From f96508f3230f6f098a26546d12a50b7a19130117 Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Fri, 30 Oct 2015 19:03:10 +0200 Subject: 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 --- canvas/source/directx/dx_surfacebitmap.cxx | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'canvas') diff --git a/canvas/source/directx/dx_surfacebitmap.cxx b/canvas/source/directx/dx_surfacebitmap.cxx index cf6e1ae20754..d69a4ea02bad 100644 --- a/canvas/source/directx/dx_surfacebitmap.cxx +++ b/canvas/source/directx/dx_surfacebitmap.cxx @@ -21,6 +21,8 @@ #include +#include + #include #include #include @@ -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; yUnlockRect(); return aRes; } -- cgit