[Libreoffice-commits] core.git: 7 commits - drawinglayer/source filter/source include/filter include/vcl sd/source vcl/source

Armin Le Grand alg at apache.org
Wed Jun 12 09:17:16 PDT 2013


 drawinglayer/source/processor2d/vclhelperbitmaprender.cxx    |   20 +
 drawinglayer/source/processor2d/vclhelperbitmaptransform.cxx |  141 +--------
 drawinglayer/source/processor2d/vclprocessor2d.cxx           |   12 
 filter/source/msfilter/escherex.cxx                          |    5 
 include/filter/msfilter/escherex.hxx                         |    1 
 include/vcl/bitmap.hxx                                       |    6 
 sd/source/filter/eppt/epptso.cxx                             |   11 
 sd/source/ui/view/sdview3.cxx                                |   24 -
 vcl/source/gdi/bitmap3.cxx                                   |  171 ++++-------
 9 files changed, 133 insertions(+), 258 deletions(-)

New commits:
commit e94baf5bcd5ceb749ff54d68287b1d37b211b535
Author: Armin Le Grand <alg at apache.org>
Date:   Wed Nov 28 13:55:37 2012 +0000

    Related: #i121387# Corrected flag usages in RenderPolygonHairlinePrimitive2D
    
    (cherry picked from commit e3eebb16c90fa5c3320fa9843e3420293bec6ab2)
    
    Conflicts:
    	drawinglayer/source/processor2d/vclprocessor2d.cxx
    
    Change-Id: I245d7ebc040580057948fdd5888f55eaca783b2a

diff --git a/drawinglayer/source/processor2d/vclprocessor2d.cxx b/drawinglayer/source/processor2d/vclprocessor2d.cxx
index bdf451e..8a2ddcc 100644
--- a/drawinglayer/source/processor2d/vclprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclprocessor2d.cxx
@@ -451,9 +451,10 @@ namespace drawinglayer
                 aLocalTransform.decompose(aScale, aTranslate, fRotate, fShearX);
 
                 // #i121387# when mirrored and rotated, avoid the GraphicManager output which has low quality
-                const bool bRotated(basegfx::fTools::equalZero(fRotate));
-                const bool bSheared(basegfx::fTools::equalZero(fShearX));
-                const bool bMirroredAndRotated(bRotated && (aScale.getX() < 0.0 || aScale.getY() < 0.0));
+                const bool bRotated(!basegfx::fTools::equalZero(fRotate));
+                const bool bSheared(!basegfx::fTools::equalZero(fShearX));
+                const bool bMirrored(aScale.getX() < 0.0 || aScale.getY() < 0.0);
+                const bool bMirroredAndRotated(bRotated && bMirrored);
 
                 if(!bForceUseOfOwnTransformer && !bSheared && !bMirroredAndRotated)
                 {
commit 829d31c122afe13df3463fe905fff4a9e93d13db
Author: Armin Le Grand <alg at apache.org>
Date:   Wed Nov 28 12:52:24 2012 +0000

    Resolves: #i121387# Corrected RenderBitmapPrimitive2D_GraphicManager...
    
    to correctly handle cases with combinations of mirroring and rotation, also
    changed VclProcessor2D::RenderBitmapPrimitive2D to use own bitmapEx renderer
    for these cases for better quality
    
    (cherry picked from commit b8cf3355071035085c705a65558cd4a6cefe8f47)
    
    Change-Id: I3f0c61db9c776299e9ee866c4e54d9c6ac431a31

diff --git a/drawinglayer/source/processor2d/vclhelperbitmaprender.cxx b/drawinglayer/source/processor2d/vclhelperbitmaprender.cxx
index 3cd0bfb..f1aa08c 100644
--- a/drawinglayer/source/processor2d/vclhelperbitmaprender.cxx
+++ b/drawinglayer/source/processor2d/vclhelperbitmaprender.cxx
@@ -67,12 +67,28 @@ namespace drawinglayer
         {
             // if rotated, create the unrotated output rectangle for the GraphicManager paint
             // #118824# Caution! When mirrored, adapt transformation accordingly
+            // #i121387# Also need to adapt position when mirror and rotation is combined
+            if(bMirrorX || bMirrorY)
+            {
+                const basegfx::B2DHomMatrix aRot(basegfx::tools::createRotateB2DHomMatrix(fRotate));
+
+                if(bMirrorX)
+                {
+                    aTranslate += aRot * basegfx::B2DVector(aScale.getX(), 0.0);
+                }
+
+                if(bMirrorY)
+                {
+                    aTranslate += aRot * basegfx::B2DVector(0.0, aScale.getY());
+                }
+            }
+
             const basegfx::B2DHomMatrix aSimpleObjectMatrix(
                 basegfx::tools::createScaleTranslateB2DHomMatrix(
                     fabs(aScale.getX()),
                     fabs(aScale.getY()),
-                    bMirrorX ? aTranslate.getX() - fabs(aScale.getX()): aTranslate.getX(),
-                    bMirrorY ? aTranslate.getY() - fabs(aScale.getY()): aTranslate.getY()));
+                    aTranslate.getX(),
+                    aTranslate.getY()));
 
             aOutlineRange.transform(aSimpleObjectMatrix);
         }
