[Libreoffice-commits] core.git: Branch 'libreoffice-4-4' - vcl/source

Michael Stahl mstahl at redhat.com
Wed May 20 07:08:14 PDT 2015


 vcl/source/gdi/mapmod.cxx |    8 ++++++++
 vcl/source/outdev/map.cxx |    1 +
 2 files changed, 9 insertions(+)

New commits:
commit d276993a1b60f66ce4322c29709c0c3907977663
Author: Michael Stahl <mstahl at redhat.com>
Date:   Fri May 15 22:46:18 2015 +0200

    tdf#90604: vcl: reduce MapMode precision further to 32 bits...
    
    tdf#91195: vcl: reduce MapMode Fraction precision to avoid...
    ... overlow in ImplMapLogicToPixel.  50 bits is still too much, 44
    appears to work for exporting PNG.
    
    DocumentToGraphicRenderer::renderToGraphic() converts a double to
    Fraction which is the source of the excess precision.
    
    (cherry picked from commit c8dad7ebb7c1738ae1348f92d67124c165d83f00)
    
    ... which mysteriously causes the Export PNG to produce a non-blank
    image again.
    
    The cause is probably that DocumentToGraphicRenderer::renderToGraphic()
    records a VCL MetaFile, and the ReadFraction/WriteFraction do only
    32 bits, while the Fraction interface promises to handle "long".
    
    (regression from 2ce0aededea43231d91a0955fc0676120dcc4f13)
    
    (cherry picked from commit 21be3257d9d10f0f65c2ae49d7ef3beb81018bfc)
    
    vcl: fix the MapMode ctor too to limit precision to 32 bits
    (cherry picked from commit 0a9b99787c65e49f08b27566d277eab8306cca54)
    
    Change-Id: Ic4289a3157ea802c17f0bc24db94ea45eabd9728
    Reviewed-on: https://gerrit.libreoffice.org/15800
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/source/gdi/mapmod.cxx b/vcl/source/gdi/mapmod.cxx
index a64f43b..56ea787 100644
--- a/vcl/source/gdi/mapmod.cxx
+++ b/vcl/source/gdi/mapmod.cxx
@@ -33,6 +33,10 @@ struct MapMode::ImplMapMode
     sal_uLong       mnRefCount;
     MapUnit         meUnit;
     Point           maOrigin;
+    // NOTE: these Fraction must NOT have more than 32 bits precision
+    // because ReadFraction / WriteFraction do only 32 bits, so more than
+    // that cannot be stored in MetaFiles!
+    // => call ReduceInaccurate whenever setting these
     Fraction        maScaleX;
     Fraction        maScaleY;
     bool            mbSimple;
@@ -158,6 +162,8 @@ MapMode::MapMode( MapUnit eUnit, const Point& rLogicOrg,
     mpImplMapMode->maOrigin = rLogicOrg;
     mpImplMapMode->maScaleX = rScaleX;
     mpImplMapMode->maScaleY = rScaleY;
+    mpImplMapMode->maScaleX.ReduceInaccurate(32);
+    mpImplMapMode->maScaleY.ReduceInaccurate(32);
 }
 
 MapMode::~MapMode()
@@ -193,6 +199,7 @@ void MapMode::SetScaleX( const Fraction& rScaleX )
 
     ImplMakeUnique();
     mpImplMapMode->maScaleX = rScaleX;
+    mpImplMapMode->maScaleX.ReduceInaccurate(32);
 }
 
 void MapMode::SetScaleY( const Fraction& rScaleY )
@@ -200,6 +207,7 @@ void MapMode::SetScaleY( const Fraction& rScaleY )
 
     ImplMakeUnique();
     mpImplMapMode->maScaleY = rScaleY;
+    mpImplMapMode->maScaleY.ReduceInaccurate(32);
 }
 
 MapMode& MapMode::operator=( const MapMode& rMapMode )
diff --git a/vcl/source/outdev/map.cxx b/vcl/source/outdev/map.cxx
index b8bc6c5..599c814 100644
--- a/vcl/source/outdev/map.cxx
+++ b/vcl/source/outdev/map.cxx
@@ -74,6 +74,7 @@ static Fraction ImplMakeFraction( long nN1, long nN2, long nD1, long nD2 )
         aF = Fraction( i*nN1, nD1 ) * Fraction( nN2, nD2 );
     }
 
+    aF.ReduceInaccurate(32);
     return aF;
 }
 


More information about the Libreoffice-commits mailing list