[Libreoffice-commits] core.git: Branch 'feature/opengl-vcl' - vcl/inc vcl/opengl vcl/unx

Louis-Francis Ratté-Boulianne lfrb at collabora.com
Mon Nov 10 20:30:42 PST 2014


 vcl/inc/openglgdiimpl.hxx                        |    5 ++
 vcl/inc/salgdiimpl.hxx                           |    5 ++
 vcl/inc/unx/salgdi.h                             |    4 +
 vcl/opengl/gdiimpl.cxx                           |   17 +++++++
 vcl/unx/generic/gdi/gdiimpl.cxx                  |    6 ++
 vcl/unx/generic/gdi/gdiimpl.hxx                  |    4 +
 vcl/unx/generic/gdi/openglx11cairotextrender.cxx |   53 +++++++++++++++++++----
 vcl/unx/generic/gdi/salgdi2.cxx                  |    6 ++
 8 files changed, 91 insertions(+), 9 deletions(-)

New commits:
commit 6fad1cfc18b084ac2974fc07c81208b1d4ab631a
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date:   Mon Nov 10 23:30:02 2014 -0500

    vcl: Fix text rendering with OpenGL
    
    Change-Id: I7784fa81cb6f9a3d6437b2b628c37e7895c84733

diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index 5a11952..56938b9 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -242,6 +242,11 @@ public:
                 const SalBitmap& rSourceBitmap,
                 const SalBitmap& rAlphaBitmap ) SAL_OVERRIDE;
 
+    /** Render 32-bits bitmap with alpha channel */
+    virtual bool drawAlphaBitmap(
+                const SalTwoRect&,
+                const SalBitmap& rBitmap ) SAL_OVERRIDE;
+
     /** draw transformed bitmap (maybe with alpha) where Null, X, Y define the coordinate system */
     virtual bool drawTransformedBitmap(
                 const basegfx::B2DPoint& rNull,
diff --git a/vcl/inc/salgdiimpl.hxx b/vcl/inc/salgdiimpl.hxx
index 5d49952..4b4b735 100644
--- a/vcl/inc/salgdiimpl.hxx
+++ b/vcl/inc/salgdiimpl.hxx
@@ -181,6 +181,11 @@ public:
                 const SalBitmap& rSourceBitmap,
                 const SalBitmap& rAlphaBitmap ) = 0;
 
+    /** Render 32-bits bitmap with alpha channel */
+    virtual bool drawAlphaBitmap(
+                const SalTwoRect&,
+                const SalBitmap& rBitmap ) = 0;
+
     /** draw transformed bitmap (maybe with alpha) where Null, X, Y define the coordinate system */
     virtual bool drawTransformedBitmap(
                 const basegfx::B2DPoint& rNull,
diff --git a/vcl/inc/unx/salgdi.h b/vcl/inc/unx/salgdi.h
index c288292..d532668 100644
--- a/vcl/inc/unx/salgdi.h
+++ b/vcl/inc/unx/salgdi.h
@@ -252,6 +252,10 @@ public:
     virtual bool            drawAlphaBitmap( const SalTwoRect&,
                                              const SalBitmap& rSourceBitmap,
                                              const SalBitmap& rAlphaBitmap ) SAL_OVERRIDE;
+
+    virtual bool            drawAlphaBitmap( const SalTwoRect&,
+                                             const SalBitmap& rBitmap );
+
     virtual bool drawTransformedBitmap(
         const basegfx::B2DPoint& rNull,
         const basegfx::B2DPoint& rX,
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 6413283..8c06769 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -1007,6 +1007,23 @@ bool OpenGLSalGraphicsImpl::drawAlphaBitmap(
     return true;
 }
 
+bool OpenGLSalGraphicsImpl::drawAlphaBitmap(
+            const SalTwoRect& rPosAry,
+            const SalBitmap& rSalBitmap )
+{
+    const OpenGLSalBitmap& rBitmap = static_cast<const OpenGLSalBitmap&>(rSalBitmap);
+    const GLuint nTexture( rBitmap.GetTexture( maContext ) );
+
+    SAL_INFO( "vcl.opengl", "::drawAlphaBitmap" );
+    PreDraw();
+    glEnable( GL_BLEND );
+    glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
+    DrawTexture( nTexture, rBitmap.GetSize(), rPosAry );
+    glDisable( GL_BLEND );
+    PostDraw();
+    return true;
+}
+
 /** draw transformed bitmap (maybe with alpha) where Null, X, Y define the coordinate system */
 bool OpenGLSalGraphicsImpl::drawTransformedBitmap(
             const basegfx::B2DPoint& /*rNull*/,
diff --git a/vcl/unx/generic/gdi/gdiimpl.cxx b/vcl/unx/generic/gdi/gdiimpl.cxx
index 172ebd6..0f210b3 100644
--- a/vcl/unx/generic/gdi/gdiimpl.cxx
+++ b/vcl/unx/generic/gdi/gdiimpl.cxx
@@ -955,6 +955,12 @@ bool X11SalGraphicsImpl::drawAlphaBitmap( const SalTwoRect& rTR,
     return true;
 }
 
+bool X11SalGraphicsImpl::drawAlphaBitmap( const SalTwoRect& /*rTR*/,
+    const SalBitmap& /*rBitmap*/ )
+{
+    return false;
+}
+
 bool X11SalGraphicsImpl::drawTransformedBitmap(
     const basegfx::B2DPoint& rNull,
     const basegfx::B2DPoint& rX,
diff --git a/vcl/unx/generic/gdi/gdiimpl.hxx b/vcl/unx/generic/gdi/gdiimpl.hxx
index 252fe35..e6bfa86 100644
--- a/vcl/unx/generic/gdi/gdiimpl.hxx
+++ b/vcl/unx/generic/gdi/gdiimpl.hxx
@@ -242,6 +242,10 @@ public:
                 const SalBitmap& rSourceBitmap,
                 const SalBitmap& rAlphaBitmap ) SAL_OVERRIDE;
 
+    virtual bool drawAlphaBitmap(
+                const SalTwoRect&,
+                const SalBitmap& rBitmap ) SAL_OVERRIDE;
+
     /** draw transformed bitmap (maybe with alpha) where Null, X, Y define the coordinate system */
     virtual bool drawTransformedBitmap(
                 const basegfx::B2DPoint& rNull,
diff --git a/vcl/unx/generic/gdi/openglx11cairotextrender.cxx b/vcl/unx/generic/gdi/openglx11cairotextrender.cxx
index 9b7c49e..36a76b0 100644
--- a/vcl/unx/generic/gdi/openglx11cairotextrender.cxx
+++ b/vcl/unx/generic/gdi/openglx11cairotextrender.cxx
@@ -24,26 +24,61 @@ cairo_surface_t* OpenGLX11CairoTextRender::getCairoSurface()
     // static size_t id = 0;
     // OString aFileName = OString("/tmp/libo_logs/text_rendering") + OString::number(id++) + OString(".svg");
     // cairo_surface_t* surface = cairo_svg_surface_create(aFileName.getStr(), GetWidth(), GetHeight());
-    cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, GetWidth(), GetHeight());
+    cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, GetWidth(), GetHeight());
     return surface;
 }
 
 void OpenGLX11CairoTextRender::drawSurface(cairo_t* cr)
 {
-    cairo_surface_t* surface = cairo_get_target(cr);
-    int width = cairo_image_surface_get_width(surface);
-    int height = cairo_image_surface_get_height(surface);
+    cairo_surface_t* pSurface = cairo_get_target(cr);
+    int nWidth = cairo_image_surface_get_width( pSurface );
+    int nHeight = cairo_image_surface_get_height( pSurface );
     SalBitmap* pBitmap = ImplGetSVData()->mpDefInst->CreateSalBitmap();
-    pBitmap->Create(Size(width, height), 24, BitmapPalette());
+    pBitmap->Create(Size(nWidth, nHeight), 32, BitmapPalette());
+
+    cairo_surface_flush( pSurface );
     BitmapBuffer* pBuffer = pBitmap->AcquireBuffer(false);
-    std::memcpy(pBuffer->mpBits, cairo_image_surface_get_data(surface), width*height*3);
+    unsigned char *pSrc = cairo_image_surface_get_data( pSurface );
+    unsigned int nSrcStride = cairo_image_surface_get_stride( pSurface );
+    unsigned int nDestStride = pBuffer->mnScanlineSize;
+    for( unsigned long y = 0; y < (unsigned long) nHeight; y++ )
+    {
+        // Cairo surface is y-inverse
+        sal_uInt32 *pSrcPix = (sal_uInt32 *)(pSrc + nSrcStride * (nHeight - y - 1));
+        sal_uInt32 *pDestPix = (sal_uInt32 *)(pBuffer->mpBits + nDestStride * y);
+        for( unsigned long x = 0; x < (unsigned long) nWidth; x++ )
+        {
+            sal_uInt8 nAlpha = (*pSrcPix >> 24);
+            sal_uInt8 nR = (*pSrcPix >> 16) & 0xff;
+            sal_uInt8 nG = (*pSrcPix >> 8) & 0xff;
+            sal_uInt8 nB = *pSrcPix & 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 );
+            }
+
+            // FIXME: lfrb: depends on endianness (use BitmapWriteAccess)
+            *pDestPix = (nAlpha << 24) + (nB << 16) + (nG << 8) + nR;
+            pSrcPix++;
+            pDestPix++;
+        }
+    }
     pBitmap->ReleaseBuffer(pBuffer, false);
+
     SalTwoRect aRect;
     aRect.mnSrcX = 0;
     aRect.mnSrcY = 0;
-    aRect.mnSrcWidth = width;
-    aRect.mnSrcHeight = height;
-    mrParent.drawBitmap(aRect, *pBitmap);
+    aRect.mnSrcWidth = nWidth;
+    aRect.mnSrcHeight = nHeight;
+    aRect.mnDestX = 0;
+    aRect.mnDestY = 0;
+    aRect.mnDestWidth = nWidth;
+    aRect.mnDestHeight = nHeight;
+
+    mrParent.drawAlphaBitmap(aRect, *pBitmap);
     delete pBitmap;
 }
 
diff --git a/vcl/unx/generic/gdi/salgdi2.cxx b/vcl/unx/generic/gdi/salgdi2.cxx
index 63ab32b..fe7199c 100644
--- a/vcl/unx/generic/gdi/salgdi2.cxx
+++ b/vcl/unx/generic/gdi/salgdi2.cxx
@@ -185,6 +185,12 @@ bool X11SalGraphics::drawAlphaBitmap( const SalTwoRect& rTR,
     return mpImpl->drawAlphaBitmap( rTR, rSrcBitmap, rAlphaBmp );
 }
 
+bool X11SalGraphics::drawAlphaBitmap( const SalTwoRect& rTR,
+                                      const SalBitmap& rBitmap )
+{
+    return mpImpl->drawAlphaBitmap( rTR, rBitmap );
+}
+
 bool X11SalGraphics::drawTransformedBitmap(
     const basegfx::B2DPoint& rNull,
     const basegfx::B2DPoint& rX,


More information about the Libreoffice-commits mailing list