diff --git a/drawinglayer/source/processor2d/vclprocessor2d.cxx b/drawinglayer/source/processor2d/vclprocessor2d.cxx
index 9741bc8..bdf451e 100644
--- a/drawinglayer/source/processor2d/vclprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclprocessor2d.cxx
@@ -450,9 +450,14 @@ namespace drawinglayer
                 double fRotate, fShearX;
                 aLocalTransform.decompose(aScale, aTranslate, fRotate, fShearX);
 
-                if(!bForceUseOfOwnTransformer && basegfx::fTools::equalZero(fShearX))
+                // #i121387# when mirrored and rotated, avoid the GraphicManager output which has low quality
+                const bool bRotated(basegfx::fTools::equalZero(fRotate));
+                const bool bSheared(basegfx::fTools::equalZero(fShearX));
+                const bool bMirroredAndRotated(bRotated && (aScale.getX() < 0.0 || aScale.getY() < 0.0));
+
+                if(!bForceUseOfOwnTransformer && !bSheared && !bMirroredAndRotated)
                 {
-                    if(!bUseGraphicManager && basegfx::fTools::equalZero(fRotate))
+                    if(!bUseGraphicManager && !bRotated)
                     {
                         RenderBitmapPrimitive2D_BitmapEx(*mpOutputDevice, aBitmapEx, aLocalTransform);
                     }
@@ -463,7 +468,7 @@ namespace drawinglayer
                 }
                 else
                 {
-                    if(!aBitmapEx.IsTransparent() && (!basegfx::fTools::equalZero(fShearX) || !basegfx::fTools::equalZero(fRotate)))
+                    if(!aBitmapEx.IsTransparent() && (bSheared || bRotated))
                     {
                         // parts will be uncovered, extend aBitmapEx with a mask bitmap
                         const Bitmap aContent(aBitmapEx.GetBitmap());
commit c856a390abbf278a6c4c80f36c8e64d15554a1ae
Author: Armin Le Grand <alg at apache.org>
Date:   Wed Nov 14 16:23:23 2012 +0000

    Resolves: #i120393# Corrected paste position of objects...
    
    with geometry outside their logic definition
    
    (cherry picked from commit 658c1d82654af635bfbd6790fab2da8664d163eb)
    
    Conflicts:
    	sd/source/ui/view/sdview3.cxx
    
    Change-Id: I4451956ab71d50e2ffec63ca17e0051d85823669

diff --git a/sd/source/ui/view/sdview3.cxx b/sd/source/ui/view/sdview3.cxx
index 38079c5..94b2abb 100644
--- a/sd/source/ui/view/sdview3.cxx
+++ b/sd/source/ui/view/sdview3.cxx
@@ -616,8 +616,8 @@ sal_Bool View::InsertData( const TransferableDataHelper& rDataHelper,
 
             pWorkPage->SetRectsDirty();
 
-            // Use SnapRect, not BoundRect
-            Size aSize( pWorkPage->GetAllObjSnapRect().GetSize() );
+            // #i120393# Clipboard data uses full object geometry range
+            const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
 
             maDropPos.X() = pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 );
             maDropPos.Y() = pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 );
@@ -780,8 +780,8 @@ sal_Bool View::InsertData( const TransferableDataHelper& rDataHelper,
 
                     if( pOwnData )
                     {
-                        // Use SnapRect, not BoundRect
-                        Size aSize( pWorkPage->GetAllObjSnapRect().GetSize() );
+                        // #i120393# Clipboard data uses full object geometry range
+                        const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
 
                         maDropPos.X() = pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 );
                         maDropPos.Y() = pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 );
@@ -846,8 +846,8 @@ sal_Bool View::InsertData( const TransferableDataHelper& rDataHelper,
 
                     if( pOwnData )
                     {
-                        // Use SnapRect, not BoundRect
-                        Size aSize( pWorkPage->GetAllObjSnapRect().GetSize() );
+                        // #i120393# Clipboard data uses full object geometry range
+                        const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
 
                         maDropPos.X() = pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 );
                         maDropPos.Y() = pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 );
@@ -1167,8 +1167,8 @@ sal_Bool View::InsertData( const TransferableDataHelper& rDataHelper,
 
                 pWorkPage->SetRectsDirty();
 
-                // Use SnapRect, not BoundRect
-                Size aSize( pWorkPage->GetAllObjSnapRect().GetSize() );
+                // #i120393# Clipboard data uses full object geometry range
+                const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
 
                 aInsertPos.X() = pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 );
                 aInsertPos.Y() = pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 );
@@ -1198,8 +1198,8 @@ sal_Bool View::InsertData( const TransferableDataHelper& rDataHelper,
 
             pWorkPage->SetRectsDirty();
 
-            // Use SnapRect, not BoundRect
-            Size aSize( pWorkPage->GetAllObjSnapRect().GetSize() );
+            // #i120393# Clipboard data uses full object geometry range
+            const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
 
             aInsertPos.X() = pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 );
             aInsertPos.Y() = pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 );
