[Libreoffice-commits] core.git: canvas/source include/vcl vcl/source

Noel Grandin noel.grandin at collabora.co.uk
Sat Mar 10 11:04:40 UTC 2018


 canvas/source/vcl/canvasbitmaphelper.cxx |  257 -------------------------------
 include/vcl/BitmapTools.hxx              |    9 +
 vcl/source/bitmap/BitmapTools.cxx        |  246 +++++++++++++++++++++++++++++
 3 files changed, 260 insertions(+), 252 deletions(-)

New commits:
commit 676024b001340dce6c854efc3b74bdc8db1e2a3b
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date:   Fri Mar 9 15:30:53 2018 +0200

    move canvas helper code into vcl
    
    part of making BitmapWriteAccess an internal feature of vcl
    
    Change-Id: Iee94f47e120d82a23e57342952d04e9b2792cd1a
    Reviewed-on: https://gerrit.libreoffice.org/50999
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/canvas/source/vcl/canvasbitmaphelper.cxx b/canvas/source/vcl/canvasbitmaphelper.cxx
index 869957546498..20b823f32cc3 100644
--- a/canvas/source/vcl/canvasbitmaphelper.cxx
+++ b/canvas/source/vcl/canvasbitmaphelper.cxx
@@ -30,6 +30,7 @@
 #include <tools/poly.hxx>
 #include <vcl/bitmapex.hxx>
 #include <vcl/bitmapaccess.hxx>
+#include <vcl/BitmapTools.hxx>
 #include <vcl/canvastools.hxx>
 #include <vcl/window.hxx>
 
@@ -205,222 +206,9 @@ namespace vclcanvas
         // retrieve local copies from the BitmapEx, which are later
         // stored back. Unfortunately, the BitmapEx does not permit
         // in-place modifications, as they are necessary here.
-        Bitmap aBitmap( mpBackBuffer->getBitmapReference().GetBitmap() );
-        Bitmap aAlpha( mpBackBuffer->getBitmapReference().GetAlpha().GetBitmap() );
-
-        bool bCopyBack( false ); // only copy something back, if we
-                                 // actually changed a pixel
-
-        {
-            Bitmap::ScopedWriteAccess pWriteAccess( aBitmap );
-            Bitmap::ScopedWriteAccess pAlphaWriteAccess( aAlpha.IsEmpty() ?
-                                                       nullptr : aAlpha.AcquireWriteAccess(),
-                                                       aAlpha );
-
-            if( pAlphaWriteAccess.get() )
-            {
-                DBG_ASSERT( pAlphaWriteAccess->GetScanlineFormat() == ScanlineFormat::N8BitPal ||
-                            pAlphaWriteAccess->GetScanlineFormat() == ScanlineFormat::N8BitTcMask,
-                            "non-8bit alpha not supported!" );
-            }
-
-            ENSURE_OR_THROW( pWriteAccess.get() != nullptr,
-                             "Could not acquire write access to bitmap" );
-
-            // TODO(F1): Support more formats.
-            const Size aBmpSize( aBitmap.GetSizePixel() );
-
-            // for the time being, always read as BGRA
-            int nCurrPos(0);
-            for( long y=rect.Y1;
-                 y<aBmpSize.Height() && y<rect.Y2;
-                 ++y )
-            {
-                if( pAlphaWriteAccess.get() != nullptr )
-                {
-                    switch( pWriteAccess->GetScanlineFormat() )
-                    {
-                        case ScanlineFormat::N8BitPal:
-                        {
-                            Scanline pScan  = pWriteAccess->GetScanline( y );
-                            Scanline pAScan = pAlphaWriteAccess->GetScanline( y );
-
-                            for( long x=rect.X1;
-                                 x<aBmpSize.Width() && x<rect.X2;
-                                 ++x )
-                            {
-                                *pScan++ = static_cast<sal_uInt8>(pWriteAccess->GetBestPaletteIndex(
-                                    BitmapColor( data[ nCurrPos   ],
-                                                 data[ nCurrPos+1 ],
-                                                 data[ nCurrPos+2 ] ) ));
-
-                                nCurrPos += 3;
-
-                                // cast to unsigned byte, for correct subtraction result
-                                *pAScan++ = static_cast<sal_uInt8>(255 -
-                                                              static_cast<sal_uInt8>(data[ nCurrPos++ ]));
-                            }
-                        }
-                        break;
-
-                        case ScanlineFormat::N24BitTcBgr:
-                        {
-                            Scanline pScan  = pWriteAccess->GetScanline( y );
-                            Scanline pAScan = pAlphaWriteAccess->GetScanline( y );
-
-                            for( long x=rect.X1;
-                                 x<aBmpSize.Width() && x<rect.X2;
-                                 ++x )
-                            {
-                                *pScan++ = data[ nCurrPos+2 ];
-                                *pScan++ = data[ nCurrPos+1 ];
-                                *pScan++ = data[ nCurrPos   ];
-
-                                nCurrPos += 3;
-
-                                // cast to unsigned byte, for correct subtraction result
-                                *pAScan++ = static_cast<sal_uInt8>(255 -
-                                                              static_cast<sal_uInt8>(data[ nCurrPos++ ]));
-                            }
-                        }
-                        break;
-
-                        case ScanlineFormat::N24BitTcRgb:
-                        {
-                            Scanline pScan  = pWriteAccess->GetScanline( y );
-                            Scanline pAScan = pAlphaWriteAccess->GetScanline( y );
-
-                            for( long x=rect.X1;
-                                 x<aBmpSize.Width() && x<rect.X2;
-                                 ++x )
-                            {
-                                *pScan++ = data[ nCurrPos   ];
-                                *pScan++ = data[ nCurrPos+1 ];
-                                *pScan++ = data[ nCurrPos+2 ];
-
-                                nCurrPos += 3;
-
-                                // cast to unsigned byte, for correct subtraction result
-                                *pAScan++ = static_cast<sal_uInt8>(255 -
-                                                              static_cast<sal_uInt8>(data[ nCurrPos++ ]));
-                            }
-                        }
-                        break;
-
-                        default:
-                        {
-                            Scanline pScan  = pWriteAccess->GetScanline( y );
-                            Scanline pAScan = pAlphaWriteAccess->GetScanline( y );
-
-                            for( long x=rect.X1;
-                                 x<aBmpSize.Width() && x<rect.X2;
-                                 ++x )
-                            {
-                                pWriteAccess->SetPixelOnData( pScan, x, BitmapColor( data[ nCurrPos   ],
-                                                                           data[ nCurrPos+1 ],
-                                                                           data[ nCurrPos+2 ] ) );
-                                nCurrPos += 3;
-
-                                // cast to unsigned byte, for correct subtraction result
-                                pAlphaWriteAccess->SetPixelOnData( pAScan, x,
-                                                             BitmapColor(
-                                                                 static_cast<sal_uInt8>(255 -
-                                                                                   static_cast<sal_uInt8>(data[ nCurrPos++ ])) ) );
-                            }
-                        }
-                        break;
-                    }
-                }
-                else
-                {
-                    // TODO(Q3): This is copy'n'pasted from
-                    // canvashelper.cxx, unify!
-                    switch( pWriteAccess->GetScanlineFormat() )
-                    {
-                        case ScanlineFormat::N8BitPal:
-                        {
-                            Scanline pScan = pWriteAccess->GetScanline( y );
-
-                            for( long x=rect.X1;
-                                 x<aBmpSize.Width() && x<rect.X2;
-                                 ++x )
-                            {
-                                *pScan++ = static_cast<sal_uInt8>(pWriteAccess->GetBestPaletteIndex(
-                                    BitmapColor( data[ nCurrPos   ],
-                                                 data[ nCurrPos+1 ],
-                                                 data[ nCurrPos+2 ] ) ));
-
-                                nCurrPos += 4; // skip three colors, _plus_ alpha
-                            }
-                        }
-                        break;
-
-                        case ScanlineFormat::N24BitTcBgr:
-                        {
-                            Scanline pScan = pWriteAccess->GetScanline( y );
-
-                            for( long x=rect.X1;
-                                 x<aBmpSize.Width() && x<rect.X2;
-                                 ++x )
-                            {
-                                *pScan++ = data[ nCurrPos+2 ];
-                                *pScan++ = data[ nCurrPos+1 ];
-                                *pScan++ = data[ nCurrPos   ];
-
-                                nCurrPos += 4; // skip three colors, _plus_ alpha
-                            }
-                        }
-                        break;
-
-                        case ScanlineFormat::N24BitTcRgb:
-                        {
-                            Scanline pScan = pWriteAccess->GetScanline( y );
-
-                            for( long x=rect.X1;
-                                 x<aBmpSize.Width() && x<rect.X2;
-                                 ++x )
-                            {
-                                *pScan++ = data[ nCurrPos   ];
-                                *pScan++ = data[ nCurrPos+1 ];
-                                *pScan++ = data[ nCurrPos+2 ];
-
-                                nCurrPos += 4; // skip three colors, _plus_ alpha
-                            }
-                        }
-                        break;
-
-                        default:
-                        {
-                            Scanline pScan = pWriteAccess->GetScanline( y );
-
-                            for( long x=rect.X1;
-                                 x<aBmpSize.Width() && x<rect.X2;
-                                 ++x )
-                            {
-                                pWriteAccess->SetPixelOnData( pScan, x, BitmapColor( data[ nCurrPos   ],
-                                                                           data[ nCurrPos+1 ],
-                                                                           data[ nCurrPos+2 ] ) );
-                                nCurrPos += 4; // skip three colors, _plus_ alpha
-                            }
-                        }
-                        break;
-                    }
-                }
-
-                bCopyBack = true;
-            }
-        }
 
