You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2013/07/17 14:28:59 UTC

svn commit: r1504094 - in /openoffice/branches/alg/sysdepgs/main: basegfx/prj/ drawinglayer/inc/drawinglayer/processor2d/ drawinglayer/source/processor2d/ tools/inc/tools/ vcl/win/source/gdi/

Author: alg
Date: Wed Jul 17 12:28:59 2013
New Revision: 1504094

URL: http://svn.apache.org/r1504094
Log:
Adaptive changes for TransparencePrimitive handling

Modified:
    openoffice/branches/alg/sysdepgs/main/basegfx/prj/d.lst
    openoffice/branches/alg/sysdepgs/main/drawinglayer/inc/drawinglayer/processor2d/win_pixelprocessor2d.hxx
    openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/vclprocessor2d.cxx
    openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/win_pixelprocessor2d.cxx
    openoffice/branches/alg/sysdepgs/main/tools/inc/tools/color.hxx
    openoffice/branches/alg/sysdepgs/main/vcl/win/source/gdi/salgdi_gdiplus.cxx

Modified: openoffice/branches/alg/sysdepgs/main/basegfx/prj/d.lst
URL: http://svn.apache.org/viewvc/openoffice/branches/alg/sysdepgs/main/basegfx/prj/d.lst?rev=1504094&r1=1504093&r2=1504094&view=diff
==============================================================================
--- openoffice/branches/alg/sysdepgs/main/basegfx/prj/d.lst (original)
+++ openoffice/branches/alg/sysdepgs/main/basegfx/prj/d.lst Wed Jul 17 12:28:59 2013
@@ -99,6 +99,7 @@ mkdir: %_DEST%\inc%_EXT%\basegfx\tools
 ..\inc\basegfx\tools\rectcliptools.hxx %_DEST%\inc%_EXT%\basegfx\tools\rectcliptools.hxx
 ..\inc\basegfx\tools\tools.hxx %_DEST%\inc%_EXT%\basegfx\tools\tools.hxx
 ..\inc\basegfx\tools\gradienttools.hxx %_DEST%\inc%_EXT%\basegfx\tools\gradienttools.hxx
+..\inc\basegfx\tools\canvastools.hxx %_DEST%\inc%_EXT%\basegfx\tools\canvastools.hxx
 
 mkdir: %_DEST%\inc%_EXT%\basegfx\color
 ..\inc\basegfx\color\bcolor.hxx %_DEST%\inc%_EXT%\basegfx\color\bcolor.hxx

Modified: openoffice/branches/alg/sysdepgs/main/drawinglayer/inc/drawinglayer/processor2d/win_pixelprocessor2d.hxx
URL: http://svn.apache.org/viewvc/openoffice/branches/alg/sysdepgs/main/drawinglayer/inc/drawinglayer/processor2d/win_pixelprocessor2d.hxx?rev=1504094&r1=1504093&r2=1504094&view=diff
==============================================================================
--- openoffice/branches/alg/sysdepgs/main/drawinglayer/inc/drawinglayer/processor2d/win_pixelprocessor2d.hxx (original)
+++ openoffice/branches/alg/sysdepgs/main/drawinglayer/inc/drawinglayer/processor2d/win_pixelprocessor2d.hxx Wed Jul 17 12:28:59 2013
@@ -38,9 +38,15 @@
 
 #include <GdiPlus.h>
 
+#undef min
+#undef max
+
 //////////////////////////////////////////////////////////////////////////////
 // predefines
 class OutputDevice;
+class VirtualDevice;
+class Gdiplus::Graphics;
+class Gdiplus::Bitmap;
 
 //////////////////////////////////////////////////////////////////////////////
 