@@ -1224,8 +1224,8 @@ sal_Bool View::InsertData( const TransferableDataHelper& rDataHelper,
 
                 pWorkPage->SetRectsDirty();
 
-                // Use SnapRect, not BoundRect
-                Size aSize( pWorkPage->GetAllObjSnapRect().GetSize() );
+                // #i120393# Clipboard data uses full object geometry range
+                const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
 
                 aInsertPos.X() = pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 );
                 aInsertPos.Y() = pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 );
commit bdfac6fdb521104f71fc28e24dfd8c9ea02a95d3
Author: Armin Le Grand <alg at apache.org>
Date:   Mon Nov 12 16:56:58 2012 +0000

    Corrected bitmap scaler to not create 24bit outputs for scaling masks/alphas
    
    (cherry picked from commit 61e12761a4887b8a6bbb977996cd1ea4080d00ac)
    
    Change-Id: Ic358251ac6646b1fd8c8323171bb48958236f407

diff --git a/vcl/source/gdi/bitmap3.cxx b/vcl/source/gdi/bitmap3.cxx
index eeec752..6507d5d 100644
--- a/vcl/source/gdi/bitmap3.cxx
+++ b/vcl/source/gdi/bitmap3.cxx
@@ -1179,6 +1179,7 @@ sal_Bool Bitmap::ImplScaleInterpolate( const double& rScaleX, const double& rSca
         if( bRet )
         {
             bRet = sal_False;
+            const Bitmap aOriginal(*this);
             *this = aNewBmp;
             aNewBmp = Bitmap( Size( nNewWidth, nNewHeight ), 24 );
             pReadAcc = AcquireReadAccess();
@@ -1249,7 +1250,7 @@ sal_Bool Bitmap::ImplScaleInterpolate( const double& rScaleX, const double& rSca
 
             if( bRet )
             {
-                ImplAdaptBitCount(aNewBmp);
+                aOriginal.ImplAdaptBitCount(aNewBmp);
                 *this = aNewBmp;
             }
         }
commit d959ff60f0f014a03ecbb55b2ab6256d474f5e84
Author: Armin Le Grand <alg at apache.org>
Date:   Thu Nov 1 08:35:23 2012 +0000

    Related: #i119536# removed code no longer needed after fix of that task
    
    (cherry picked from commit bcc6f1762eda8ac5290eb10b4ad47a249c9b5f51)
    
    Conflicts:
    	sd/source/filter/eppt/epptso.cxx
    
    Change-Id: I42bce7ff99264d3bd1e3e5dbdf8eda87a05361a7

diff --git a/sd/source/filter/eppt/epptso.cxx b/sd/source/filter/eppt/epptso.cxx
index 30ce35d..fa1a46b 100644
--- a/sd/source/filter/eppt/epptso.cxx
+++ b/sd/source/filter/eppt/epptso.cxx
@@ -2835,21 +2835,10 @@ void PPTWriter::ImplWritePage( const PHLayout& rLayout, EscherSolverContainer& a
                     else
                     {
                         ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );
-                        const Rectangle aOldRect100thmm(aRect100thmm);
 
                         if ( aPropOpt.CreateGraphicProperties( mXPropSet, OUString( "GraphicURL" ), sal_False, sal_True ) )
                         {
                             aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
-
-                            if(aOldRect100thmm != aRect100thmm)
-                            {
-                                // #119536# graphic has been adapted (rotated) so that it can be saved without angle,
-                                // adapt local values as needed
-                                maPosition = MapPoint( ::com::sun::star::awt::Point( aRect100thmm.Left(), aRect100thmm.Top() ) );
-                                maSize = MapSize( ::com::sun::star::awt::Size ( aRect100thmm.GetWidth(), aRect100thmm.GetHeight() ) );
-                                maRect = Rectangle( Point( maPosition.X, maPosition.Y ), Size( maSize.Width, maSize.Height ) );
-                                mnAngle = 0;
-                            }
                         }
                     }
                 }
commit 131486a9ad5d3c66911adeb4608d2d0e1d8dc31b
Author: Armin Le Grand <alg at apache.org>
Date:   Wed Oct 31 16:17:35 2012 +0000

    removed unused variable bSuppressRotation
    
    (cherry picked from commit b7a63f1dc7c1ddab8092f1b7b9641923aa857579)
    
    Conflicts:
    	filter/inc/filter/msfilter/escherex.hxx
    
    Change-Id: I66b664c26d5db2dae2deea36490350d40deb3ccd

diff --git a/filter/source/msfilter/escherex.cxx b/filter/source/msfilter/escherex.cxx
index a517f32..f667769 100644
--- a/filter/source/msfilter/escherex.cxx
+++ b/filter/source/msfilter/escherex.cxx
@@ -146,7 +146,6 @@ void EscherPropertyContainer::ImplInit()
     nCountSize = 0;
     nSortBufSize = 64;
     bHasComplexData = sal_False;
-    bSuppressRotation = sal_False;
     pSortStruct = new EscherPropSortStruct[ nSortBufSize ];
 }
 
