Kaydet (Commit) 5e7709c5 authored tarafından Luboš Luňák's avatar Luboš Luňák

use AA for lines only when AA is active

Change-Id: I9965f58b8f06f1cec2c419dcf16d8aebf9cd97b8
üst 8286e924
...@@ -40,8 +40,9 @@ class VCL_PLUGIN_PUBLIC OpenGLSalGraphicsImpl : public SalGraphicsImpl ...@@ -40,8 +40,9 @@ class VCL_PLUGIN_PUBLIC OpenGLSalGraphicsImpl : public SalGraphicsImpl
protected: protected:
OpenGLContext* mpContext; OpenGLContext* mpContext;
SalGraphics& mrParent;
/// Pointer to the SalFrame or SalVirtualDevice /// Pointer to the SalFrame or SalVirtualDevice
SalGeometryProvider* mpParent; SalGeometryProvider* mpProvider;
OpenGLFramebuffer* mpFramebuffer; OpenGLFramebuffer* mpFramebuffer;
OpenGLProgram* mpProgram; OpenGLProgram* mpProgram;
...@@ -66,11 +67,14 @@ public: ...@@ -66,11 +67,14 @@ public:
bool UseSolid( SalColor nColor, sal_uInt8 nTransparency ); bool UseSolid( SalColor nColor, sal_uInt8 nTransparency );
bool UseSolid( SalColor nColor, double fTransparency ); bool UseSolid( SalColor nColor, double fTransparency );
bool UseSolid( SalColor nColor ); bool UseSolid( SalColor nColor );
bool UseSolidAA( SalColor nColor );
bool UseInvert(); bool UseInvert();
void DrawPoint( long nX, long nY ); void DrawPoint( long nX, long nY );
void DrawLine( long nX1, long nY1, long nX2, long nY2 ); void DrawLine( long nX1, long nY1, long nX2, long nY2 );
void DrawLines( sal_uInt32 nPoints, const SalPoint* pPtAry, bool bClose ); void DrawLines( sal_uInt32 nPoints, const SalPoint* pPtAry, bool bClose );
void DrawLineAA( long nX1, long nY1, long nX2, long nY2 );
void DrawLinesAA( sal_uInt32 nPoints, const SalPoint* pPtAry, bool bClose );
void DrawConvexPolygon( sal_uInt32 nPoints, const SalPoint* pPtAry ); void DrawConvexPolygon( sal_uInt32 nPoints, const SalPoint* pPtAry );
void DrawConvexPolygon( const Polygon& rPolygon ); void DrawConvexPolygon( const Polygon& rPolygon );
void DrawRect( long nX, long nY, long nWidth, long nHeight ); void DrawRect( long nX, long nY, long nWidth, long nHeight );
...@@ -92,13 +96,13 @@ public: ...@@ -92,13 +96,13 @@ public:
public: public:
// get the width of the device // get the width of the device
GLfloat GetWidth() const { return mpParent ? mpParent->GetWidth() : 1; } GLfloat GetWidth() const { return mpProvider ? mpProvider->GetWidth() : 1; }
// get the height of the device // get the height of the device
GLfloat GetHeight() const { return mpParent ? mpParent->GetHeight() : 1; } GLfloat GetHeight() const { return mpProvider ? mpProvider->GetHeight() : 1; }
// check whether this instance is used for offscreen rendering // check whether this instance is used for offscreen rendering
bool IsOffscreen() const { return mpParent ? mpParent->IsOffScreen() : true; } bool IsOffscreen() const { return mpProvider ? mpProvider->IsOffScreen() : true; }
// operations to do before painting // operations to do before painting
virtual void PreDraw(); virtual void PreDraw();
...@@ -120,7 +124,7 @@ protected: ...@@ -120,7 +124,7 @@ protected:
virtual bool UseContext( OpenGLContext* pContext ) = 0; virtual bool UseContext( OpenGLContext* pContext ) = 0;
public: public:
OpenGLSalGraphicsImpl(SalGeometryProvider* pParent); OpenGLSalGraphicsImpl(SalGraphics& pParent, SalGeometryProvider *pProvider);
virtual ~OpenGLSalGraphicsImpl (); virtual ~OpenGLSalGraphicsImpl ();
OpenGLContext* GetOpenGLContext(); OpenGLContext* GetOpenGLContext();
......
...@@ -36,9 +36,10 @@ ...@@ -36,9 +36,10 @@
#include <vector> #include <vector>
OpenGLSalGraphicsImpl::OpenGLSalGraphicsImpl(SalGeometryProvider* pParent) OpenGLSalGraphicsImpl::OpenGLSalGraphicsImpl(SalGraphics& rParent, SalGeometryProvider *pProvider)
: mpContext(0) : mpContext(0)
, mpParent(pParent) , mrParent(rParent)
, mpProvider(pProvider)
, mpFramebuffer(NULL) , mpFramebuffer(NULL)
, mpProgram(NULL) , mpProgram(NULL)
, mbUseScissor(false) , mbUseScissor(false)
...@@ -381,6 +382,18 @@ bool OpenGLSalGraphicsImpl::UseSolid( SalColor nColor ) ...@@ -381,6 +382,18 @@ bool OpenGLSalGraphicsImpl::UseSolid( SalColor nColor )
return UseSolid( nColor, 0.0f ); return UseSolid( nColor, 0.0f );
} }
// Like UseSolid(), but sets up for AA drawing, which uses gradients to create the AA.
bool OpenGLSalGraphicsImpl::UseSolidAA( SalColor nColor )
{
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 );
return true;
}
bool OpenGLSalGraphicsImpl::UseInvert() bool OpenGLSalGraphicsImpl::UseInvert()
{ {
if( !UseSolid( MAKE_SALCOLOR( 255, 255, 255 ) ) ) if( !UseSolid( MAKE_SALCOLOR( 255, 255, 255 ) ) )
...@@ -402,8 +415,24 @@ void OpenGLSalGraphicsImpl::DrawPoint( long nX, long nY ) ...@@ -402,8 +415,24 @@ void OpenGLSalGraphicsImpl::DrawPoint( long nX, long nY )
void OpenGLSalGraphicsImpl::DrawLine( long nX1, long nY1, long nX2, long nY2 ) void OpenGLSalGraphicsImpl::DrawLine( long nX1, long nY1, long nX2, long nY2 )
{ {
GLfloat pPoints[4];
pPoints[0] = (2 * nX1) / GetWidth() - 1.0;
pPoints[1] = 1.0f - 2 * nY1 / GetHeight();
pPoints[2] = (2 * nX2) / GetWidth() - 1.0;;
pPoints[3] = 1.0f - 2 * nY2 / GetHeight();
mpProgram->SetVertices( pPoints );
glDrawArrays( GL_LINES, 0, 2 );
}
void OpenGLSalGraphicsImpl::DrawLineAA( long nX1, long nY1, long nX2, long nY2 )
{
if( !mrParent.getAntiAliasB2DDraw())
return DrawLine( nX1, nY1, nX2, nY2 );
if( nX1 == nX2 || nY1 == nY2 ) if( nX1 == nX2 || nY1 == nY2 )
{ // horizontal/vertical, no need for AA { // Horizontal/vertical, no need for AA, both points have normal color.
GLfloat pPoints[4]; GLfloat pPoints[4];
pPoints[0] = (2 * nX1) / GetWidth() - 1.0; pPoints[0] = (2 * nX1) / GetWidth() - 1.0;
...@@ -412,6 +441,10 @@ void OpenGLSalGraphicsImpl::DrawLine( long nX1, long nY1, long nX2, long nY2 ) ...@@ -412,6 +441,10 @@ void OpenGLSalGraphicsImpl::DrawLine( long nX1, long nY1, long nX2, long nY2 )
pPoints[3] = 1.0f - 2 * nY2 / GetHeight(); pPoints[3] = 1.0f - 2 * nY2 / GetHeight();
mpProgram->SetVertices( pPoints ); mpProgram->SetVertices( pPoints );
// Still set up for the trivial "gradients", because presumably UseSolidAA() has been called.
GLfloat aTexCoord[4] = { 0, 1, 1, 1 };
mpProgram->SetTextureCoord( aTexCoord );
glDrawArrays( GL_LINES, 0, 2 ); glDrawArrays( GL_LINES, 0, 2 );
return; return;
} }
...@@ -425,11 +458,6 @@ void OpenGLSalGraphicsImpl::DrawLine( long nX1, long nY1, long nX2, long nY2 ) ...@@ -425,11 +458,6 @@ void OpenGLSalGraphicsImpl::DrawLine( long nX1, long nY1, long nX2, long nY2 )
* *
* Enjoy. Chris Tsang.*/ * Enjoy. Chris Tsang.*/
if( !UseProgram( "textureVertexShader", "linearGradientFragmentShader" ) )
return;
mpProgram->SetColorf( "start_color", mnLineColor, 0.0f );
mpProgram->SetColorf( "end_color", mnLineColor, 1.0f );
double x1 = nX1; double x1 = nX1;
double y1 = nY1; double y1 = nY1;
double x2 = nX2; double x2 = nX2;
...@@ -546,6 +574,14 @@ void OpenGLSalGraphicsImpl::DrawLines( sal_uInt32 nPoints, const SalPoint* pPtAr ...@@ -546,6 +574,14 @@ void OpenGLSalGraphicsImpl::DrawLines( sal_uInt32 nPoints, const SalPoint* pPtAr
DrawLine( pPtAry[ nPoints - 1 ].mnX, pPtAry[ nPoints - 1 ].mnY, pPtAry[ 0 ].mnX, pPtAry[ 0 ].mnY ); DrawLine( pPtAry[ nPoints - 1 ].mnX, pPtAry[ nPoints - 1 ].mnY, pPtAry[ 0 ].mnX, pPtAry[ 0 ].mnY );
} }
void OpenGLSalGraphicsImpl::DrawLinesAA( sal_uInt32 nPoints, const SalPoint* pPtAry, bool bClose )
{
for( int i = 0; i < int(nPoints) - 1; ++i )
DrawLineAA( pPtAry[ i ].mnX, pPtAry[ i ].mnY, pPtAry[ i + 1 ].mnX, pPtAry[ i + 1 ].mnY );
if( bClose )
DrawLineAA( pPtAry[ nPoints - 1 ].mnX, pPtAry[ nPoints - 1 ].mnY, pPtAry[ 0 ].mnX, pPtAry[ 0 ].mnY );
}
void OpenGLSalGraphicsImpl::DrawConvexPolygon( sal_uInt32 nPoints, const SalPoint* pPtAry ) void OpenGLSalGraphicsImpl::DrawConvexPolygon( sal_uInt32 nPoints, const SalPoint* pPtAry )
{ {
std::vector<GLfloat> aVertices(nPoints * 2); std::vector<GLfloat> aVertices(nPoints * 2);
...@@ -925,8 +961,8 @@ void OpenGLSalGraphicsImpl::drawLine( long nX1, long nY1, long nX2, long nY2 ) ...@@ -925,8 +961,8 @@ void OpenGLSalGraphicsImpl::drawLine( long nX1, long nY1, long nX2, long nY2 )
if( mnLineColor != SALCOLOR_NONE ) if( mnLineColor != SALCOLOR_NONE )
{ {
PreDraw(); PreDraw();
if( UseSolid( mnLineColor ) ) if( UseSolidAA( mnLineColor ) )
DrawLine( nX1, nY1, nX2, nY2 ); DrawLineAA( nX1, nY1, nX2, nY2 );
PostDraw(); PostDraw();
} }
} }
...@@ -947,7 +983,7 @@ void OpenGLSalGraphicsImpl::drawRect( long nX, long nY, long nWidth, long nHeigh ...@@ -947,7 +983,7 @@ void OpenGLSalGraphicsImpl::drawRect( long nX, long nY, long nWidth, long nHeigh
const long nY2( nY + nHeight ); const long nY2( nY + nHeight );
const SalPoint aPoints[] = { { nX1, nY1 }, { nX2, nY1 }, const SalPoint aPoints[] = { { nX1, nY1 }, { nX2, nY1 },
{ nX2, nY2 }, { nX1, nY2 } }; { nX2, nY2 }, { nX1, nY2 } };
DrawLines( 4, aPoints, true ); DrawLines( 4, aPoints, true ); // No need for AA.
} }
PostDraw(); PostDraw();
...@@ -960,8 +996,8 @@ void OpenGLSalGraphicsImpl::drawPolyLine( sal_uInt32 nPoints, const SalPoint* pP ...@@ -960,8 +996,8 @@ void OpenGLSalGraphicsImpl::drawPolyLine( sal_uInt32 nPoints, const SalPoint* pP
if( mnLineColor != SALCOLOR_NONE && nPoints > 1 ) if( mnLineColor != SALCOLOR_NONE && nPoints > 1 )
{ {
PreDraw(); PreDraw();
if( UseSolid( mnLineColor ) ) if( UseSolidAA( mnLineColor ) )
DrawLines( nPoints, pPtAry, false ); DrawLinesAA( nPoints, pPtAry, false );
PostDraw(); PostDraw();
} }
} }
...@@ -988,8 +1024,8 @@ void OpenGLSalGraphicsImpl::drawPolygon( sal_uInt32 nPoints, const SalPoint* pPt ...@@ -988,8 +1024,8 @@ void OpenGLSalGraphicsImpl::drawPolygon( sal_uInt32 nPoints, const SalPoint* pPt
if( UseSolid( mnFillColor ) ) if( UseSolid( mnFillColor ) )
DrawPolygon( nPoints, pPtAry ); DrawPolygon( nPoints, pPtAry );
if( UseSolid( mnLineColor ) ) if( UseSolidAA( mnLineColor ) )
DrawLines( nPoints, pPtAry, true ); DrawLinesAA( nPoints, pPtAry, true );
PostDraw(); PostDraw();
} }
...@@ -1008,11 +1044,11 @@ void OpenGLSalGraphicsImpl::drawPolyPolygon( sal_uInt32 nPoly, const sal_uInt32* ...@@ -1008,11 +1044,11 @@ void OpenGLSalGraphicsImpl::drawPolyPolygon( sal_uInt32 nPoly, const sal_uInt32*
DrawPolygon( pPoints[i], pPtAry[i] ); DrawPolygon( pPoints[i], pPtAry[i] );
} }
if( UseSolid( mnLineColor ) ) if( UseSolidAA( mnLineColor ) )
{ {
// TODO Use glMultiDrawElements or primitive restart // TODO Use glMultiDrawElements or primitive restart
for( sal_uInt32 i = 0; i < nPoly; i++ ) for( sal_uInt32 i = 0; i < nPoly; i++ )
DrawLines( pPoints[i], pPtAry[i], true ); DrawLinesAA( pPoints[i], pPtAry[i], true );
} }
PostDraw(); PostDraw();
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
WinOpenGLSalGraphicsImpl::WinOpenGLSalGraphicsImpl(WinSalGraphics& rGraphics, WinOpenGLSalGraphicsImpl::WinOpenGLSalGraphicsImpl(WinSalGraphics& rGraphics,
SalGeometryProvider *mpProvider): SalGeometryProvider *mpProvider):
OpenGLSalGraphicsImpl(mpProvider), OpenGLSalGraphicsImpl(rGraphics,mpProvider),
mrParent(rGraphics) mrParent(rGraphics)
{ {
} }
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
#include <vcl/opengl/OpenGLHelper.hxx> #include <vcl/opengl/OpenGLHelper.hxx>
X11OpenGLSalGraphicsImpl::X11OpenGLSalGraphicsImpl( X11SalGraphics& rParent ): X11OpenGLSalGraphicsImpl::X11OpenGLSalGraphicsImpl( X11SalGraphics& rParent ):
OpenGLSalGraphicsImpl(rParent.GetGeometryProvider()), OpenGLSalGraphicsImpl(rParent,rParent.GetGeometryProvider()),
mrParent(rParent) mrParent(rParent)
{ {
} }
...@@ -38,7 +38,7 @@ X11OpenGLSalGraphicsImpl::~X11OpenGLSalGraphicsImpl() ...@@ -38,7 +38,7 @@ X11OpenGLSalGraphicsImpl::~X11OpenGLSalGraphicsImpl()
void X11OpenGLSalGraphicsImpl::Init() void X11OpenGLSalGraphicsImpl::Init()
{ {
// The m_pFrame and m_pVDev pointers are updated late in X11 // The m_pFrame and m_pVDev pointers are updated late in X11
mpParent = mrParent.GetGeometryProvider(); mpProvider = mrParent.GetGeometryProvider();
OpenGLSalGraphicsImpl::Init(); OpenGLSalGraphicsImpl::Init();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment