drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx |  182 ++++++++-----
 1 file changed, 119 insertions(+), 63 deletions(-)

New commits:
commit fc91501f9f0a24ccfa69c2b4baf070aac9e2d0f0
Author: Armin Le Grand <a...@apache.org>
Date:   Tue Oct 23 10:49:25 2012 +0000

    Resolves: #i121185# corrected handling of gradients in rotated metafiles
    
    (cherry picked from commit 498926039ce717631eda046b1aa256efd24dfdf6)
    
    Conflicts:
        drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
    
    Change-Id: Ib1a96888d0990f6f9aa573e308736d40b694a613

diff --git a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx 
b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
index 706020b..0bcb413 100644
--- a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
@@ -1537,78 +1537,108 @@ namespace drawinglayer
                 }
                 case PRIMITIVE2D_ID_POLYPOLYGONGRADIENTPRIMITIVE2D :
                 {
-                    const primitive2d::PolyPolygonGradientPrimitive2D& 
rGradientCandidate = static_cast< const 
primitive2d::PolyPolygonGradientPrimitive2D& >(rCandidate);
-                    basegfx::B2DPolyPolygon 
aLocalPolyPolygon(rGradientCandidate.getB2DPolyPolygon());
+                    basegfx::B2DVector aScale, aTranslate;
+                    double fRotate, fShearX;
 
-                    // #i112245# Metafiles use tools Polygon and are not able 
to have more than 65535 points
-                    // per polygon. Split polygon until there are less than 
that
-                    while(fillPolyPolygonNeededToBeSplit(aLocalPolyPolygon))
-                        ;
+                    maCurrentTransformation.decompose(aScale, aTranslate, 
fRotate, fShearX);
 
-                    // for support of MetaCommentActions of the form 
XGRAD_SEQ_BEGIN, XGRAD_SEQ_END
-                    // it is safest to use the VCL OutputDevice::DrawGradient 
method which creates those.
-                    // re-create a VCL-gradient from FillGradientPrimitive2D 
and the needed tools PolyPolygon
-                    Gradient aVCLGradient;
-                    impConvertFillGradientAttributeToVCLGradient(aVCLGradient, 
rGradientCandidate.getFillGradient(), false);
-                    aLocalPolyPolygon.transform(maCurrentTransformation);
+                    if(!basegfx::fTools::equalZero(fRotate) || 
!basegfx::fTools::equalZero(fShearX))
+                    {
+                        // #121185# When rotation or shear is used, a VCL 
Gradient cannot be used directly.
+                        // This is because VCL Gradient mechanism does *not* 
support to rotate the gradient
+                        // with objects and this case is not expressable in a 
Metafile (and cannot be added
+                        // since the FileFormats used, e.g. *.wmf, do not 
support it either).
+                        // Such cases happen when a graphic object uses a 
Metafile as graphic information or
+                        // a fill style definition uses a Metafile. In this 
cases the graphic content is
+                        // rotated with the graphic or filled object; this is 
not supported by the target
+                        // format of this conversion renderer - Metafiles.
+                        // To solve this, not a Gradient is written, but the 
decomposition of this object
+                        // is written to the Metafile. This is the 
PolyPolygons building the gradient fill.
+                        // These will need more space and time, but the result 
will be as if the Gradient
+                        // was rotated with the object.
+                        // This mechanism is used by all exporters still not 
using Primtives (e.g. Print,
+                        // Slideshow, Export rto PDF, export to Picture, ...) 
but relying on Metafile
+                        // transfers. One more reason to *change* these to 
primitives.
+                        // BTW: One more example how useful the principles of 
primitives are; the decomposition
+                        // is by definition a simpler, maybe more expensive 
representation of the same content.
+                        
process(rCandidate.get2DDecomposition(getViewInformation2D()));
+                    }
+                    else
+                    {
+                        const primitive2d::PolyPolygonGradientPrimitive2D& 
rGradientCandidate = static_cast< const 
primitive2d::PolyPolygonGradientPrimitive2D& >(rCandidate);
+                        basegfx::B2DPolyPolygon 
aLocalPolyPolygon(rGradientCandidate.getB2DPolyPolygon());
 
-                    // #i82145# ATM VCL printing of gradients using curved 
shapes does not work,
-                    // i submitted the bug with the given ID to THB. When that 
task is fixed it is
-                    // necessary to again remove this subdivision since it 
decreases possible
-                    // printing quality (not even resolution-dependent for 
now). THB will tell
-                    // me when that task is fixed in the master
-                    const PolyPolygon aToolsPolyPolygon(
-                        getFillPolyPolygon(
-                            
basegfx::tools::adaptiveSubdivideByAngle(aLocalPolyPolygon)));
+                        // #i112245# Metafiles use tools Polygon and are not 
able to have more than 65535 points
+                        // per polygon. Split polygon until there are less 
than that
+                        
while(fillPolyPolygonNeededToBeSplit(aLocalPolyPolygon))
+                            ;
+
+                        // for support of MetaCommentActions of the form 
XGRAD_SEQ_BEGIN, XGRAD_SEQ_END
+                        // it is safest to use the VCL 
OutputDevice::DrawGradient method which creates those.
+                        // re-create a VCL-gradient from 
FillGradientPrimitive2D and the needed tools PolyPolygon
+                        Gradient aVCLGradient;
+                        
impConvertFillGradientAttributeToVCLGradient(aVCLGradient, 
rGradientCandidate.getFillGradient(), false);
+                        aLocalPolyPolygon.transform(maCurrentTransformation);
+
+                        // #i82145# ATM VCL printing of gradients using curved 
shapes does not work,
+                        // i submitted the bug with the given ID to THB. When 
that task is fixed it is
+                        // necessary to again remove this subdivision since it 
decreases possible
+                        // printing quality (not even resolution-dependent for 
now). THB will tell
+                        // me when that task is fixed in the master
+                        const PolyPolygon aToolsPolyPolygon(
+                            getFillPolyPolygon(
+                                
basegfx::tools::adaptiveSubdivideByAngle(aLocalPolyPolygon)));
+
+
+                        // XPATHFILL_SEQ_BEGIN/XPATHFILL_SEQ_END support
+                        SvtGraphicFill* pSvtGraphicFill = 0;
 
-                    // XPATHFILL_SEQ_BEGIN/XPATHFILL_SEQ_END support
-                    SvtGraphicFill* pSvtGraphicFill = 0;
+                        if(!mnSvtGraphicFillCount && aLocalPolyPolygon.count())
+                        {
+                            // setup gradient stuff like in like in impgrfll
+                            SvtGraphicFill::GradientType 
eGrad(SvtGraphicFill::gradientLinear);
 
-                    if(!mnSvtGraphicFillCount && aLocalPolyPolygon.count())
-                    {
-                        // setup gradient stuff like in like in impgrfll
-                        SvtGraphicFill::GradientType 
eGrad(SvtGraphicFill::gradientLinear);
+                            switch(aVCLGradient.GetStyle())
+                            {
+                                default : // GradientStyle_LINEAR:
+                                case GradientStyle_AXIAL:
+                                    eGrad = SvtGraphicFill::gradientLinear;
+                                    break;
+                                case GradientStyle_RADIAL:
+                                case GradientStyle_ELLIPTICAL:
+                                    eGrad = SvtGraphicFill::gradientRadial;
+                                    break;
+                                case GradientStyle_SQUARE:
+                                case GradientStyle_RECT:
+                                    eGrad = 
SvtGraphicFill::gradientRectangular;
+                                    break;
+                            }
 
-                        switch(aVCLGradient.GetStyle())
-                        {
-                            default : // GradientStyle_LINEAR:
-                            case GradientStyle_AXIAL:
-                                eGrad = SvtGraphicFill::gradientLinear;
-                                break;
-                            case GradientStyle_RADIAL:
-                            case GradientStyle_ELLIPTICAL:
-                                eGrad = SvtGraphicFill::gradientRadial;
-                                break;
-                            case GradientStyle_SQUARE:
-                            case GradientStyle_RECT:
-                                eGrad = SvtGraphicFill::gradientRectangular;
-                                break;
+                            pSvtGraphicFill = new SvtGraphicFill(
+                                aToolsPolyPolygon,
+                                Color(),
+                                0.0,
+                                SvtGraphicFill::fillEvenOdd,
+                                SvtGraphicFill::fillGradient,
+                                SvtGraphicFill::Transform(),
+                                false,
+                                SvtGraphicFill::hatchSingle,
+                                Color(),
+                                eGrad,
+                                aVCLGradient.GetStartColor(),
+                                aVCLGradient.GetEndColor(),
+                                aVCLGradient.GetSteps(),
+                                Graphic());
                         }
 
-                        pSvtGraphicFill = new SvtGraphicFill(
-                            aToolsPolyPolygon,
-                            Color(),
-                            0.0,
-                            SvtGraphicFill::fillEvenOdd,
-                            SvtGraphicFill::fillGradient,
-                            SvtGraphicFill::Transform(),
-                            false,
-                            SvtGraphicFill::hatchSingle,
-                            Color(),
-                            eGrad,
-                            aVCLGradient.GetStartColor(),
-                            aVCLGradient.GetEndColor(),
-                            aVCLGradient.GetSteps(),
-                            Graphic());
-                    }
-
-                    // call VCL directly; encapsulate with SvtGraphicFill
-                    impStartSvtGraphicFill(pSvtGraphicFill);
-                    mpOutputDevice->DrawGradient(aToolsPolyPolygon, 
aVCLGradient);
-                    impEndSvtGraphicFill(pSvtGraphicFill);
+                        // call VCL directly; encapsulate with SvtGraphicFill
+                        impStartSvtGraphicFill(pSvtGraphicFill);
+                        mpOutputDevice->DrawGradient(aToolsPolyPolygon, 
aVCLGradient);
+                        impEndSvtGraphicFill(pSvtGraphicFill);
 
-                    // NO usage of common own gradient randerer, not used ATM 
for VCL MetaFile, see text above
-                    // RenderPolyPolygonGradientPrimitive2D(static_cast< const 
primitive2d::PolyPolygonGradientPrimitive2D& >(rCandidate));
+                        // NO usage of common own gradient randerer, not used 
ATM for VCL MetaFile, see text above
+                        // RenderPolyPolygonGradientPrimitive2D(static_cast< 
const primitive2d::PolyPolygonGradientPrimitive2D& >(rCandidate));
+                    }
 
                     break;
                 }
commit 3df12741fa949d1b0e90d45aceeaa99679066b83
Author: Armin Le Grand <a...@apache.org>
Date:   Mon Oct 22 14:15:22 2012 +0000

    Resolves: #i116162# Forced DRAWMODE_WHITEFILL to DRAWMODE_BLACKFILL
    
    during line geometry processing to get line geometry rendered black (as
    intended) in b&w mode (e.g. print preview)
    
    (cherry picked from commit e3ec94e68f63e4e9fda829c9214f89dd5ffc4df2)
    
    Change-Id: I35fd6d26ac48bb478a8a3b9cd4f50ccd0e4468d0

diff --git a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx 
b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
index 7ae4de9..706020b 100644
--- a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
@@ -1306,8 +1306,34 @@ namespace drawinglayer
                             &rStrokeArrowPrimitive.getStart(),
                             &rStrokeArrowPrimitive.getEnd());
 
+                        // write LineGeometry start marker
                         impStartSvtGraphicStroke(pSvtGraphicStroke);
+
+                        // #116162# When B&W is set as DrawMode, 
DRAWMODE_WHITEFILL is used
+                        // to let all fills be just white; for lines 
DRAWMODE_BLACKLINE is used
+                        // so all line geometry is supposed to get black. 
Since in the in-between
+                        // stages of line geometry drawing filled polygons are 
used (e.g. line
+                        // start/ends) it is necessary to change these 
drawmodes to preserve
+                        // that lines shall be black; thus change 
DRAWMODE_WHITEFILL to
+                        // DRAWMODE_BLACKFILL during line geometry processing 
to have line geometry
+                        // parts filled black.
+                        const sal_uLong 
nOldDrawMode(mpOutputDevice->GetDrawMode());
+                        const bool bDrawmodeChange(nOldDrawMode & 
DRAWMODE_WHITEFILL && mnSvtGraphicStrokeCount);
+
+                        if(bDrawmodeChange)
+                        {
+                            mpOutputDevice->SetDrawMode((nOldDrawMode & 
~DRAWMODE_WHITEFILL) | DRAWMODE_BLACKFILL);
+                        }
+
+                        // process sub-line geometry (evtl. filled 
PolyPolygons)
                         
process(rCandidate.get2DDecomposition(getViewInformation2D()));
+
+                        if(bDrawmodeChange)
+                        {
+                            mpOutputDevice->SetDrawMode(nOldDrawMode);
+                        }
+
+                        // write LineGeometry end marker
                         impEndSvtGraphicStroke(pSvtGraphicStroke);
                     }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to