summaryrefslogtreecommitdiffstats
path: root/vcl/unx
diff options
context:
space:
mode:
authorLouis-Francis Ratté-Boulianne <lfrb@collabora.com>2014-11-10 23:30:02 -0500
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2014-11-11 11:08:25 +0100
commit14a1d4da2f49c92caaccfae9cab6940ac6e672a5 (patch)
treebe4d83e77cfa75e6291dfbbd8c9550bdb341ee63 /vcl/unx
parentvcl: Fix the VirtualDevice rectangle rendering in vcldemo (diff)
downloadcore-14a1d4da2f49c92caaccfae9cab6940ac6e672a5.tar.gz
core-14a1d4da2f49c92caaccfae9cab6940ac6e672a5.zip
vcl: Fix text rendering with OpenGL
Change-Id: I7784fa81cb6f9a3d6437b2b628c37e7895c84733
Diffstat (limited to 'vcl/unx')
-rw-r--r--vcl/unx/generic/gdi/gdiimpl.cxx6
-rw-r--r--vcl/unx/generic/gdi/gdiimpl.hxx4
-rw-r--r--vcl/unx/generic/gdi/openglx11cairotextrender.cxx53
-rw-r--r--vcl/unx/generic/gdi/salgdi2.cxx6
4 files changed, 60 insertions, 9 deletions
diff --git a/vcl/unx/generic/gdi/gdiimpl.cxx b/vcl/unx/generic/gdi/gdiimpl.cxx
index efe66d8fe3d3..4adea6259f46 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 91592eb6bfd5..5b0062c93949 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 9b7c49ed450f..36a76b06c6ee 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 63ab32b8981d..fe7199c16ffb 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,