diff options
Diffstat (limited to 'canvas/source')
-rw-r--r-- | canvas/source/opengl/ogl_canvascustomsprite.cxx | 31 | ||||
-rw-r--r-- | canvas/source/opengl/ogl_canvastools.cxx | 29 | ||||
-rw-r--r-- | canvas/source/tools/surfaceproxy.cxx | 19 |
3 files changed, 63 insertions, 16 deletions
diff --git a/canvas/source/opengl/ogl_canvascustomsprite.cxx b/canvas/source/opengl/ogl_canvascustomsprite.cxx index 5f53ab4ece46..3cb5ec9fe217 100644 --- a/canvas/source/opengl/ogl_canvascustomsprite.cxx +++ b/canvas/source/opengl/ogl_canvascustomsprite.cxx @@ -191,18 +191,35 @@ namespace oglcanvas const double fHeight=maSize.Height; // TODO(P3): buffer triangulation - const ::basegfx::B2DPolygon& rTriangulatedPolygon( + const ::basegfx::triangulator::B2DTriangleVector rTriangulatedPolygon( ::basegfx::triangulator::triangulate( ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(mxClip))); glBegin(GL_TRIANGLES); - for( sal_uInt32 i=0; i<rTriangulatedPolygon.count(); i++ ) + for( size_t i=0; i<rTriangulatedPolygon.size(); i++ ) { - const ::basegfx::B2DPoint& rPt( rTriangulatedPolygon.getB2DPoint(i) ); - const double s(rPt.getX()/fWidth); - const double t(rPt.getY()/fHeight); - glTexCoord2f(s,t); glVertex2d(rPt.getX(), rPt.getY()); - } + const::basegfx::triangulator::B2DTriangle& rCandidate(rTriangulatedPolygon[i]); + glTexCoord2f( + rCandidate.getA().getX()/fWidth, + rCandidate.getA().getY()/fHeight); + glVertex2d( + rCandidate.getA().getX(), + rCandidate.getA().getY()); + + glTexCoord2f( + rCandidate.getB().getX()/fWidth, + rCandidate.getB().getY()/fHeight); + glVertex2d( + rCandidate.getB().getX(), + rCandidate.getB().getY()); + + glTexCoord2f( + rCandidate.getC().getX()/fWidth, + rCandidate.getC().getY()/fHeight); + glVertex2d( + rCandidate.getC().getX(), + rCandidate.getC().getY()); + } glEnd(); } else diff --git a/canvas/source/opengl/ogl_canvastools.cxx b/canvas/source/opengl/ogl_canvastools.cxx index cbf20db3a1e5..56fa47fbf303 100644 --- a/canvas/source/opengl/ogl_canvastools.cxx +++ b/canvas/source/opengl/ogl_canvastools.cxx @@ -35,15 +35,32 @@ namespace oglcanvas const ::basegfx::B2DRange& rBounds(aPolyPoly.getB2DRange()); const double nWidth=rBounds.getWidth(); const double nHeight=rBounds.getHeight(); - const ::basegfx::B2DPolygon& rTriangulatedPolygon( + const ::basegfx::triangulator::B2DTriangleVector rTriangulatedPolygon( ::basegfx::triangulator::triangulate(aPolyPoly)); - for( sal_uInt32 i=0; i<rTriangulatedPolygon.count(); i++ ) + for( size_t i=0; i<rTriangulatedPolygon.size(); i++ ) { - const ::basegfx::B2DPoint& rPt( rTriangulatedPolygon.getB2DPoint(i) ); - const double s(rPt.getX()/nWidth); - const double t(rPt.getY()/nHeight); - glTexCoord2f(s,t); glVertex2d(rPt.getX(), rPt.getY()); + const::basegfx::triangulator::B2DTriangle& rCandidate(rTriangulatedPolygon[i]); + glTexCoord2f( + rCandidate.getA().getX()/nWidth, + rCandidate.getA().getY()/nHeight); + glVertex2d( + rCandidate.getA().getX(), + rCandidate.getA().getY()); + + glTexCoord2f( + rCandidate.getB().getX()/nWidth, + rCandidate.getB().getY()/nHeight); + glVertex2d( + rCandidate.getB().getX(), + rCandidate.getB().getY()); + + glTexCoord2f( + rCandidate.getC().getX()/nWidth, + rCandidate.getC().getY()/nHeight); + glVertex2d( + rCandidate.getC().getX(), + rCandidate.getC().getY()); } } diff --git a/canvas/source/tools/surfaceproxy.cxx b/canvas/source/tools/surfaceproxy.cxx index 5c1bff2a5950..164fb781b4d9 100644 --- a/canvas/source/tools/surfaceproxy.cxx +++ b/canvas/source/tools/surfaceproxy.cxx @@ -111,15 +111,28 @@ namespace canvas const ::basegfx::B2DPolyPolygon& rClipPoly, const ::basegfx::B2DHomMatrix& rTransform ) { - const ::basegfx::B2DPolygon& rTriangulatedPolygon( + const ::basegfx::triangulator::B2DTriangleVector& rTriangulatedVector( ::basegfx::triangulator::triangulate(rClipPoly)); + // we have now an explicit ::B2DTriangle and ::B2DTriangleVector, + // but I do not know enough about 'drawWithClip' or 'clipTriangleListOnRange' + // to adapt to that. Convert back to old three-point-in-polygon convention + ::basegfx::B2DPolygon aTriangulatedPolygon; + aTriangulatedPolygon.reserve(rTriangulatedVector.size() * 3); + + for(const auto& rCandidate : rTriangulatedVector) + { + aTriangulatedPolygon.append(rCandidate.getA()); + aTriangulatedPolygon.append(rCandidate.getB()); + aTriangulatedPolygon.append(rCandidate.getC()); + } + // dump polygons SAL_INFO("canvas", "Original clip polygon: " << basegfx::utils::exportToSvgD( rClipPoly, true, true, false )); - SAL_INFO("canvas", "Triangulated polygon: " << basegfx::utils::exportToSvgD(basegfx::B2DPolyPolygon(rTriangulatedPolygon), true, true, false )); + SAL_INFO("canvas", "Triangulated polygon: " << basegfx::utils::exportToSvgD(basegfx::B2DPolyPolygon(aTriangulatedPolygon), true, true, false )); for( const auto& rSurfacePtr : maSurfaceList ) - rSurfacePtr->drawWithClip( fAlpha, rPos, rTriangulatedPolygon, rTransform ); + rSurfacePtr->drawWithClip( fAlpha, rPos, aTriangulatedPolygon, rTransform ); return true; } |