Kaydet (Commit) ebc11ae0 authored tarafından Thorsten Behrens's avatar Thorsten Behrens

emfplus: cut over to new EMF+ renderer

We're on par with the old functionality now (modulo a few smaller
issues); overall QoS is much better, we get vector output on pdf
and print, and the need for large offscreen bitmap rendering goes
away.

Change-Id: I1fa92c5cad67579c3fcfa78f1bc68696bf1623ec
Reviewed-on: https://gerrit.libreoffice.org/41406Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarPatrick Jaap <patrick.jaap@tu-dresden.de>
Reviewed-by: 's avatarThorsten Behrens <Thorsten.Behrens@CIB.de>
üst a3782f11
......@@ -1714,40 +1714,6 @@ namespace drawinglayer
break;
}
case PRIMITIVE2D_ID_METAFILEPRIMITIVE2D :
{
const primitive2d::MetafilePrimitive2D& aMetafile = static_cast< const primitive2d::MetafilePrimitive2D& >(rCandidate);
if(!aMetafile.getMetaFile().GetUseCanvas())
{
// Use new Metafile decomposition.
// TODO EMF+ stuffed into METACOMMENT support required
process(rCandidate);
}
else
{
#ifdef DBG_UTIL
// switch to test EMFPlus-enhanced MetafileDecomposition, don't do
// this by default in debug mode
static bool bTestEMFPDecomposition(false);
if (bTestEMFPDecomposition)
{
process(rCandidate);
}
else
{
// direct draw of MetaFile
RenderMetafilePrimitive2D(aMetafile);
}
#else // DBG_UTIL
// direct draw of MetaFile, use default processing
RenderMetafilePrimitive2D(aMetafile);
#endif // DBG_UTIL
}
break;
}
case PRIMITIVE2D_ID_MASKPRIMITIVE2D :
{
// mask group. Special handling for MetaFiles.
......
......@@ -485,59 +485,7 @@ namespace drawinglayer
mpOutputDevice->SetAntialiasing(nOldAntiAliase | AntialiasingFlags::PixelSnapHairline);
}
const primitive2d::MetafilePrimitive2D& rMetafilePrimitive( static_cast< const primitive2d::MetafilePrimitive2D& >(rCandidate) );
if( !rMetafilePrimitive.getMetaFile().GetUseCanvas() )
{
// use new Metafile decomposition
process(rCandidate);
}
else
{
#ifdef DBG_UTIL
// switch to test EMFPlus-enhanced MetafileDecomposition, don't do
// this by default in debug mode
static bool bTestEMFPDecomposition(false);
// switch to show the new visualization color changed behind
// the original output vor visual testing, also not by default in debug mode
static bool bUseChangedColorObject(false);
if (bTestEMFPDecomposition)
{
if (bUseChangedColorObject)
{
primitive2d::Primitive2DContainer aDecomposition;
rMetafilePrimitive.get2DDecomposition(aDecomposition, getViewInformation2D());
primitive2d::BasePrimitive2D* pBasePrimitive = nullptr;
const primitive2d::Primitive2DReference aPrimitiveR(
pBasePrimitive = new primitive2d::ModifiedColorPrimitive2D(
aDecomposition,
basegfx::BColorModifierSharedPtr(
new basegfx::BColorModifier_RGBLuminanceContrast(
0.5, // red
-0.5, // green
-0.5, // blue
0.0, // luminance
0.0)))); // contrast
processBasePrimitive2D(*pBasePrimitive);
RenderMetafilePrimitive2D(rMetafilePrimitive);
}
else
{
process(rCandidate);
}
}
else
{
// direct draw of MetaFile
RenderMetafilePrimitive2D(rMetafilePrimitive);
}
#else // DBG_UTIL
// direct draw of MetaFile
RenderMetafilePrimitive2D(rMetafilePrimitive);
#endif // DBG_UTIL
}
process(rCandidate);
if(bForceLineSnap)
{
......
......@@ -87,18 +87,6 @@ namespace
return nSteps;
}
// get metafile (copy it)
GDIMetaFile GetMetaFile(const drawinglayer::primitive2d::MetafilePrimitive2D& rMetaCandidate, const basegfx::BColorModifierStack& rColorModifierStack)
{
if (rColorModifierStack.count())
{
const basegfx::BColor aRGBBaseColor(0, 0, 0);
const basegfx::BColor aRGBColor(rColorModifierStack.getModifiedColor(aRGBBaseColor));
return rMetaCandidate.getMetaFile().GetMonochromeMtf(Color(aRGBColor));
}
return rMetaCandidate.getMetaFile();
}
}
namespace drawinglayer
......@@ -713,86 +701,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 compromise.
tools::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(GetMetaFile(rMetaCandidate, maBColorModifierStack));
// 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() > 0 && aDestSize.getHeight() > 0)
{
// 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 contained 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)
{
......
......@@ -106,7 +106,6 @@ namespace drawinglayer
void RenderEpsPrimitive2D(const primitive2d::EpsPrimitive2D& rEpsPrimitive2D);
void RenderSvgLinearAtomPrimitive2D(const primitive2d::SvgLinearAtomPrimitive2D& rCandidate);
void RenderSvgRadialAtomPrimitive2D(const primitive2d::SvgRadialAtomPrimitive2D& rCandidate);
void RenderMetafilePrimitive2D(const primitive2d::MetafilePrimitive2D& rPolygonCandidate);
// DrawMode adaption support
void adaptLineToFillDrawMode() const;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment