|
 |
f0633d |
From 51a8b809a999b390b26287c9f3d4d45fc8ecd8f9 Mon Sep 17 00:00:00 2001
|
|
 |
f0633d |
From: Jan Holesovsky <kendy@collabora.com>
|
|
 |
f0633d |
Date: Fri, 22 Nov 2013 17:06:10 +0100
|
|
 |
f0633d |
Subject: [PATCH 005/109] EMF+: Parse and render custom line cap data.
|
|
 |
f0633d |
|
|
 |
f0633d |
Contains the following commits:
|
|
 |
f0633d |
|
|
 |
f0633d |
* EMF+: Small cleanup & more logging in preparation for line starts & ends.
|
|
 |
f0633d |
* EMF+: Parse custom line cap data for start and end line caps.
|
|
 |
f0633d |
* EMF+: Render custom line cap data.
|
|
 |
f0633d |
* EMF+: Set the stroke attributes on the custom line caps.
|
|
 |
f0633d |
|
|
 |
f0633d |
Change-Id: Ibdf69c7944e4d027d9dc6974bd740f9b70fb5079
|
|
 |
f0633d |
Reviewed-on: https://gerrit.libreoffice.org/6831
|
|
 |
f0633d |
Reviewed-by: Andras Timar <andras.timar@collabora.com>
|
|
 |
f0633d |
Tested-by: Andras Timar <andras.timar@collabora.com>
|
|
 |
f0633d |
---
|
|
 |
f0633d |
cppcanvas/source/inc/implrenderer.hxx | 9 +-
|
|
 |
f0633d |
cppcanvas/source/mtfrenderer/emfplus.cxx | 314 +++++++++++++++++++++++++++----
|
|
 |
f0633d |
2 files changed, 290 insertions(+), 33 deletions(-)
|
|
 |
f0633d |
|
|
 |
f0633d |
diff --git a/cppcanvas/source/inc/implrenderer.hxx b/cppcanvas/source/inc/implrenderer.hxx
|
|
 |
f0633d |
index 79a2967..270c0de 100644
|
|
 |
f0633d |
--- a/cppcanvas/source/inc/implrenderer.hxx
|
|
 |
f0633d |
+++ b/cppcanvas/source/inc/implrenderer.hxx
|
|
 |
f0633d |
@@ -280,7 +280,14 @@ static float GetSwapFloat( SvStream& rSt )
|
|
 |
f0633d |
/* EMF+ */
|
|
 |
f0633d |
void processEMFPlus( MetaCommentAction* pAct, const ActionFactoryParameters& rFactoryParms, OutDevState& rState, const CanvasSharedPtr& rCanvas );
|
|
 |
f0633d |
double setFont( sal_uInt8 objectId, const ActionFactoryParameters& rParms, OutDevState& rState );
|
|
 |
f0633d |
- void EMFPPlusDrawPolygon (::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms, OutDevState& rState, const CanvasSharedPtr& rCanvas, sal_uInt32 penIndex);
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ /// Render LineCap, like the start or end arrow of a polygon.
|
|
 |
f0633d |
+ void EMFPPlusDrawLineCap(const ::basegfx::B2DPolygon& rPolygon, double fPolyLength,
|
|
 |
f0633d |
+ const ::basegfx::B2DPolyPolygon& rLineCap, bool bStart,
|
|
 |
f0633d |
+ const com::sun::star::rendering::StrokeAttributes& rAttributes,
|
|
 |
f0633d |
+ const ActionFactoryParameters& rParms, OutDevState& rState);
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ void EMFPPlusDrawPolygon (const ::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms, OutDevState& rState, const CanvasSharedPtr& rCanvas, sal_uInt32 penIndex);
|
|
 |
f0633d |
void EMFPPlusFillPolygon (::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms, OutDevState& rState, const CanvasSharedPtr& rCanvas, bool isColor, sal_uInt32 brushIndexOrColor);
|
|
 |
f0633d |
|
|
 |
f0633d |
ActionVector maActions;
|
|
 |
f0633d |
diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx
|
|
 |
f0633d |
index a1b6ebd..1d752e7 100644
|
|
 |
f0633d |
--- a/cppcanvas/source/mtfrenderer/emfplus.cxx
|
|
 |
f0633d |
+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx
|
|
 |
f0633d |
@@ -28,6 +28,7 @@
|
|
 |
f0633d |
#include <basegfx/vector/b2dsize.hxx>
|
|
 |
f0633d |
#include <basegfx/range/b2drange.hxx>
|
|
 |
f0633d |
#include <basegfx/range/b2drectangle.hxx>
|
|
 |
f0633d |
+#include <basegfx/polygon/b2dlinegeometry.hxx>
|
|
 |
f0633d |
#include <basegfx/polygon/b2dpolygon.hxx>
|
|
 |
f0633d |
#include <basegfx/polygon/b2dpolygontools.hxx>
|
|
 |
f0633d |
#include <basegfx/polygon/b2dpolypolygon.hxx>
|
|
 |
f0633d |
@@ -36,8 +37,10 @@
|
|
 |
f0633d |
#include <rtl/ustring.hxx>
|
|
 |
f0633d |
#include <sal/alloca.h>
|
|
 |
f0633d |
|
|
 |
f0633d |
-#include <com/sun/star/rendering/XCanvas.hpp>
|
|
 |
f0633d |
+#include <com/sun/star/rendering/PathCapType.hpp>
|
|
 |
f0633d |
+#include <com/sun/star/rendering/PathJoinType.hpp>
|
|
 |
f0633d |
#include <com/sun/star/rendering/TexturingMode.hpp>
|
|
 |
f0633d |
+#include <com/sun/star/rendering/XCanvas.hpp>
|
|
 |
f0633d |
|
|
 |
f0633d |
#include <bitmapaction.hxx>
|
|
 |
f0633d |
#include <implrenderer.hxx>
|
|
 |
f0633d |
@@ -96,6 +99,22 @@ const sal_Int32 EmfPlusLineStyleDashDot = 0x00000003;
|
|
 |
f0633d |
const sal_Int32 EmfPlusLineStyleDashDotDot = 0x00000004;
|
|
 |
f0633d |
const sal_Int32 EmfPlusLineStyleCustom = 0x00000005;
|
|
 |
f0633d |
|
|
 |
f0633d |
+const sal_uInt32 EmfPlusCustomLineCapDataTypeDefault = 0x00000000;
|
|
 |
f0633d |
+const sal_uInt32 EmfPlusCustomLineCapDataTypeAdjustableArrow = 0x00000001;
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+const sal_uInt32 EmfPlusCustomLineCapDataFillPath = 0x00000001;
|
|
 |
f0633d |
+const sal_uInt32 EmfPlusCustomLineCapDataLinePath = 0x00000002;
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+const sal_uInt32 EmfPlusLineCapTypeFlat = 0x00000000;
|
|
 |
f0633d |
+const sal_uInt32 EmfPlusLineCapTypeSquare = 0x00000001;
|
|
 |
f0633d |
+const sal_uInt32 EmfPlusLineCapTypeRound = 0x00000002;
|
|
 |
f0633d |
+const sal_uInt32 EmfPlusLineCapTypeTriangle = 0x00000003;
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+const sal_uInt32 EmfPlusLineJoinTypeMiter = 0x00000000;
|
|
 |
f0633d |
+const sal_uInt32 EmfPlusLineJoinTypeBevel = 0x00000001;
|
|
 |
f0633d |
+const sal_uInt32 EmfPlusLineJoinTypeRound = 0x00000002;
|
|
 |
f0633d |
+const sal_uInt32 EmfPlusLineJoinTypeMiterClipped = 0x00000003;
|
|
 |
f0633d |
+
|
|
 |
f0633d |
using namespace ::com::sun::star;
|
|
 |
f0633d |
using namespace ::basegfx;
|
|
 |
f0633d |
|
|
 |
f0633d |
@@ -587,6 +606,137 @@ namespace cppcanvas
|
|
 |
f0633d |
}
|
|
 |
f0633d |
};
|
|
 |
f0633d |
|
|
 |
f0633d |
+ /// Convert stroke caps between EMF+ and rendering API
|
|
 |
f0633d |
+ sal_Int8 lcl_convertStrokeCap(sal_uInt32 nEmfStroke)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ switch (nEmfStroke)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ case EmfPlusLineCapTypeSquare: return rendering::PathCapType::SQUARE;
|
|
 |
f0633d |
+ case EmfPlusLineCapTypeRound: return rendering::PathCapType::ROUND;
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ // we have no mapping for EmfPlusLineCapTypeTriangle, so return
|
|
 |
f0633d |
+ // BUTT always
|
|
 |
f0633d |
+ return rendering::PathCapType::BUTT;
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ struct EMFPCustomLineCap : public EMFPObject
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ sal_uInt32 type;
|
|
 |
f0633d |
+ sal_uInt32 strokeStartCap, strokeEndCap, strokeJoin;
|
|
 |
f0633d |
+ float miterLimit;
|
|
 |
f0633d |
+ basegfx::B2DPolyPolygon polygon;
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ public:
|
|
 |
f0633d |
+ EMFPCustomLineCap() : EMFPObject()
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ ~EMFPCustomLineCap()
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ void SetAttributes(rendering::StrokeAttributes& aAttributes)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ aAttributes.StartCapType = lcl_convertStrokeCap(strokeStartCap);
|
|
 |
f0633d |
+ aAttributes.EndCapType = lcl_convertStrokeCap(strokeEndCap);
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ switch (strokeJoin)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ case EmfPlusLineJoinTypeMiter: // fall-through
|
|
 |
f0633d |
+ case EmfPlusLineJoinTypeMiterClipped: aAttributes.JoinType = rendering::PathJoinType::MITER; break;
|
|
 |
f0633d |
+ case EmfPlusLineJoinTypeBevel: aAttributes.JoinType = rendering::PathJoinType::BEVEL; break;
|
|
 |
f0633d |
+ case EmfPlusLineJoinTypeRound: aAttributes.JoinType = rendering::PathJoinType::ROUND; break;
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ aAttributes.MiterLimit = miterLimit;
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ void ReadPath(SvStream& s, ImplRenderer& rR, bool bClosed)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ sal_Int32 pathLength;
|
|
 |
f0633d |
+ s >> pathLength;
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tpath length: " << pathLength);
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ sal_uInt32 pathHeader;
|
|
 |
f0633d |
+ sal_Int32 pathPoints, pathFlags;
|
|
 |
f0633d |
+ s >> pathHeader >> pathPoints >> pathFlags;
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tpath (custom cap line path)");
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\theader: 0x" << std::hex << pathHeader << " points: " << std::dec << pathPoints << " additional flags: 0x" << std::hex << pathFlags << std::dec );
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ EMFPPath path(pathPoints);
|
|
 |
f0633d |
+ path.Read(s, pathFlags, rR);
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ polygon = path.GetPolygon(rR, false);
|
|
 |
f0633d |
+ polygon.setClosed(bClosed);
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ // transformation to convert the path to what LibreOffice
|
|
 |
f0633d |
+ // expects
|
|
 |
f0633d |
+ B2DHomMatrix aMatrix;
|
|
 |
f0633d |
+ aMatrix.scale(1.0, -1.0);
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ polygon.transform(aMatrix);
|
|
 |
f0633d |
+ };
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ void Read (SvStream& s, ImplRenderer& rR)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ sal_uInt32 header;
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ s >> header >> type;
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tcustom cap");
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\theader: 0x" << std::hex << header << " type: " << type << std::dec);
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ if (type == EmfPlusCustomLineCapDataTypeDefault)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ sal_uInt32 customLineCapDataFlags, baseCap;
|
|
 |
f0633d |
+ float baseInset;
|
|
 |
f0633d |
+ float widthScale;
|
|
 |
f0633d |
+ float fillHotSpotX, fillHotSpotY, strokeHotSpotX, strokeHotSpotY;
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ s >> customLineCapDataFlags >> baseCap >> baseInset
|
|
 |
f0633d |
+ >> strokeStartCap >> strokeEndCap >> strokeJoin
|
|
 |
f0633d |
+ >> miterLimit >> widthScale
|
|
 |
f0633d |
+ >> fillHotSpotX >> fillHotSpotY >> strokeHotSpotX >> strokeHotSpotY;
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tcustomLineCapDataFlags: 0x" << std::hex << customLineCapDataFlags);
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tbaseCap: 0x" << std::hex << baseCap);
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tbaseInset: " << baseInset);
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tstrokeStartCap: 0x" << std::hex << strokeStartCap);
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tstrokeEndCap: 0x" << std::hex << strokeEndCap);
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tstrokeJoin: 0x" << std::hex << strokeJoin);
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tmiterLimit: " << miterLimit);
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\twidthScale: " << widthScale);
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ if (customLineCapDataFlags & EmfPlusCustomLineCapDataFillPath)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ ReadPath(s, rR, true);
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ if (customLineCapDataFlags & EmfPlusCustomLineCapDataLinePath)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ ReadPath(s, rR, false);
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+ else if (type == EmfPlusCustomLineCapDataTypeAdjustableArrow)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ // TODO only reads the data, does not use them [I've had
|
|
 |
f0633d |
+ // no test document to be able to implement it]
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ sal_Int32 width, height, middleInset, fillState, lineStartCap;
|
|
 |
f0633d |
+ sal_Int32 lineEndCap, lineJoin, widthScale;
|
|
 |
f0633d |
+ float fillHotSpotX, fillHotSpotY, lineHotSpotX, lineHotSpotY;
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ s >> width >> height >> middleInset >> fillState >> lineStartCap
|
|
 |
f0633d |
+ >> lineEndCap >> lineJoin >> miterLimit >> widthScale
|
|
 |
f0633d |
+ >> fillHotSpotX >> fillHotSpotY >> lineHotSpotX >> lineHotSpotY;
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tTODO - actually read EmfPlusCustomLineCapArrowData object (section 2.2.2.12)");
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+ };
|
|
 |
f0633d |
+
|
|
 |
f0633d |
struct EMFPPen : public EMFPBrush
|
|
 |
