[Libreoffice-commits] core.git: Branch 'private/moggi/fix-text-rendering' - 2 commits - chart2/source

Markus Mohrhard markus.mohrhard at collabora.co.uk
Tue Jan 14 11:30:17 PST 2014


 chart2/source/view/main/OpenGLRender.cxx |   68 ++++++++++++++++---------------
 1 file changed, 37 insertions(+), 31 deletions(-)

New commits:
commit 103880ce92b09656d1f408e96ad137940de71c2b
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Tue Jan 14 19:14:49 2014 +0100

    add more debugging for text rendering
    
    Change-Id: I1cb43c8a02313acf2a48ba91e88534c17f5f86c8

diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index 57cd0a2..bd83199 100644
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -1433,6 +1433,19 @@ int OpenGLRender::CreateTextTexture(::rtl::OUString textValue, sal_uInt32 color,
     int bmpHeight = (aRect.Bottom() - aRect.Top() + 3) & ~3;
     BitmapEx aBitmapEx(aDevice.GetBitmapEx(aRect.TopLeft(), Size(bmpWidth, bmpHeight)));
 
+#if DEBUG_PNG // debug PNG writing
+    static int nIdx = 0;
+    OUString aName = OUString( "file:///home/moggi/Documents/work/text" ) + OUString::number( nIdx++ ) + ".png";
+    try {
+        vcl::PNGWriter aWriter( aBitmapEx );
+        SvFileStream sOutput( aName, STREAM_WRITE );
+        aWriter.Write( sOutput );
+        sOutput.Close();
+    } catch (...) {
+        SAL_WARN("slideshow.opengl", "Error writing png to " << aName);
+    }
+#endif
+
     Bitmap aBitmap (aBitmapEx.GetBitmap());
     AlphaMask aAlpha (aBitmapEx.GetAlpha());
     boost::scoped_array<sal_uInt8> bitmapBuf(new sal_uInt8[4* bmpWidth * bmpHeight ]);
commit d9a75f9df3d614cbcd1451168c0d4db8e714c293
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Mon Jan 13 23:32:37 2014 +0100

    try to use alpha background in text rendering
    
    Change-Id: I9750117a72d05c7325580a1f93e5db3b9e0fdeb6

diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index 451b169..57cd0a2 100644
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -37,6 +37,7 @@
 #include <vcl/virdev.hxx>
 #include <vcl/dibtools.hxx>
 #include <vcl/bmpacc.hxx>
+#include <vcl/svapp.hxx>
 
 #include <boost/scoped_array.hpp>
 
@@ -1418,49 +1419,40 @@ int OpenGLRender::RenderRectangleShape()
 
 int OpenGLRender::CreateTextTexture(::rtl::OUString textValue, sal_uInt32 color, const Font& rFont, awt::Point aPos, awt::Size aSize, long rotation)
 {
-    VirtualDevice aDevice;
-    aDevice.SetFont(rFont);
+    VirtualDevice aDevice(*Application::GetDefaultDevice(), 0, 0);
+    aDevice.Erase();
     Rectangle aRect;
+    aDevice.SetFont(rFont);
     aDevice.GetTextBoundRect(aRect, textValue);
     int screenWidth = (aRect.BottomRight().X() + 3) & ~3;
     int screenHeight = (aRect.BottomRight().Y() + 3) & ~3;
     aDevice.SetOutputSizePixel(Size(screenWidth * 3, screenHeight));
+    aDevice.SetBackground(Wallpaper(COL_TRANSPARENT));
     aDevice.DrawText(Point(0, 0), textValue);
     int bmpWidth = (aRect.Right() - aRect.Left() + 3) & ~3;
     int bmpHeight = (aRect.Bottom() - aRect.Top() + 3) & ~3;
-    BitmapEx aBitmapEx(aDevice.GetBitmap(aRect.TopLeft(), Size(bmpWidth, bmpHeight)));
-    Bitmap aBitmap( aBitmapEx.GetBitmap());
-    int bitmapsize = aBitmap.GetSizeBytes();
-    boost::scoped_array<sal_uInt8> bitmapBuf(new sal_uInt8[bitmapsize * 4 / 3 ]);
-    BitmapReadAccess* pRAcc = aBitmap.AcquireReadAccess();
-    sal_uInt8 red = (color & 0x00FF0000) >> 16;
-    sal_uInt8 g = (color & 0x0000FF00) >> 8;
-    sal_uInt8 b = (color & 0x000000FF);
+    BitmapEx aBitmapEx(aDevice.GetBitmapEx(aRect.TopLeft(), Size(bmpWidth, bmpHeight)));
+
+    Bitmap aBitmap (aBitmapEx.GetBitmap());
+    AlphaMask aAlpha (aBitmapEx.GetAlpha());
+    boost::scoped_array<sal_uInt8> bitmapBuf(new sal_uInt8[4* bmpWidth * bmpHeight ]);
+    Bitmap::ScopedReadAccess pReadAccces( aBitmap );
+    AlphaMask::ScopedReadAccess pAlphaReadAccess( aAlpha );
 
-    SAL_WARN("chart2.opengl", "r = " << (int)red << ", g = " << (int)g << ", b = " << (int)b );
+    size_t i = 0;
     for (long ny = 0; ny < bmpHeight; ny++)
     {
+        Scanline pAScan = pAlphaReadAccess->GetScanline(ny);
         for(long nx = 0; nx < bmpWidth; nx++)
         {
-           sal_uInt8 *pm = pRAcc->GetScanline(ny) + nx * 3;
-           sal_uInt8 *mk = bitmapBuf.get() + ny * bmpWidth * 4 + nx * 4;
-           if ((*pm == 0xFF) && (*(pm + 1) == 0xFF) && (*(pm + 2) == 0xFF))
-           {
-               *mk = *pm;
-               *(mk + 1) = *(pm + 1);
-               *(mk + 2) = *(pm + 2);
-               *(mk + 3) = 0;
-           }
-           else
-           {
-               *mk = b;
-               *(mk + 1) = g;
-               *(mk + 2) = red;
-               *(mk + 3) = ((0xFF - *pm) + (0xFF - *(pm + 1)) + (0xFF - *(pm + 2))) / 3;
-           }
+            BitmapColor aCol = pReadAccces->GetColor( ny, nx );
+            bitmapBuf[i++] = aCol.GetRed();
+            bitmapBuf[i++] = aCol.GetGreen();
+            bitmapBuf[i++] = aCol.GetBlue();
+            bitmapBuf[i++] = *pAScan++;
         }
     }
-    aBitmap.ReleaseAccess(pRAcc);
+
     TextInfo aTextInfo;
     aTextInfo.x = (float)(aPos.X + aSize.Width / 2) / OPENGL_SCALE_VALUE;
     aTextInfo.y = (float)(aPos.Y + aSize.Height / 2) / OPENGL_SCALE_VALUE;
@@ -1509,11 +1501,12 @@ int OpenGLRender::CreateTextTexture(::rtl::OUString textValue, sal_uInt32 color,
     CHECK_GL_ERROR();
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     CHECK_GL_ERROR();
-    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bmpWidth, bmpHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, bitmapBuf.get());
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bmpWidth, bmpHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmapBuf.get());
     CHECK_GL_ERROR();
     glBindTexture(GL_TEXTURE_2D, 0);
     CHECK_GL_ERROR();
     m_TextInfoList.push_back(aTextInfo);
+    aDevice.Erase();
     return 0;
 }
 
@@ -1650,12 +1643,12 @@ void OpenGLRender::SetBackGroundColor(sal_uInt32 color1, sal_uInt32 color2)
     m_BackgroundColor[0] = (float)r / 255.0f;
     m_BackgroundColor[1] = (float)g / 255.0f;
     m_BackgroundColor[2] = (float)b / 255.0f;
-    m_BackgroundColor[3] = 1.0;
+    m_BackgroundColor[3] = m_fAlpha;
 
     m_BackgroundColor[4] = (float)r / 255.0f;
     m_BackgroundColor[5] = (float)g / 255.0f;
     m_BackgroundColor[6] = (float)b / 255.0f;
-    m_BackgroundColor[7] = 1.0;
+    m_BackgroundColor[7] = m_fAlpha;
 
     r = (color2 & 0x00FF0000) >> 16;
     g = (color2 & 0x0000FF00) >> 8;


More information about the Libreoffice-commits mailing list