[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