-        // copy back only here, since the BitmapAccessors must be
-        // destroyed beforehand
-        if( bCopyBack )
-        {
-            if( aAlpha.IsEmpty() )
-                setBitmap( BitmapEx( aBitmap ) );
-            else
-                setBitmap( BitmapEx( aBitmap,
-                                     AlphaMask( aAlpha ) ) );
-        }
+        BitmapEx newBitmap = vcl::bitmap::CanvasBitmapHelperSetData(data, rect, mpBackBuffer->getBitmapReference());
+        setBitmap( newBitmap );
     }
 
     void CanvasBitmapHelper::setPixel( const uno::Sequence< sal_Int8 >&      color,
@@ -448,44 +236,9 @@ namespace vclcanvas
                              aRefLayout.IsMsbFirst  != rLayout.IsMsbFirst,
                              "Mismatching memory layout" );
 
-        // retrieve local copies from the BitmapEx, which are later
-        // stored back. Unfortunately, the BitmapEx does not permit
-        // in-place modifications, as they are necessary here.
-        Bitmap aBitmap( mpBackBuffer->getBitmapReference().GetBitmap() );
-        Bitmap aAlpha( mpBackBuffer->getBitmapReference().GetAlpha().GetBitmap() );
-
-        bool bCopyBack( false ); // only copy something back, if we
-                                 // actually changed a pixel
 
