[Libreoffice-commits] core.git: canvas/source

Tor Lillqvist tml at collabora.com
Fri Oct 30 17:31:28 UTC 2015


 canvas/source/directx/dx_surfacebitmap.cxx |   27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

New commits:
commit f96508f3230f6f098a26546d12a50b7a19130117
Author: Tor Lillqvist <tml at collabora.com>
Date:   Fri Oct 30 19:03:10 2015 +0200

    tdf#92272: We need to twiddle the bytes from BGR to RGB
    
    As far as I see, the surfaces created in the DX canvas are of
    D3DFMT_A8R8G8B8 or D3DFMT_X8R8G8B8 format, which means that the bytes
    (in memory order, on little-endian Windows) are B,G,R,A/X. So if the
    desired destination wants R,G,B,A, we need to swap the blue and red
    bytes.
    
    Let's hope this doesn't break anything else...
    
    Change-Id: I1b90d2cf95418f6557cac633ec6fce27599e8a61

diff --git a/canvas/source/directx/dx_surfacebitmap.cxx b/canvas/source/directx/dx_surfacebitmap.cxx
index cf6e1ae..d69a4ea 100644
--- a/canvas/source/directx/dx_surfacebitmap.cxx
+++ b/canvas/source/directx/dx_surfacebitmap.cxx
@@ -21,6 +21,8 @@
 
 #include <string.h>
 
+#include <com/sun/star/rendering/ColorComponentTag.hpp>
+
 #include <basegfx/matrix/b2dhommatrix.hxx>
 #include <basegfx/range/b2irange.hxx>
 #include <tools/diagnose_ex.h>
@@ -412,7 +414,7 @@ namespace dxcanvas
     // DXSurfaceBitmap::getData
 
 
-    uno::Sequence< sal_Int8 > DXSurfaceBitmap::getData( rendering::IntegerBitmapLayout&     /*bitmapLayout*/,
+    uno::Sequence< sal_Int8 > DXSurfaceBitmap::getData( rendering::IntegerBitmapLayout& rBitmapLayout,
                                                         const geometry::IntegerRectangle2D& rect )
     {
         if(hasAlpha())
@@ -457,6 +459,11 @@ namespace dxcanvas
             D3DLOCKED_RECT aLockedRect;
             if(FAILED(mpSurface->LockRect(&aLockedRect,NULL,D3DLOCK_NOSYSLOCK|D3DLOCK_READONLY)))
                 return uno::Sequence< sal_Int8 >();
+            D3DSURFACE_DESC aDesc;
+            if(FAILED(mpSurface->GetDesc(&aDesc)))
+                return uno::Sequence< sal_Int8 >();
+
+            assert(aDesc.Format == D3DFMT_A8R8G8B8 || aDesc.Format == D3DFMT_X8R8G8B8);
 
             sal_uInt8 *pSrc = (sal_uInt8 *)((((BYTE *)aLockedRect.pBits)+(rect.Y1*aLockedRect.Pitch))+rect.X1);
             sal_uInt8 *pDst = (sal_uInt8 *)aRes.getArray();
@@ -468,6 +475,24 @@ namespace dxcanvas
                 pSrc += aLockedRect.Pitch;
             }
 
+            if(rBitmapLayout.ColorSpace->getComponentTags().getArray()[0] == rendering::ColorComponentTag::RGB_RED &&
+               rBitmapLayout.ColorSpace->getComponentTags().getArray()[2] == rendering::ColorComponentTag::RGB_BLUE)
+            {
+                pDst = (sal_uInt8 *)aRes.getArray();
+                for(sal_uInt32 y=0; y<nHeight; ++y)
+                {
+                    sal_uInt8* pPixel = pDst;
+                    for(sal_uInt32 n = 0; n<nWidth; n++)
+                    {
+                        sal_uInt8 nB = pPixel[0];
+                        pPixel[0] = pPixel[2];
+                        pPixel[2] = nB;
+                        pPixel += 4;
+                    }
+                    pDst += nSegmentSizeInBytes;
+                }
+            }
+
             mpSurface->UnlockRect();
             return aRes;
         }


More information about the Libreoffice-commits mailing list