[Libreoffice-commits] core.git: Branch 'feature/fixes17' - 3 commits - include/vcl vcl/source

Marco Cecchetti marco.cecchetti at collabora.com
Tue Feb 23 13:32:06 UTC 2016


 include/vcl/pdfextoutdevdata.hxx    |    2 +
 vcl/source/gdi/pdfextoutdevdata.cxx |   27 ++++++++++++++++++----
 vcl/source/gdi/pdfwriter_impl.hxx   |    2 -
 vcl/source/gdi/pdfwriter_impl2.cxx  |   44 ++++++++++++++++++++++++++----------
 4 files changed, 57 insertions(+), 18 deletions(-)

New commits:
commit 7ea774d54badc9e75550a897c6dfbd1859013885
Author: Marco Cecchetti <marco.cecchetti at collabora.com>
Date:   Fri Feb 19 18:12:49 2016 +0100

    pdf export - avoid to export png as jpeg
    
    Conflicts:
    	vcl/source/gdi/pdfextoutdevdata.cxx
    
    Change-Id: Iafa5d4b347da46dedb9431b6870f34b2b6fcad99

diff --git a/vcl/source/gdi/pdfextoutdevdata.cxx b/vcl/source/gdi/pdfextoutdevdata.cxx
index 37d999a..0466cfb 100644
--- a/vcl/source/gdi/pdfextoutdevdata.cxx
+++ b/vcl/source/gdi/pdfextoutdevdata.cxx
@@ -408,11 +408,19 @@ bool PageSyncData::PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rCurGDIMtfAc
                     else if ( aBeg->eAct == PDFExtOutDevDataSync::EndGroupGfxLink )
                     {
                         Graphic& rGraphic = mGraphics.front();
-                        if ( rGraphic.IsLink() && rGraphic.GetLink().GetType() == GFX_LINK_TYPE_NATIVE_JPG )
+                        if ( rGraphic.IsLink() )
                         {
-                            mbGroupIgnoreGDIMtfActions = rOutDevData.GetIsLosslessCompression() && !rOutDevData.GetIsReduceImageResolution();
-                            if ( !mbGroupIgnoreGDIMtfActions )
+                            GfxLinkType eType = rGraphic.GetLink().GetType();
+                            if ( eType == GFX_LINK_TYPE_NATIVE_JPG  )
+                            {
+                                mbGroupIgnoreGDIMtfActions = rOutDevData.GetIsLosslessCompression() && !rOutDevData.GetIsReduceImageResolution();
+                                if ( !mbGroupIgnoreGDIMtfActions )
+                                    mCurrentGraphic = rGraphic;
+                            }
+                            else if ( eType == GFX_LINK_TYPE_NATIVE_PNG )
+                            {
                                 mCurrentGraphic = rGraphic;
+                            }
                         }
                         break;
                     }
diff --git a/vcl/source/gdi/pdfwriter_impl2.cxx b/vcl/source/gdi/pdfwriter_impl2.cxx
index 257d8a6..0d14428 100644
--- a/vcl/source/gdi/pdfwriter_impl2.cxx
+++ b/vcl/source/gdi/pdfwriter_impl2.cxx
@@ -96,7 +96,13 @@ void PDFWriterImpl::implWriteBitmapEx( const Point& i_rPoint, const Size& i_rSiz
             aBitmapEx.Mirror( nMirrorFlags );
         }
 
-        bool bIsJpeg = (i_Graphic.GetType() != GRAPHIC_NONE) && (i_Graphic.GetBitmapEx() == aBitmapEx);
+        bool bIsJpeg = false, bIsPng = false;
+        if( i_Graphic.GetType() != GRAPHIC_NONE && i_Graphic.GetBitmapEx() == aBitmapEx )
+        {
+            GfxLinkType eType = i_Graphic.GetLink().GetType();
+            bIsJpeg = (eType == GFX_LINK_TYPE_NATIVE_JPG);
+            bIsPng = (eType == GFX_LINK_TYPE_NATIVE_PNG);
+        }
 
         if( i_rContext.m_nMaxImageResolution > 50 )
         {
@@ -154,7 +160,7 @@ void PDFWriterImpl::implWriteBitmapEx( const Point& i_rPoint, const Size& i_rSiz
                     aBitmapEx.Convert( eConv );
             }
             bool bUseJPGCompression = !i_rContext.m_bOnlyLosslessCompression;
-            if ( ( aSizePixel.Width() < 32 ) || ( aSizePixel.Height() < 32 ) )
+            if ( bIsPng || ( aSizePixel.Width() < 32 ) || ( aSizePixel.Height() < 32 ) )
                 bUseJPGCompression = false;
 
             SvMemoryStream  aStrm;
commit 3b6a9a5bc06555f2c05e62c0932a7af9cd20a6fa
Author: Marco Cecchetti <marco.cecchetti at collabora.com>
Date:   Fri Feb 19 16:41:20 2016 +0100

    pdf export - jpeg exporting is too expensive - de-pointer-ized
    
    Refactored: Graphic* ---> Graphic
    
    Conflicts:
    	vcl/source/gdi/pdfextoutdevdata.cxx
    
    Conflicts:
    	vcl/source/gdi/pdfextoutdevdata.cxx
    	vcl/source/gdi/pdfwriter_impl2.cxx
    
    Change-Id: I4f49957f8bd060e34a4f54cfcce00994c52bc71e

diff --git a/include/vcl/pdfextoutdevdata.hxx b/include/vcl/pdfextoutdevdata.hxx
index 7efc561..1140180 100644
--- a/include/vcl/pdfextoutdevdata.hxx
+++ b/include/vcl/pdfextoutdevdata.hxx
@@ -146,7 +146,7 @@ public:
 
     std::vector< PDFExtOutDevBookmarkEntry >& GetBookmarks() { return maBookmarks;}
 
-    const Graphic* GetCurrentGraphic() const;
+    Graphic GetCurrentGraphic() const;
 
     /** Start a new group of render output
 
diff --git a/vcl/source/gdi/pdfextoutdevdata.cxx b/vcl/source/gdi/pdfextoutdevdata.cxx
index 2fbab28..37d999a 100644
--- a/vcl/source/gdi/pdfextoutdevdata.cxx
+++ b/vcl/source/gdi/pdfextoutdevdata.cxx
@@ -294,7 +294,7 @@ struct PageSyncData
     std::deque< PDFWriter::StructAttribute >        mParaStructAttributes;
     std::deque< PDFWriter::StructAttributeValue >   mParaStructAttributeValues;
     std::deque< Graphic >                           mGraphics;
-    Graphic*                                        mpCurrentGraphic;
+    Graphic                                         mCurrentGraphic;
     std::deque< std::shared_ptr< PDFWriter::AnyWidget > >
                                                     mControls;
     GlobalSyncData*                                 mpGlobalData;
@@ -303,8 +303,7 @@ struct PageSyncData
 
 
     explicit PageSyncData( GlobalSyncData* pGlobal )
-        : mpCurrentGraphic ( nullptr )
-        , mbGroupIgnoreGDIMtfActions ( false )
+        : mbGroupIgnoreGDIMtfActions ( false )
     { mpGlobalData = pGlobal; }
 
     void PushAction( const OutputDevice& rOutDev, const PDFExtOutDevDataSync::Action eAct );
@@ -412,7 +411,8 @@ bool PageSyncData::PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rCurGDIMtfAc
                         if ( rGraphic.IsLink() && rGraphic.GetLink().GetType() == GFX_LINK_TYPE_NATIVE_JPG )
                         {
                             mbGroupIgnoreGDIMtfActions = rOutDevData.GetIsLosslessCompression() && !rOutDevData.GetIsReduceImageResolution();
-                            mpCurrentGraphic = mbGroupIgnoreGDIMtfActions ? nullptr : &rGraphic;
+                            if ( !mbGroupIgnoreGDIMtfActions )
+                                mCurrentGraphic = rGraphic;
                         }
                         break;
                     }
@@ -467,7 +467,7 @@ bool PageSyncData::PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rCurGDIMtfAc
                     }
                     mbGroupIgnoreGDIMtfActions = false;
                 }
-                mpCurrentGraphic = nullptr;
+                mCurrentGraphic.Clear();
             }
             break;
             case PDFExtOutDevDataSync::CreateNamedDest:
@@ -520,9 +520,9 @@ PDFExtOutDevData::~PDFExtOutDevData()
     delete mpGlobalSyncData;
 }
 
-const Graphic* PDFExtOutDevData::GetCurrentGraphic() const
+Graphic PDFExtOutDevData::GetCurrentGraphic() const
 {
-    return mpPageSyncData->mpCurrentGraphic;
+    return mpPageSyncData->mCurrentGraphic;
 }
 
 void PDFExtOutDevData::SetDocumentLocale( const css::lang::Locale& rLoc )
diff --git a/vcl/source/gdi/pdfwriter_impl.hxx b/vcl/source/gdi/pdfwriter_impl.hxx
index d4d8f3a..306bb15 100644
--- a/vcl/source/gdi/pdfwriter_impl.hxx
+++ b/vcl/source/gdi/pdfwriter_impl.hxx
@@ -1011,7 +1011,7 @@ i12626
     // helper for playMetafile
     void implWriteGradient( const tools::PolyPolygon& rPolyPoly, const Gradient& rGradient,
                             VirtualDevice* pDummyVDev, const vcl::PDFWriter::PlayMetafileContext& );
-    void implWriteBitmapEx( const Point& rPoint, const Size& rSize, const BitmapEx& rBitmapEx, const Graphic* i_pGraphic,
+    void implWriteBitmapEx( const Point& rPoint, const Size& rSize, const BitmapEx& rBitmapEx, Graphic i_pGraphic,
                            VirtualDevice* pDummyVDev, const vcl::PDFWriter::PlayMetafileContext& );
 
     // helpers for CCITT 1bit bitmap stream
diff --git a/vcl/source/gdi/pdfwriter_impl2.cxx b/vcl/source/gdi/pdfwriter_impl2.cxx
index b74234b..257d8a6 100644
--- a/vcl/source/gdi/pdfwriter_impl2.cxx
+++ b/vcl/source/gdi/pdfwriter_impl2.cxx
@@ -65,7 +65,7 @@ void PDFWriterImpl::implWriteGradient( const tools::PolyPolygon& i_rPolyPoly, co
     m_rOuterFace.Pop();
 }
 
-void PDFWriterImpl::implWriteBitmapEx( const Point& i_rPoint, const Size& i_rSize, const BitmapEx& i_rBitmapEx, const Graphic* i_pGraphic,
+void PDFWriterImpl::implWriteBitmapEx( const Point& i_rPoint, const Size& i_rSize, const BitmapEx& i_rBitmapEx, Graphic i_Graphic,
                                        VirtualDevice* i_pDummyVDev, const vcl::PDFWriter::PlayMetafileContext& i_rContext )
 {
     if ( !i_rBitmapEx.IsEmpty() && i_rSize.Width() && i_rSize.Height() )
@@ -96,7 +96,7 @@ void PDFWriterImpl::implWriteBitmapEx( const Point& i_rPoint, const Size& i_rSiz
             aBitmapEx.Mirror( nMirrorFlags );
         }
 
-        bool bIsJpeg = i_pGraphic && (i_pGraphic->GetBitmapEx() == aBitmapEx);
+        bool bIsJpeg = (i_Graphic.GetType() != GRAPHIC_NONE) && (i_Graphic.GetBitmapEx() == aBitmapEx);
 
         if( i_rContext.m_nMaxImageResolution > 50 )
         {
@@ -487,8 +487,9 @@ void PDFWriterImpl::playMetafile( const GDIMetaFile& i_rMtf, vcl::PDFExtOutDevDa
                                 xVDev->EnableMapMode( false );
                                 xVDev->DrawMask( aPoint, aDstSizePixel, aMask, Color( COL_WHITE ) );
                                 aAlpha = xVDev->GetBitmap( aPoint, aDstSizePixel );
-                                const Graphic* pGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : nullptr;
-                                implWriteBitmapEx( rPos, rSize, BitmapEx( aPaint, aAlpha ), pGraphic, pDummyVDev, i_rContext );
+
+                                Graphic aGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : Graphic();
+                                implWriteBitmapEx( rPos, rSize, BitmapEx( aPaint, aAlpha ), aGraphic, pDummyVDev, i_rContext );
                             }
                         }
                     }
@@ -788,16 +789,16 @@ void PDFWriterImpl::playMetafile( const GDIMetaFile& i_rMtf, vcl::PDFExtOutDevDa
                     if( ! ( aSize.Width() && aSize.Height() ) )
                         aSize = pDummyVDev->PixelToLogic( aBitmapEx.GetSizePixel() );
 
-                    const Graphic* pGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : nullptr;
-                    implWriteBitmapEx( pA->GetPoint(), aSize, aBitmapEx, pGraphic, pDummyVDev, i_rContext );
+                    Graphic aGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : Graphic();
+                    implWriteBitmapEx( pA->GetPoint(), aSize, aBitmapEx, aGraphic, pDummyVDev, i_rContext );
                 }
                 break;
 
                 case( MetaActionType::BMPSCALE ):
                 {
                     const MetaBmpScaleAction* pA = static_cast<const MetaBmpScaleAction*>(pAction);
-                    const Graphic* pGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : nullptr;
-                    implWriteBitmapEx( pA->GetPoint(), pA->GetSize(), BitmapEx( pA->GetBitmap() ), pGraphic, pDummyVDev, i_rContext );
+                    Graphic aGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : Graphic();
+                    implWriteBitmapEx( pA->GetPoint(), pA->GetSize(), BitmapEx( pA->GetBitmap() ), aGraphic, pDummyVDev, i_rContext );
                 }
                 break;
 
@@ -806,8 +807,8 @@ void PDFWriterImpl::playMetafile( const GDIMetaFile& i_rMtf, vcl::PDFExtOutDevDa
                     const MetaBmpScalePartAction* pA = static_cast<const MetaBmpScalePartAction*>(pAction);
                     BitmapEx aBitmapEx( pA->GetBitmap() );
                     aBitmapEx.Crop( Rectangle( pA->GetSrcPoint(), pA->GetSrcSize() ) );
-                    const Graphic* pGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : nullptr;
-                    implWriteBitmapEx( pA->GetDestPoint(), pA->GetDestSize(), aBitmapEx, pGraphic, pDummyVDev, i_rContext );
+                    Graphic aGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : Graphic();
+                    implWriteBitmapEx( pA->GetDestPoint(), pA->GetDestSize(), aBitmapEx, aGraphic, pDummyVDev, i_rContext );
                 }
                 break;
 
@@ -817,16 +818,16 @@ void PDFWriterImpl::playMetafile( const GDIMetaFile& i_rMtf, vcl::PDFExtOutDevDa
                     BitmapEx aBitmapEx( pA->GetBitmapEx() );
                     Size aSize( OutputDevice::LogicToLogic( aBitmapEx.GetPrefSize(),
                             aBitmapEx.GetPrefMapMode(), pDummyVDev->GetMapMode() ) );
-                    const Graphic* pGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : nullptr;
-                    implWriteBitmapEx( pA->GetPoint(), aSize, aBitmapEx, pGraphic, pDummyVDev, i_rContext );
+                    Graphic aGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : Graphic();
+                    implWriteBitmapEx( pA->GetPoint(), aSize, aBitmapEx, aGraphic, pDummyVDev, i_rContext );
                 }
                 break;
 
                 case( MetaActionType::BMPEXSCALE ):
                 {
                     const MetaBmpExScaleAction* pA = static_cast<const MetaBmpExScaleAction*>(pAction);
-                    const Graphic* pGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : nullptr;
-                    implWriteBitmapEx( pA->GetPoint(), pA->GetSize(), pA->GetBitmapEx(), pGraphic, pDummyVDev, i_rContext );
+                    Graphic aGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : Graphic();
+                    implWriteBitmapEx( pA->GetPoint(), pA->GetSize(), pA->GetBitmapEx(), aGraphic, pDummyVDev, i_rContext );
                 }
                 break;
 
@@ -835,8 +836,8 @@ void PDFWriterImpl::playMetafile( const GDIMetaFile& i_rMtf, vcl::PDFExtOutDevDa
                     const MetaBmpExScalePartAction* pA = static_cast<const MetaBmpExScalePartAction*>(pAction);
                     BitmapEx aBitmapEx( pA->GetBitmapEx() );
                     aBitmapEx.Crop( Rectangle( pA->GetSrcPoint(), pA->GetSrcSize() ) );
-                    const Graphic* pGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : nullptr;
-                    implWriteBitmapEx( pA->GetDestPoint(), pA->GetDestSize(), aBitmapEx, pGraphic, pDummyVDev, i_rContext );
+                    Graphic aGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : Graphic();
+                    implWriteBitmapEx( pA->GetDestPoint(), pA->GetDestSize(), aBitmapEx, aGraphic, pDummyVDev, i_rContext );
                 }
                 break;
 
commit afd0aa9c8609fbaf1a95993d6ccae0967e4826ca
Author: Marco Cecchetti <marco.cecchetti at collabora.com>
Date:   Fri Feb 19 13:42:24 2016 +0100

    pdf export - jpeg exporting is too expensive - workaround
    
    Avoid to zip bitmap when the original image is a Jpeg
    
    Conflicts:
    	vcl/source/gdi/pdfextoutdevdata.cxx
    
    Change-Id: I396759ca40ed3730bb29585370b2f8900fcc693c

diff --git a/include/vcl/pdfextoutdevdata.hxx b/include/vcl/pdfextoutdevdata.hxx
index 477f668..7efc561 100644
--- a/include/vcl/pdfextoutdevdata.hxx
+++ b/include/vcl/pdfextoutdevdata.hxx
@@ -146,6 +146,8 @@ public:
 
     std::vector< PDFExtOutDevBookmarkEntry >& GetBookmarks() { return maBookmarks;}
 
+    const Graphic* GetCurrentGraphic() const;
+
     /** Start a new group of render output
 
         Use this method to group render output.
diff --git a/vcl/source/gdi/pdfextoutdevdata.cxx b/vcl/source/gdi/pdfextoutdevdata.cxx
index 8212f85..2fbab28 100644
--- a/vcl/source/gdi/pdfextoutdevdata.cxx
+++ b/vcl/source/gdi/pdfextoutdevdata.cxx
@@ -294,13 +294,18 @@ struct PageSyncData
     std::deque< PDFWriter::StructAttribute >        mParaStructAttributes;
     std::deque< PDFWriter::StructAttributeValue >   mParaStructAttributeValues;
     std::deque< Graphic >                           mGraphics;
+    Graphic*                                        mpCurrentGraphic;
     std::deque< std::shared_ptr< PDFWriter::AnyWidget > >
                                                     mControls;
     GlobalSyncData*                                 mpGlobalData;
 
     bool                                        mbGroupIgnoreGDIMtfActions;
 
-    explicit PageSyncData( GlobalSyncData* pGlobal ) : mbGroupIgnoreGDIMtfActions ( false ) { mpGlobalData = pGlobal; }
+
+    explicit PageSyncData( GlobalSyncData* pGlobal )
+        : mpCurrentGraphic ( nullptr )
+        , mbGroupIgnoreGDIMtfActions ( false )
+    { mpGlobalData = pGlobal; }
 
     void PushAction( const OutputDevice& rOutDev, const PDFExtOutDevDataSync::Action eAct );
     bool PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rCurGDIMtfAction, const PDFExtOutDevData& rOutDevData );
@@ -403,13 +408,11 @@ bool PageSyncData::PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rCurGDIMtfAc
                     }
                     else if ( aBeg->eAct == PDFExtOutDevDataSync::EndGroupGfxLink )
                     {
-                        if ( rOutDevData.GetIsLosslessCompression() && !rOutDevData.GetIsReduceImageResolution() )
+                        Graphic& rGraphic = mGraphics.front();
+                        if ( rGraphic.IsLink() && rGraphic.GetLink().GetType() == GFX_LINK_TYPE_NATIVE_JPG )
                         {
-                            Graphic& rGraphic = mGraphics.front();
-                            if ( rGraphic.IsLink() && rGraphic.GetLink().GetType() == GFX_LINK_TYPE_NATIVE_JPG )
-                            {
-                                mbGroupIgnoreGDIMtfActions = true;
-                            }
+                            mbGroupIgnoreGDIMtfActions = rOutDevData.GetIsLosslessCompression() && !rOutDevData.GetIsReduceImageResolution();
+                            mpCurrentGraphic = mbGroupIgnoreGDIMtfActions ? nullptr : &rGraphic;
                         }
                         break;
                     }
@@ -464,6 +467,7 @@ bool PageSyncData::PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rCurGDIMtfAc
                     }
                     mbGroupIgnoreGDIMtfActions = false;
                 }
+                mpCurrentGraphic = nullptr;
             }
             break;
             case PDFExtOutDevDataSync::CreateNamedDest:
@@ -516,6 +520,11 @@ PDFExtOutDevData::~PDFExtOutDevData()
     delete mpGlobalSyncData;
 }
 
+const Graphic* PDFExtOutDevData::GetCurrentGraphic() const
+{
+    return mpPageSyncData->mpCurrentGraphic;
+}
+
 void PDFExtOutDevData::SetDocumentLocale( const css::lang::Locale& rLoc )
 {
     maDocLocale = rLoc;
diff --git a/vcl/source/gdi/pdfwriter_impl.hxx b/vcl/source/gdi/pdfwriter_impl.hxx
index 77b0d47..d4d8f3a 100644
--- a/vcl/source/gdi/pdfwriter_impl.hxx
+++ b/vcl/source/gdi/pdfwriter_impl.hxx
@@ -1011,7 +1011,7 @@ i12626
     // helper for playMetafile
     void implWriteGradient( const tools::PolyPolygon& rPolyPoly, const Gradient& rGradient,
                             VirtualDevice* pDummyVDev, const vcl::PDFWriter::PlayMetafileContext& );
-    void implWriteBitmapEx( const Point& rPoint, const Size& rSize, const BitmapEx& rBitmapEx,
+    void implWriteBitmapEx( const Point& rPoint, const Size& rSize, const BitmapEx& rBitmapEx, const Graphic* i_pGraphic,
                            VirtualDevice* pDummyVDev, const vcl::PDFWriter::PlayMetafileContext& );
 
     // helpers for CCITT 1bit bitmap stream
diff --git a/vcl/source/gdi/pdfwriter_impl2.cxx b/vcl/source/gdi/pdfwriter_impl2.cxx
index 8e47b84..b74234b 100644
--- a/vcl/source/gdi/pdfwriter_impl2.cxx
+++ b/vcl/source/gdi/pdfwriter_impl2.cxx
@@ -65,7 +65,7 @@ void PDFWriterImpl::implWriteGradient( const tools::PolyPolygon& i_rPolyPoly, co
     m_rOuterFace.Pop();
 }
 
-void PDFWriterImpl::implWriteBitmapEx( const Point& i_rPoint, const Size& i_rSize, const BitmapEx& i_rBitmapEx,
+void PDFWriterImpl::implWriteBitmapEx( const Point& i_rPoint, const Size& i_rSize, const BitmapEx& i_rBitmapEx, const Graphic* i_pGraphic,
                                        VirtualDevice* i_pDummyVDev, const vcl::PDFWriter::PlayMetafileContext& i_rContext )
 {
     if ( !i_rBitmapEx.IsEmpty() && i_rSize.Width() && i_rSize.Height() )
@@ -95,6 +95,9 @@ void PDFWriterImpl::implWriteBitmapEx( const Point& i_rPoint, const Size& i_rSiz
         {
             aBitmapEx.Mirror( nMirrorFlags );
         }
+
+        bool bIsJpeg = i_pGraphic && (i_pGraphic->GetBitmapEx() == aBitmapEx);
+
         if( i_rContext.m_nMaxImageResolution > 50 )
         {
             // do downsampling if necessary
@@ -160,8 +163,10 @@ void PDFWriterImpl::implWriteBitmapEx( const Point& i_rPoint, const Size& i_rSiz
             bool bTrueColorJPG = true;
             if ( bUseJPGCompression )
             {
-                sal_uInt32 nZippedFileSize;     // sj: we will calculate the filesize of a zipped bitmap
-                {                               // to determine if jpeg compression is useful
+
+                sal_uInt32 nZippedFileSize = 0; // sj: we will calculate the filesize of a zipped bitmap
+                if ( !bIsJpeg )                 // to determine if jpeg compression is useful
+                {
                     SvMemoryStream aTemp;
                     aTemp.SetCompressMode( aTemp.GetCompressMode() | SvStreamCompressFlags::ZBITMAP );
                     aTemp.SetVersion( SOFFICE_FILEFORMAT_40 );  // sj: up from version 40 our bitmap stream operator
@@ -203,7 +208,7 @@ void PDFWriterImpl::implWriteBitmapEx( const Point& i_rPoint, const Size& i_rSiz
                     aOutMediaProperties[2].Value <<= aFilterData;
                     xGraphicProvider->storeGraphic( xGraphic, aOutMediaProperties );
                     xOut->flush();
-                    if ( xSeekable->getLength() > nZippedFileSize )
+                    if ( !bIsJpeg && xSeekable->getLength() > nZippedFileSize )
                     {
                         bUseJPGCompression = false;
                     }
@@ -482,7 +487,8 @@ void PDFWriterImpl::playMetafile( const GDIMetaFile& i_rMtf, vcl::PDFExtOutDevDa
                                 xVDev->EnableMapMode( false );
                                 xVDev->DrawMask( aPoint, aDstSizePixel, aMask, Color( COL_WHITE ) );
                                 aAlpha = xVDev->GetBitmap( aPoint, aDstSizePixel );
-                                implWriteBitmapEx( rPos, rSize, BitmapEx( aPaint, aAlpha ), pDummyVDev, i_rContext );
+                                const Graphic* pGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : nullptr;
+                                implWriteBitmapEx( rPos, rSize, BitmapEx( aPaint, aAlpha ), pGraphic, pDummyVDev, i_rContext );
                             }
                         }
                     }
@@ -781,14 +787,17 @@ void PDFWriterImpl::playMetafile( const GDIMetaFile& i_rMtf, vcl::PDFExtOutDevDa
                                                             aBitmapEx.GetPrefMapMode(), pDummyVDev->GetMapMode() ) );
                     if( ! ( aSize.Width() && aSize.Height() ) )
                         aSize = pDummyVDev->PixelToLogic( aBitmapEx.GetSizePixel() );
-                    implWriteBitmapEx( pA->GetPoint(), aSize, aBitmapEx, pDummyVDev, i_rContext );
+
+                    const Graphic* pGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : nullptr;
+                    implWriteBitmapEx( pA->GetPoint(), aSize, aBitmapEx, pGraphic, pDummyVDev, i_rContext );
                 }
                 break;
 
                 case( MetaActionType::BMPSCALE ):
                 {
                     const MetaBmpScaleAction* pA = static_cast<const MetaBmpScaleAction*>(pAction);
-                    implWriteBitmapEx( pA->GetPoint(), pA->GetSize(), BitmapEx( pA->GetBitmap() ), pDummyVDev, i_rContext );
+                    const Graphic* pGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : nullptr;
+                    implWriteBitmapEx( pA->GetPoint(), pA->GetSize(), BitmapEx( pA->GetBitmap() ), pGraphic, pDummyVDev, i_rContext );
                 }
                 break;
 
@@ -797,7 +806,8 @@ void PDFWriterImpl::playMetafile( const GDIMetaFile& i_rMtf, vcl::PDFExtOutDevDa
                     const MetaBmpScalePartAction* pA = static_cast<const MetaBmpScalePartAction*>(pAction);
                     BitmapEx aBitmapEx( pA->GetBitmap() );
                     aBitmapEx.Crop( Rectangle( pA->GetSrcPoint(), pA->GetSrcSize() ) );
-                    implWriteBitmapEx( pA->GetDestPoint(), pA->GetDestSize(), aBitmapEx, pDummyVDev, i_rContext );
+                    const Graphic* pGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : nullptr;
+                    implWriteBitmapEx( pA->GetDestPoint(), pA->GetDestSize(), aBitmapEx, pGraphic, pDummyVDev, i_rContext );
                 }
                 break;
 
@@ -807,14 +817,16 @@ void PDFWriterImpl::playMetafile( const GDIMetaFile& i_rMtf, vcl::PDFExtOutDevDa
                     BitmapEx aBitmapEx( pA->GetBitmapEx() );
                     Size aSize( OutputDevice::LogicToLogic( aBitmapEx.GetPrefSize(),
                             aBitmapEx.GetPrefMapMode(), pDummyVDev->GetMapMode() ) );
-                    implWriteBitmapEx( pA->GetPoint(), aSize, aBitmapEx, pDummyVDev, i_rContext );
+                    const Graphic* pGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : nullptr;
+                    implWriteBitmapEx( pA->GetPoint(), aSize, aBitmapEx, pGraphic, pDummyVDev, i_rContext );
                 }
                 break;
 
                 case( MetaActionType::BMPEXSCALE ):
                 {
                     const MetaBmpExScaleAction* pA = static_cast<const MetaBmpExScaleAction*>(pAction);
-                    implWriteBitmapEx( pA->GetPoint(), pA->GetSize(), pA->GetBitmapEx(), pDummyVDev, i_rContext );
+                    const Graphic* pGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : nullptr;
+                    implWriteBitmapEx( pA->GetPoint(), pA->GetSize(), pA->GetBitmapEx(), pGraphic, pDummyVDev, i_rContext );
                 }
                 break;
 
@@ -823,7 +835,8 @@ void PDFWriterImpl::playMetafile( const GDIMetaFile& i_rMtf, vcl::PDFExtOutDevDa
                     const MetaBmpExScalePartAction* pA = static_cast<const MetaBmpExScalePartAction*>(pAction);
                     BitmapEx aBitmapEx( pA->GetBitmapEx() );
                     aBitmapEx.Crop( Rectangle( pA->GetSrcPoint(), pA->GetSrcSize() ) );
-                    implWriteBitmapEx( pA->GetDestPoint(), pA->GetDestSize(), aBitmapEx, pDummyVDev, i_rContext );
+                    const Graphic* pGraphic = i_pOutDevData ? i_pOutDevData->GetCurrentGraphic() : nullptr;
+                    implWriteBitmapEx( pA->GetDestPoint(), pA->GetDestSize(), aBitmapEx, pGraphic, pDummyVDev, i_rContext );
                 }
                 break;
 


More information about the Libreoffice-commits mailing list