1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 #include <test/primitive2dxmldump.hxx>
11 #include <test/xmltesttools.hxx>
13 #include <vcl/metaact.hxx>
14 #include <rtl/string.hxx>
15 #include <rtl/strbuf.hxx>
19 #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
20 #include <drawinglayer/primitive2d/transformprimitive2d.hxx>
21 #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
22 #include <drawinglayer/primitive2d/hiddengeometryprimitive2d.hxx>
23 #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
24 #include <drawinglayer/primitive2d/textprimitive2d.hxx>
25 #include <drawinglayer/primitive2d/maskprimitive2d.hxx>
26 #include <drawinglayer/primitive2d/unifiedtransparenceprimitive2d.hxx>
27 #include <drawinglayer/primitive2d/objectinfoprimitive2d.hxx>
28 #include <drawinglayer/primitive2d/svggradientprimitive2d.hxx>
30 #include <drawinglayer/attribute/lineattribute.hxx>
31 #include <drawinglayer/attribute/fontattribute.hxx>
33 #include <basegfx/polygon/b2dpolypolygontools.hxx>
34 #include <basegfx/polygon/b2dpolygontools.hxx>
36 using namespace drawinglayer::primitive2d
;
41 const size_t constMaxActionType
= 513;
43 OUString
convertColorToString(const basegfx::BColor
& rColor
)
45 OUString aRGBString
= Color(rColor
).AsRGBHexString();
46 return "#" + aRGBString
;
49 } // anonymous namespace
51 Primitive2dXmlDump::Primitive2dXmlDump() :
52 maFilter(constMaxActionType
, false)
55 Primitive2dXmlDump::~Primitive2dXmlDump()
59 xmlDocPtr
Primitive2dXmlDump::dumpAndParse(
60 const drawinglayer::primitive2d::Primitive2DContainer
& rPrimitive2DSequence
,
61 const OUString
& rTempStreamName
)
63 std::unique_ptr
<SvStream
> pStream
;
65 if (rTempStreamName
.isEmpty())
66 pStream
.reset(new SvMemoryStream());
68 pStream
.reset(new SvFileStream(rTempStreamName
, StreamMode::STD_READWRITE
| StreamMode::TRUNC
));
70 XmlWriter
aWriter(pStream
.get());
71 aWriter
.startDocument();
72 aWriter
.startElement("primitive2D");
74 decomposeAndWrite(rPrimitive2DSequence
, aWriter
);
77 aWriter
.endDocument();
79 pStream
->Seek(STREAM_SEEK_TO_BEGIN
);
81 xmlDocPtr pDoc
= XmlTestTools::parseXmlStream(pStream
.get());
86 void Primitive2dXmlDump::decomposeAndWrite(
87 const drawinglayer::primitive2d::Primitive2DContainer
& rPrimitive2DSequence
,
90 for (size_t i
= 0; i
< rPrimitive2DSequence
.size(); i
++)
92 drawinglayer::primitive2d::Primitive2DReference xPrimitive2DReference
= rPrimitive2DSequence
[i
];
93 const BasePrimitive2D
* pBasePrimitive
= dynamic_cast<const BasePrimitive2D
* >(xPrimitive2DReference
.get());
96 sal_uInt32 nId
= pBasePrimitive
->getPrimitive2DID();
100 OUString sCurrentElementTag
= drawinglayer::primitive2d::idToString(nId
);
104 case PRIMITIVE2D_ID_HIDDENGEOMETRYPRIMITIVE2D
:
106 const HiddenGeometryPrimitive2D
& rHiddenGeometryPrimitive2D
= dynamic_cast<const HiddenGeometryPrimitive2D
&>(*pBasePrimitive
);
107 rWriter
.startElement("hiddengeometry");
108 decomposeAndWrite(rHiddenGeometryPrimitive2D
.getChildren(), rWriter
);
109 rWriter
.endElement();
113 case PRIMITIVE2D_ID_TRANSFORMPRIMITIVE2D
:
115 const TransformPrimitive2D
& rTransformPrimitive2D
= dynamic_cast<const TransformPrimitive2D
&>(*pBasePrimitive
);
116 rWriter
.startElement("transform");
117 decomposeAndWrite(rTransformPrimitive2D
.getChildren(), rWriter
);
118 rWriter
.endElement();
122 case PRIMITIVE2D_ID_POLYPOLYGONCOLORPRIMITIVE2D
:
124 const PolyPolygonColorPrimitive2D
& rPolyPolygonColorPrimitive2D
= dynamic_cast<const PolyPolygonColorPrimitive2D
&>(*pBasePrimitive
);
126 rWriter
.startElement("polypolygoncolor");
127 rWriter
.attribute("color", convertColorToString(rPolyPolygonColorPrimitive2D
.getBColor()));
128 const basegfx::B2DPolyPolygon
aB2DPolyPolygon(rPolyPolygonColorPrimitive2D
.getB2DPolyPolygon());
129 const basegfx::B2DRange
aB2DRange(aB2DPolyPolygon
.getB2DRange());
130 rWriter
.attribute("height", aB2DRange
.getHeight());
131 rWriter
.attribute("width", aB2DRange
.getWidth());
132 rWriter
.attribute("minx", aB2DRange
.getMinX());
133 rWriter
.attribute("miny", aB2DRange
.getMinY());
134 rWriter
.attribute("maxx", aB2DRange
.getMaxX());
135 rWriter
.attribute("maxy", aB2DRange
.getMaxY());
136 rWriter
.startElement("polypolygon");
137 rWriter
.content(basegfx::tools::exportToSvgD(rPolyPolygonColorPrimitive2D
.getB2DPolyPolygon(), true, true, false));
138 rWriter
.endElement();
139 rWriter
.endElement();
143 case PRIMITIVE2D_ID_POLYPOLYGONSTROKEPRIMITIVE2D
:
145 const PolyPolygonStrokePrimitive2D
& rPolyPolygonStrokePrimitive2D
= dynamic_cast<const PolyPolygonStrokePrimitive2D
&>(*pBasePrimitive
);
146 rWriter
.startElement("polypolygonstroke");
148 rWriter
.startElement("line");
149 drawinglayer::attribute::LineAttribute aLineAttribute
= rPolyPolygonStrokePrimitive2D
.getLineAttribute();
150 rWriter
.attribute("color", convertColorToString(aLineAttribute
.getColor()));
151 rWriter
.attribute("width", aLineAttribute
.getWidth());
152 //rWriter.attribute("linejoin", aLineAttribute.getLineJoin());
153 //rWriter.attribute("linecap", aLineAttribute.getLineCap());
154 rWriter
.endElement();
156 //getStrokeAttribute()
158 rWriter
.startElement("polypolygon");
159 rWriter
.content(basegfx::tools::exportToSvgD(rPolyPolygonStrokePrimitive2D
.getB2DPolyPolygon(), true, true, false));
160 rWriter
.endElement();
162 rWriter
.endElement();
166 case PRIMITIVE2D_ID_POLYGONHAIRLINEPRIMITIVE2D
:
168 const PolygonHairlinePrimitive2D
& rPolygonHairlinePrimitive2D
= dynamic_cast<const PolygonHairlinePrimitive2D
&>(*pBasePrimitive
);
169 rWriter
.startElement("polygonhairline");
171 rWriter
.attribute("color", convertColorToString(rPolygonHairlinePrimitive2D
.getBColor()));
173 rWriter
.startElement("polygon");
174 rWriter
.content(basegfx::tools::exportToSvgPoints(rPolygonHairlinePrimitive2D
.getB2DPolygon()));
175 rWriter
.endElement();
178 rWriter
.endElement();
182 case PRIMITIVE2D_ID_TEXTSIMPLEPORTIONPRIMITIVE2D
:
184 const TextSimplePortionPrimitive2D
& rTextSimplePortionPrimitive2D
= dynamic_cast<const TextSimplePortionPrimitive2D
&>(*pBasePrimitive
);
185 rWriter
.startElement("textsimpleportion");
187 basegfx::B2DVector aScale
, aTranslate
;
188 double fRotate
, fShearX
;
189 if(rTextSimplePortionPrimitive2D
.getTextTransform().decompose(aScale
, aTranslate
, fRotate
, fShearX
))
191 rWriter
.attribute("height", aScale
.getY());
193 rWriter
.attribute("text", rTextSimplePortionPrimitive2D
.getText());
194 rWriter
.attribute("fontcolor", convertColorToString(rTextSimplePortionPrimitive2D
.getFontColor()));
196 drawinglayer::attribute::FontAttribute aFontAttribute
= rTextSimplePortionPrimitive2D
.getFontAttribute();
197 rWriter
.attribute("familyname", aFontAttribute
.getFamilyName());
198 rWriter
.endElement();
202 case PRIMITIVE2D_ID_MASKPRIMITIVE2D
:
204 const MaskPrimitive2D
& rMaskPrimitive2D
= dynamic_cast<const MaskPrimitive2D
&>(*pBasePrimitive
);
205 rWriter
.startElement("mask");
207 decomposeAndWrite(rMaskPrimitive2D
.getChildren(), rWriter
);
208 rWriter
.endElement();
212 case PRIMITIVE2D_ID_UNIFIEDTRANSPARENCEPRIMITIVE2D
:
214 const UnifiedTransparencePrimitive2D
& rUnifiedTransparencePrimitive2D
= dynamic_cast<const UnifiedTransparencePrimitive2D
&>(*pBasePrimitive
);
215 rWriter
.startElement("unifiedtransparence");
217 rWriter
.attribute("transparence", rUnifiedTransparencePrimitive2D
.getTransparence());
219 rWriter
.endElement();
223 case PRIMITIVE2D_ID_OBJECTINFOPRIMITIVE2D
:
225 const ObjectInfoPrimitive2D
& rObjectInfoPrimitive2D
= dynamic_cast<const ObjectInfoPrimitive2D
&>(*pBasePrimitive
);
226 rWriter
.startElement("objectinfo");
228 decomposeAndWrite(rObjectInfoPrimitive2D
.getChildren(), rWriter
);
229 rWriter
.endElement();
233 case PRIMITIVE2D_ID_SVGRADIALGRADIENTPRIMITIVE2D
:
235 const SvgRadialGradientPrimitive2D
& rSvgRadialGradientPrimitive2D
= dynamic_cast<const SvgRadialGradientPrimitive2D
&>(*pBasePrimitive
);
236 rWriter
.startElement("svgradialgradient");
237 basegfx::B2DPoint aFocusAttribute
= rSvgRadialGradientPrimitive2D
.getFocal();
239 rWriter
.attribute("radius", rSvgRadialGradientPrimitive2D
.getRadius());
240 rWriter
.attribute("x", aFocusAttribute
.getX());
241 rWriter
.attribute("y", aFocusAttribute
.getY());
243 rWriter
.endElement();
249 rWriter
.element(OUStringToOString(sCurrentElementTag
, RTL_TEXTENCODING_UTF8
));
257 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */