[Libreoffice-commits] core.git: Branch 'distro/suse/suse-4.0.3' - canvas/source

Thorsten Behrens tbehrens at suse.com
Thu Jun 13 05:04:29 PDT 2013


 canvas/source/cairo/cairo_canvasbitmap.cxx |   55 ++++++++++++++++-------------
 1 file changed, 31 insertions(+), 24 deletions(-)

New commits:
commit 243e40694936c21b781bf929a7153b1f8cb7f8ae
Author: Thorsten Behrens <tbehrens at suse.com>
Date:   Thu Jun 13 12:47:02 2013 +0200

    Add some error handling to bitmap conversion.
    
    Fixup for 7cf2b5809f7137acc7a5eed9159042b3d748da01, makes sure cairo
    has all data committed to the surface, and handle random errors.
    
    Conflicts:
    	canvas/source/cairo/cairo_canvasbitmap.cxx
    
    Change-Id: I39e5b5777968c4563a8ce3870bac3d4182090f3b
    (cherry picked from commit 83b785e1924e418f98167205cd1b20054feffe3f)

diff --git a/canvas/source/cairo/cairo_canvasbitmap.cxx b/canvas/source/cairo/cairo_canvasbitmap.cxx
index 062af84..59a84d8 100644
--- a/canvas/source/cairo/cairo_canvasbitmap.cxx
+++ b/canvas/source/cairo/cairo_canvasbitmap.cxx
@@ -172,39 +172,46 @@ namespace cairocanvas
                 ::AlphaMask aMask( aSize );
 
                 BitmapWriteAccess *pRGBWrite( aRGB.AcquireWriteAccess() );
-                BitmapWriteAccess *pMaskWrite( aMask.AcquireWriteAccess() );
-
-                unsigned char *pSrc = cairo_image_surface_get_data( pPixels );
-                unsigned int nStride = cairo_image_surface_get_stride( pPixels );
-                for( unsigned long y = 0; y < (unsigned long) aSize.Height(); y++ )
+                if( pRGBWrite )
                 {
-                    sal_uInt32 *pPix = (sal_uInt32 *)(pSrc + nStride * y);
-                    for( unsigned long x = 0; x < (unsigned long) aSize.Width(); x++ )
+                    BitmapWriteAccess *pMaskWrite( aMask.AcquireWriteAccess() );
+                    if( pMaskWrite )
                     {
-                        sal_uInt8 nAlpha = (*pPix >> 24);
-                        sal_uInt8 nR = (*pPix >> 16) & 0xff;
-                        sal_uInt8 nG = (*pPix >> 8) & 0xff;
-                        sal_uInt8 nB = *pPix & 0xff;
-                        if( nAlpha != 0 && nAlpha != 255 )
+                        cairo_surface_flush(pPixels);
+                        unsigned char *pSrc = cairo_image_surface_get_data( pPixels );
+                        unsigned int nStride = cairo_image_surface_get_stride( pPixels );
+                        for( unsigned long y = 0; y < (unsigned long) aSize.Height(); y++ )
                         {
-//                            fprintf (stderr, "From A(0x%.2x) 0x%.2x 0x%.2x 0x%.2x -> ",
-//                                     nAlpha, nR, nG, nB );
-                            // Cairo uses pre-multiplied alpha - we do not => re-multiply
-                            nR = (sal_uInt8) MinMax( ((sal_uInt32)nR * 255) / nAlpha, 0, 255 );
-                            nG = (sal_uInt8) MinMax( ((sal_uInt32)nG * 255) / nAlpha, 0, 255 );
-                            nB = (sal_uInt8) MinMax( ((sal_uInt32)nB * 255) / nAlpha, 0, 255 );
-//                            fprintf (stderr, "0x%.2x 0x%.2x 0x%.2x\n", nR, nG, nB );
+                            sal_uInt32 *pPix = (sal_uInt32 *)(pSrc + nStride * y);
+                            for( unsigned long x = 0; x < (unsigned long) aSize.Width(); x++ )
+                            {
+                                sal_uInt8 nAlpha = (*pPix >> 24);
+                                sal_uInt8 nR = (*pPix >> 16) & 0xff;
+                                sal_uInt8 nG = (*pPix >> 8) & 0xff;
+                                sal_uInt8 nB = *pPix & 0xff;
+                                if( nAlpha != 0 && nAlpha != 255 )
+                                {
+                                    // Cairo uses pre-multiplied alpha - we do not => re-multiply
+                                    nR = (sal_uInt8) MinMax( ((sal_uInt32)nR * 255) / nAlpha, 0, 255 );
+                                    nG = (sal_uInt8) MinMax( ((sal_uInt32)nG * 255) / nAlpha, 0, 255 );
+                                    nB = (sal_uInt8) MinMax( ((sal_uInt32)nB * 255) / nAlpha, 0, 255 );
+                                }
+                                pRGBWrite->SetPixel( y, x, BitmapColor( nR, nG, nB ) );
+                                pMaskWrite->SetPixel( y, x, BitmapColor( 255 - nAlpha ) );
+                                pPix++;
+                            }
                         }
-                        pRGBWrite->SetPixel( y, x, BitmapColor( nR, nG, nB ) );
-                        pMaskWrite->SetPixel( y, x, BitmapColor( 255 - nAlpha ) );
-                        pPix++;
+                        aMask.ReleaseAccess( pMaskWrite );
                     }
+                    aRGB.ReleaseAccess( pRGBWrite );
                 }
-                aMask.ReleaseAccess( pMaskWrite );
-                aRGB.ReleaseAccess( pRGBWrite );
 
+                // ignore potential errors above. will get caller a
+                // uniformely white bitmap, but not that there would
+                // be error handling in calling code ...
                 ::BitmapEx *pBitmapEx = new ::BitmapEx( aRGB, aMask );
 
+                cairo_destroy( pCairo );
                 cairo_surface_destroy( pPixels );
 
                 aRV = uno::Any( reinterpret_cast<sal_Int64>( pBitmapEx ) );


More information about the Libreoffice-commits mailing list