diff options
author | Michael Stahl <mstahl@redhat.com> | 2012-10-15 15:47:09 +0200 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2012-10-15 15:49:47 +0200 |
commit | 0c120f9dd429e035c1e4595c702411241c4431ea (patch) | |
tree | 238dddac98d08445dad5b2d7a824786e0d653d18 /canvas | |
parent | 0349c738da5970d9f0fc10d7cf4d7b766ce10e13 (diff) |
cairo canvas: handle 8-bit grey-scale alpha colors:
Apparently BitmapReadAccess::ImplCreate creates non-indexed color
palettes in case of grey-scale, which leads to one assertion from
BitmapColor::GetIndex() per pixel if that is accessed incorrectly;
handle this better in cairo canvas.
Change-Id: Idcdc3fbe182db948d25e744cb484e2db932c7868
Diffstat (limited to 'canvas')
-rw-r--r-- | canvas/source/cairo/cairo_canvashelper.cxx | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/canvas/source/cairo/cairo_canvashelper.cxx b/canvas/source/cairo/cairo_canvashelper.cxx index 0ecddee33365..8c0f03e1c5a1 100644 --- a/canvas/source/cairo/cairo_canvashelper.cxx +++ b/canvas/source/cairo/cairo_canvashelper.cxx @@ -339,6 +339,22 @@ namespace cairocanvas return ::BitmapEx(); } + static sal_uInt8 lcl_GetColor(BitmapColor const& rColor) + { + sal_uInt8 nTemp(0); + if (rColor.IsIndex()) + { + nTemp = rColor.GetIndex(); + } + else + { + nTemp = rColor.GetBlue(); + // greyscale expected here, or what would non-grey colors mean? + assert(rColor.GetRed() == nTemp && rColor.GetGreen() == nTemp); + } + return nTemp; + } + static bool readAlpha( BitmapReadAccess* pAlphaReadAcc, long nY, const long nWidth, unsigned char* data, long nOff ) { bool bIsAlpha = false; @@ -364,7 +380,10 @@ namespace cairocanvas pReadScan = pAlphaReadAcc->GetScanline( nY ); for( nX = 0; nX < nWidth; nX++ ) { - nAlpha = data[ nOff ] = 255 - ( pAlphaReadAcc->GetPaletteColor( *pReadScan++ ).GetIndex() ); + BitmapColor const& rColor( + pAlphaReadAcc->GetPaletteColor(*pReadScan)); + pReadScan++; + nAlpha = data[ nOff ] = 255 - lcl_GetColor(rColor); if( nAlpha != 255 ) bIsAlpha = true; nOff += 4; |