@@ -56,8 +62,17 @@ namespace drawinglayer
         class Win_PixelProcessor2D : public BaseProcessor2D
         {
         private:
-            // the OutputDevice started with
-            OutputDevice&                           mrOutDev;
+            // current pixel output size
+            sal_uInt32                              mnWidth;
+            sal_uInt32                              mnHeight;
+
+            // buffer devices used for TransparencePrimitive2D
+            Gdiplus::Bitmap*                        mpBitmapContent;
+            Gdiplus::Graphics*                      mpGraphicsContent;
+            Gdiplus::Bitmap*                        mpBitmapMask;
+            Gdiplus::Graphics*                      mpGraphicsMask;
+            Gdiplus::Bitmap*                        mpBitmapAlpha;
+            Gdiplus::Graphics*                      mpGraphicsAlpha;
 
             // the current Gdiplus::Graphics and the stack
             Gdiplus::Graphics*                      mpGraphics;

Modified: openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/vclprocessor2d.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/vclprocessor2d.cxx?rev=1504094&r1=1504093&r2=1504094&view=diff
==============================================================================
--- openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/vclprocessor2d.cxx (original)
+++ openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/vclprocessor2d.cxx Wed Jul 17 12:28:59 2013
@@ -127,7 +127,7 @@ namespace drawinglayer
         // tooling
         void VclProcessor2D::pushOutputDevice(OutputDevice& rNew)
         {
-            mnOutputDevices.push_back(&rNew);
+            mnOutputDevices.push_back(mpOutputDevice);
             mpOutputDevice = &rNew;
         }
 
@@ -1630,12 +1630,14 @@ namespace drawinglayer
             }
 
             rOutDev.SetDigitLanguage(eLang);
-            pushOutputDevice(rOutDev);
+
+            mpOutputDevice = &rOutDev;
+            mnOutputDevices.push_back(&rOutDev);
 		}
 
 		VclProcessor2D::~VclProcessor2D()
 		{
-            popOutputDevice();
+            mnOutputDevices.pop_back();
             OSL_ENSURE(mnOutputDevices.empty(), "Mismatch in push/popOutputDevices (!)");
 		}
 	} // end of namespace processor2d

Modified: openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/win_pixelprocessor2d.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/win_pixelprocessor2d.cxx?rev=1504094&r1=1504093&r2=1504094&view=diff
==============================================================================
--- openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/win_pixelprocessor2d.cxx (original)
+++ openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/win_pixelprocessor2d.cxx Wed Jul 17 12:28:59 2013
@@ -37,6 +37,7 @@
 #include <drawinglayer/primitive2d/maskprimitive2d.hxx>
 #include <drawinglayer/primitive2d/modifiedcolorprimitive2d.hxx>
 #include <drawinglayer/primitive2d/transformprimitive2d.hxx>
+#include <vcl/virdev.hxx>
 //#include <GdiPlusEnums.h>
 //#include <GdiPlusColor.h>
 
@@ -94,65 +95,29 @@ namespace drawinglayer
             const geometry::ViewInformation2D& rViewInformation, 
             OutputDevice& rOutDev)
         :   BaseProcessor2D(rViewInformation),
-            mrOutDev(rOutDev),
+            mnWidth(rOutDev.GetOutputSizePixel().Width()),
+            mnHeight(rOutDev.GetOutputSizePixel().Height()),
             mpGraphics(0),
             maBColorModifierStack(),
             maCurrentTransformation(),
             maDrawinglayerOpt()
         {
-            // set digit language, derived from SvtCTLOptions to have the correct
-            // number display for arabic/hindi numerals
-            const SvtCTLOptions aSvtCTLOptions;
-            LanguageType eLang(LANGUAGE_SYSTEM);
-
-            if(SvtCTLOptions::NUMERALS_HINDI == aSvtCTLOptions.GetCTLTextNumerals())
-            {
-                eLang = LANGUAGE_ARABIC_SAUDI_ARABIA;
-            }
-            else if(SvtCTLOptions::NUMERALS_ARABIC == aSvtCTLOptions.GetCTLTextNumerals())
-            {
-                eLang = LANGUAGE_ENGLISH;
-            }
-            else
-            {
-                eLang = (LanguageType)Application::GetSettings().GetLanguage();
-            }
-
-            mrOutDev.SetDigitLanguage(eLang);
-
             // prepare getCurrentTransformation() matrix with viewTransformation to target directly to pixels
             setCurrentTransformation(rViewInformation.getObjectToViewTransformation());
 
-            // prepare output directly to pixels
-            mrOutDev.Push(PUSH_MAPMODE);
-            mrOutDev.SetMapMode();
-
-            // react on AntiAliasing settings
-            if(getOptionsDrawinglayer().IsAntiAliasing())
-            {
-                mrOutDev.SetAntialiasing(mrOutDev.GetAntialiasing() | ANTIALIASING_ENABLE_B2DDRAW);
-            }
-            else
-            {
-                mrOutDev.SetAntialiasing(mrOutDev.GetAntialiasing() & ~ANTIALIASING_ENABLE_B2DDRAW);
-            }
-
             // create Gdiplus::Graphics entry for new OutputDevice
-            SystemGraphicsData aSystemGraphicsData(mrOutDev.GetSystemGfxData());
+            SystemGraphicsData aSystemGraphicsData(rOutDev.GetSystemGfxData());
             mpGraphics = new Gdiplus::Graphics(aSystemGraphicsData.hDC);
+
+            // init AntiAliasing and transformation
             setAntialiasing(getGraphics(), getOptionsDrawinglayer().IsAntiAliasing());
             setMatrix(getGraphics(), getCurrentTransformation());
         }
 
         Win_PixelProcessor2D::~Win_PixelProcessor2D()
         {
+            // cleanup Gdiplus::Graphics
             delete mpGraphics;
-
-            // restore MapMode
-            mrOutDev.Pop();
-
-            // restore AntiAliasing
-            mrOutDev.SetAntialiasing(mrOutDev.GetAntialiasing() & ~ANTIALIASING_ENABLE_B2DDRAW);
         }
 
         void Win_PixelProcessor2D::processBasePrimitive2D(const primitive2d::BasePrimitive2D& rCandidate)
@@ -280,156 +245,187 @@ namespace drawinglayer
 
                         if(isVisible(getGraphics(), aRange))
                         {
-                            const sal_uInt32 nFullWidth(mrOutDev.GetOutputSizePixel().Width());
-                            const sal_uInt32 nFullHeight(mrOutDev.GetOutputSizePixel().Height());
-
                             aRange.transform(getCurrentTransformation());
-                            aRange.intersect(basegfx::B2DRange(0.0, 0.0, nFullWidth, nFullHeight));
+                            aRange.intersect(basegfx::B2DRange(0.0, 0.0, mnWidth, mnHeight));
 
                             if(!aRange.isEmpty())
                             {
-                                // prepare bitmap and graphics for child content
+                                // get involved pixel sizes
                                 const sal_uInt32 nLeft(floor(aRange.getMinX()));
                                 const sal_uInt32 nTop(floor(aRange.getMinY()));
                                 const sal_uInt32 nRight(ceil(aRange.getMaxX()));
                                 const sal_uInt32 nBottom(ceil(aRange.getMaxY()));
                                 const sal_uInt32 nWidth(nRight - nLeft);
                                 const sal_uInt32 nHeight(nBottom - nTop);
-                                Gdiplus::Bitmap aBitmap(nWidth, nHeight, PixelFormat32bppRGB);
-                                Gdiplus::Graphics aBitmapGraphics(&aBitmap);
 
-                                // create new transformation
+                                // basic mechanism is: Allocate Gdi+ Bitmaps for content, mask and alpha, create
+                                // GDI+ Graphics for them (to paint to these). Use RGBA for content, RGB only for
+                                // mask and alpha. Mix these together (unfortunately GDI+ has no mechanism to mix
+                                // or copy/mix these when blitting) and paint the result as GDI+ Bitmap.
+                                //
+                                // It would also be possible to first fill the content bitmap with the target content,
+                                // but GDI+ seems not to provide a mechanism to get this data (a Bitmap from a Graphics).
+                                // When this would be possible, creating mask could be avoided, but alpha still would
+                                // need to be copied handish to content.
+                                // This could evtl. be done by starting the whole renderer with getting a GDI+ Bitmap
+                                // from the given OutputDevice and always have a Bitmap as render target. This would
+                                // lead in the direction to always have renderers which rander to Bitmaps, not to
+                                // OutputDevices in general, a valid thought anyways.
+                                Gdiplus::Bitmap aBitmapContent(nWidth, nHeight, PixelFormat32bppARGB);
+                                Gdiplus::Graphics aGraphicsContent(&aBitmapContent);
+                                Gdiplus::Bitmap aBitmapMask(nWidth, nHeight, PixelFormat24bppRGB);
+                                Gdiplus::Graphics aGraphicsMask(&aBitmapMask);
+                                Gdiplus::Bitmap aBitmapAlpha(nWidth, nHeight, PixelFormat24bppRGB);
+                                Gdiplus::Graphics aGraphicsAlpha(&aBitmapAlpha);
+
+                                // create new transformation and set
                                 const basegfx::B2DHomMatrix aLastCurrentTransformation(getCurrentTransformation());
                                 basegfx::B2DHomMatrix aNewTransformation(aLastCurrentTransformation);
                                 aNewTransformation.translate(nLeft * -1.0, nTop * -1.0);
                                 setCurrentTransformation(aNewTransformation);
 
-                                // set clipping, AntiAliasing and transformation
-                                aBitmapGraphics.SetClip(&getGraphics(), Gdiplus::CombineModeReplace);
-                                setAntialiasing(aBitmapGraphics, getOptionsDrawinglayer().IsAntiAliasing());
-                                setMatrix(aBitmapGraphics, getCurrentTransformation());
+                                // clear both
+                                const Gdiplus::SolidBrush aClearingBrush(Gdiplus::Color(255, 255, 255, 255));
+
+                                aGraphicsContent.FillRectangle(
+                                    &aClearingBrush,
+                                    (INT)0,
+                                    (INT)0,
+                                    (INT)nWidth,
+                                    (INT)nHeight);
+                                aGraphicsMask.FillRectangle(
+                                    &aClearingBrush,
+                                    (INT)0,
+                                    (INT)0,
+                                    (INT)nWidth,
+                                    (INT)nHeight);
+                                aGraphicsAlpha.FillRectangle(
+                                    &aClearingBrush,
+                                    (INT)0,
+                                    (INT)0,
+                                    (INT)nWidth,
+                                    (INT)nHeight);
+
+                                // set other values
+                                const Gdiplus::GraphicsState aStateContent(aGraphicsContent.Save());
+                                const Gdiplus::GraphicsState aStateMask(aGraphicsMask.Save());
+                                const Gdiplus::GraphicsState aStateAlpha(aGraphicsAlpha.Save());
+
+                                setAntialiasing(aGraphicsContent, getOptionsDrawinglayer().IsAntiAliasing());
+                                setMatrix(aGraphicsContent, getCurrentTransformation());
+                                aGraphicsContent.SetClip(&getGraphics(), Gdiplus::CombineModeReplace);
+
+                                setAntialiasing(aGraphicsMask, getOptionsDrawinglayer().IsAntiAliasing());
+                                setMatrix(aGraphicsMask, getCurrentTransformation());
+                                aGraphicsMask.SetClip(&getGraphics(), Gdiplus::CombineModeReplace);
+
+                                setAntialiasing(aGraphicsAlpha, getOptionsDrawinglayer().IsAntiAliasing());
+                                setMatrix(aGraphicsAlpha, getCurrentTransformation());
+                                aGraphicsAlpha.SetClip(&getGraphics(), Gdiplus::CombineModeReplace);
 
-                                // make the Bitmap the graphics target
+                                // make content the graphics target, for Gdiplus::Graphics and OutputDevice
                                 Gdiplus::Graphics* pOriginal = mpGraphics;
-                                mpGraphics = &aBitmapGraphics;
+                                const sal_uInt32 nOrigWidth(mnWidth);
+                                const sal_uInt32 nOrigHeight(mnHeight);
+                                mpGraphics = &aGraphicsContent;
+                                mnWidth = nWidth;
+                                mnHeight = nHeight;
 
                                 // do process children
                                 process(rTransparencePrimitive2D.getChildren());
 
-                                // restore last target
-                                mpGraphics = pOriginal;
+                                // target to mask
+                                mpGraphics = &aGraphicsMask;
 
-                                // create bitmap and graphics for alpha
-                                Gdiplus::Bitmap aAlphaBitmap(nWidth, nHeight, PixelFormat32bppRGB);
-                                Gdiplus::Graphics aAlphaBitmapGraphics(&aAlphaBitmap);
-
-                                // set clipping, AntiAliasing and transformation
-                                aAlphaBitmapGraphics.SetClip(&getGraphics(), Gdiplus::CombineModeReplace);
-                                setAntialiasing(aAlphaBitmapGraphics, getOptionsDrawinglayer().IsAntiAliasing());
-                                setMatrix(aAlphaBitmapGraphics, getCurrentTransformation());
-                                
-                                // make the Bitmap the graphics target
-                                mpGraphics = &aAlphaBitmapGraphics;
-
-                                // activate gray mode
-                                //const basegfx::BColorModifier aGrayModifier(
-                                //    basegfx::BColor(), 
-                                //    0.5, 
-                                //    basegfx::BCOLORMODIFYMODE_GRAY);
-                                //getBColorModifierStack().push(aGrayModifier);
+                                // do process children as black to create mask
+                                const basegfx::BColor aBlack(0.0, 0.0, 0.0);
+                                const basegfx::BColorModifier aBColorModifier(aBlack);
 
-                                // do process children
-                                process(rTransparencePrimitive2D.getTransparence());
+                                getBColorModifierStack().push(aBColorModifier);
+                                process(rTransparencePrimitive2D.getChildren());
+                                getBColorModifierStack().pop();
+
+                                // target to alpha
+                                mpGraphics = &aGraphicsAlpha;
 
-                                // deactivate gray mode
-                                //getBColorModifierStack().pop();
+                                // do process transparency
+                                process(rTransparencePrimitive2D.getTransparence());
 
-                                // restore last target
+                                // restore graphics target and trans, flush
                                 mpGraphics = pOriginal;
+                                mnWidth = nOrigWidth;
+                                mnHeight = nOrigHeight;
 
-                                // restore transformations
                                 setCurrentTransformation(aLastCurrentTransformation);
+                                aGraphicsContent.Flush(Gdiplus::FlushIntentionSync);
+                                aGraphicsContent.Restore(aStateContent);
+                                aGraphicsMask.Flush(Gdiplus::FlushIntentionSync);
+                                aGraphicsMask.Restore(aStateMask);
+                                aGraphicsAlpha.Flush(Gdiplus::FlushIntentionSync);
+                                aGraphicsAlpha.Restore(aStateAlpha);
+
+                                // copy alpha to content
+                                const Gdiplus::Rect aRect(0, 0, nWidth, nHeight);
+                                Gdiplus::BitmapData aBitmapDataContent;
+                                Gdiplus::BitmapData aBitmapDataMask;
+                                Gdiplus::BitmapData aBitmapDataAlpha;
+
+                                aBitmapContent.LockBits(&aRect, Gdiplus::ImageLockModeWrite, PixelFormat32bppARGB, &aBitmapDataContent);
+                                aBitmapMask.LockBits(&aRect, Gdiplus::ImageLockModeRead, PixelFormat24bppRGB, &aBitmapDataMask);
+                                aBitmapAlpha.LockBits(&aRect, Gdiplus::ImageLockModeRead, PixelFormat24bppRGB, &aBitmapDataAlpha);
+                                sal_uInt8* pTargetLineContent = (sal_uInt8*)aBitmapDataContent.Scan0;
+                                sal_uInt8* pSourceLineMask = (sal_uInt8*)aBitmapDataMask.Scan0;
+                                sal_uInt8* pSourceLineAlpha = (sal_uInt8*)aBitmapDataAlpha.Scan0;
 
-                                if(false)
-                                {
-                                    // flush to ensure results
-                                    aBitmapGraphics.Flush(Gdiplus::FlushIntentionSync);
-                                    aAlphaBitmapGraphics.Flush(Gdiplus::FlushIntentionSync);
-
-                                    // copy aAlphaBitmap content as alpha to aBitmapGraphics
-                                    Gdiplus::ImageAttributes aImageAttributes;
-                                    const Gdiplus::REAL aWeight(1.0f / 3.0f);
-                                    const Gdiplus::ColorMatrix colorMatrix = {
-                                       0.0f, 0.0f, 0.0f, aWeight, 0.0f,
-                                       0.0f, 0.0f, 0.0f, aWeight, 0.0f,
-                                       0.0f, 0.0f, 0.0f, aWeight, 0.0f,
-                                       0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
-                                       0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
-
-                                    aImageAttributes.SetColorMatrix(
-                                        &colorMatrix,
-                                        Gdiplus::ColorMatrixFlagsDefault,
-                                        Gdiplus::ColorAdjustTypeDefault);
-                                    setMatrix(aBitmapGraphics, basegfx::B2DHomMatrix());
-                                    aBitmapGraphics.SetCompositingMode(Gdiplus::CompositingModeSourceCopy);
-                                    aBitmapGraphics.DrawImage(
-                                        &aAlphaBitmap,
-                                        Gdiplus::Rect(0, 0, nWidth, nHeight),
-                                        0, 0, nWidth, nHeight,
-                                        Gdiplus::UnitPixel,
-                                        &aImageAttributes);
-                                }
-                                else
+                                for(sal_uInt32 y(0); y < nHeight; y++)
                                 {
-                                    // mix aAlphaBitmap's colors as alpha channel to aBitmap
-                                    Gdiplus::Color aColor;
-                                    Gdiplus::Color aAlphaColor;
-                                    static bool bDoCopy(true);
-                                    
-                                    if(bDoCopy)
+                                    sal_uInt8* pTargetPixelContent = pTargetLineContent;
+                                    sal_uInt8* pSourcePixelMask = pSourceLineMask;
+                                    sal_uInt8* pSourcePixelAlpha = pSourceLineAlpha;
+
+                                    for(sal_uInt32 x(0); x < nWidth; x++)
                                     {
-                                        for(INT y(0); y < nHeight; y++)
+                                        const sal_uInt16 aMask(*pSourcePixelMask++);
+                                        pSourcePixelMask += 2;
+
+                                        if(0xff == aMask)
                                         {
-                                            for(INT x(0); x < nWidth; x++)
-                                            {
-                                                aBitmap.GetPixel(x, y, &aColor);
-                                                //const sal_uInt16 aAlphaA(aColor.GetAlpha());
-                                                //
-                                                //if(aAlphaA)
-                                                //{
-                                                    aAlphaBitmap.GetPixel(x, y, &aAlphaColor);
-                                                    sal_uInt16 aAlpha((
-                                                        (aAlphaColor.GetRed() * 77) + 
-                                                        (aAlphaColor.GetGreen() * 151) + 
-                                                        (aAlphaColor.GetBlue() * 28)) >> 8);
-
-                                                //    if(0xff != aAlphaA)
-                                                //    {
-                                                //        aAlpha = 256 - (((256 - aAlpha) * (256 - aAlphaA)) >> 8);
-                                                //    }
-
-                                                    aBitmap.SetPixel(
-                                                        x, 
-                                                        y, 
-                                                        Gdiplus::Color(
-                                                            aAlpha, 
-                                                            aColor.GetRed(), 
-                                                            aColor.GetGreen(), 
-                                                            aColor.GetBlue()));
-                                                //}
-                                            }
+                                            pSourcePixelAlpha += 3;
+                                            pTargetPixelContent += 3;
+                                            *pTargetPixelContent++ = 0;
+                                        }
+                                        else
+                                        {
+                                            sal_uInt16 aAlpha = 0x00ff - (((sal_uInt16)*pSourcePixelAlpha++ * 28 +
+                                                (sal_uInt16)*pSourcePixelAlpha++ * 151 +
+                                                (sal_uInt16)*pSourcePixelAlpha++ * 77) >> 8);
+
+                                            aAlpha = ((0x00ff - aMask) * aAlpha) >> 8;
+
+                                            pTargetPixelContent += 3;
+                                            *pTargetPixelContent++ = sal_uInt8(aAlpha);
                                         }
                                     }
+
+                                    pTargetLineContent += aBitmapDataContent.Stride;
+                                    pSourceLineMask += aBitmapDataMask.Stride;
+                                    pSourceLineAlpha += aBitmapDataAlpha.Stride;
                                 }
 
-                                // copy content
+                                aBitmapAlpha.UnlockBits(&aBitmapDataAlpha);
+                                aBitmapMask.UnlockBits(&aBitmapDataMask);
+                                aBitmapContent.UnlockBits(&aBitmapDataContent);
+
                                 setMatrix(getGraphics(), basegfx::B2DHomMatrix());
                                 getGraphics().DrawImage(
-                                    &aBitmap, 
-                                    INT(nLeft), 
-                                    INT(nTop), 
-                                    INT(aBitmap.GetWidth()), 
-                                    INT(aBitmap.GetHeight()));
+                                    &aBitmapContent,
+                                    (INT)nLeft,
+                                    (INT)nTop,
+                                    (INT)0,
+                                    (INT)0,
+                                    (INT)nWidth,
+                                    (INT)nHeight,
+                                    Gdiplus::UnitPixel);
                                 setMatrix(getGraphics(), getCurrentTransformation());
                             }
                         }