f0633d |
{
|
|
 |
f0633d |
XForm transformation;
|
|
 |
f0633d |
@@ -604,16 +754,28 @@ namespace cppcanvas
|
|
 |
f0633d |
sal_Int32 compoundArrayLen;
|
|
 |
f0633d |
float *compoundArray;
|
|
 |
f0633d |
sal_Int32 customStartCapLen;
|
|
 |
f0633d |
- sal_uInt8 *customStartCap;
|
|
 |
f0633d |
+ EMFPCustomLineCap *customStartCap;
|
|
 |
f0633d |
sal_Int32 customEndCapLen;
|
|
 |
f0633d |
- sal_uInt8 *customEndCap;
|
|
 |
f0633d |
+ EMFPCustomLineCap *customEndCap;
|
|
 |
f0633d |
|
|
 |
f0633d |
public:
|
|
 |
f0633d |
EMFPPen () : EMFPBrush ()
|
|
 |
f0633d |
{
|
|
 |
f0633d |
+ dashPattern = NULL;
|
|
 |
f0633d |
+ compoundArray = NULL;
|
|
 |
f0633d |
+ customStartCap = NULL;
|
|
 |
f0633d |
+ customEndCap = NULL;
|
|
 |
f0633d |
}
|
|
 |
f0633d |
|
|
 |
f0633d |
- void SetStrokeAttributes (rendering::StrokeAttributes& rStrokeAttributes, ImplRenderer& rR, const OutDevState& rState)
|
|
 |
f0633d |
+ ~EMFPPen ()
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ delete[] dashPattern;
|
|
 |
f0633d |
+ delete[] compoundArray;
|
|
 |
f0633d |
+ delete customStartCap;
|
|
 |
f0633d |
+ delete customEndCap;
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ void SetStrokeWidth(rendering::StrokeAttributes& rStrokeAttributes, ImplRenderer& rR, const OutDevState& rState)
|
|
 |
f0633d |
{
|
|
 |
f0633d |
#if OSL_DEBUG_LEVEL > 1
|
|
 |
f0633d |
if (width == 0.0) {
|
|
 |
f0633d |
@@ -621,8 +783,10 @@ namespace cppcanvas
|
|
 |
f0633d |
}
|
|
 |
f0633d |
#endif
|
|
 |
f0633d |
rStrokeAttributes.StrokeWidth = fabs((rState.mapModeTransform * rR.MapSize (width == 0.0 ? 0.05 : width, 0)).getX());
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
|
|
 |
f0633d |
- // set dashing
|
|
 |
f0633d |
+ void SetStrokeDashing(rendering::StrokeAttributes& rStrokeAttributes)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
if (dashStyle != EmfPlusLineStyleSolid)
|
|
 |
f0633d |
{
|
|
 |
f0633d |
const float dash[] = {3, 3};
|
|
 |
f0633d |
@@ -666,12 +830,18 @@ namespace cppcanvas
|
|
 |
f0633d |
s >> transformation;
|
|
 |
f0633d |
|
|
 |
f0633d |
if (penFlags & 2)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
s >> startCap;
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tstartCap: 0x" << std::hex << startCap);
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
else
|
|
 |
f0633d |
startCap = 0;
|
|
 |
f0633d |
|
|
 |
f0633d |
if (penFlags & 4)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
s >> endCap;
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tendCap: 0x" << std::hex << endCap);
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
else
|
|
 |
f0633d |
endCap = 0;
|
|
 |
f0633d |
|
|
 |
f0633d |
@@ -737,24 +907,34 @@ namespace cppcanvas
|
|
 |
f0633d |
} else
|
|
 |
f0633d |
compoundArrayLen = 0;
|
|
 |
f0633d |
|
|
 |
f0633d |
- if (penFlags & 2048) {
|
|
 |
f0633d |
+ if (penFlags & 2048)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
s >> customStartCapLen;
|
|
 |
f0633d |
- if( customStartCapLen<0 )
|
|
 |
f0633d |
- customStartCapLen=0;
|
|
 |
f0633d |
- customStartCap = new sal_uInt8 [customStartCapLen];
|
|
 |
f0633d |
- for (i = 0; i < customStartCapLen; i++)
|
|
 |
f0633d |
- s >> customStartCap [i];
|
|
 |
f0633d |
- } else
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tcustomStartCapLen: " << customStartCapLen);
|
|
 |
f0633d |
+ sal_uInt32 pos = s.Tell();
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ customStartCap = new EMFPCustomLineCap();
|
|
 |
f0633d |
+ customStartCap->Read(s, rR);
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ // maybe we don't read everything yet, play it safe ;-)
|
|
 |
f0633d |
+ s.Seek(pos + customStartCapLen);
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+ else
|
|
 |
f0633d |
customStartCapLen = 0;
|
|
 |
f0633d |
|
|
 |
f0633d |
- if (penFlags & 4096) {
|
|
 |
f0633d |
+ if (penFlags & 4096)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
s >> customEndCapLen;
|
|
 |
f0633d |
- if( customEndCapLen<0 )
|
|
 |
f0633d |
- customEndCapLen=0;
|
|
 |
f0633d |
- customEndCap = new sal_uInt8 [customEndCapLen];
|
|
 |
f0633d |
- for (i = 0; i < customEndCapLen; i++)
|
|
 |
f0633d |
- s >> customEndCap [i];
|
|
 |
f0633d |
- } else
|
|
 |
f0633d |
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tcustomEndCapLen: " << customEndCapLen);
|
|
 |
f0633d |
+ sal_uInt32 pos = s.Tell();
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ customEndCap = new EMFPCustomLineCap();
|
|
 |
f0633d |
+ customEndCap->Read(s, rR);
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ // maybe we don't read everything yet, play it safe ;-)
|
|
 |
f0633d |
+ s.Seek(pos + customEndCapLen);
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+ else
|
|
 |
f0633d |
customEndCapLen = 0;
|
|
 |
f0633d |
|
|
 |
f0633d |
EMFPBrush::Read (s, rR);
|
|
 |
f0633d |
@@ -1140,7 +1320,39 @@ namespace cppcanvas
|
|
 |
f0633d |
}
|
|
 |
f0633d |
}
|
|
 |
