summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vcl/source/gdi/pdfwriter_impl.cxx19
-rw-r--r--vcl/source/gdi/pdfwriter_impl.hxx4
2 files changed, 13 insertions, 10 deletions
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index b37c880cffa9..6646c7b994fe 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -8656,9 +8656,12 @@ void PDFWriterImpl::beginRedirect( SvStream* pStream, const Rectangle& rTargetRe
{
push( PUSH_ALL );
- // force reemitting clip region
+ // force reemitting clip region inside the new stream, and
+ // prevent emitting an unbalanced "Q" at the start
clearClipRegion();
- updateGraphicsState();
+ // this is needed to point m_aCurrentPDFState at the pushed state
+ // ... but it's pointless to actually write into the "outer" stream here!
+ updateGraphicsState(NOWRITE);
m_aOutputStreams.push_front( StreamRedirect() );
m_aOutputStreams.front().m_pStream = pStream;
@@ -8695,14 +8698,12 @@ SvStream* PDFWriterImpl::endRedirect()
}
pop();
- // force reemitting colors and clip region
- clearClipRegion();
- m_aCurrentPDFState.m_bClipRegion = m_aGraphicsStack.front().m_bClipRegion;
- m_aCurrentPDFState.m_aClipRegion = m_aGraphicsStack.front().m_aClipRegion;
+
m_aCurrentPDFState.m_aLineColor = Color( COL_TRANSPARENT );
m_aCurrentPDFState.m_aFillColor = Color( COL_TRANSPARENT );
- updateGraphicsState();
+ // needed after pop() to set m_aCurrentPDFState
+ updateGraphicsState(NOWRITE);
return pStream;
}
@@ -10491,7 +10492,7 @@ void PDFWriterImpl::drawWallpaper( const Rectangle& rRect, const Wallpaper& rWal
}
}
-void PDFWriterImpl::updateGraphicsState()
+void PDFWriterImpl::updateGraphicsState(Mode const mode)
{
OStringBuffer aLine( 256 );
GraphicsState& rNewState = m_aGraphicsStack.front();
@@ -10587,7 +10588,7 @@ void PDFWriterImpl::updateGraphicsState()
// everything is up to date now
m_aCurrentPDFState = m_aGraphicsStack.front();
- if( !aLine.isEmpty() )
+ if ((mode != NOWRITE) && !aLine.isEmpty())
writeBuffer( aLine.getStr(), aLine.getLength() );
}
diff --git a/vcl/source/gdi/pdfwriter_impl.hxx b/vcl/source/gdi/pdfwriter_impl.hxx
index 4fe749ae9e71..b94e4f404608 100644
--- a/vcl/source/gdi/pdfwriter_impl.hxx
+++ b/vcl/source/gdi/pdfwriter_impl.hxx
@@ -840,10 +840,12 @@ i12626
void drawRelief( SalLayout& rLayout, const OUString& rText, bool bTextLines );
void drawShadow( SalLayout& rLayout, const OUString& rText, bool bTextLines );
+ enum Mode { DEFAULT, NOWRITE };
+
/* writes differences between graphics stack and current real PDF
* state to the file
*/
- void updateGraphicsState();
+ void updateGraphicsState(Mode mode = DEFAULT);
/* writes a transparency group object */
bool writeTransparentObject( TransparencyEmit& rObject );