@@ -468,7 +464,7 @@ namespace drawinglayer
                                 if(aMaskPath.get())
                                 {
                                     // save current clip region
-                                    const Gdiplus::GraphicsState aState = getGraphics().Save();
+                                    const Gdiplus::GraphicsState aState(getGraphics().Save());
 
                                     // add clip to current
                                     getGraphics().SetClip(

Modified: openoffice/branches/alg/sysdepgs/main/tools/inc/tools/color.hxx
URL: http://svn.apache.org/viewvc/openoffice/branches/alg/sysdepgs/main/tools/inc/tools/color.hxx?rev=1504094&r1=1504093&r2=1504094&view=diff
==============================================================================
--- openoffice/branches/alg/sysdepgs/main/tools/inc/tools/color.hxx (original)
+++ openoffice/branches/alg/sysdepgs/main/tools/inc/tools/color.hxx Wed Jul 17 12:28:59 2013
@@ -174,14 +174,14 @@ public:
     static ColorData    HSBtoRGB( sal_uInt16 nHue, sal_uInt16 nSat, sal_uInt16 nBri );
     void                RGBtoHSB( sal_uInt16& nHue, sal_uInt16& nSat, sal_uInt16& nBri ) const;
 
-    // the range for cymk is 0 to 1.0
-    static ColorData    CMYKtoRGB( double fCyan, double fMagenta, double fYellow, double fKey );
-    void                RGBtoCMYK( double& fCyan, double& fMagenta, double& fYellow, double& fKey );
-
-    sal_Bool            operator==( const Color& rColor ) const
-                        { return (mnColor == rColor.mnColor); }
-    sal_Bool            operator!=( const Color& rColor ) const
-                        { return !(Color::operator==( rColor )); }
+    // the range for cymk is 0 to 1.0
+    static ColorData    CMYKtoRGB( double fCyan, double fMagenta, double fYellow, double fKey );
+    void                RGBtoCMYK( double& fCyan, double& fMagenta, double& fYellow, double& fKey );
+
+    sal_Bool            operator==( const Color& rColor ) const
+                        { return (mnColor == rColor.mnColor); }
+    sal_Bool            operator!=( const Color& rColor ) const
+                        { return !(Color::operator==( rColor )); }
 
 	SvStream&			Read( SvStream& rIStm, sal_Bool bNewFormat = sal_True );
 	SvStream&			Write( SvStream& rOStm, sal_Bool bNewFormat = sal_True );

Modified: openoffice/branches/alg/sysdepgs/main/vcl/win/source/gdi/salgdi_gdiplus.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/alg/sysdepgs/main/vcl/win/source/gdi/salgdi_gdiplus.cxx?rev=1504094&r1=1504093&r2=1504094&view=diff
==============================================================================
--- openoffice/branches/alg/sysdepgs/main/vcl/win/source/gdi/salgdi_gdiplus.cxx (original)
+++ openoffice/branches/alg/sysdepgs/main/vcl/win/source/gdi/salgdi_gdiplus.cxx Wed Jul 17 12:28:59 2013
@@ -65,7 +65,8 @@
 class GdiPlusBitmapBufferNode : public basegfx::cache::node
 {
 private:
-    boost::shared_ptr< Gdiplus::Bitmap >       maGdiPlusBitmapPtr;
+    boost::shared_ptr< Gdiplus::Bitmap >        maGdiPlusBitmapPtr;
+    const WinSalBitmap*                         mpAssociatedAlphaSource;
 
     // conversion helpers
     Gdiplus::Bitmap* createGdiPlusBitmap(const WinSalBitmap& rBitmapSource);
@@ -79,6 +80,7 @@ public:
     virtual ~GdiPlusBitmapBufferNode();
 
     boost::shared_ptr< Gdiplus::Bitmap > getGdiPlusBitmapPtr() const { return maGdiPlusBitmapPtr; }
+    const WinSalBitmap* getAssociatedAlphaSource() const { return mpAssociatedAlphaSource; }
 };
 
 //////////////////////////////////////////////////////////////////////////////
@@ -131,6 +133,15 @@ boost::shared_ptr< Gdiplus::Bitmap > Gdi
     {
         const GdiPlusBitmapBufferNode* pEntry = static_cast< const GdiPlusBitmapBufferNode* >(getEntry(rBitmapSource));
 
+        if(pEntry && pEntry->getAssociatedAlphaSource() != pAlphaSource)
+        {
+            // need to destroy since the associated alpha has changed (only alpha, not content,
+            // this can happen since BitmapEx uses two bitmaps. Hopefully this can be simplified
+            // in the future to just use RGBA Bitmaps)
+            delete pEntry;
+            pEntry = 0;
+        }
+
         if(!pEntry)
         {
             pEntry = new GdiPlusBitmapBufferNode(*this, rBitmapSource, pAlphaSource);
@@ -454,7 +465,8 @@ GdiPlusBitmapBufferNode::GdiPlusBitmapBu
     const WinSalBitmap& rBitmapSource, 
     const WinSalBitmap* pAlphaSource)
 :   basegfx::cache::node(rBuffer, rBitmapSource),
-    maGdiPlusBitmapPtr()
+    maGdiPlusBitmapPtr(),
+    mpAssociatedAlphaSource(pAlphaSource)
 {
     if(pAlphaSource)
     {