summaryrefslogtreecommitdiff
path: root/drawinglayer
diff options
context:
space:
mode:
authorArmin Le Grand <alg@apache.org>2012-11-29 11:34:59 +0000
committerCaolán McNamara <caolanm@redhat.com>2013-06-12 20:31:52 +0100
commitf69df53b316b53931e10d35402a70f533399398c (patch)
tree4caf445254cabfd6feefc90c6d96110ce5c71470 /drawinglayer
parent98910950890141c6236fb3c0e9914b20b0557b02 (diff)
Resolves: #i121297# corrected non-AAed gradient rendering...
when in rotated metafiles (cherry picked from commit 2a063da1614a8044fdd2c64a55f4f402b69e2fcd) Conflicts: drawinglayer/Library_drawinglayer.mk drawinglayer/inc/drawinglayer/processor2d/vclprocessor2d.hxx drawinglayer/source/processor2d/vclhelpergradient.cxx drawinglayer/source/processor2d/vclhelpergradient.hxx drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx drawinglayer/source/processor2d/vclpixelprocessor2d.cxx Change-Id: I0e4ff1d3bebbc738fb6d301da19747faa2efbe3d
Diffstat (limited to 'drawinglayer')
-rw-r--r--drawinglayer/Library_drawinglayer.mk1
-rw-r--r--drawinglayer/source/processor2d/vclhelpergradient.cxx253
-rw-r--r--drawinglayer/source/processor2d/vclhelpergradient.hxx54
-rw-r--r--drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx22
-rw-r--r--drawinglayer/source/processor2d/vclpixelprocessor2d.cxx39
-rw-r--r--drawinglayer/source/processor2d/vclprocessor2d.cxx130
6 files changed, 25 insertions, 474 deletions
diff --git a/drawinglayer/Library_drawinglayer.mk b/drawinglayer/Library_drawinglayer.mk
index 93014a888e8a..a8e92b19c6a2 100644
--- a/drawinglayer/Library_drawinglayer.mk
+++ b/drawinglayer/Library_drawinglayer.mk
@@ -145,7 +145,6 @@ $(eval $(call gb_Library_add_exception_objects,drawinglayer,\
drawinglayer/source/processor2d/vclhelperbitmaprender \
drawinglayer/source/processor2d/vclhelperbitmaptransform \
drawinglayer/source/processor2d/vclhelperbufferdevice \
- drawinglayer/source/processor2d/vclhelpergradient \
drawinglayer/source/processor2d/vclmetafileprocessor2d \
drawinglayer/source/processor2d/vclpixelprocessor2d \
drawinglayer/source/processor2d/vclprocessor2d \
diff --git a/drawinglayer/source/processor2d/vclhelpergradient.cxx b/drawinglayer/source/processor2d/vclhelpergradient.cxx
deleted file mode 100644
index 245e85084fcd..000000000000
--- a/drawinglayer/source/processor2d/vclhelpergradient.cxx
+++ /dev/null
@@ -1,253 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include <vclhelpergradient.hxx>
-#include <basegfx/range/b2drange.hxx>
-#include <vcl/outdev.hxx>
-#include <basegfx/polygon/b2dpolygon.hxx>
-#include <basegfx/polygon/b2dpolypolygontools.hxx>
-#include <basegfx/polygon/b2dpolygontools.hxx>
-#include <drawinglayer/texture/texture.hxx>
-
-//////////////////////////////////////////////////////////////////////////////
-// support methods for vcl direct gradient renderering
-
-namespace drawinglayer
-{
- namespace
- {
- sal_uInt32 impCalcGradientSteps(OutputDevice& rOutDev, sal_uInt32 nSteps, const basegfx::B2DRange& rRange, sal_uInt32 nMaxDist)
- {
- if(nSteps == 0L)
- {
- const Size aSize(rOutDev.LogicToPixel(Size(basegfx::fround(rRange.getWidth()), basegfx::fround(rRange.getHeight()))));
- nSteps = (aSize.getWidth() + aSize.getHeight()) >> 3L;
- }
-
- if(nSteps < 2L)
- {
- nSteps = 2L;
- }
-
- if(nSteps > nMaxDist)
- {
- nSteps = nMaxDist;
- }
-
- return nSteps;
- }
-
- void impDrawGradientToOutDevSimple(
- OutputDevice& rOutDev,
- const basegfx::B2DPolyPolygon& rTargetForm,
- const std::vector< drawinglayer::texture::B2DHomMatrixAndBColor >& rEntries,
- const basegfx::BColor& rOutmostColor,
- const basegfx::B2DPolygon& rUnitPolygon)
- {
- rOutDev.SetLineColor();
- rOutDev.SetFillColor(Color(rOutmostColor));
- rOutDev.DrawPolyPolygon(rTargetForm);
- const sal_uInt32 nCount(rEntries.size());
-
- for(sal_uInt32 a(0); a < nCount; a++)
- {
- // create part polygon
- basegfx::B2DPolygon aNewPoly(rUnitPolygon);
-
- aNewPoly.transform(rEntries[a].maB2DHomMatrix);
-
- // create solid fill
- rOutDev.SetFillColor(Color(rEntries[a].maBColor));
- rOutDev.DrawPolygon(aNewPoly);
- }
- }
-
- void impDrawGradientToOutDevComplex(
- OutputDevice& rOutDev,
- const basegfx::B2DPolyPolygon& rTargetForm,
- const std::vector< drawinglayer::texture::B2DHomMatrixAndBColor >& rEntries,
- const basegfx::BColor& rOutmostColor,
- const basegfx::B2DPolygon& rUnitPolygon)
- {
- PolyPolygon aVclTargetForm(rTargetForm);
- ::std::vector< Polygon > aVclPolygons;
- const sal_uInt32 nCount(rEntries.size());
- sal_uInt32 a;
-
- // reserve when possible
- aVclPolygons.reserve(nCount);
-
- // remember and set to XOR
- rOutDev.SetLineColor();
- rOutDev.Push(PUSH_RASTEROP);
- rOutDev.SetRasterOp(ROP_XOR);
-
- // draw gradient PolyPolygons
- for(a = 0; a < nCount; a++)
- {
- // create polygon and remember
- basegfx::B2DPolygon aNewPoly(rUnitPolygon);
- aNewPoly.transform(rEntries[a].maB2DHomMatrix);
- aVclPolygons.push_back(Polygon(aNewPoly));
-
- // create vcl PolyPolygon and draw it
- if(a)
- {
- rOutDev.SetFillColor(Color(rEntries[a - 1].maBColor));
- PolyPolygon aVclPolyPoly(aVclPolygons[a - 1]);
- aVclPolyPoly.Insert(aVclPolygons[a]);
- rOutDev.DrawPolyPolygon(aVclPolyPoly);
- }
- else
- {
- rOutDev.SetFillColor(Color(rOutmostColor));
- PolyPolygon aVclPolyPoly(aVclTargetForm);
- aVclPolyPoly.Insert(aVclPolygons[0]);
- rOutDev.DrawPolyPolygon(aVclPolyPoly);
- }
- }
-
- // draw last poly in last color
- if(nCount)
- {
- rOutDev.SetFillColor(Color(rEntries[nCount - 1].maBColor));
- rOutDev.DrawPolygon(aVclPolygons[aVclPolygons.size() - 1]);
- }
-
- // draw object form in black and go back to XOR
- rOutDev.SetFillColor(COL_BLACK);
- rOutDev.SetRasterOp(ROP_0);
- rOutDev.DrawPolyPolygon(aVclTargetForm);
- rOutDev.SetRasterOp(ROP_XOR);
-
- // draw gradient PolyPolygons again
- for(a = 0; a < nCount; a++)
- {
- // create vcl PolyPolygon and draw it
- if(a)
- {
- rOutDev.SetFillColor(Color(rEntries[a - 1].maBColor));
- PolyPolygon aVclPolyPoly(aVclPolygons[a - 1]);
- aVclPolyPoly.Insert(aVclPolygons[a]);
- rOutDev.DrawPolyPolygon(aVclPolyPoly);
- }
- else
- {
- rOutDev.SetFillColor(Color(rOutmostColor));
- PolyPolygon aVclPolyPoly(aVclTargetForm);
- aVclPolyPoly.Insert(aVclPolygons[0]);
- rOutDev.DrawPolyPolygon(aVclPolyPoly);
- }
- }
-
- // draw last poly in last color
- if(nCount)
- {
- rOutDev.SetFillColor(Color(rEntries[nCount - 1].maBColor));
- rOutDev.DrawPolygon(aVclPolygons[aVclPolygons.size() - 1]);
- }
-
- // reset drawmode
- rOutDev.Pop();
- }
- } // end of anonymous namespace
-} // end of namespace drawinglayer
-
-namespace drawinglayer
-{
- void impDrawGradientToOutDev(
- OutputDevice& rOutDev,
- const basegfx::B2DPolyPolygon& rTargetForm,
- attribute::GradientStyle eGradientStyle,
- sal_uInt32 nSteps,
- const basegfx::BColor& rStart,
- const basegfx::BColor& rEnd,
- double fBorder, double fAngle, double fOffsetX, double fOffsetY, bool bSimple)
- {
- const basegfx::B2DRange aOutlineRange(basegfx::tools::getRange(rTargetForm));
- std::vector< drawinglayer::texture::B2DHomMatrixAndBColor > aEntries;
- basegfx::BColor aOutmostColor;
- basegfx::B2DPolygon aUnitPolygon;
-
- // make sure steps is not too high/low
- nSteps = impCalcGradientSteps(rOutDev, nSteps, aOutlineRange, sal_uInt32((rStart.getMaximumDistance(rEnd) * 127.5) + 0.5));
-
- // create geometries
- switch(eGradientStyle)
- {
- case attribute::GRADIENTSTYLE_LINEAR:
- {
- texture::GeoTexSvxGradientLinear aGradient(aOutlineRange, rStart, rEnd, nSteps, fBorder, fAngle);
- aGradient.appendTransformationsAndColors(aEntries, aOutmostColor);
- aUnitPolygon = basegfx::tools::createPolygonFromRect(basegfx::B2DRange(-1, -1, 1, 1));
- break;
- }
- case attribute::GRADIENTSTYLE_AXIAL:
- {
- texture::GeoTexSvxGradientAxial aGradient(aOutlineRange, rStart, rEnd, nSteps, fBorder, fAngle);
- aGradient.appendTransformationsAndColors(aEntries, aOutmostColor);
- aUnitPolygon = basegfx::tools::createPolygonFromRect(basegfx::B2DRange(-1, -1, 1, 1));
- break;
- }
- case attribute::GRADIENTSTYLE_RADIAL:
- {
- texture::GeoTexSvxGradientRadial aGradient(aOutlineRange, rStart, rEnd, nSteps, fBorder, fOffsetX, fOffsetY);
- aGradient.appendTransformationsAndColors(aEntries, aOutmostColor);
- aUnitPolygon = basegfx::tools::createPolygonFromCircle(basegfx::B2DPoint(0,0), 1);
- break;
- }
- case attribute::GRADIENTSTYLE_ELLIPTICAL:
- {
- texture::GeoTexSvxGradientElliptical aGradient(aOutlineRange, rStart, rEnd, nSteps, fBorder, fOffsetX, fOffsetX, fAngle);
- aGradient.appendTransformationsAndColors(aEntries, aOutmostColor);
- aUnitPolygon = basegfx::tools::createPolygonFromCircle(basegfx::B2DPoint(0,0), 1);
- break;
- }
- case attribute::GRADIENTSTYLE_SQUARE:
- {
- texture::GeoTexSvxGradientSquare aGradient(aOutlineRange, rStart, rEnd, nSteps, fBorder, fOffsetX, fOffsetX, fAngle);
- aGradient.appendTransformationsAndColors(aEntries, aOutmostColor);
- aUnitPolygon = basegfx::tools::createPolygonFromRect(basegfx::B2DRange(-1, -1, 1, 1));
- break;
- }
- case attribute::GRADIENTSTYLE_RECT:
- {
- texture::GeoTexSvxGradientRect aGradient(aOutlineRange, rStart, rEnd, nSteps, fBorder, fOffsetX, fOffsetX, fAngle);
- aGradient.appendTransformationsAndColors(aEntries, aOutmostColor);
- aUnitPolygon = basegfx::tools::createPolygonFromRect(basegfx::B2DRange(-1, -1, 1, 1));
- break;
- }
- }
-
- // paint them with mask using the XOR method
- if(aEntries.size())
- {
- if(bSimple)
- {
- impDrawGradientToOutDevSimple(rOutDev, rTargetForm, aEntries, aOutmostColor, aUnitPolygon);
- }
- else
- {
- impDrawGradientToOutDevComplex(rOutDev, rTargetForm, aEntries, aOutmostColor, aUnitPolygon);
- }
- }
- }
-} // end of namespace drawinglayer
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/drawinglayer/source/processor2d/vclhelpergradient.hxx b/drawinglayer/source/processor2d/vclhelpergradient.hxx
deleted file mode 100644
index 053886ca4da5..000000000000
--- a/drawinglayer/source/processor2d/vclhelpergradient.hxx
+++ /dev/null
@@ -1,54 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#ifndef INCLUDED_DRAWINGLAYER_PROCESSOR2D_VCLHELPERGRADIENT_HXX
-#define INCLUDED_DRAWINGLAYER_PROCESSOR2D_VCLHELPERGRADIENT_HXX
-
-#include <sal/types.h>
-#include <drawinglayer/attribute/fillgradientattribute.hxx>
-
-//////////////////////////////////////////////////////////////////////////////
-// predefines
-
-class OutputDevice;
-namespace basegfx {
- class B2DPolyPolygon;
- class BColor;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// support methods for vcl direct gradient renderering
-
-namespace drawinglayer
-{
- void impDrawGradientToOutDev(
- OutputDevice& rOutDev,
- const basegfx::B2DPolyPolygon& rTargetForm,
- attribute::GradientStyle eGradientStyle,
- sal_uInt32 nSteps,
- const basegfx::BColor& rStart,
- const basegfx::BColor& rEnd,
- double fBorder, double fAngle, double fOffsetX, double fOffsetY, bool bSimple);
-} // end of namespace drawinglayer
-
-//////////////////////////////////////////////////////////////////////////////
-
-#endif // INCLUDED_DRAWINGLAYER_PROCESSOR2D_VCLHELPERGRADIENT_HXX
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
index 3511e5714678..acf1a7ee2d12 100644
--- a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
@@ -27,7 +27,6 @@
#include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
#include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
#include <drawinglayer/primitive2d/bitmapprimitive2d.hxx>
-#include <drawinglayer/primitive2d/metafileprimitive2d.hxx>
#include <drawinglayer/primitive2d/maskprimitive2d.hxx>
#include <basegfx/polygon/b2dpolygonclipper.hxx>
#include <basegfx/polygon/b2dpolypolygontools.hxx>
@@ -1645,9 +1644,6 @@ namespace drawinglayer
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));
}
break;
@@ -1712,24 +1708,6 @@ namespace drawinglayer
break;
}
- case PRIMITIVE2D_ID_METAFILEPRIMITIVE2D :
- {
- static bool bUseMetaFilePrimitiveDecomposition(true);
- const primitive2d::MetafilePrimitive2D& aMetafile = static_cast< const primitive2d::MetafilePrimitive2D& >(rCandidate);
-
- if(bUseMetaFilePrimitiveDecomposition && !aMetafile.getMetaFile().GetUseCanvas())
- {
- // use new Metafile decomposition
- process(rCandidate.get2DDecomposition(getViewInformation2D()));
- }
- else
- {
- // direct draw of MetaFile, use default pocessing
- RenderMetafilePrimitive2D(aMetafile);
- }
-
- break;
- }
case PRIMITIVE2D_ID_MASKPRIMITIVE2D :
{
// mask group. Special handling for MetaFiles.
diff --git a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
index 1f2d518e3c9d..fdf3e684c094 100644
--- a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
@@ -188,7 +188,29 @@ namespace drawinglayer
case PRIMITIVE2D_ID_POLYPOLYGONGRADIENTPRIMITIVE2D :
{
// direct draw of gradient
- RenderPolyPolygonGradientPrimitive2D(static_cast< const primitive2d::PolyPolygonGradientPrimitive2D& >(rCandidate));
+ const primitive2d::PolyPolygonGradientPrimitive2D& rPolygonCandidate = static_cast< const primitive2d::PolyPolygonGradientPrimitive2D& >(rCandidate);
+ const attribute::FillGradientAttribute& rGradient(rPolygonCandidate.getFillGradient());
+ basegfx::BColor aStartColor(maBColorModifierStack.getModifiedColor(rGradient.getStartColor()));
+ basegfx::BColor aEndColor(maBColorModifierStack.getModifiedColor(rGradient.getEndColor()));
+ basegfx::B2DPolyPolygon aLocalPolyPolygon(rPolygonCandidate.getB2DPolyPolygon());
+
+ if(aLocalPolyPolygon.count())
+ {
+ aLocalPolyPolygon.transform(maCurrentTransformation);
+
+ if(aStartColor == aEndColor)
+ {
+ // no gradient at all, draw as polygon in AA and non-AA case
+ mpOutputDevice->SetLineColor();
+ mpOutputDevice->SetFillColor(Color(aStartColor));
+ mpOutputDevice->DrawPolyPolygon(aLocalPolyPolygon);
+ }
+ else
+ {
+ // use the primitive decomposition of the metafile
+ process(rPolygonCandidate.get2DDecomposition(getViewInformation2D()));
+ }
+ }
break;
}
case PRIMITIVE2D_ID_POLYPOLYGONGRAPHICPRIMITIVE2D :
@@ -214,19 +236,8 @@ namespace drawinglayer
mpOutputDevice->SetAntialiasing(nOldAntiAliase | ANTIALIASING_PIXELSNAPHAIRLINE);
}
- const primitive2d::MetafilePrimitive2D& rMetafilePrimitive( static_cast< const primitive2d::MetafilePrimitive2D& >(rCandidate) );
-
- static bool bTestMetaFilePrimitiveDecomposition( true );
- if( bTestMetaFilePrimitiveDecomposition && !rMetafilePrimitive.getMetaFile().GetUseCanvas() )
- {
- // use new Metafile decomposition
- process(rCandidate.get2DDecomposition(getViewInformation2D()));
- }
- else
- {
- // direct draw of MetaFile
- RenderMetafilePrimitive2D( rMetafilePrimitive );
- }
+ // use new Metafile decomposition
+ process(rCandidate.get2DDecomposition(getViewInformation2D()));
if(bForceLineSnap)
{
diff --git a/drawinglayer/source/processor2d/vclprocessor2d.cxx b/drawinglayer/source/processor2d/vclprocessor2d.cxx
index 8a2ddccaf2a8..f67b982ed703 100644
--- a/drawinglayer/source/processor2d/vclprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclprocessor2d.cxx
@@ -31,7 +31,6 @@
#include <drawinglayer/attribute/sdrfillgraphicattribute.hxx>
#include <drawinglayer/primitive2d/fillgraphicprimitive2d.hxx>
#include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
-#include <vclhelpergradient.hxx>
#include <drawinglayer/primitive2d/metafileprimitive2d.hxx>
#include <drawinglayer/primitive2d/maskprimitive2d.hxx>
#include <basegfx/polygon/b2dpolypolygontools.hxx>
@@ -696,44 +695,6 @@ namespace drawinglayer
}
}
- // direct draw of gradient
- void VclProcessor2D::RenderPolyPolygonGradientPrimitive2D(const primitive2d::PolyPolygonGradientPrimitive2D& rPolygonCandidate)
- {
- const attribute::FillGradientAttribute& rGradient(rPolygonCandidate.getFillGradient());
- basegfx::BColor aStartColor(maBColorModifierStack.getModifiedColor(rGradient.getStartColor()));
- basegfx::BColor aEndColor(maBColorModifierStack.getModifiedColor(rGradient.getEndColor()));
- basegfx::B2DPolyPolygon aLocalPolyPolygon(rPolygonCandidate.getB2DPolyPolygon());
-
- if(aLocalPolyPolygon.count())
- {
- aLocalPolyPolygon.transform(maCurrentTransformation);
-
- if(aStartColor == aEndColor)
- {
- // no gradient at all, draw as polygon in AA and non-AA case
- mpOutputDevice->SetLineColor();
- mpOutputDevice->SetFillColor(Color(aStartColor));
- mpOutputDevice->DrawPolyPolygon(aLocalPolyPolygon);
- }
- else if(getOptionsDrawinglayer().IsAntiAliasing())
- {
- // For AA, direct render has to be avoided since it uses XOR maskings which will not
- // work with AA. Instead, the decompose which uses MaskPrimitive2D with fillings is
- // used
- process(rPolygonCandidate.get2DDecomposition(getViewInformation2D()));
- }
- else
- {
- static bool bSimple = false; // allow testing simple paint in debugger
-
- impDrawGradientToOutDev(
- *mpOutputDevice, aLocalPolyPolygon, rGradient.getStyle(), rGradient.getSteps(),
- aStartColor, aEndColor, rGradient.getBorder(),
- rGradient.getAngle(), rGradient.getOffsetX(), rGradient.getOffsetY(), bSimple);
- }
- }
- }
-
// direct draw of Graphic
void VclProcessor2D::RenderPolyPolygonGraphicPrimitive2D(const primitive2d::PolyPolygonGraphicPrimitive2D& rPolygonCandidate)
{
@@ -921,97 +882,6 @@ namespace drawinglayer
}
}
- // direct draw of MetaFile
- void VclProcessor2D::RenderMetafilePrimitive2D(const primitive2d::MetafilePrimitive2D& rMetaCandidate)
- {
- // decompose matrix to check for shear, rotate and mirroring
- basegfx::B2DHomMatrix aLocalTransform(maCurrentTransformation * rMetaCandidate.getTransform());
- basegfx::B2DVector aScale, aTranslate;
- double fRotate, fShearX;
- aLocalTransform.decompose(aScale, aTranslate, fRotate, fShearX);
-
- if(basegfx::fTools::less(aScale.getX(), 0.0) && basegfx::fTools::less(aScale.getY(), 0.0))
- {
- // #i102175# handle special case: If scale is negative in (x,y) (3rd quadrant), it can
- // be expressed as rotation by PI. This needs to be done for Metafiles since
- // these can be rotated, but not really mirrored
- aScale = basegfx::absolute(aScale);
- fRotate += F_PI;
- }
-
- // get BoundRect
- basegfx::B2DRange aOutlineRange(rMetaCandidate.getB2DRange(getViewInformation2D()));
- aOutlineRange.transform(maCurrentTransformation);
-
- // Due to the integer MapModes used from VCL aind inside MetaFiles errors of up to three
- // pixels in size may happen. As long as there is no better way (e.g. convert the MetaFile
- // to primitives) it is necessary to reduce maximum pixel size by 1 in X and Y and to use
- // the inner pixel bounds accordingly (ceil resp. floor). This will also be done for logic
- // units e.g. when creating a new MetaFile, but since much huger value ranges are used
- // there typically will be okay for this compromize.
- Rectangle aDestRectView(
- // !!CAUTION!! Here, ceil and floor are exchanged BY PURPOSE, do NOT copy when
- // looking for a standard conversion to rectangle (!)
- (sal_Int32)ceil(aOutlineRange.getMinX()), (sal_Int32)ceil(aOutlineRange.getMinY()),
- (sal_Int32)floor(aOutlineRange.getMaxX()), (sal_Int32)floor(aOutlineRange.getMaxY()));
-
- // get metafile (copy it)
- GDIMetaFile aMetaFile;
-
- if(maBColorModifierStack.count())
- {
- const basegfx::BColor aRGBBaseColor(0, 0, 0);
- const basegfx::BColor aRGBColor(maBColorModifierStack.getModifiedColor(aRGBBaseColor));
- aMetaFile = rMetaCandidate.getMetaFile().GetMonochromeMtf(Color(aRGBColor));
- }
- else
- {
- aMetaFile = rMetaCandidate.getMetaFile();
- }
-
- // rotation
- if(!basegfx::fTools::equalZero(fRotate))
- {
- // #i103530#
- // MetaFile::Rotate has no input parameter check, so the parameter needs to be
- // well-aligned to the old range [0..3600] 10th degrees with inverse orientation
- sal_Int16 nRotation((sal_Int16)((fRotate / F_PI180) * -10.0));
-
- while(nRotation < 0)
- nRotation += 3600;
-
- while(nRotation >= 3600)
- nRotation -= 3600;
-
- aMetaFile.Rotate(nRotation);
- }
-
- // Prepare target output size
- Size aDestSize(aDestRectView.GetSize());
-
- if(aDestSize.getWidth() && aDestSize.getHeight())
- {
- // Get preferred Metafile output size. When it's very equal to the output size, it's probably
- // a rounding error somewhere, so correct it to get a 1:1 output without single pixel scalings
- // of the Metafile (esp. for contaned Bitmaps, e.g 3D charts)
- const Size aPrefSize(mpOutputDevice->LogicToPixel(aMetaFile.GetPrefSize(), aMetaFile.GetPrefMapMode()));
-
- if(aPrefSize.getWidth() && (aPrefSize.getWidth() - 1 == aDestSize.getWidth() || aPrefSize.getWidth() + 1 == aDestSize.getWidth()))
- {
- aDestSize.setWidth(aPrefSize.getWidth());
- }
-
- if(aPrefSize.getHeight() && (aPrefSize.getHeight() - 1 == aDestSize.getHeight() || aPrefSize.getHeight() + 1 == aDestSize.getHeight()))
- {
- aDestSize.setHeight(aPrefSize.getHeight());
- }
-
- // paint it
- aMetaFile.WindStart();
- aMetaFile.Play(mpOutputDevice, aDestRectView.TopLeft(), aDestSize);
- }
- }
-
// mask group. Force output to VDev and create mask from given mask
void VclProcessor2D::RenderMaskPrimitive2DPixel(const primitive2d::MaskPrimitive2D& rMaskCandidate)
{