-        {
-            Bitmap::ScopedWriteAccess pWriteAccess( aBitmap );
-            Bitmap::ScopedWriteAccess pAlphaWriteAccess( aAlpha.IsEmpty() ?
-                                                       nullptr : aAlpha.AcquireWriteAccess(),
-                                                       aAlpha );
-
-            ENSURE_OR_THROW( pWriteAccess.get() != nullptr,
-                             "Could not acquire write access to bitmap" );
-
-            pWriteAccess->SetPixel( pos.Y, pos.X, BitmapColor( color[ 0 ],
-                                                               color[ 1 ],
-                                                               color[ 2 ] ) );
-
-            if( pAlphaWriteAccess.get() != nullptr )
-                pAlphaWriteAccess->SetPixel( pos.Y, pos.X, BitmapColor( 255 - color[ 3 ] ) );
-
-            bCopyBack = true;
-        }
-
-        // copy back only here, since the BitmapAccessors must be
-        // destroyed beforehand
-        if( bCopyBack )
-        {
-            if( aAlpha.IsEmpty() )
-                setBitmap( BitmapEx( aBitmap ) );
-            else
-                setBitmap( BitmapEx( aBitmap,
-                                     AlphaMask( aAlpha ) ) );
-        }
+        BitmapEx newBitmapEx = vcl::bitmap::CanvasBitmapHelperSetPixel(color, pos, mpBackBuffer->getBitmapReference());
+        setBitmap( newBitmapEx );
     }
 
     uno::Sequence< sal_Int8 > CanvasBitmapHelper::getPixel( rendering::IntegerBitmapLayout& rLayout,
diff --git a/include/vcl/BitmapTools.hxx b/include/vcl/BitmapTools.hxx
index 51088b0fefa1..e68e203825e2 100644
--- a/include/vcl/BitmapTools.hxx
+++ b/include/vcl/BitmapTools.hxx
@@ -18,6 +18,8 @@
 #if ENABLE_CAIRO_CANVAS
 #include <vcl/cairo.hxx>
 #endif
+#include <com/sun/star/geometry/IntegerPoint2D.hpp>
+#include <com/sun/star/geometry/IntegerRectangle2D.hpp>
 
 namespace vcl {
 namespace bitmap {
@@ -83,6 +85,13 @@ BitmapEx VCL_DLLPUBLIC CreateFromData( RawBitmap && data );
 VCL_DLLPUBLIC BitmapEx* CreateFromCairoSurface(Size size, cairo_surface_t* pSurface);
 #endif
 
+VCL_DLLPUBLIC BitmapEx CanvasBitmapHelperSetPixel( const css::uno::Sequence< sal_Int8 >& color,
+                                                   const css::geometry::IntegerPoint2D&  pos,
+                                                   BitmapEx & rBitmapEx );
+VCL_DLLPUBLIC BitmapEx CanvasBitmapHelperSetData( const css::uno::Sequence< sal_Int8 >&      data,
+                                                  const css::geometry::IntegerRectangle2D&   rect,
+                                                  BitmapEx & rBitmapEx);
+
 }} // end vcl::bitmap
 
 #endif // INCLUDED_VCL_BITMAP_TOOLS_HXX
diff --git a/vcl/source/bitmap/BitmapTools.cxx b/vcl/source/bitmap/BitmapTools.cxx
index beda990e5b03..16816496158d 100644
--- a/vcl/source/bitmap/BitmapTools.cxx
+++ b/vcl/source/bitmap/BitmapTools.cxx
@@ -29,6 +29,7 @@
 #if ENABLE_CAIRO_CANVAS
 #include <cairo.h>
 #endif
+#include <tools/diagnose_ex.h>
 
 using namespace css;
 
@@ -299,6 +300,251 @@ BitmapEx* CreateFromCairoSurface(Size aSize, cairo_surface_t * pSurface)
 }
 #endif
 
+BitmapEx CanvasBitmapHelperSetPixel( const uno::Sequence< sal_Int8 >&      color,
+                                     const geometry::IntegerPoint2D&       pos,
+                                     BitmapEx & rBitmapEx )
+{
+    // retrieve local copies from the BitmapEx, which are later
+    // stored back. Unfortunately, the BitmapEx does not permit
+    // in-place modifications, as they are necessary here.
+    Bitmap aBitmap( rBitmapEx.GetBitmap() );
+    Bitmap aAlpha( rBitmapEx.GetAlpha().GetBitmap() );
+
+    {
+        Bitmap::ScopedWriteAccess pWriteAccess( aBitmap );
+        Bitmap::ScopedWriteAccess pAlphaWriteAccess( aAlpha.IsEmpty() ?
+                                                   nullptr : aAlpha.AcquireWriteAccess(),
+                                                   aAlpha );
+
+        ENSURE_OR_THROW( pWriteAccess.get() != nullptr,
+                         "Could not acquire write access to bitmap" );
+
+        pWriteAccess->SetPixel( pos.Y, pos.X, BitmapColor( color[ 0 ],
+                                                           color[ 1 ],
+                                                           color[ 2 ] ) );
+
+        if( pAlphaWriteAccess.get() != nullptr )
+            pAlphaWriteAccess->SetPixel( pos.Y, pos.X, BitmapColor( 255 - color[ 3 ] ) );
+    }
+
+    if( aAlpha.IsEmpty() )
+        return BitmapEx( aBitmap );
+    else
+        return BitmapEx( aBitmap, AlphaMask( aAlpha ) );
+}
+
+BitmapEx CanvasBitmapHelperSetData( const uno::Sequence< sal_Int8 >&      data,
+                                    const geometry::IntegerRectangle2D&   rect,
+                                    BitmapEx & rBitmapEx)
+{
+    Bitmap aBitmap( rBitmapEx.GetBitmap() );
+    Bitmap aAlpha( rBitmapEx.GetAlpha().GetBitmap() );
+
+    {
+        Bitmap::ScopedWriteAccess pWriteAccess( aBitmap );
+        Bitmap::ScopedWriteAccess pAlphaWriteAccess( aAlpha.IsEmpty() ?
+                                                   nullptr : aAlpha.AcquireWriteAccess(),
+                                                   aAlpha );
+
+        if( pAlphaWriteAccess.get() )
+        {
+            DBG_ASSERT( pAlphaWriteAccess->GetScanlineFormat() == ScanlineFormat::N8BitPal ||
+                        pAlphaWriteAccess->GetScanlineFormat() == ScanlineFormat::N8BitTcMask,
+                        "non-8bit alpha not supported!" );
+        }
+
+        ENSURE_OR_THROW( pWriteAccess.get() != nullptr,
+                         "Could not acquire write access to bitmap" );
+
+        // TODO(F1): Support more formats.
+        const Size aBmpSize( aBitmap.GetSizePixel() );
+
+        // for the time being, always read as BGRA
+        int nCurrPos(0);
+        for( long y=rect.Y1;
+             y<aBmpSize.Height() && y<rect.Y2;
+             ++y )
+        {
+            if( pAlphaWriteAccess.get() != nullptr )
+            {
+                switch( pWriteAccess->GetScanlineFormat() )
+                {
+                    case ScanlineFormat::N8BitPal:
+                    {
+                        Scanline pScan  = pWriteAccess->GetScanline( y );
+                        Scanline pAScan = pAlphaWriteAccess->GetScanline( y );
+
+                        for( long x=rect.X1;
+                             x<aBmpSize.Width() && x<rect.X2;
+                             ++x )
+                        {
+                            *pScan++ = static_cast<sal_uInt8>(pWriteAccess->GetBestPaletteIndex(
+                                BitmapColor( data[ nCurrPos   ],
+                                             data[ nCurrPos+1 ],
+                                             data[ nCurrPos+2 ] ) ));
+
+                            nCurrPos += 3;
+
+                            // cast to unsigned byte, for correct subtraction result
+                            *pAScan++ = static_cast<sal_uInt8>(255 -
+                                                          static_cast<sal_uInt8>(data[ nCurrPos++ ]));
+                        }
+                    }
+                    break;
+
+                    case ScanlineFormat::N24BitTcBgr:
+                    {
+                        Scanline pScan  = pWriteAccess->GetScanline( y );
+                        Scanline pAScan = pAlphaWriteAccess->GetScanline( y );
+
+                        for( long x=rect.X1;
+                             x<aBmpSize.Width() && x<rect.X2;
+                             ++x )
+                        {
+                            *pScan++ = data[ nCurrPos+2 ];
+                            *pScan++ = data[ nCurrPos+1 ];
+                            *pScan++ = data[ nCurrPos   ];
+
+                            nCurrPos += 3;
+
+                            // cast to unsigned byte, for correct subtraction result
+                            *pAScan++ = static_cast<sal_uInt8>(255 -
+                                                          static_cast<sal_uInt8>(data[ nCurrPos++ ]));
+                        }
+                    }
+                    break;
+
+                    case ScanlineFormat::N24BitTcRgb:
+                    {
+                        Scanline pScan  = pWriteAccess->GetScanline( y );
+                        Scanline pAScan = pAlphaWriteAccess->GetScanline( y );
+
+                        for( long x=rect.X1;
+                             x<aBmpSize.Width() && x<rect.X2;
+                             ++x )
+                        {
+                            *pScan++ = data[ nCurrPos   ];
+                            *pScan++ = data[ nCurrPos+1 ];
+                            *pScan++ = data[ nCurrPos+2 ];
+
+                            nCurrPos += 3;
+
+                            // cast to unsigned byte, for correct subtraction result
+                            *pAScan++ = static_cast<sal_uInt8>(255 -
+                                                          static_cast<sal_uInt8>(data[ nCurrPos++ ]));
+                        }
+                    }
+                    break;
+
+                    default:
+                    {
+                        Scanline pScan  = pWriteAccess->GetScanline( y );
+                        Scanline pAScan = pAlphaWriteAccess->GetScanline( y );
+
+                        for( long x=rect.X1;
+                             x<aBmpSize.Width() && x<rect.X2;
+                             ++x )
+                        {
+                            pWriteAccess->SetPixelOnData( pScan, x, BitmapColor( data[ nCurrPos   ],
+                                                                       data[ nCurrPos+1 ],
+                                                                       data[ nCurrPos+2 ] ) );
+                            nCurrPos += 3;
+
+                            // cast to unsigned byte, for correct subtraction result
+                            pAlphaWriteAccess->SetPixelOnData( pAScan, x,
+                                                         BitmapColor(
+                                                             static_cast<sal_uInt8>(255 -
+                                                                               static_cast<sal_uInt8>(data[ nCurrPos++ ])) ) );
+                        }
+                    }
+                    break;
+                }
+            }
+            else
+            {
+                // TODO(Q3): This is copy'n'pasted from
+                // canvashelper.cxx, unify!
+                switch( pWriteAccess->GetScanlineFormat() )
+                {
+                    case ScanlineFormat::N8BitPal:
+                    {
+                        Scanline pScan = pWriteAccess->GetScanline( y );
+
+                        for( long x=rect.X1;
+                             x<aBmpSize.Width() && x<rect.X2;
+                             ++x )
+                        {
+                            *pScan++ = static_cast<sal_uInt8>(pWriteAccess->GetBestPaletteIndex(
+                                BitmapColor( data[ nCurrPos   ],
+                                             data[ nCurrPos+1 ],
+                                             data[ nCurrPos+2 ] ) ));
+
+                            nCurrPos += 4; // skip three colors, _plus_ alpha
+                        }
+                    }
+                    break;
+
+                    case ScanlineFormat::N24BitTcBgr:
+                    {
+                        Scanline pScan = pWriteAccess->GetScanline( y );
+
+                        for( long x=rect.X1;
+                             x<aBmpSize.Width() && x<rect.X2;
+                             ++x )
+                        {
+                            *pScan++ = data[ nCurrPos+2 ];
+                            *pScan++ = data[ nCurrPos+1 ];
+                            *pScan++ = data[ nCurrPos   ];
+
+                            nCurrPos += 4; // skip three colors, _plus_ alpha
+                        }
+                    }
+                    break;
+
+                    case ScanlineFormat::N24BitTcRgb:
+                    {
+                        Scanline pScan = pWriteAccess->GetScanline( y );
+
+                        for( long x=rect.X1;
+                             x<aBmpSize.Width() && x<rect.X2;
+                             ++x )
+                        {
+                            *pScan++ = data[ nCurrPos   ];
+                            *pScan++ = data[ nCurrPos+1 ];
+                            *pScan++ = data[ nCurrPos+2 ];
+
+                            nCurrPos += 4; // skip three colors, _plus_ alpha
+                        }
+                    }
+                    break;
+
+                    default:
+                    {
+                        Scanline pScan = pWriteAccess->GetScanline( y );
+
+                        for( long x=rect.X1;
+                             x<aBmpSize.Width() && x<rect.X2;
+                             ++x )
+                        {
+                            pWriteAccess->SetPixelOnData( pScan, x, BitmapColor( data[ nCurrPos   ],
+                                                                       data[ nCurrPos+1 ],
+                                                                       data[ nCurrPos+2 ] ) );
+                            nCurrPos += 4; // skip three colors, _plus_ alpha
+                        }
+                    }
+                    break;
+                }
+            }
+        }
+    }
+
+    if( aAlpha.IsEmpty() )
+        return BitmapEx( aBitmap );
+    else
+        return BitmapEx( aBitmap, AlphaMask( aAlpha ) );
+}
+
+
 }} // end vcl::bitmap
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list