@@ -311,9 +310,6 @@ void EscherPropertyContainer::Commit( SvStream& rSt, sal_uInt16 nVersion, sal_uI
             sal_uInt32 nPropValue = pSortStruct[ i ].nPropValue;
             sal_uInt16 nPropId = pSortStruct[ i ].nPropId;
 
-            if ( bSuppressRotation && ( nPropId == ESCHER_Prop_Rotation ) )
-                nPropValue = 0;
-
             rSt << nPropId
                 << nPropValue;
         }
@@ -2336,7 +2332,6 @@ sal_Bool EscherPropertyContainer::CreateConnectorProperties(
                         }
                         CreateLineProperties( aXPropSet, sal_False );
                         bRetValue = sal_True;
-                        bSuppressRotation = sal_False;
                     }
                 }
             }
diff --git a/include/filter/msfilter/escherex.hxx b/include/filter/msfilter/escherex.hxx
index d21e2f0..289cc79 100644
--- a/include/filter/msfilter/escherex.hxx
+++ b/include/filter/msfilter/escherex.hxx
@@ -1177,7 +1177,6 @@ class MSFILTER_DLLPUBLIC EscherPropertyContainer
     sal_uInt32              nCountSize;
 
     sal_Bool                bHasComplexData;
-    sal_Bool                bSuppressRotation;
 
 
     sal_uInt32  ImplGetColor( const sal_uInt32 rColor, sal_Bool bSwap = sal_True );
commit 9536e3cbb8b1e765b83cdb10359cca91ff80b172
Author: Armin Le Grand <alg at apache.org>
Date:   Tue Oct 30 11:02:38 2012 +0000

    Resolves: #i121233# some slight corrections/enhancements
    
    (cherry picked from commit db00dfd93ac0e215a5d71e72645790918db0e734)
    
    Conflicts:
    	vcl/inc/vcl/bitmap.hxx
    	vcl/source/gdi/bitmap3.cxx
    
    Change-Id: I1a7817a94232b3d7f1c095dd27025e4cccea348c

diff --git a/drawinglayer/source/processor2d/vclhelperbitmaptransform.cxx b/drawinglayer/source/processor2d/vclhelperbitmaptransform.cxx
index 6033eb4..76ea68d 100644
--- a/drawinglayer/source/processor2d/vclhelperbitmaptransform.cxx
+++ b/drawinglayer/source/processor2d/vclhelperbitmaptransform.cxx
@@ -110,78 +110,14 @@ namespace drawinglayer
             }
         }
 
-        void impSmoothIndex(BitmapColor& rValue, const basegfx::B2DPoint& rSource, sal_Int32 nIntX, sal_Int32 nIntY, BitmapReadAccess& rRead)
+        Bitmap impTransformBitmap(
+            const Bitmap& rSource,
+            const Size aDestinationSize,
+            const basegfx::B2DHomMatrix& rTransform,
+            bool bSmooth)
         {
-            double fDeltaX(rSource.getX() - nIntX);
-            double fDeltaY(rSource.getY() - nIntY);
-            sal_Int32 nIndX(0L);
-            sal_Int32 nIndY(0L);
-
-            if(fDeltaX > 0.0 && nIntX + 1L < rRead.Width())
-            {
-                nIndX++;
-            }
-            else if(fDeltaX < 0.0 && nIntX >= 1L)
-            {
-                fDeltaX = -fDeltaX;
-                nIndX--;
-            }
-
-            if(fDeltaY > 0.0 && nIntY + 1L < rRead.Height())
-            {
-                nIndY++;
-            }
-            else if(fDeltaY < 0.0 && nIntY >= 1L)
-            {
-                fDeltaY = -fDeltaY;
-                nIndY--;
-            }
-
-            if(nIndX || nIndY)
-            {
-                const double fColorToReal(1.0 / 255.0);
-                double fVal(rValue.GetIndex() * fColorToReal);
-                double fValBottom(0.0);
-
-                if(nIndX)
-                {
-                    const double fMulA(fDeltaX * fColorToReal);
-                    double fMulB(1.0 - fDeltaX);
-                    const BitmapColor aTopPartner(rRead.GetPixel(nIntY, nIntX + nIndX));
-
-                    fVal = (fVal * fMulB) + (aTopPartner.GetIndex() * fMulA);
-
-                    if(nIndY)
-                    {
-                        fMulB *= fColorToReal;
-                        const BitmapColor aBottom(rRead.GetPixel(nIntY + nIndY, nIntX));
-                        const BitmapColor aBottomPartner(rRead.GetPixel(nIntY + nIndY, nIntX + nIndX));
-
-                        fValBottom = (aBottom.GetIndex() * fMulB) + (aBottomPartner.GetIndex() * fMulA);
-                    }
-                }
-
-                if(nIndY)
-                {
-                    if(!nIndX)
-                    {
-                        const BitmapColor aBottom(rRead.GetPixel(nIntY + nIndY, nIntX));
-
-                        fValBottom = aBottom.GetIndex() * fColorToReal;
-                    }
-
-                    const double fMulB(1.0 - fDeltaY);
-
-                    fVal = (fVal * fMulB) + (fValBottom * fDeltaY);
-                }
-
-                rValue.SetIndex((sal_uInt8)(fVal * 255.0));
-            }
-        }
-
-        void impTransformBitmap(const Bitmap& rSource, Bitmap& rDestination, const basegfx::B2DHomMatrix& rTransform, bool bSmooth)
-        {
-            BitmapWriteAccess* pWrite = rDestination.AcquireWriteAccess();
+            Bitmap aDestination(aDestinationSize, 24);
+            BitmapWriteAccess* pWrite = aDestination.AcquireWriteAccess();
 
             if(pWrite)
             {
@@ -190,9 +126,9 @@ namespace drawinglayer
 
                 if(pRead)
                 {
-                    const Size aDestinationSizePixel(rDestination.GetSizePixel());
-                    bool bWorkWithIndex(rDestination.GetBitCount() <= 8);
-                    BitmapColor aOutside(pRead->GetBestMatchingColor(BitmapColor(0xff, 0xff, 0xff)));
+                    const Size aDestinationSizePixel(aDestination.GetSizePixel());
+                    bool bWorkWithIndex(rSource.GetBitCount() <= 8);
+                    BitmapColor aOutside(BitmapColor(0xff, 0xff, 0xff));
 
                     for(sal_Int32 y(0L); y < aDestinationSizePixel.getHeight(); y++)
                     {
@@ -207,29 +143,24 @@ namespace drawinglayer
 
                                 if(nIntY >= 0L && nIntY < aContentSizePixel.getHeight())
                                 {
+                                    // inside pixel
+                                    BitmapColor aValue;
+
                                     if(bWorkWithIndex)
                                     {
-                                        BitmapColor aValue(pRead->GetPixel(nIntY, nIntX));
-
-                                        if(bSmooth)
-                                        {
-                                            impSmoothIndex(aValue, aSourceCoor, nIntX, nIntY, *pRead);
-                                        }
-
-                                        pWrite->SetPixel(y, x, aValue);
+                                        aValue = pRead->GetPaletteColor(pRead->GetPixelIndex(nIntY, nIntX));
                                     }
                                     else
                                     {
-                                        BitmapColor aValue(pRead->GetColor(nIntY, nIntX));
-
-                                        if(bSmooth)
-                                        {
-                                            impSmoothPoint(aValue, aSourceCoor, nIntX, nIntY, *pRead);
-                                        }
+                                        aValue = pRead->GetPixel(nIntY, nIntX);
+                                    }
 
-                                        pWrite->SetPixel(y, x, aValue.IsIndex() ? aValue : pWrite->GetBestMatchingColor(aValue));
+                                    if(bSmooth)
+                                    {
+                                        impSmoothPoint(aValue, aSourceCoor, nIntX, nIntY, *pRead);
                                     }
 
+                                    pWrite->SetPixel(y, x, aValue);
                                     continue;
                                 }
                             }
@@ -247,29 +178,10 @@ namespace drawinglayer
 
                 delete pWrite;
             }
-        }
-
-        Bitmap impCreateEmptyBitmapWithPattern(const Bitmap& rSource, const Size& aTargetSizePixel)
-        {
-            Bitmap aRetval;
-            BitmapReadAccess* pReadAccess = (const_cast< Bitmap& >(rSource)).AcquireReadAccess();
 
-            if(pReadAccess)
-            {
-                if(rSource.GetBitCount() <= 8)
-                {
-                    BitmapPalette aPalette(pReadAccess->GetPalette());
-                    aRetval = Bitmap(aTargetSizePixel, rSource.GetBitCount(), &aPalette);
-                }
-                else
-                {
-                    aRetval = Bitmap(aTargetSizePixel, rSource.GetBitCount());
-                }
-
-                delete pReadAccess;
-            }
+            rSource.AdaptBitCount(aDestination);
 
-            return aRetval;
+            return aDestination;
         }
     } // end of anonymous namespace
 } // end of namespace drawinglayer
@@ -283,23 +195,20 @@ namespace drawinglayer
     {
         // force destination to 24 bit, we want to smooth output
         const Size aDestinationSize(rCroppedRectPixel.GetSize());
-        Bitmap aDestination(impCreateEmptyBitmapWithPattern(rSource.GetBitmap(), aDestinationSize));
         static bool bDoSmoothAtAll(true);
-        impTransformBitmap(rSource.GetBitmap(), aDestination, rTransform, bDoSmoothAtAll);
+        const Bitmap aDestination(impTransformBitmap(rSource.GetBitmap(), aDestinationSize, rTransform, bDoSmoothAtAll));
 
         // create mask
         if(rSource.IsTransparent())
         {
             if(rSource.IsAlpha())
             {
-                Bitmap aAlpha(impCreateEmptyBitmapWithPattern(rSource.GetAlpha().GetBitmap(), aDestinationSize));
-                impTransformBitmap(rSource.GetAlpha().GetBitmap(), aAlpha, rTransform, bDoSmoothAtAll);
+                const Bitmap aAlpha(impTransformBitmap(rSource.GetAlpha().GetBitmap(), aDestinationSize, rTransform, bDoSmoothAtAll));
                 return BitmapEx(aDestination, AlphaMask(aAlpha));
             }
             else
             {
-                Bitmap aMask(impCreateEmptyBitmapWithPattern(rSource.GetMask(), aDestinationSize));
-                impTransformBitmap(rSource.GetMask(), aMask, rTransform, false);
+                const Bitmap aMask(impTransformBitmap(rSource.GetMask(), aDestinationSize, rTransform, false));
                 return BitmapEx(aDestination, aMask);
             }
         }
diff --git a/include/vcl/bitmap.hxx b/include/vcl/bitmap.hxx
index 1715022..a5388fa 100644
--- a/include/vcl/bitmap.hxx
+++ b/include/vcl/bitmap.hxx
@@ -342,7 +342,7 @@ public:
                                                             BitmapWriteAccess& rAcc, sal_Bool bRLE4 );
     SAL_DLLPRIVATE static sal_Bool      ImplWriteRLE( SvStream& rOStm, BitmapReadAccess& rAcc, sal_Bool bRLE4 );
 
