diff options
author | Tor Lillqvist <tml@collabora.com> | 2015-10-30 19:03:10 +0200 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2015-11-28 14:15:51 +0100 |
commit | b60f6a7a60c76dd9b9c875ab358af29ceb0d8a02 (patch) | |
tree | d27e262a9eef3498dd69eb3f80d91881c6613947 | |
parent | 578feb2c41f4875de6622d8a43947fddccce5969 (diff) |
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
Reviewed-on: https://gerrit.libreoffice.org/20161
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
(cherry picked from commit f7d1ea37a557d904caecb080deab162bd70e1a87)
-rw-r--r-- | canvas/source/directx/dx_surfacebitmap.cxx | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/canvas/source/directx/dx_surfacebitmap.cxx b/canvas/source/directx/dx_surfacebitmap.cxx index abff2019a3ea..529c37c016f5 100644 --- a/canvas/source/directx/dx_surfacebitmap.cxx +++ b/canvas/source/directx/dx_surfacebitmap.cxx @@ -19,6 +19,8 @@ #include <string.h> +#include <com/sun/star/rendering/ColorComponentTag.hpp> + #include "dx_surfacebitmap.hxx" #include "dx_impltools.hxx" #include "dx_surfacegraphics.hxx" @@ -438,7 +440,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()) @@ -483,6 +485,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(); @@ -494,6 +501,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; } |