f0633d |
|
|
 |
f0633d |
- void ImplRenderer::EMFPPlusDrawPolygon (::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms,
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ void ImplRenderer::EMFPPlusDrawLineCap(const ::basegfx::B2DPolygon& rPolygon, double fPolyLength,
|
|
 |
f0633d |
+ const ::basegfx::B2DPolyPolygon& rLineCap, bool bStart, const rendering::StrokeAttributes& rAttributes,
|
|
 |
f0633d |
+ const ActionFactoryParameters& rParms, OutDevState& rState)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ if (!rLineCap.count())
|
|
 |
f0633d |
+ return;
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ // it seems the line caps in EMF+ are 4*larger than what
|
|
 |
f0633d |
+ // LibreOffice expects, and the mapping in
|
|
 |
f0633d |
+ // createAreaGeometryForLineStartEnd scales that down, so
|
|
 |
f0633d |
+ // correct it
|
|
 |
f0633d |
+ // [unfortunately found no proof for this in the spec :-( - please
|
|
 |
f0633d |
+ // feel free to correct this if it causes trouble]
|
|
 |
f0633d |
+ double fWidth = rAttributes.StrokeWidth*4;
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ basegfx::B2DPolyPolygon aArrow(basegfx::tools::createAreaGeometryForLineStartEnd(
|
|
 |
f0633d |
+ rPolygon, rLineCap, bStart,
|
|
 |
f0633d |
+ fWidth, fPolyLength, 0.0, NULL));
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ // createAreaGeometryForLineStartEnd from some reason always sets
|
|
 |
f0633d |
+ // the path as closed, correct it
|
|
 |
f0633d |
+ aArrow.setClosed(rLineCap.isClosed());
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ ActionSharedPtr pAction(internal::PolyPolyActionFactory::createPolyPolyAction(aArrow, rParms.mrCanvas, rState, rAttributes));
|
|
 |
f0633d |
+ if (pAction)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ maActions.push_back(MtfAction(pAction, rParms.mrCurrActionIndex));
|
|
 |
f0633d |
+ rParms.mrCurrActionIndex += pAction->getActionCount()-1;
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ void ImplRenderer::EMFPPlusDrawPolygon (const ::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms,
|
|
 |
f0633d |
OutDevState& rState, const CanvasSharedPtr& rCanvas, sal_uInt32 penIndex)
|
|
 |
f0633d |
{
|
|
 |
f0633d |
EMFPPen* pen = (EMFPPen*) aObjects [penIndex & 0xff];
|
|
 |
f0633d |
@@ -1154,24 +1366,62 @@ namespace cppcanvas
|
|
 |
f0633d |
rState.lineColor = ::vcl::unotools::colorToDoubleSequence (pen->GetColor (),
|
|
 |
f0633d |
rCanvas->getUNOCanvas ()->getDevice()->getDeviceColorSpace());
|
|
 |
f0633d |
|
|
 |
f0633d |
- polygon.transform( rState.mapModeTransform );
|
|
 |
f0633d |
- rendering::StrokeAttributes aStrokeAttributes;
|
|
 |
f0633d |
+ basegfx::B2DPolyPolygon aPolyPolygon(polygon);
|
|
 |
f0633d |
+ aPolyPolygon.transform(rState.mapModeTransform);
|
|
 |
f0633d |
+ rendering::StrokeAttributes aCommonAttributes;
|
|
 |
f0633d |
|
|
 |
f0633d |
- pen->SetStrokeAttributes (aStrokeAttributes, *this, rState);
|
|
 |
f0633d |
+ // some attributes are common for the polygon, and the line
|
|
 |
f0633d |
+ // starts & ends - like the stroke width
|
|
 |
f0633d |
+ pen->SetStrokeWidth(aCommonAttributes, *this, rState);
|
|
 |
f0633d |
|
|
 |
f0633d |
- ActionSharedPtr pPolyAction(
|
|
 |
f0633d |
- internal::PolyPolyActionFactory::createPolyPolyAction(
|
|
 |
f0633d |
- polygon, rParms.mrCanvas, rState, aStrokeAttributes ) );
|
|
 |
f0633d |
+ // but eg. dashing has to be additionally set only on the
|
|
 |
f0633d |
+ // polygon
|
|
 |
f0633d |
+ rendering::StrokeAttributes aPolygonAttributes(aCommonAttributes);
|
|
 |
f0633d |
+ pen->SetStrokeDashing(aPolygonAttributes);
|
|
 |
f0633d |
|
|
 |
f0633d |
+ // render the polygon
|
|
 |
f0633d |
+ ActionSharedPtr pPolyAction(internal::PolyPolyActionFactory::createPolyPolyAction(aPolyPolygon, rParms.mrCanvas, rState, aPolygonAttributes));
|
|
 |
f0633d |
if( pPolyAction )
|
|
 |
f0633d |
{
|
|
 |
f0633d |
- maActions.push_back(
|
|
 |
f0633d |
- MtfAction(
|
|
 |
f0633d |
- pPolyAction,
|
|
 |
f0633d |
- rParms.mrCurrActionIndex ) );
|
|
 |
f0633d |
-
|
|
 |
f0633d |
+ maActions.push_back(MtfAction(pPolyAction, rParms.mrCurrActionIndex));
|
|
 |
f0633d |
rParms.mrCurrActionIndex += pPolyAction->getActionCount()-1;
|
|
 |
f0633d |
}
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ // render line starts & ends
|
|
 |
f0633d |
+ if (pen->customStartCap || pen->customEndCap)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ for (sal_uInt32 i = 0; i < aPolyPolygon.count(); ++i)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ // break the polypolygon into polygons
|
|
 |
f0633d |
+ basegfx::B2DPolygon aPolygon(aPolyPolygon.getB2DPolygon(i));
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ if (aPolygon.isClosed())
|
|
 |
f0633d |
+ continue;
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ double fPolyLength = basegfx::tools::getLength(aPolygon);
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ // line start
|
|
 |
f0633d |
+ if (pen->customStartCap)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ rendering::StrokeAttributes aAttributes(aCommonAttributes);
|
|
 |
f0633d |
+ pen->customStartCap->SetAttributes(aAttributes);
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ EMFPPlusDrawLineCap(aPolygon, fPolyLength, pen->customStartCap->polygon,
|
|
 |
f0633d |
+ true, aAttributes, rParms, rState);
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ // line end
|
|
 |
f0633d |
+ if (pen->customEndCap)
|
|
 |
f0633d |
+ {
|
|
 |
f0633d |
+ rendering::StrokeAttributes aAttributes(aCommonAttributes);
|
|
 |
f0633d |
+ pen->customEndCap->SetAttributes(aAttributes);
|
|
 |
f0633d |
+
|
|
 |
f0633d |
+ EMFPPlusDrawLineCap(aPolygon, fPolyLength, pen->customEndCap->polygon,
|
|
 |
f0633d |
+ false, aAttributes, rParms, rState);
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+ }
|
|
 |
f0633d |
+
|
|
 |
f0633d |
}
|
|
 |
f0633d |
}
|
|
 |
f0633d |
|
|
 |
f0633d |
@@ -1550,7 +1800,7 @@ namespace cppcanvas
|
|
 |
f0633d |
|
|
 |
f0633d |
rendering::StrokeAttributes aStrokeAttributes;
|
|
 |
f0633d |
|
|
 |
f0633d |
- pen->SetStrokeAttributes (aStrokeAttributes, *this, rState);
|
|
 |
f0633d |
+ pen->SetStrokeWidth (aStrokeAttributes, *this, rState);
|
|
 |
f0633d |
|
|
 |
f0633d |
ActionSharedPtr pPolyAction(
|
|
 |
f0633d |
internal::PolyPolyActionFactory::createPolyPolyAction(
|
|
 |
f0633d |
--
|
|
 |
f0633d |
1.8.4.2
|
|
 |
f0633d |
|