Performance: avoid scaling just-generated bitmap 2nd time

We're creating the bitmap to exactly match our output size -
so why rounding off total transformation again, incurring another
expensive bitmap scale down in the canvas?
This commit is contained in:
Thorsten Behrens
2012-03-06 19:01:56 +01:00
parent 3dcd8ca0a7
commit af1514abf2

View File

@@ -279,6 +279,22 @@ namespace cppcanvas
aTotalTransform.set( 0, 2, 0.0 );
aTotalTransform.set( 1, 2, 0.0 );
// determine total scaling factor of the
// transformation matrix - need to make the bitmap
// large enough
::basegfx::B2DTuple aScale;
::basegfx::B2DTuple aTranslate;
double nRotate;
double nShearX;
if( !aTotalTransform.decompose( aScale,
aTranslate,
nRotate,
nShearX ) )
{
OSL_FAIL( "TransparencyGroupAction::render(): non-decomposable transformation" );
return false;
}
// if there's no buffer bitmap, or as soon as the
// total transformation changes, we've got to
// re-render the bitmap
@@ -289,22 +305,6 @@ namespace cppcanvas
{
DBG_TESTSOLARMUTEX();
// determine total scaling factor of the
// transformation matrix - need to make the bitmap
// large enough
::basegfx::B2DTuple aScale;
::basegfx::B2DTuple aTranslate;
double nRotate;
double nShearX;
if( !aTotalTransform.decompose( aScale,
aTranslate,
nRotate,
nShearX ) )
{
OSL_FAIL( "TransparencyGroupAction::render(): non-decomposable transformation" );
return false;
}
// output size of metafile
::Size aOutputSizePixel( ::basegfx::fround( aScale.getX() * maDstSize.getX() ),
::basegfx::fround( aScale.getY() * maDstSize.getY() ) );
@@ -452,12 +452,8 @@ namespace cppcanvas
// Translation*Rotation*Shear*Scale. Thus, to neutralize
// the contained scaling, we've got to right-multiply with
// the inverse.
::basegfx::B2ISize aBmpSize(
::basegfx::unotools::b2ISizeFromIntegerSize2D( mxBufferBitmap->getSize() ) );
::basegfx::B2DHomMatrix aScaleCorrection;
aScaleCorrection.scale( (double)maDstSize.getX() / aBmpSize.getX(),
(double)maDstSize.getY() / aBmpSize.getY() );
aScaleCorrection.scale( 1/aScale.getX(), 1/aScale.getY() );
aTransform = aTransform * aScaleCorrection;
rendering::RenderState aLocalState( maState );