summaryrefslogtreecommitdiff
path: root/canvas/source
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2015-10-30 19:03:10 +0200
committerCaolán McNamara <caolanm@redhat.com>2015-11-26 12:24:51 +0000
commitf7d1ea37a557d904caecb080deab162bd70e1a87 (patch)
tree1cfc2442e2826c5681cedfbdc20df182002afd21 /canvas/source
parentb8711f6600216ca482627a928099a33612008734 (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>
Diffstat (limited to 'canvas/source')
-rw-r--r--canvas/source/directx/dx_surfacebitmap.cxx27
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;
}