-    SAL_DLLPRIVATE void                 ImplAdaptBitCount(Bitmap& rNew);
+    SAL_DLLPRIVATE void                 ImplAdaptBitCount(Bitmap& rNew) const;
     SAL_DLLPRIVATE sal_Bool             ImplScaleFast( const double& rScaleX, const double& rScaleY );
     SAL_DLLPRIVATE sal_Bool             ImplScaleInterpolate( const double& rScaleX, const double& rScaleY );
     SAL_DLLPRIVATE sal_Bool             ImplScaleSuper( const double& rScaleX, const double& rScaleY );
@@ -616,6 +616,10 @@ public:
      */
     sal_Bool                    Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag = BMP_SCALE_DEFAULT );
 
+    // Adapt the BitCount of rNew to BitCount of lolal, including grey or color paltette
+    // Can be used to create alpha/mask bitmaps after their processing in 24bit
+    void AdaptBitCount(Bitmap& rNew) const;
+
     /** Rotate bitmap by the specified angle
 
         @param nAngle10
diff --git a/vcl/source/gdi/bitmap3.cxx b/vcl/source/gdi/bitmap3.cxx
index 1ee4ce4..eeec752 100644
--- a/vcl/source/gdi/bitmap3.cxx
+++ b/vcl/source/gdi/bitmap3.cxx
@@ -950,7 +950,16 @@ sal_Bool Bitmap::Scale( const Size& rNewSize, sal_uInt32 nScaleFlag )
     return bRet;
 }
 
-void Bitmap::ImplAdaptBitCount(Bitmap& rNew)
+// ------------------------------------------------------------------------
+
+void Bitmap::AdaptBitCount(Bitmap& rNew) const
+{
+    ImplAdaptBitCount(rNew);
+}
+
+// ------------------------------------------------------------------------
+
+void Bitmap::ImplAdaptBitCount(Bitmap& rNew) const
 {
     // aNew is the result of some operation; adapt it's BitCount to the original (this)
     if(GetBitCount() != rNew.GetBitCount())
@@ -1109,73 +1118,52 @@ sal_Bool Bitmap::ImplScaleInterpolate( const double& rScaleX, const double& rSca
                 pLutFrac[ nX ] = (long) ( fTemp * 1024. );
             }
 
-            if( pReadAcc->HasPalette() )
+            for( nY = 0L; nY < nHeight; nY++ )
             {
-                for( nY = 0L; nY < nHeight; nY++ )
+                if( 1 == nWidth )
                 {
-                    if( 1 == nWidth )
+                    if( pReadAcc->HasPalette() )
                     {
                         aCol0 = pReadAcc->GetPaletteColor( pReadAcc->GetPixelIndex( nY, 0 ) );
-
-                        for( nX = 0L; nX < nNewWidth; nX++ )
-                            pWriteAcc->SetPixel( nY, nX, aCol0 );
                     }
                     else
                     {
-                        for( nX = 0L; nX < nNewWidth; nX++ )
-                        {
-                            nTemp = pLutInt[ nX ];
-
-                            aCol0 = pReadAcc->GetPaletteColor( pReadAcc->GetPixelIndex( nY, nTemp++ ) );
-                            aCol1 = pReadAcc->GetPaletteColor( pReadAcc->GetPixelIndex( nY, nTemp ) );
-
-                            nTemp = pLutFrac[ nX ];
-
-                            lXR1 = aCol1.GetRed() - ( lXR0 = aCol0.GetRed() );
-                            lXG1 = aCol1.GetGreen() - ( lXG0 = aCol0.GetGreen() );
-                            lXB1 = aCol1.GetBlue() - ( lXB0 = aCol0.GetBlue() );
-
-                            aCol0.SetRed( (sal_uInt8) ( ( lXR1 * nTemp + ( lXR0 << 10 ) ) >> 10 ) );
-                            aCol0.SetGreen( (sal_uInt8) ( ( lXG1 * nTemp + ( lXG0 << 10 ) ) >> 10 ) );
-                            aCol0.SetBlue( (sal_uInt8) ( ( lXB1 * nTemp + ( lXB0 << 10 ) ) >> 10 ) );
+                        aCol0 = pReadAcc->GetPixel( nY, 0 );
+                    }
 
-                            pWriteAcc->SetPixel( nY, nX, aCol0 );
-                        }
+                    for( nX = 0L; nX < nNewWidth; nX++ )
+                    {
+                        pWriteAcc->SetPixel( nY, nX, aCol0 );
                     }
                 }
-            }
-            else
-            {
-                for( nY = 0L; nY < nHeight; nY++ )
+                else
                 {
-                    if( 1 == nWidth )
+                    for( nX = 0L; nX < nNewWidth; nX++ )
                     {
-                        aCol0 = pReadAcc->GetPixel( nY, 0 );
+                        nTemp = pLutInt[ nX ];
 
-                        for( nX = 0L; nX < nNewWidth; nX++ )
-                            pWriteAcc->SetPixel( nY, nX, aCol0 );
-                    }
-                    else
-                    {
-                        for( nX = 0L; nX < nNewWidth; nX++ )
+                        if( pReadAcc->HasPalette() )
+                        {
+                            aCol0 = pReadAcc->GetPaletteColor( pReadAcc->GetPixelIndex( nY, nTemp++ ) );
+                            aCol1 = pReadAcc->GetPaletteColor( pReadAcc->GetPixelIndex( nY, nTemp ) );
+                        }
+                        else
                         {
-                            nTemp = pLutInt[ nX ];
-
                             aCol0 = pReadAcc->GetPixel( nY, nTemp++ );
                             aCol1 = pReadAcc->GetPixel( nY, nTemp );
+                        }
 
-                            nTemp = pLutFrac[ nX ];
+                        nTemp = pLutFrac[ nX ];
 
-                            lXR1 = aCol1.GetRed() - ( lXR0 = aCol0.GetRed() );
-                            lXG1 = aCol1.GetGreen() - ( lXG0 = aCol0.GetGreen() );
-                            lXB1 = aCol1.GetBlue() - ( lXB0 = aCol0.GetBlue() );
+                        lXR1 = aCol1.GetRed() - ( lXR0 = aCol0.GetRed() );
+                        lXG1 = aCol1.GetGreen() - ( lXG0 = aCol0.GetGreen() );
+                        lXB1 = aCol1.GetBlue() - ( lXB0 = aCol0.GetBlue() );
 
-                            aCol0.SetRed( (sal_uInt8) ( ( lXR1 * nTemp + ( lXR0 << 10 ) ) >> 10 ) );
-                            aCol0.SetGreen( (sal_uInt8) ( ( lXG1 * nTemp + ( lXG0 << 10 ) ) >> 10 ) );
-                            aCol0.SetBlue( (sal_uInt8) ( ( lXB1 * nTemp + ( lXB0 << 10 ) ) >> 10 ) );
+                        aCol0.SetRed( (sal_uInt8) ( ( lXR1 * nTemp + ( lXR0 << 10 ) ) >> 10 ) );
+                        aCol0.SetGreen( (sal_uInt8) ( ( lXG1 * nTemp + ( lXG0 << 10 ) ) >> 10 ) );
+                        aCol0.SetBlue( (sal_uInt8) ( ( lXB1 * nTemp + ( lXB0 << 10 ) ) >> 10 ) );
 
-                            pWriteAcc->SetPixel( nY, nX, aCol0 );
-                        }
+                        pWriteAcc->SetPixel( nY, nX, aCol0 );
                     }
                 }
             }
@@ -1191,10 +1179,9 @@ sal_Bool Bitmap::ImplScaleInterpolate( const double& rScaleX, const double& rSca
         if( bRet )
         {
             bRet = sal_False;
-            ImplAdaptBitCount(aNewBmp);
-            ImplAssignWithSize( aNewBmp );
-            pReadAcc = AcquireReadAccess();
+            *this = aNewBmp;
             aNewBmp = Bitmap( Size( nNewWidth, nNewHeight ), 24 );
+            pReadAcc = AcquireReadAccess();
             pWriteAcc = aNewBmp.AcquireWriteAccess();
 
             if( pReadAcc && pWriteAcc )
@@ -1214,73 +1201,40 @@ sal_Bool Bitmap::ImplScaleInterpolate( const double& rScaleX, const double& rSca
                     pLutFrac[ nY ] = (long) ( fTemp * 1024. );
                 }
 
-                if( pReadAcc->HasPalette() )
+                // after 1st step, bitmap *is* 24bit format (see above)
+                OSL_ENSURE(!pReadAcc->HasPalette(), "OOps, somehow ImplScaleInterpolate in-between format has palette, should not happen (!)");
+
+                for( nX = 0L; nX < nNewWidth; nX++ )
                 {
-                    for( nX = 0L; nX < nNewWidth; nX++ )
+                    if( 1 == nHeight )
                     {
-                        if( 1 == nHeight )
-                        {
-                            aCol0 = pReadAcc->GetPaletteColor( pReadAcc->GetPixelIndex( 0, nX ) );
+                        aCol0 = pReadAcc->GetPixel( 0, nX );
 
-                            for( nY = 0L; nY < nNewHeight; nY++ )
-                                pWriteAcc->SetPixel( nY, nX, aCol0 );
-                        }
-                        else
+                        for( nY = 0L; nY < nNewHeight; nY++ )
                         {
-                            for( nY = 0L; nY < nNewHeight; nY++ )
-                            {
-                                nTemp = pLutInt[ nY ];
-
-                                aCol0 = pReadAcc->GetPaletteColor( pReadAcc->GetPixelIndex( nTemp++, nX ) );
-                                aCol1 = pReadAcc->GetPaletteColor( pReadAcc->GetPixelIndex( nTemp, nX ) );
-
-                                nTemp = pLutFrac[ nY ];
-
-                                lXR1 = aCol1.GetRed() - ( lXR0 = aCol0.GetRed() );
-                                lXG1 = aCol1.GetGreen() - ( lXG0 = aCol0.GetGreen() );
-                                lXB1 = aCol1.GetBlue() - ( lXB0 = aCol0.GetBlue() );
-
-                                aCol0.SetRed( (sal_uInt8) ( ( lXR1 * nTemp + ( lXR0 << 10 ) ) >> 10 ) );
-                                aCol0.SetGreen( (sal_uInt8) ( ( lXG1 * nTemp + ( lXG0 << 10 ) ) >> 10 ) );
-                                aCol0.SetBlue( (sal_uInt8) ( ( lXB1 * nTemp + ( lXB0 << 10 ) ) >> 10 ) );
-
-                                pWriteAcc->SetPixel( nY, nX, aCol0 );
-                            }
+                            pWriteAcc->SetPixel( nY, nX, aCol0 );
                         }
                     }
-                }
-                else
-                {
-                    for( nX = 0L; nX < nNewWidth; nX++ )
+                    else
                     {
-                        if( 1 == nHeight )
-                        {
-                            aCol0 = pReadAcc->GetPixel( 0, nX );
-
-                            for( nY = 0L; nY < nNewHeight; nY++ )
-                                pWriteAcc->SetPixel( nY, nX, aCol0 );
-                        }
-                        else
+                        for( nY = 0L; nY < nNewHeight; nY++ )
                         {
-                            for( nY = 0L; nY < nNewHeight; nY++ )
-                            {
-                                nTemp = pLutInt[ nY ];
+                            nTemp = pLutInt[ nY ];
 
-                                aCol0 = pReadAcc->GetPixel( nTemp++, nX );
-                                aCol1 = pReadAcc->GetPixel( nTemp, nX );
+                            aCol0 = pReadAcc->GetPixel( nTemp++, nX );
+                            aCol1 = pReadAcc->GetPixel( nTemp, nX );
 
-                                nTemp = pLutFrac[ nY ];
+                            nTemp = pLutFrac[ nY ];
 
-                                lXR1 = aCol1.GetRed() - ( lXR0 = aCol0.GetRed() );
-                                lXG1 = aCol1.GetGreen() - ( lXG0 = aCol0.GetGreen() );
-                                lXB1 = aCol1.GetBlue() - ( lXB0 = aCol0.GetBlue() );
+                            lXR1 = aCol1.GetRed() - ( lXR0 = aCol0.GetRed() );
+                            lXG1 = aCol1.GetGreen() - ( lXG0 = aCol0.GetGreen() );
+                            lXB1 = aCol1.GetBlue() - ( lXB0 = aCol0.GetBlue() );
 
-                                aCol0.SetRed( (sal_uInt8) ( ( lXR1 * nTemp + ( lXR0 << 10 ) ) >> 10 ) );
-                                aCol0.SetGreen( (sal_uInt8) ( ( lXG1 * nTemp + ( lXG0 << 10 ) ) >> 10 ) );
-                                aCol0.SetBlue( (sal_uInt8) ( ( lXB1 * nTemp + ( lXB0 << 10 ) ) >> 10 ) );
+                            aCol0.SetRed( (sal_uInt8) ( ( lXR1 * nTemp + ( lXR0 << 10 ) ) >> 10 ) );
+                            aCol0.SetGreen( (sal_uInt8) ( ( lXG1 * nTemp + ( lXG0 << 10 ) ) >> 10 ) );
+                            aCol0.SetBlue( (sal_uInt8) ( ( lXB1 * nTemp + ( lXB0 << 10 ) ) >> 10 ) );
 
-                                pWriteAcc->SetPixel( nY, nX, aCol0 );
-                            }
+                            pWriteAcc->SetPixel( nY, nX, aCol0 );
                         }
                     }
                 }
@@ -1296,13 +1250,15 @@ sal_Bool Bitmap::ImplScaleInterpolate( const double& rScaleX, const double& rSca
             if( bRet )
             {
                 ImplAdaptBitCount(aNewBmp);
-                ImplAssignWithSize( aNewBmp );
+                *this = aNewBmp;
             }
         }
     }
 
     if( !bRet )
+    {
         bRet = ImplScaleFast( rScaleX, rScaleY );
+    }
 
     return bRet;
 }


More information about the Libreoffice-commits mailing list