diff options
Diffstat (limited to 'canvas/source/cairo/cairo_spritehelper.cxx')
-rw-r--r-- | canvas/source/cairo/cairo_spritehelper.cxx | 132 |
1 files changed, 66 insertions, 66 deletions
diff --git a/canvas/source/cairo/cairo_spritehelper.cxx b/canvas/source/cairo/cairo_spritehelper.cxx index 8faf7be3a974..aafab160c51d 100644 --- a/canvas/source/cairo/cairo_spritehelper.cxx +++ b/canvas/source/cairo/cairo_spritehelper.cxx @@ -83,75 +83,75 @@ namespace cairocanvas const double fAlpha( getAlpha() ); const ::basegfx::B2DHomMatrix aTransform( getTransformation() ); - if( isActive() && !::basegfx::fTools::equalZero( fAlpha ) ) + if( !(isActive() && !::basegfx::fTools::equalZero( fAlpha )) ) + return; + + SAL_INFO( "canvas.cairo", "CanvasCustomSprite::redraw called"); + if( !pCairo ) + return; + + basegfx::B2DVector aSize = getSizePixel(); + cairo_save( pCairo.get() ); + + double fX, fY; + + fX = rPos.getX(); + fY = rPos.getY(); + + if( !aTransform.isIdentity() ) + { + cairo_matrix_t aMatrix, aInverseMatrix; + cairo_matrix_init( &aMatrix, + aTransform.get( 0, 0 ), aTransform.get( 1, 0 ), aTransform.get( 0, 1 ), + aTransform.get( 1, 1 ), aTransform.get( 0, 2 ), aTransform.get( 1, 2 ) ); + + aMatrix.x0 = basegfx::fround( aMatrix.x0 ); + aMatrix.y0 = basegfx::fround( aMatrix.y0 ); + + cairo_matrix_init( &aInverseMatrix, aMatrix.xx, aMatrix.yx, aMatrix.xy, aMatrix.yy, aMatrix.x0, aMatrix.y0 ); + cairo_matrix_invert( &aInverseMatrix ); + cairo_matrix_transform_distance( &aInverseMatrix, &fX, &fY ); + + cairo_set_matrix( pCairo.get(), &aMatrix ); + } + + fX = basegfx::fround( fX ); + fY = basegfx::fround( fY ); + + cairo_matrix_t aOrigMatrix; + cairo_get_matrix( pCairo.get(), &aOrigMatrix ); + cairo_translate( pCairo.get(), fX, fY ); + + if( getClip().is() ) { - SAL_INFO( "canvas.cairo", "CanvasCustomSprite::redraw called"); - if( pCairo ) - { - basegfx::B2DVector aSize = getSizePixel(); - cairo_save( pCairo.get() ); - - double fX, fY; - - fX = rPos.getX(); - fY = rPos.getY(); - - if( !aTransform.isIdentity() ) - { - cairo_matrix_t aMatrix, aInverseMatrix; - cairo_matrix_init( &aMatrix, - aTransform.get( 0, 0 ), aTransform.get( 1, 0 ), aTransform.get( 0, 1 ), - aTransform.get( 1, 1 ), aTransform.get( 0, 2 ), aTransform.get( 1, 2 ) ); - - aMatrix.x0 = basegfx::fround( aMatrix.x0 ); - aMatrix.y0 = basegfx::fround( aMatrix.y0 ); - - cairo_matrix_init( &aInverseMatrix, aMatrix.xx, aMatrix.yx, aMatrix.xy, aMatrix.yy, aMatrix.x0, aMatrix.y0 ); - cairo_matrix_invert( &aInverseMatrix ); - cairo_matrix_transform_distance( &aInverseMatrix, &fX, &fY ); - - cairo_set_matrix( pCairo.get(), &aMatrix ); - } - - fX = basegfx::fround( fX ); - fY = basegfx::fround( fY ); - - cairo_matrix_t aOrigMatrix; - cairo_get_matrix( pCairo.get(), &aOrigMatrix ); - cairo_translate( pCairo.get(), fX, fY ); - - if( getClip().is() ) - { - const uno::Reference<rendering::XPolyPolygon2D>& rClip( getClip() ); - - ::basegfx::B2DPolyPolygon aClipPoly( - ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D( - rClip )); - - doPolyPolygonImplementation( aClipPoly, Clip, pCairo.get(), - nullptr, SurfaceProviderRef(mpSpriteCanvas.get()), - rClip->getFillRule() ); - } - - SAL_INFO( "canvas.cairo","aSize " << aSize.getX() << " x " << aSize.getY() << " position: " << fX << "," << fY ); - cairo_rectangle( pCairo.get(), 0, 0, floor( aSize.getX() ), floor( aSize.getY() ) ); - cairo_clip( pCairo.get() ); - cairo_set_matrix( pCairo.get(), &aOrigMatrix ); - - if( isContentFullyOpaque() ) - cairo_set_operator( pCairo.get(), CAIRO_OPERATOR_SOURCE ); - cairo_set_source_surface( pCairo.get(), - mpBufferSurface->getCairoSurface().get(), - fX, fY ); - if( ::rtl::math::approxEqual( fAlpha, 1.0 ) ) - cairo_paint( pCairo.get() ); - else - cairo_paint_with_alpha( pCairo.get(), fAlpha ); - - cairo_restore( pCairo.get() ); - } + const uno::Reference<rendering::XPolyPolygon2D>& rClip( getClip() ); + + ::basegfx::B2DPolyPolygon aClipPoly( + ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D( + rClip )); + + doPolyPolygonImplementation( aClipPoly, Clip, pCairo.get(), + nullptr, SurfaceProviderRef(mpSpriteCanvas.get()), + rClip->getFillRule() ); } + SAL_INFO( "canvas.cairo","aSize " << aSize.getX() << " x " << aSize.getY() << " position: " << fX << "," << fY ); + cairo_rectangle( pCairo.get(), 0, 0, floor( aSize.getX() ), floor( aSize.getY() ) ); + cairo_clip( pCairo.get() ); + cairo_set_matrix( pCairo.get(), &aOrigMatrix ); + + if( isContentFullyOpaque() ) + cairo_set_operator( pCairo.get(), CAIRO_OPERATOR_SOURCE ); + cairo_set_source_surface( pCairo.get(), + mpBufferSurface->getCairoSurface().get(), + fX, fY ); + if( ::rtl::math::approxEqual( fAlpha, 1.0 ) ) + cairo_paint( pCairo.get() ); + else + cairo_paint_with_alpha( pCairo.get(), fAlpha ); + + cairo_restore( pCairo.get() ); + #ifdef CAIRO_CANVAS_PERF_TRACE mxDevice->stopPerfTrace( &aTimer, "sprite redraw" ); #endif |