vcl/inc/openglgdiimpl.hxx |   10 ++++-
 vcl/opengl/gdiimpl.cxx    |   78 ++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 79 insertions(+), 9 deletions(-)

New commits:
commit 783ba49aa0cd068c7e3dacdd3c13e9c37cf52e22
Author: Luboš Luňák <l.lu...@collabora.com>
Date:   Thu Dec 18 11:47:58 2014 +0100

    draw also opengl polygon with AA edges if AA is wanted
    
    Especially given that lines are sometimes actually drawn using polygons.
    
    Change-Id: I429a24faff94f8b9accc20bdee3ff66f47669bde

diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index 2c911ee..4ca30b3 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -56,6 +56,9 @@ protected:
 
     SalColor mnLineColor;
     SalColor mnFillColor;
+#ifdef DBG_UTIL
+    bool mProgramIsSolidLineColor;
+#endif
 
     void ImplInitClipRegion();
     void ImplSetClipBit( const vcl::Region& rClip, GLuint nMask );
@@ -67,20 +70,21 @@ public:
     bool UseSolid( SalColor nColor, sal_uInt8 nTransparency );
     bool UseSolid( SalColor nColor, double fTransparency );
     bool UseSolid( SalColor nColor );
+    bool UseSolidAA( SalColor nColor, double fTransparency );
     bool UseSolidAA( SalColor nColor );
     bool UseInvert();
 
     void DrawPoint( long nX, long nY );
-    void DrawLine( long nX1, long nY1, long nX2, long nY2 );
+    void DrawLine( double nX1, double nY1, double nX2, double nY2 );
     void DrawLines( sal_uInt32 nPoints, const SalPoint* pPtAry, bool bClose );
-    void DrawLineAA( long nX1, long nY1, long nX2, long nY2 );
+    void DrawLineAA( double nX1, double nY1, double nX2, double nY2 );
     void DrawLinesAA( sal_uInt32 nPoints, const SalPoint* pPtAry, bool bClose 
);
     void DrawConvexPolygon( sal_uInt32 nPoints, const SalPoint* pPtAry );
     void DrawConvexPolygon( const Polygon& rPolygon );
     void DrawRect( long nX, long nY, long nWidth, long nHeight );
     void DrawRect( const Rectangle& rRect );
     void DrawPolygon( sal_uInt32 nPoints, const SalPoint* pPtAry );
-    void DrawPolyPolygon( const basegfx::B2DPolyPolygon& rPolyPolygon );
+    void DrawPolyPolygon( const basegfx::B2DPolyPolygon& rPolyPolygon, bool 
blockAA = false );
     void DrawRegionBand( const RegionBand& rRegion );
     void DrawTextureRect( OpenGLTexture& rTexture, const SalTwoRect& rPosAry, 
bool bInverted = false );
     void DrawTexture( OpenGLTexture& rTexture, const SalTwoRect& rPosAry, bool 
bInverted = false );
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 69db79b..f75966f 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -47,6 +47,9 @@ OpenGLSalGraphicsImpl::OpenGLSalGraphicsImpl(SalGraphics& 
rParent, SalGeometryPr
     , mbOffscreen(false)
     , mnLineColor(SALCOLOR_NONE)
     , mnFillColor(SALCOLOR_NONE)
+#ifdef DBG_UTIL
+    , mProgramIsSolidLineColor(false)
+#endif
 {
 }
 
@@ -162,6 +165,9 @@ void OpenGLSalGraphicsImpl::PostDraw()
     {
         mpProgram->Clean();
         mpProgram = NULL;
+#ifdef DBG_UTIL
+        mProgramIsSolidLineColor = false;
+#endif
     }
 
     CHECK_GL_ERROR();
@@ -192,7 +198,7 @@ void OpenGLSalGraphicsImpl::ImplSetClipBit( const 
vcl::Region& rClip, GLuint nMa
         if( rClip.getRegionBand() )
             DrawRegionBand( *rClip.getRegionBand() );
         else
-            DrawPolyPolygon( rClip.GetAsB2DPolyPolygon() );
+            DrawPolyPolygon( rClip.GetAsB2DPolyPolygon(), true );
     }
 
     glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
@@ -354,6 +360,9 @@ bool OpenGLSalGraphicsImpl::UseProgram( const OUString& 
rVertexShader, const OUS
     if( mpProgram != NULL )
         mpProgram->Clean();
     mpProgram = mpContext->UseProgram( rVertexShader, rFragmentShader );
+#ifdef DBG_UTIL
+    mProgramIsSolidLineColor = false; // UseSolid() will set to true if needed
+#endif
     return ( mpProgram != NULL );
 }
 
@@ -364,6 +373,9 @@ bool OpenGLSalGraphicsImpl::UseSolid( SalColor nColor, 
sal_uInt8 nTransparency )
     if( !UseProgram( "dumbVertexShader", "solidFragmentShader" ) )
         return false;
     mpProgram->SetColor( "color", nColor, nTransparency );
+#ifdef DBG_UTIL
+    mProgramIsSolidLineColor = true;
+#endif
     return true;
 }
 
@@ -374,6 +386,9 @@ bool OpenGLSalGraphicsImpl::UseSolid( SalColor nColor, 
double fTransparency )
     if( !UseProgram( "dumbVertexShader", "solidFragmentShader" ) )
         return false;
     mpProgram->SetColorf( "color", nColor, fTransparency );
+#ifdef DBG_UTIL
+    mProgramIsSolidLineColor = true;
+#endif
     return true;
 }
 
@@ -383,17 +398,22 @@ bool OpenGLSalGraphicsImpl::UseSolid( SalColor nColor )
 }
 
 // Like UseSolid(), but sets up for AA drawing, which uses gradients to create 
the AA.
-bool OpenGLSalGraphicsImpl::UseSolidAA( SalColor nColor )
+bool OpenGLSalGraphicsImpl::UseSolidAA( SalColor nColor, double fTransparency )
 {
     if( !mrParent.getAntiAliasB2DDraw())
         return UseSolid( nColor );
     if( !UseProgram( "textureVertexShader", "linearGradientFragmentShader" ) )
         return false;
     mpProgram->SetColorf( "start_color", nColor, 0.0f );
-    mpProgram->SetColorf( "end_color", nColor, 1.0f );
+    mpProgram->SetColorf( "end_color", nColor, fTransparency );
     return true;
 }
 
+bool OpenGLSalGraphicsImpl::UseSolidAA( SalColor nColor )
+{
+    return UseSolidAA( nColor, 1.0 );
+}
+
 bool OpenGLSalGraphicsImpl::UseInvert()
 {
     if( !UseSolid( MAKE_SALCOLOR( 255, 255, 255 ) ) )
@@ -413,7 +433,7 @@ void OpenGLSalGraphicsImpl::DrawPoint( long nX, long nY )
     glDrawArrays( GL_POINTS, 0, 1 );
 }
 
-void OpenGLSalGraphicsImpl::DrawLine( long nX1, long nY1, long nX2, long nY2 )
+void OpenGLSalGraphicsImpl::DrawLine( double nX1, double nY1, double nX2, 
double nY2 )
 {
     GLfloat pPoints[4];
 
@@ -426,7 +446,7 @@ void OpenGLSalGraphicsImpl::DrawLine( long nX1, long nY1, 
long nX2, long nY2 )
     glDrawArrays( GL_LINES, 0, 2 );
 }
 
-void OpenGLSalGraphicsImpl::DrawLineAA( long nX1, long nY1, long nX2, long nY2 
)
+void OpenGLSalGraphicsImpl::DrawLineAA( double nX1, double nY1, double nX2, 
double nY2 )
 {
     if( !mrParent.getAntiAliasB2DDraw())
         return DrawLine( nX1, nY1, nX2, nY2 );
@@ -612,6 +632,27 @@ void OpenGLSalGraphicsImpl::DrawConvexPolygon( const 
Polygon& rPolygon )
 
     mpProgram->SetVertices( &aVertices[0] );
     glDrawArrays( GL_TRIANGLE_FAN, 0, nPoints );
+
+    if( mrParent.getAntiAliasB2DDraw())
+    {
+        // Make the edges antialiased by drawing the edge lines again with AA.
+        // TODO: If transparent drawing is set up, drawing the lines 
themselves twice
+        // may be a problem, if that is a real problem, the polygon areas 
itself needs to be
+        // masked out for this or something.
+#ifdef DBG_UTIL
+        assert( mProgramIsSolidLineColor );
+#endif
+        UseSolidAA( mnLineColor );
+        for( i = 0; i < nPoints; ++i )
+        {
+            const Point& rPt1 = rPolygon.GetPoint( i );
+            const Point& rPt2 = rPolygon.GetPoint(( i + 1 ) % nPoints );
+            if( rPt1.getX() == rPt2.getX() || rPt1.getY() == rPt2.getY())
+                continue; //horizontal/vertical, no need for AA
+            DrawLineAA( rPt1.getX(), rPt1.getY(), rPt2.getX(), rPt2.getY());
+        }
+        UseSolid( mnLineColor );
+    }
 }
 
 void OpenGLSalGraphicsImpl::DrawRect( long nX, long nY, long nWidth, long 
nHeight )
@@ -658,7 +699,7 @@ void OpenGLSalGraphicsImpl::DrawPolygon( sal_uInt32 
nPoints, const SalPoint* pPt
     }
 }
 
-void OpenGLSalGraphicsImpl::DrawPolyPolygon( const basegfx::B2DPolyPolygon& 
rPolyPolygon )
+void OpenGLSalGraphicsImpl::DrawPolyPolygon( const basegfx::B2DPolyPolygon& 
rPolyPolygon, bool blockAA )
 {
     ::std::vector< GLfloat > aVertices;
     GLfloat nWidth = GetWidth();
@@ -682,6 +723,31 @@ void OpenGLSalGraphicsImpl::DrawPolyPolygon( const 
basegfx::B2DPolyPolygon& rPol
     mpProgram->SetVertices( aVertices.data() );
     glDrawArrays( GL_TRIANGLES, 0, aVertices.size() / 2 );
 
+    if( !blockAA && mrParent.getAntiAliasB2DDraw())
+    {
+        // Make the edges antialiased by drawing the edge lines again with AA.
+        // TODO: If transparent drawing is set up, drawing the lines 
themselves twice
+        // may be a problem, if that is a real problem, the polygon areas 
itself needs to be
+        // masked out for this or something.
+#ifdef DBG_UTIL
+        assert( mProgramIsSolidLineColor );
+#endif
+        UseSolidAA( mnLineColor );
+        for( sal_uInt32 i = 0; i < aSimplePolyPolygon.count(); i++ )
+        {
+            const basegfx::B2DPolygon& rPolygon( 
aSimplePolyPolygon.getB2DPolygon( i ) );
+            for( sal_uInt32 j = 0; j < rPolygon.count(); j++ )
+            {
+                const ::basegfx::B2DPoint& rPt1( rPolygon.getB2DPoint( j ) );
+                const ::basegfx::B2DPoint& rPt2( rPolygon.getB2DPoint(( j + 1 
) % rPolygon.count()) );
+                if( rPt1.getX() == rPt2.getX() || rPt1.getY() == rPt2.getY())
+                    continue; //horizontal/vertical, no need for AA
+                DrawLineAA( rPt1.getX(), rPt1.getY(), rPt2.getX(), 
rPt2.getY());
+            }
+        }
+        UseSolid( mnLineColor );
+    }
+
     CHECK_GL_ERROR();
 }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to