LibreOffice Module vcl (master) 1
mtfxmldump.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
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/.
8 */
9
10#include <vcl/mtfxmldump.hxx>
11#include <tools/XmlWriter.hxx>
12#include <tools/fract.hxx>
13
14#include <vcl/metaact.hxx>
15#include <vcl/outdev.hxx>
16#include <vcl/bitmap.hxx>
18
19#include <rtl/string.hxx>
20#include <rtl/ustrbuf.hxx>
21
22#include <comphelper/hash.hxx>
23
24#include <sstream>
25
26namespace
27{
28
29OUString collectPushFlags(vcl::PushFlags nFlags)
30{
32 return "PushAll";
33 else if ((nFlags & PUSH_ALLFONT) == PUSH_ALLFONT)
34 return "PushAllFont";
35
36 std::vector<OUString> aStrings;
37
38 if (nFlags & vcl::PushFlags::LINECOLOR)
39 aStrings.emplace_back("PushLineColor");
40 if (nFlags & vcl::PushFlags::FILLCOLOR)
41 aStrings.emplace_back("PushFillColor");
42 if (nFlags & vcl::PushFlags::FONT)
43 aStrings.emplace_back("PushFont");
44 if (nFlags & vcl::PushFlags::TEXTCOLOR)
45 aStrings.emplace_back("PushTextColor");
46 if (nFlags & vcl::PushFlags::MAPMODE)
47 aStrings.emplace_back("PushMapMode");
48 if (nFlags & vcl::PushFlags::CLIPREGION)
49 aStrings.emplace_back("PushClipRegion");
50 if (nFlags & vcl::PushFlags::RASTEROP)
51 aStrings.emplace_back("PushRasterOp");
53 aStrings.emplace_back("PushTextFillColor");
54 if (nFlags & vcl::PushFlags::TEXTALIGN)
55 aStrings.emplace_back("PushTextAlign");
56 if (nFlags & vcl::PushFlags::REFPOINT)
57 aStrings.emplace_back("PushRefPoint");
59 aStrings.emplace_back("PushTextLineColor");
61 aStrings.emplace_back("PushTextLayoutMode");
63 aStrings.emplace_back("PushTextLanguage");
65 aStrings.emplace_back("PushOverlineColor");
66
67 OUString aString;
68
69 if (aStrings.empty())
70 return aString;
71
72 aString = aStrings[0];
73 for (size_t i = 1; i < aStrings.size(); ++i)
74 {
75 aString += ", " + aStrings[i];
76 }
77 return aString;
78}
79
80OUString convertDrawTextFlagsToString(DrawTextFlags eDrawTextFlags)
81{
82 std::vector<OUString> aStrings;
83 if (eDrawTextFlags & DrawTextFlags::Disable)
84 aStrings.emplace_back("Disable");
85 if (eDrawTextFlags & DrawTextFlags::Mnemonic)
86 aStrings.emplace_back("Mnemonic");
87 if (eDrawTextFlags & DrawTextFlags::Mono)
88 aStrings.emplace_back("Mono");
89 if (eDrawTextFlags & DrawTextFlags::Clip)
90 aStrings.emplace_back("Clip");
91 if (eDrawTextFlags & DrawTextFlags::Left)
92 aStrings.emplace_back("Left");
93 if (eDrawTextFlags & DrawTextFlags::Center)
94 aStrings.emplace_back("Center");
95 if (eDrawTextFlags & DrawTextFlags::Right)
96 aStrings.emplace_back("Right");
97 if (eDrawTextFlags & DrawTextFlags::Top)
98 aStrings.emplace_back("Top");
99 if (eDrawTextFlags & DrawTextFlags::VCenter)
100 aStrings.emplace_back("VCenter");
101 if (eDrawTextFlags & DrawTextFlags::Bottom)
102 aStrings.emplace_back("Bottom");
103 if (eDrawTextFlags & DrawTextFlags::EndEllipsis)
104 aStrings.emplace_back("EndEllipsis");
105 if (eDrawTextFlags & DrawTextFlags::PathEllipsis)
106 aStrings.emplace_back("PathEllipsis");
107 if (eDrawTextFlags & DrawTextFlags::MultiLine)
108 aStrings.emplace_back("MultiLine");
109 if (eDrawTextFlags & DrawTextFlags::WordBreak)
110 aStrings.emplace_back("WordBreak");
111 if (eDrawTextFlags & DrawTextFlags::NewsEllipsis)
112 aStrings.emplace_back("NewsEllipsis");
113 if (eDrawTextFlags & DrawTextFlags::WordBreakHyphenation)
114 aStrings.emplace_back("WordBreakHyphenation");
115 if (eDrawTextFlags & DrawTextFlags::CenterEllipsis)
116 aStrings.emplace_back("CenterEllipsis");
117 if (eDrawTextFlags & DrawTextFlags::HideMnemonic)
118 aStrings.emplace_back("HideMnemonic");
119
120 OUString aString;
121
122 if (aStrings.empty())
123 return "None";
124
125 aString = aStrings[0];
126 for (size_t i = 1; i < aStrings.size(); ++i)
127 {
128 aString += " " + aStrings[i];
129 }
130 return aString;
131};
132
133OUString convertRopToString(RasterOp eRop)
134{
135 switch (eRop)
136 {
137 case RasterOp::OverPaint: return "overpaint";
138 case RasterOp::Xor: return "xor";
139 case RasterOp::N0: return "0";
140 case RasterOp::N1: return "1";
141 case RasterOp::Invert: return "invert";
142 }
143 return OUString();
144}
145
146OUString convertTextAlignToString(TextAlign eAlign)
147{
148 switch (eAlign)
149 {
150 case ALIGN_BASELINE: return "baseline";
151 case ALIGN_BOTTOM: return "bottom";
152 case ALIGN_TOP: return "top";
153 case TextAlign_FORCE_EQUAL_SIZE: return "equalsize";
154 }
155 return OUString();
156}
157
158OUString convertColorToString(Color aColor)
159{
160 OUString aRGBString = aColor.AsRGBHexString();
161 return "#" + aRGBString;
162}
163
164OUString convertLineStyleToString(LineStyle eAlign)
165{
166 switch (eAlign)
167 {
168 case LineStyle::NONE: return "none";
169 case LineStyle::Solid: return "solid";
170 case LineStyle::Dash: return "dash";
171 default: break;
172 }
173 return OUString();
174}
175
176OUString convertLineJoinToString(basegfx::B2DLineJoin eJoin)
177{
178 switch (eJoin)
179 {
180 default:
181 case basegfx::B2DLineJoin::NONE: return "none";
182 case basegfx::B2DLineJoin::Bevel: return "bevel";
183 case basegfx::B2DLineJoin::Miter: return "miter";
184 case basegfx::B2DLineJoin::Round: return "round";
185 }
186}
187
188OUString convertLineCapToString(css::drawing::LineCap eCap)
189{
190 switch (eCap)
191 {
192 default:
193 case css::drawing::LineCap_BUTT: return "butt";
194 case css::drawing::LineCap_ROUND: return "round";
195 case css::drawing::LineCap_SQUARE: return "square";
196 }
197}
198
199OUString convertPolygonFlags(PolyFlags eFlags)
200{
201 switch (eFlags)
202 {
203 default:
204 case PolyFlags::Normal: return "normal";
205 case PolyFlags::Control: return "control";
206 case PolyFlags::Smooth: return "smooth";
207 case PolyFlags::Symmetric: return "symmetric";
208 }
209}
210
211OUString convertFontWeightToString(FontWeight eFontWeight)
212{
213 switch (eFontWeight)
214 {
215 case WEIGHT_DONTKNOW: return "unknown";
216 case WEIGHT_THIN: return "thin";
217 case WEIGHT_ULTRALIGHT: return "ultralight";
218 case WEIGHT_LIGHT: return "light";
219 case WEIGHT_SEMILIGHT: return "semilight";
220 case WEIGHT_NORMAL: return "normal";
221 case WEIGHT_MEDIUM: return "medium";
222 case WEIGHT_SEMIBOLD: return "semibold";
223 case WEIGHT_BOLD: return "bold";
224 case WEIGHT_ULTRABOLD: return "ultrabold";
225 case WEIGHT_BLACK: return "black";
226 case FontWeight_FORCE_EQUAL_SIZE: return "equalsize";
227 }
228 return OUString();
229}
230
231OUString convertFontStrikeoutToString(FontStrikeout eFontStrikeout)
232{
233 switch (eFontStrikeout)
234 {
235 case STRIKEOUT_NONE: return "none";
236 case STRIKEOUT_SINGLE: return "single";
237 case STRIKEOUT_DOUBLE: return "double";
238 case STRIKEOUT_DONTKNOW: return "dontknow";
239 case STRIKEOUT_BOLD: return "bold";
240 case STRIKEOUT_SLASH: return "slash";
241 case STRIKEOUT_X: return "x";
242 case FontStrikeout_FORCE_EQUAL_SIZE: return "equalsize";
243 }
244 return OUString();
245}
246
247OUString convertFontLineStyleToString(FontLineStyle eFontLineStyle)
248{
249 switch (eFontLineStyle)
250 {
251 case LINESTYLE_NONE: return "none";
252 case LINESTYLE_SINGLE: return "single";
253 case LINESTYLE_DOUBLE: return "double";
254 case LINESTYLE_DOTTED: return "dotted";
255 case LINESTYLE_DONTKNOW: return "dontknow";
256 case LINESTYLE_DASH: return "dash";
257 case LINESTYLE_LONGDASH: return "longdash";
258 case LINESTYLE_DASHDOT: return "dashdot";
259 case LINESTYLE_DASHDOTDOT: return "dashdotdot";
260 case LINESTYLE_SMALLWAVE: return "smallwave";
261 case LINESTYLE_WAVE: return "wave";
262 case LINESTYLE_DOUBLEWAVE: return "doublewave";
263 case LINESTYLE_BOLD: return "bold";
264 case LINESTYLE_BOLDDOTTED: return "bolddotted";
265 case LINESTYLE_BOLDDASH: return "bolddash";
266 case LINESTYLE_BOLDLONGDASH: return "boldlongdash";
267 case LINESTYLE_BOLDDASHDOT: return "bolddashdot";
268 case LINESTYLE_BOLDDASHDOTDOT: return "bolddashdotdot";
269 case LINESTYLE_BOLDWAVE: return "boldwave";
270 case FontLineStyle_FORCE_EQUAL_SIZE: return "equalsize";
271 }
272 return OUString();
273}
274
275OString convertLineStyleToString(const MetaActionType nActionType)
276{
277 switch (nActionType)
278 {
279 case MetaActionType::NONE: return "null";
280 case MetaActionType::PIXEL: return "pixel";
281 case MetaActionType::POINT: return "point";
282 case MetaActionType::LINE: return "line";
283 case MetaActionType::RECT: return "rect";
284 case MetaActionType::ROUNDRECT: return "roundrect";
285 case MetaActionType::ELLIPSE: return "ellipse";
286 case MetaActionType::ARC: return "arc";
287 case MetaActionType::PIE: return "pie";
288 case MetaActionType::CHORD: return "chord";
289 case MetaActionType::POLYLINE: return "polyline";
290 case MetaActionType::POLYGON: return "polygon";
291 case MetaActionType::POLYPOLYGON: return "polypolygon";
292 case MetaActionType::TEXT: return "text";
293 case MetaActionType::TEXTARRAY: return "textarray";
294 case MetaActionType::STRETCHTEXT: return "stretchtext";
295 case MetaActionType::TEXTRECT: return "textrect";
296 case MetaActionType::TEXTLINE: return "textline";
297 case MetaActionType::BMP: return "bmp";
298 case MetaActionType::BMPSCALE: return "bmpscale";
299 case MetaActionType::BMPSCALEPART: return "bmpscalepart";
300 case MetaActionType::BMPEX: return "bmpex";
301 case MetaActionType::BMPEXSCALE: return "bmpexscale";
302 case MetaActionType::BMPEXSCALEPART: return "bmpexscalepart";
303 case MetaActionType::MASK: return "mask";
304 case MetaActionType::MASKSCALE: return "maskscale";
305 case MetaActionType::MASKSCALEPART: return "maskscalepart";
306 case MetaActionType::GRADIENT: return "gradient";
307 case MetaActionType::GRADIENTEX: return "gradientex";
308 case MetaActionType::HATCH: return "hatch";
309 case MetaActionType::WALLPAPER: return "wallpaper";
310 case MetaActionType::CLIPREGION: return "clipregion";
311 case MetaActionType::ISECTRECTCLIPREGION: return "sectrectclipregion";
312 case MetaActionType::ISECTREGIONCLIPREGION: return "sectregionclipregion";
313 case MetaActionType::MOVECLIPREGION: return "moveclipregion";
314 case MetaActionType::LINECOLOR: return "linecolor";
315 case MetaActionType::FILLCOLOR: return "fillcolor";
316 case MetaActionType::TEXTCOLOR: return "textcolor";
317 case MetaActionType::TEXTFILLCOLOR: return "textfillcolor";
318 case MetaActionType::TEXTLINECOLOR: return "textlinecolor";
319 case MetaActionType::OVERLINECOLOR: return "overlinecolor";
320 case MetaActionType::TEXTALIGN: return "textalign";
321 case MetaActionType::MAPMODE: return "mapmode";
322 case MetaActionType::FONT: return "font";
323 case MetaActionType::PUSH: return "push";
324 case MetaActionType::POP: return "pop";
325 case MetaActionType::RASTEROP: return "rasterop";
326 case MetaActionType::Transparent: return "transparent";
327 case MetaActionType::FLOATTRANSPARENT: return "floattransparent";
328 case MetaActionType::EPS: return "eps";
329 case MetaActionType::REFPOINT: return "refpoint";
330 case MetaActionType::COMMENT: return "comment";
331 case MetaActionType::LAYOUTMODE: return "layoutmode";
332 case MetaActionType::TEXTLANGUAGE: return "textlanguage";
333 }
334 return "";
335}
336
337OUString convertBitmapExTransparentType(BitmapEx const & rBitmapEx)
338{
339 if (rBitmapEx.IsAlpha())
340 return "bitmap";
341 else
342 return "none";
343}
344
345OUString convertMapUnitToString(MapUnit eUnit)
346{
347 switch (eUnit)
348 {
349 default:
350 case MapUnit::LASTENUMDUMMY: return "LASTENUMDUMMY";
351 case MapUnit::Map1000thInch: return "Map1000thInch";
352 case MapUnit::Map100thInch: return "Map100thInch";
353 case MapUnit::Map100thMM: return "Map100thMM";
354 case MapUnit::Map10thInch: return "Map10thInch";
355 case MapUnit::Map10thMM: return "Map10thMM";
356 case MapUnit::MapAppFont: return "MapAppFont";
357 case MapUnit::MapCM: return "MapCM";
358 case MapUnit::MapInch: return "MapInch";
359 case MapUnit::MapMM: return "MapMM";
360 case MapUnit::MapPixel: return "MapPixel";
361 case MapUnit::MapPoint: return "MapPoint";
362 case MapUnit::MapRelative: return "MapRelative";
363 case MapUnit::MapSysFont: return "MapSysFont";
364 case MapUnit::MapTwip: return "MapTwip";
365 }
366}
367
368OUString convertFractionToString(const Fraction& aFraction)
369{
370 std::stringstream ss;
371
372 ss << aFraction;
373
374 return OUString::createFromAscii(ss.str());
375}
376
377OUString convertGradientStyleToOUString(css::awt::GradientStyle eStyle)
378{
379 switch (eStyle)
380 {
381 case css::awt::GradientStyle_LINEAR: return "Linear";
382 case css::awt::GradientStyle_AXIAL: return "Axial";
383 case css::awt::GradientStyle_RADIAL: return "Radial";
384 case css::awt::GradientStyle_ELLIPTICAL: return "Elliptical";
385 case css::awt::GradientStyle_SQUARE: return "Square";
386 case css::awt::GradientStyle_RECT: return "Rect";
387 case css::awt::GradientStyle::GradientStyle_MAKE_FIXED_SIZE: return "ForceEqualSize";
388 }
389 return OUString();
390}
391
392OUString convertHatchStyle(HatchStyle eStyle)
393{
394 switch (eStyle)
395 {
396 case HatchStyle::Single: return "Single";
397 case HatchStyle::Double: return "Double";
398 case HatchStyle::Triple: return "Triple";
399 case HatchStyle::FORCE_EQUAL_SIZE: return "ForceEqualSize";
400 }
401 return OUString();
402}
403
404OUString convertLanguageTypeToString(LanguageType rLanguageType)
405{
406 std::stringstream ss;
407 ss << std::hex << std::setfill ('0') << std::setw(4) << rLanguageType.get();
408 return "#" + OUString::createFromAscii(ss.str());
409}
410
411OUString convertWallpaperStyleToString(WallpaperStyle eWallpaperStyle)
412{
413 switch (eWallpaperStyle)
414 {
415 case WallpaperStyle::NONE: return "NONE";
416 case WallpaperStyle::Tile: return "Tile";
417 case WallpaperStyle::Center: return "Center";
418 case WallpaperStyle::Scale: return "Scale";
419 case WallpaperStyle::TopLeft: return "TopLeft";
420 case WallpaperStyle::Top: return "Top";
421 case WallpaperStyle::TopRight: return "TopRight";
422 case WallpaperStyle::Left: return "Left";
423 case WallpaperStyle::Right: return "Right";
424 case WallpaperStyle::BottomLeft: return "BottomLeft";
425 case WallpaperStyle::Bottom: return "Bottom";
426 case WallpaperStyle::BottomRight: return "BottomRight";
427 case WallpaperStyle::ApplicationGradient: return "ApplicationGradient";
428 }
429 return OUString();
430}
431
432OUString convertPixelFormatToString(vcl::PixelFormat ePixelFormat)
433{
434 switch (ePixelFormat)
435 {
436 case vcl::PixelFormat::INVALID: return "INVALID";
437 case vcl::PixelFormat::N8_BPP: return "8BPP";
438 case vcl::PixelFormat::N24_BPP: return "24BPP";
439 case vcl::PixelFormat::N32_BPP: return "32BPP";
440 }
441 return OUString();
442}
443
444OUString convertComplexTestLayoutFlags(vcl::text::ComplexTextLayoutFlags eComplexTestLayoutFlags)
445{
446 switch(eComplexTestLayoutFlags)
447 {
448 default:
454 }
455}
456
457OUString convertGfxLinkTypeToString(GfxLinkType eGfxLinkType)
458{
459 switch(eGfxLinkType)
460 {
461 case GfxLinkType::EpsBuffer: return "EpsBuffer";
462 case GfxLinkType::NativeBmp: return "NativeBmp";
463 case GfxLinkType::NativeGif: return "NativeGif";
464 case GfxLinkType::NativeJpg: return "NativeJpg";
465 case GfxLinkType::NativeMet: return "NativeMet";
466 case GfxLinkType::NativeMov: return "NativeMov";
467 case GfxLinkType::NativePct: return "NativePct";
468 case GfxLinkType::NativePdf: return "NativePdf";
469 case GfxLinkType::NativePng: return "NativePng";
470 case GfxLinkType::NativeSvg: return "NativeSvg";
471 case GfxLinkType::NativeTif: return "NativeTif";
472 case GfxLinkType::NativeWmf: return "NativeWmf";
473 case GfxLinkType::NativeWebp: return "NativeWebp";
474 case GfxLinkType::NONE: return "None";
475 }
476 return OUString();
477}
478
479OUString hex32(sal_uInt32 nNumber)
480{
481 std::stringstream ss;
482 ss << std::hex << std::setfill('0') << std::setw(8) << nNumber;
483 return OUString::createFromAscii(ss.str());
484}
485
486OUString toHexString(const sal_uInt8* nData, sal_uInt32 nDataSize){
487
488 std::stringstream aStrm;
489 for (sal_uInt32 i = 0; i < nDataSize; i++)
490 {
491 aStrm << std::setw(2) << std::setfill('0') << std::hex << static_cast<int>(nData[i]);
492 }
493
494 return OUString::createFromAscii(aStrm.str());
495}
496
497void writePoint(tools::XmlWriter& rWriter, Point const& rPoint)
498{
499 rWriter.attribute("x", rPoint.X());
500 rWriter.attribute("y", rPoint.Y());
501}
502
503void writeStartPoint(tools::XmlWriter& rWriter, Point const& rPoint)
504{
505 rWriter.attribute("startx", rPoint.X());
506 rWriter.attribute("starty", rPoint.Y());
507}
508
509void writeEndPoint(tools::XmlWriter& rWriter, Point const& rPoint)
510{
511 rWriter.attribute("endx", rPoint.X());
512 rWriter.attribute("endy", rPoint.Y());
513}
514
515void writeSize(tools::XmlWriter& rWriter, Size const& rSize)
516{
517 rWriter.attribute("width", rSize.Width());
518 rWriter.attribute("height", rSize.Height());
519}
520
521void writeRectangle(tools::XmlWriter& rWriter, tools::Rectangle const& rRectangle)
522{
523 rWriter.attribute("left", rRectangle.Left());
524 rWriter.attribute("top", rRectangle.Top());
525 if (rRectangle.IsWidthEmpty())
526 rWriter.attribute("right", OString("empty"));
527 else
528 rWriter.attribute("right", rRectangle.Right());
529 if (rRectangle.IsHeightEmpty())
530 rWriter.attribute("bottom", OString("empty"));
531 else
532 rWriter.attribute("bottom", rRectangle.Bottom());
533}
534
535void writeMapMode(tools::XmlWriter& rWriter, MapMode const& rMapMode)
536{
537 rWriter.attribute("mapunit", convertMapUnitToString( rMapMode.GetMapUnit() ));
538 writePoint(rWriter, rMapMode.GetOrigin());
539 rWriter.attribute("scalex", convertFractionToString(rMapMode.GetScaleX()));
540 rWriter.attribute("scaley", convertFractionToString(rMapMode.GetScaleY()));
541}
542
543void writeLineInfo(tools::XmlWriter& rWriter, LineInfo const& rLineInfo)
544{
545 rWriter.attribute("style", convertLineStyleToString(rLineInfo.GetStyle()));
546 rWriter.attribute("width", rLineInfo.GetWidth());
547 rWriter.attribute("dashlen", rLineInfo.GetDashLen());
548 rWriter.attribute("dashcount", rLineInfo.GetDashCount());
549 rWriter.attribute("dotlen", rLineInfo.GetDotLen());
550 rWriter.attribute("dotcount", rLineInfo.GetDotCount());
551 rWriter.attribute("distance", rLineInfo.GetDistance());
552 rWriter.attribute("join", convertLineJoinToString(rLineInfo.GetLineJoin()));
553 rWriter.attribute("cap", convertLineCapToString(rLineInfo.GetLineCap()));
554}
555
556void writeGradient(tools::XmlWriter& rWriter, Gradient const& rGradient)
557{
558 rWriter.attribute("style", convertGradientStyleToOUString(rGradient.GetStyle()));
559 rWriter.attribute("startcolor", convertColorToString(rGradient.GetStartColor()));
560 rWriter.attribute("endcolor", convertColorToString(rGradient.GetEndColor()));
561 rWriter.attribute("angle", rGradient.GetAngle().get());
562 rWriter.attribute("border", rGradient.GetBorder());
563 rWriter.attribute("offsetx", rGradient.GetOfsX());
564 rWriter.attribute("offsety", rGradient.GetOfsY());
565 rWriter.attribute("startintensity", rGradient.GetStartIntensity());
566 rWriter.attribute("endintensity", rGradient.GetEndIntensity());
567 rWriter.attribute("steps", rGradient.GetSteps());
568}
569
570OString toHexString(const std::vector<unsigned char>& a)
571{
572 std::stringstream aStrm;
573 for (auto& i : a)
574 {
575 aStrm << std::setw(2) << std::setfill('0') << std::hex << static_cast<int>(i);
576 }
577
578 return OString(aStrm.str());
579}
580
581void writeBitmapContentChecksum(tools::XmlWriter& rWriter, Bitmap const& rBitmap)
582{
583 Bitmap aBitmap(rBitmap);
584
586 Bitmap::ScopedReadAccess pReadAccess(aBitmap);
587 assert(pReadAccess);
588
589 for (tools::Long y = 0 ; y < pReadAccess->Height() ; ++y)
590 {
591 for (tools::Long x = 0 ; x < pReadAccess->Width() ; ++x)
592 {
593 BitmapColor aColor = pReadAccess->GetColor(y, x);
594 sal_uInt8 r = aColor.GetRed();
595 sal_uInt8 g = aColor.GetGreen();
596 sal_uInt8 b = aColor.GetBlue();
597 sal_uInt8 a = aColor.GetAlpha();
598 aHashEngine.update(&r, 1);
599 aHashEngine.update(&g, 1);
600 aHashEngine.update(&b, 1);
601 aHashEngine.update(&a, 1);
602 }
603 }
604 std::vector<unsigned char> aVector = aHashEngine.finalize();
605 rWriter.attribute("contentchecksum", toHexString(aVector));
606}
607
608void writeBitmap(tools::XmlWriter& rWriter, Bitmap const& rBitmap)
609{
610 writeBitmapContentChecksum(rWriter, rBitmap);
611 rWriter.attribute("bitmapwidth", rBitmap.GetSizePixel().Width());
612 rWriter.attribute("bitmapheight", rBitmap.GetSizePixel().Height());
613 rWriter.attribute("pixelformat", convertPixelFormatToString(rBitmap.getPixelFormat()));
614 rWriter.attribute("crc", hex32(rBitmap.GetChecksum()));
615}
616
617} // anonymous namespace
618
620{
621 maFilter.fill(false);
622}
623
624void MetafileXmlDump::filterActionType(const MetaActionType nActionType, bool bShouldFilter)
625{
626 maFilter[nActionType] = bShouldFilter;
627}
628
630{
631 maFilter.fill(true);
632}
633
634void MetafileXmlDump::dump(const GDIMetaFile& rMetaFile, SvStream& rStream)
635{
636 tools::XmlWriter aWriter(&rStream);
637 aWriter.startDocument();
638 aWriter.startElement("metafile");
639
640 writeXml(rMetaFile, aWriter);
641
642 aWriter.endElement();
643 aWriter.endDocument();
644}
645
647{
648 MapMode aMtfMapMode = rMetaFile.GetPrefMapMode();
649 rWriter.attribute("mapunit", convertMapUnitToString(aMtfMapMode.GetMapUnit()));
650 writePoint(rWriter, aMtfMapMode.GetOrigin());
651 rWriter.attribute("scalex", convertFractionToString(aMtfMapMode.GetScaleX()));
652 rWriter.attribute("scaley", convertFractionToString(aMtfMapMode.GetScaleY()));
653
654 Size aMtfSize = rMetaFile.GetPrefSize();
655 writeSize(rWriter, aMtfSize);
656
657 for(size_t nAction = 0; nAction < rMetaFile.GetActionSize(); ++nAction)
658 {
659 MetaAction* pAction = rMetaFile.GetAction(nAction);
660 const MetaActionType nActionType = pAction->GetType();
661 if (maFilter[nActionType])
662 continue;
663
664 OString sCurrentElementTag = convertLineStyleToString(nActionType);
665
666 switch (nActionType)
667 {
669 {
670 rWriter.startElement(sCurrentElementTag);
671 rWriter.endElement();
672 }
673 break;
674
676 {
677 auto* pMetaAction = static_cast<MetaPixelAction*>(pAction);
678 rWriter.startElement(sCurrentElementTag);
679 writePoint(rWriter, pMetaAction->GetPoint());
680 rWriter.attribute("color", convertColorToString(pMetaAction->GetColor()));
681 rWriter.endElement();
682 }
683 break;
684
686 {
687 auto* pMetaAction = static_cast<MetaPointAction*>(pAction);
688 rWriter.startElement(sCurrentElementTag);
689 writePoint(rWriter, pMetaAction->GetPoint());
690 rWriter.endElement();
691 }
692 break;
693
695 {
696 MetaLineAction* pMetaLineAction = static_cast<MetaLineAction*>(pAction);
697 rWriter.startElement(sCurrentElementTag);
698 writeStartPoint(rWriter, pMetaLineAction->GetStartPoint());
699 writeEndPoint(rWriter, pMetaLineAction->GetEndPoint());
700
701 writeLineInfo(rWriter, pMetaLineAction->GetLineInfo());
702 rWriter.endElement();
703 }
704 break;
705
707 {
708 MetaRectAction* pMetaAction = static_cast<MetaRectAction*>(pAction);
709 rWriter.startElement(sCurrentElementTag);
710 writeRectangle(rWriter, pMetaAction->GetRect());
711 rWriter.endElement();
712 }
713 break;
714
716 {
717 auto pMetaAction = static_cast<MetaRoundRectAction*>(pAction);
718 rWriter.startElement(sCurrentElementTag);
719 writeRectangle(rWriter, pMetaAction->GetRect());
720 rWriter.attribute("horizontalround", pMetaAction->GetHorzRound());
721 rWriter.attribute("verticalround", pMetaAction->GetVertRound());
722 rWriter.endElement();
723 }
724 break;
725
727 {
728 auto pMetaAction = static_cast<MetaEllipseAction*>(pAction);
729 rWriter.startElement(sCurrentElementTag);
730 writeRectangle(rWriter, pMetaAction->GetRect());
731 rWriter.endElement();
732 }
733 break;
734
736 {
737 auto pMetaAction = static_cast<MetaArcAction*>(pAction);
738 rWriter.startElement(sCurrentElementTag);
739 writeRectangle(rWriter, pMetaAction->GetRect());
740 writeStartPoint(rWriter, pMetaAction->GetStartPoint());
741 writeEndPoint(rWriter, pMetaAction->GetEndPoint());
742 rWriter.endElement();
743 }
744 break;
745
747 {
748 auto pMetaAction = static_cast<MetaPieAction*>(pAction);
749 rWriter.startElement(sCurrentElementTag);
750 writeRectangle(rWriter, pMetaAction->GetRect());
751 writeStartPoint(rWriter, pMetaAction->GetStartPoint());
752 writeEndPoint(rWriter, pMetaAction->GetEndPoint());
753 rWriter.endElement();
754 }
755 break;
756
758 {
759 auto pMetaAction = static_cast<MetaChordAction*>(pAction);
760 rWriter.startElement(sCurrentElementTag);
761 writeRectangle(rWriter, pMetaAction->GetRect());
762 writeStartPoint(rWriter, pMetaAction->GetStartPoint());
763 writeEndPoint(rWriter, pMetaAction->GetEndPoint());
764 rWriter.endElement();
765 }
766 break;
767
769 {
770 MetaPolyLineAction* pMetaPolyLineAction = static_cast<MetaPolyLineAction*>(pAction);
771 rWriter.startElement(sCurrentElementTag);
772
773 writeLineInfo(rWriter, pMetaPolyLineAction->GetLineInfo());
774
775 tools::Polygon aPolygon = pMetaPolyLineAction->GetPolygon();
776 bool bFlags = aPolygon.HasFlags();
777 for (sal_uInt16 i = 0; i < aPolygon.GetSize(); i++)
778 {
779 rWriter.startElement("point");
780 writePoint(rWriter, aPolygon[i]);
781 if (bFlags)
782 rWriter.attribute("flags", convertPolygonFlags(aPolygon.GetFlags(i)));
783 rWriter.endElement();
784 }
785
786 rWriter.endElement();
787 }
788 break;
789
791 {
792 MetaPolygonAction* pMetaPolygonAction = static_cast<MetaPolygonAction*>(pAction);
793 rWriter.startElement(sCurrentElementTag);
794
795 tools::Polygon aPolygon = pMetaPolygonAction->GetPolygon();
796 bool bFlags = aPolygon.HasFlags();
797 for (sal_uInt16 i = 0; i < aPolygon.GetSize(); i++)
798 {
799 rWriter.startElement("point");
800 writePoint(rWriter, aPolygon[i]);
801 if (bFlags)
802 rWriter.attribute("flags", convertPolygonFlags(aPolygon.GetFlags(i)));
803 rWriter.endElement();
804 }
805
806 rWriter.endElement();
807 }
808 break;
809
811 {
812 MetaPolyPolygonAction *const pMetaPolyPolygonAction = static_cast<MetaPolyPolygonAction*>(pAction);
813 rWriter.startElement(sCurrentElementTag);
814
815 tools::PolyPolygon const& rPolyPolygon(pMetaPolyPolygonAction->GetPolyPolygon());
816
817 for (sal_uInt16 j = 0; j < rPolyPolygon.Count(); ++j)
818 {
819 rWriter.startElement("polygon");
820 tools::Polygon const& rPolygon = rPolyPolygon[j];
821 bool bFlags = rPolygon.HasFlags();
822 for (sal_uInt16 i = 0; i < rPolygon.GetSize(); ++i)
823 {
824 rWriter.startElement("point");
825 writePoint(rWriter, rPolygon[i]);
826 if (bFlags)
827 rWriter.attribute("flags", convertPolygonFlags(rPolygon.GetFlags(i)));
828 rWriter.endElement();
829 }
830 rWriter.endElement();
831 }
832 rWriter.endElement();
833 }
834 break;
835
837 {
838 auto* pMeta = static_cast<MetaTextAction*>(pAction);
839 rWriter.startElement(sCurrentElementTag);
840 writePoint(rWriter, pMeta->GetPoint());
841 rWriter.attribute("index", pMeta->GetIndex());
842 rWriter.attribute("length", pMeta->GetLen());
843 rWriter.startElement("textcontent");
844 rWriter.content(pMeta->GetText());
845 rWriter.endElement();
846
847 rWriter.endElement();
848 }
849 break;
850
852 {
853 MetaTextArrayAction* pMetaTextArrayAction = static_cast<MetaTextArrayAction*>(pAction);
854 rWriter.startElement(sCurrentElementTag);
855
856 sal_Int32 aIndex = pMetaTextArrayAction->GetIndex();
857 sal_Int32 aLength = pMetaTextArrayAction->GetLen();
858
859 writePoint(rWriter, pMetaTextArrayAction->GetPoint());
860 rWriter.attribute("index", aIndex);
861 rWriter.attribute("length", aLength);
862
863 if (!pMetaTextArrayAction->GetDXArray().empty())
864 {
865 auto & rArray = pMetaTextArrayAction->GetDXArray();
866 rWriter.startElement("dxarray");
867 if (aIndex < o3tl::narrowing<sal_Int32>(rArray.size()))
868 rWriter.attribute("first", rArray[aIndex]);
869 if (aIndex + aLength - 1 < o3tl::narrowing<sal_Int32>(rArray.size()))
870 rWriter.attribute("last", rArray[aIndex + aLength - 1]);
871 OUStringBuffer sDxLengthString(std::max((aLength - aIndex) * 4, sal_Int32(0)));
872 for (sal_Int32 i = 0; i < aLength - aIndex; ++i)
873 {
874 sDxLengthString.append(OUString::number(rArray[aIndex + i]) + " ");
875 }
876 rWriter.content(sDxLengthString);
877 rWriter.endElement();
878 }
879
880 rWriter.startElement("text");
881
882 const OUString& rStr = pMetaTextArrayAction->GetText();
883 // fix bad XML dump by removing forbidden 0x01
884 // FIXME: expand footnote anchor point 0x01 instead of this
885 if ( rStr.indexOf(0x01) > -1 )
886 rWriter.content(rStr.replaceAll("\001", ""));
887 else
888 rWriter.content(rStr);
889
890 rWriter.endElement();
891
892 rWriter.endElement();
893 }
894 break;
895
897 {
898 auto* pMeta = static_cast<MetaStretchTextAction*>(pAction);
899 rWriter.startElement(sCurrentElementTag);
900
901 writePoint(rWriter, pMeta->GetPoint());
902 rWriter.attribute("index", pMeta->GetIndex());
903 rWriter.attribute("length", pMeta->GetLen());
904 rWriter.attribute("width", pMeta->GetWidth());
905
906 rWriter.startElement("textcontent");
907 rWriter.content(pMeta->GetText());
908 rWriter.endElement();
909
910 rWriter.endElement();
911 }
912 break;
913
915 {
916 auto* pMeta = static_cast<MetaTextRectAction*>(pAction);
917 rWriter.startElement(sCurrentElementTag);
918 writeRectangle(rWriter, pMeta->GetRect());
919 rWriter.startElement("textcontent");
920 rWriter.content(pMeta->GetText());
921 rWriter.endElement();
922
923 rWriter.startElement("style");
924 rWriter.content(convertDrawTextFlagsToString(pMeta->GetStyle()));
925 rWriter.endElement();
926
927 rWriter.endElement();
928 }
929 break;
930
932 {
933 auto pMeta = static_cast<MetaBmpAction*>(pAction);
934 Bitmap aBitmap = pMeta->GetBitmap();
935 rWriter.startElement(sCurrentElementTag);
936 writePoint(rWriter, pMeta->GetPoint());
937 writeBitmap(rWriter, aBitmap);
938 rWriter.endElement();
939 }
940 break;
941
943 {
944 auto pMeta = static_cast<MetaBmpScaleAction*>(pAction);
945 Bitmap aBitmap = pMeta->GetBitmap();
946 rWriter.startElement(sCurrentElementTag);
947 writePoint(rWriter, pMeta->GetPoint());
948 writeSize(rWriter, pMeta->GetSize());
949 writeBitmap(rWriter, aBitmap);
950 rWriter.endElement();
951 }
952 break;
953
955 {
956 auto pMeta = static_cast<MetaBmpScalePartAction*>(pAction);
957 Bitmap aBitmap = pMeta->GetBitmap();
958 rWriter.startElement(sCurrentElementTag);
959 rWriter.attribute("destx", pMeta->GetDestPoint().X());
960 rWriter.attribute("desty", pMeta->GetDestPoint().Y());
961 rWriter.attribute("destwidth", pMeta->GetDestSize().Width());
962 rWriter.attribute("destheight", pMeta->GetDestSize().Height());
963 rWriter.attribute("srcx", pMeta->GetSrcPoint().X());
964 rWriter.attribute("srcy", pMeta->GetSrcPoint().Y());
965 rWriter.attribute("srcwidth", pMeta->GetSrcSize().Width());
966 rWriter.attribute("srcheight", pMeta->GetSrcSize().Height());
967 writeBitmap(rWriter, aBitmap);
968 rWriter.endElement();
969 }
970 break;
971
973 {
974 auto pMeta = static_cast<MetaBmpExAction*>(pAction);
975 rWriter.startElement(sCurrentElementTag);
976 writePoint(rWriter, pMeta->GetPoint());
977 Bitmap aBitmap = pMeta->GetBitmapEx().GetBitmap();
978 rWriter.attribute("transparenttype", convertBitmapExTransparentType(pMeta->GetBitmapEx()));
979 writeBitmap(rWriter, aBitmap);
980 rWriter.endElement();
981 }
982 break;
983
985 {
986 auto pMeta = static_cast<MetaBmpExScaleAction*>(pAction);
987 rWriter.startElement(sCurrentElementTag);
988 writePoint(rWriter, pMeta->GetPoint());
989 writeSize(rWriter, pMeta->GetSize());
990 Bitmap aBitmap = pMeta->GetBitmapEx().GetBitmap();
991 rWriter.attribute("transparenttype", convertBitmapExTransparentType(pMeta->GetBitmapEx()));
992 writeBitmap(rWriter, aBitmap);
993 rWriter.endElement();
994 }
995 break;
996
998 {
999 auto pMeta = static_cast<MetaBmpExScalePartAction*>(pAction);
1000 Bitmap aBitmap = pMeta->GetBitmapEx().GetBitmap();
1001 rWriter.startElement(sCurrentElementTag);
1002 rWriter.attribute("destx", pMeta->GetDestPoint().X());
1003 rWriter.attribute("desty", pMeta->GetDestPoint().Y());
1004 rWriter.attribute("destwidth", pMeta->GetDestSize().Width());
1005 rWriter.attribute("destheight", pMeta->GetDestSize().Height());
1006 rWriter.attribute("srcx", pMeta->GetSrcPoint().X());
1007 rWriter.attribute("srcy", pMeta->GetSrcPoint().Y());
1008 rWriter.attribute("srcwidth", pMeta->GetSrcSize().Width());
1009 rWriter.attribute("srcheight", pMeta->GetSrcSize().Height());
1010 rWriter.attribute("transparenttype", convertBitmapExTransparentType(pMeta->GetBitmapEx()));
1011 writeBitmap(rWriter, aBitmap);
1012 rWriter.endElement();
1013 }
1014 break;
1015
1017 {
1018 auto pMeta = static_cast<MetaMaskAction*>(pAction);
1019 rWriter.startElement(sCurrentElementTag);
1020 writePoint(rWriter, pMeta->GetPoint());
1021 rWriter.attribute("crc", hex32(pMeta->GetBitmap().GetChecksum()));
1022 rWriter.attribute("color", convertColorToString(pMeta->GetColor()));
1023 rWriter.endElement();
1024 }
1025 break;
1026
1028 {
1029 auto pMeta = static_cast<MetaMaskScaleAction*>(pAction);
1030 rWriter.startElement(sCurrentElementTag);
1031 writePoint(rWriter, pMeta->GetPoint());
1032 writeSize(rWriter, pMeta->GetSize());
1033 rWriter.attribute("crc", hex32(pMeta->GetBitmap().GetChecksum()));
1034 rWriter.attribute("color", convertColorToString(pMeta->GetColor()));
1035 rWriter.endElement();
1036 }
1037 break;
1038
1040 {
1041 auto pMeta = static_cast<MetaMaskScalePartAction*>(pAction);
1042 rWriter.startElement(sCurrentElementTag);
1043 rWriter.attribute("destx", pMeta->GetDestPoint().X());
1044 rWriter.attribute("desty", pMeta->GetDestPoint().Y());
1045 rWriter.attribute("destwidth", pMeta->GetDestSize().Width());
1046 rWriter.attribute("destheight", pMeta->GetDestSize().Height());
1047 rWriter.attribute("srcx", pMeta->GetSrcPoint().X());
1048 rWriter.attribute("srcy", pMeta->GetSrcPoint().Y());
1049 rWriter.attribute("srcwidth", pMeta->GetSrcSize().Width());
1050 rWriter.attribute("srcheight", pMeta->GetSrcSize().Height());
1051 rWriter.attribute("crc", hex32(pMeta->GetBitmap().GetChecksum()));
1052 rWriter.attribute("color", convertColorToString(pMeta->GetColor()));
1053 rWriter.endElement();
1054 }
1055 break;
1056
1058 {
1059 const MetaGradientAction* pMeta = static_cast<MetaGradientAction*>(pAction);
1060
1061 rWriter.startElement(sCurrentElementTag);
1062 writeGradient(rWriter, pMeta->GetGradient());
1063
1064 rWriter.startElement("rectangle");
1065 writeRectangle(rWriter, pMeta->GetRect());
1066 rWriter.endElement();
1067
1068 rWriter.endElement();
1069 }
1070 break;
1071
1073 {
1074 auto* const pMetaHatchAction = static_cast<MetaHatchAction*>(pAction);
1075 rWriter.startElement(sCurrentElementTag);
1076
1077 tools::PolyPolygon const& rPolyPolygon(pMetaHatchAction->GetPolyPolygon());
1078
1079 for (sal_uInt16 j = 0; j < rPolyPolygon.Count(); ++j)
1080 {
1081 rWriter.startElement("polygon");
1082 tools::Polygon const& rPolygon = rPolyPolygon[j];
1083 bool bFlags = rPolygon.HasFlags();
1084 for (sal_uInt16 i = 0; i < rPolygon.GetSize(); ++i)
1085 {
1086 rWriter.startElement("point");
1087 writePoint(rWriter, rPolygon[i]);
1088 if (bFlags)
1089 rWriter.attribute("flags", convertPolygonFlags(rPolygon.GetFlags(i)));
1090 rWriter.endElement();
1091 }
1092 rWriter.endElement();
1093 }
1094
1095 rWriter.startElement("hatch");
1096 const auto& rHatch = pMetaHatchAction->GetHatch();
1097 rWriter.attribute("style", convertHatchStyle(rHatch.GetStyle()));
1098 rWriter.attribute("color", convertColorToString(rHatch.GetColor()));
1099 rWriter.attribute("distance", sal_Int32(rHatch.GetDistance()));
1100 rWriter.attribute("angle", sal_Int32(rHatch.GetAngle().get()));
1101 rWriter.endElement();
1102
1103 rWriter.endElement();
1104 }
1105 break;
1106
1108 {
1109 const auto* pMetaAction = static_cast<const MetaWallpaperAction*>(pAction);
1110 rWriter.startElement(sCurrentElementTag);
1111
1112 writeRectangle(rWriter, pMetaAction->GetRect());
1113
1114 rWriter.startElement("wallpaper");
1115 const auto& rWallpaper = pMetaAction->GetWallpaper();
1116
1117 rWriter.attribute("color", convertColorToString(rWallpaper.GetColor()));
1118
1119 WallpaperStyle eStyle = rWallpaper.GetStyle();
1120 rWriter.attribute("style", convertWallpaperStyleToString(eStyle));
1121
1122 if (rWallpaper.IsBitmap())
1123 {
1124 rWriter.startElement("bitmap");
1125 BitmapEx const & rBitmapEx = rWallpaper.GetBitmap();
1126 rWriter.attribute("crc", hex32(rBitmapEx.GetChecksum()));
1127 rWriter.attribute("transparenttype", convertBitmapExTransparentType(rBitmapEx));
1128 rWriter.attribute("pixelformat", convertPixelFormatToString(rBitmapEx.GetBitmap().getPixelFormat()));
1129 rWriter.attribute("width", hex32(rBitmapEx.GetSizePixel().Width()));
1130 rWriter.attribute("height", hex32(rBitmapEx.GetSizePixel().Height()));
1131 rWriter.endElement();
1132 }
1133
1134 if (rWallpaper.IsGradient())
1135 {
1136 rWriter.startElement("gradient");
1137 Gradient aGradient = rWallpaper.GetGradient();
1138 writeGradient(rWriter, aGradient);
1139 rWriter.endElement();
1140 }
1141
1142 if (rWallpaper.IsRect())
1143 {
1144 tools::Rectangle aRect = rWallpaper.GetRect();
1145 rWriter.startElement("rectangle");
1146 writeRectangle(rWriter, aRect);
1147 rWriter.endElement();
1148 }
1149
1150 rWriter.attribute("fixed", rWallpaper.IsFixed() ? "true" : "false");
1151 rWriter.attribute("scrollable", rWallpaper.IsScrollable() ? "true" : "false");
1152
1153 rWriter.endElement();
1154
1155 rWriter.endElement();
1156 }
1157 break;
1158
1160 {
1161 const auto* pMetaClipRegionAction = static_cast<const MetaClipRegionAction*>(pAction);
1162 rWriter.startElement(sCurrentElementTag);
1163
1164 tools::Rectangle aRectangle = pMetaClipRegionAction->GetRegion().GetBoundRect();
1165 writeRectangle(rWriter, aRectangle);
1166
1167 vcl::Region aRegion = pMetaClipRegionAction->GetRegion();
1168
1169 if (aRegion.HasPolyPolygonOrB2DPolyPolygon())
1170 {
1171 tools::PolyPolygon aPolyPolygon = aRegion.GetAsPolyPolygon();
1172
1173 for (sal_uInt16 j = 0; j < aPolyPolygon.Count(); ++j)
1174 {
1175 rWriter.startElement("polygon");
1176 tools::Polygon const& rPolygon = aPolyPolygon[j];
1177 bool bFlags = rPolygon.HasFlags();
1178 for (sal_uInt16 i = 0; i < rPolygon.GetSize(); ++i)
1179 {
1180 rWriter.startElement("point");
1181 writePoint(rWriter, rPolygon[i]);
1182 if (bFlags)
1183 rWriter.attribute("flags", convertPolygonFlags(rPolygon.GetFlags(i)));
1184 rWriter.endElement();
1185 }
1186 rWriter.endElement();
1187 }
1188 }
1189
1190 rWriter.endElement();
1191 }
1192 break;
1193
1195 {
1196 MetaISectRectClipRegionAction* pMetaISectRectClipRegionAction = static_cast<MetaISectRectClipRegionAction*>(pAction);
1197 rWriter.startElement(sCurrentElementTag);
1198
1199 tools::Rectangle aRectangle = pMetaISectRectClipRegionAction->GetRect();
1200 writeRectangle(rWriter, aRectangle);
1201 rWriter.endElement();
1202 }
1203 break;
1204
1206 {
1207 MetaISectRegionClipRegionAction* pMetaISectRegionClipRegionAction = static_cast<MetaISectRegionClipRegionAction*>(pAction);
1208 rWriter.startElement(sCurrentElementTag);
1209
1210 // FIXME for now we dump only the bounding box; this is
1211 // enough for the tests we have, but may need extending to
1212 // dumping the real polypolygon in the future
1213 tools::Rectangle aRectangle = pMetaISectRegionClipRegionAction->GetRegion().GetBoundRect();
1214 writeRectangle(rWriter, aRectangle);
1215 rWriter.endElement();
1216 }
1217 break;
1218
1220 {
1221 const auto* pMetaMoveClipRegionAction = static_cast<MetaMoveClipRegionAction*>(pAction);
1222 rWriter.startElement(sCurrentElementTag);
1223
1224 rWriter.attribute("horzmove", pMetaMoveClipRegionAction->GetHorzMove());
1225 rWriter.attribute("vertmove", pMetaMoveClipRegionAction->GetVertMove());
1226 rWriter.endElement();
1227 }
1228 break;
1229
1231 {
1232 MetaLineColorAction* pMetaLineColorAction = static_cast<MetaLineColorAction*>(pAction);
1233 rWriter.startElement(sCurrentElementTag);
1234
1235 rWriter.attribute("color", convertColorToString(pMetaLineColorAction->GetColor()));
1236 rWriter.endElement();
1237 }
1238 break;
1239
1241 {
1242 MetaFillColorAction* pMetaFillColorAction = static_cast<MetaFillColorAction*>(pAction);
1243 rWriter.startElement(sCurrentElementTag);
1244
1245 rWriter.attribute("color", convertColorToString(pMetaFillColorAction->GetColor()));
1246 rWriter.endElement();
1247 }
1248 break;
1249
1251 {
1252 MetaTextColorAction* pMetaTextColorAction = static_cast<MetaTextColorAction*>(pAction);
1253 rWriter.startElement(sCurrentElementTag);
1254
1255 rWriter.attribute("color", convertColorToString(pMetaTextColorAction->GetColor()));
1256 rWriter.endElement();
1257 }
1258 break;
1259
1261 {
1262 MetaTextFillColorAction* pMetaTextFillColorAction = static_cast<MetaTextFillColorAction*>(pAction);
1263 rWriter.startElement(sCurrentElementTag);
1264
1265 rWriter.attribute("color", convertColorToString(pMetaTextFillColorAction->GetColor()));
1266
1267 if (pMetaTextFillColorAction->IsSetting())
1268 rWriter.attribute("setting", u"true");
1269
1270 rWriter.endElement();
1271 }
1272 break;
1273
1275 {
1276 MetaTextAlignAction* pMetaTextAlignAction = static_cast<MetaTextAlignAction*>(pAction);
1277 rWriter.startElement(sCurrentElementTag);
1278 OUString sAlign = convertTextAlignToString(pMetaTextAlignAction->GetTextAlign());
1279 if (!sAlign.isEmpty())
1280 rWriter.attribute("align", sAlign);
1281 rWriter.endElement();
1282 }
1283 break;
1284
1286 {
1287 const MetaMapModeAction* pMeta = static_cast<MetaMapModeAction*>(pAction);
1288 MapMode aMapMode = pMeta->GetMapMode();
1289 rWriter.startElement(sCurrentElementTag);
1290 rWriter.attribute("mapunit", convertMapUnitToString( aMapMode.GetMapUnit() ));
1291 writePoint(rWriter, aMapMode.GetOrigin());
1292 rWriter.attribute("scalex", convertFractionToString(aMapMode.GetScaleX()));
1293 rWriter.attribute("scaley", convertFractionToString(aMapMode.GetScaleY()));
1294 rWriter.endElement();
1295 }
1296 break;
1297
1299 {
1300 MetaFontAction* pMetaFontAction = static_cast<MetaFontAction*>(pAction);
1301 rWriter.startElement(sCurrentElementTag);
1302
1303 vcl::Font aFont = pMetaFontAction->GetFont();
1304
1305 rWriter.attribute("color", convertColorToString(aFont.GetColor()));
1306 rWriter.attribute("fillcolor", convertColorToString(aFont.GetFillColor()));
1307 rWriter.attribute("name", aFont.GetFamilyName());
1308 rWriter.attribute("stylename", aFont.GetStyleName());
1309 rWriter.attribute("width", aFont.GetFontSize().Width());
1310 rWriter.attribute("height", aFont.GetFontSize().Height());
1311 rWriter.attribute("orientation", aFont.GetOrientation().get());
1312 rWriter.attribute("weight", convertFontWeightToString(aFont.GetWeight()));
1313 rWriter.attribute("vertical", aFont.IsVertical() ? "true" : "false");
1314
1315 rWriter.endElement();
1316 }
1317 break;
1318
1320 {
1321 MetaPushAction* pMetaPushAction = static_cast<MetaPushAction*>(pAction);
1322 rWriter.startElement(sCurrentElementTag);
1323
1324 rWriter.attribute("flags", collectPushFlags(pMetaPushAction->GetFlags()));
1325 }
1326 break;
1327
1329 {
1330 rWriter.endElement();
1331 }
1332 break;
1333
1335 {
1336 MetaRasterOpAction* pMetaRasterOpAction = static_cast<MetaRasterOpAction*>(pAction);
1337 rWriter.startElement(sCurrentElementTag);
1338
1339 if (pMetaRasterOpAction->GetRasterOp() != RasterOp::OverPaint)
1340 {
1341 rWriter.attribute("operation", convertRopToString(pMetaRasterOpAction->GetRasterOp()));
1342 }
1343 rWriter.endElement();
1344 }
1345 break;
1346
1348 {
1349 const MetaTransparentAction* pMeta = static_cast<MetaTransparentAction*>(pAction);
1350
1351 rWriter.startElement(sCurrentElementTag);
1352 rWriter.attribute("transparence", pMeta->GetTransparence());
1353
1354 tools::PolyPolygon const& rPolyPolygon(pMeta->GetPolyPolygon());
1355
1356 for (sal_uInt16 j = 0; j < rPolyPolygon.Count(); ++j)
1357 {
1358 rWriter.startElement("polygon");
1359 tools::Polygon const& rPolygon = rPolyPolygon[j];
1360 bool bFlags = rPolygon.HasFlags();
1361 for (sal_uInt16 i = 0; i < rPolygon.GetSize(); ++i)
1362 {
1363 rWriter.startElement("point");
1364 writePoint(rWriter, rPolygon[i]);
1365 if (bFlags)
1366 rWriter.attribute("flags", convertPolygonFlags(rPolygon.GetFlags(i)));
1367 rWriter.endElement();
1368 }
1369 rWriter.endElement();
1370 }
1371
1372 rWriter.endElement();
1373 }
1374 break;
1375
1377 {
1378 MetaEPSAction* pMetaEPSAction = static_cast<MetaEPSAction*>(pAction);
1379 rWriter.startElement(sCurrentElementTag);
1380
1381 writePoint(rWriter, pMetaEPSAction->GetPoint());
1382 writeSize(rWriter, pMetaEPSAction->GetSize());
1383
1384 rWriter.startElement("gfxlink");
1385 writeSize(rWriter, pMetaEPSAction->GetLink().GetPrefSize());
1386 rWriter.attribute("type", convertGfxLinkTypeToString(pMetaEPSAction->GetLink().GetType()));
1387 rWriter.attribute("userid", pMetaEPSAction->GetLink().GetUserId());
1388 rWriter.attribute("datasize", pMetaEPSAction->GetLink().GetDataSize());
1389 rWriter.attribute("data", toHexString(pMetaEPSAction->GetLink().GetData(), pMetaEPSAction->GetLink().GetDataSize()));
1390 rWriter.attribute("native", pMetaEPSAction->GetLink().IsNative() ? "true" : "false");
1391 rWriter.attribute("emf", pMetaEPSAction->GetLink().IsEMF() ? "true" : "false");
1392 rWriter.attribute("validmapmode", pMetaEPSAction->GetLink().IsPrefMapModeValid() ? "true" : "false");
1393 rWriter.startElement("prefmapmode");
1394 writeMapMode(rWriter, pMetaEPSAction->GetLink().GetPrefMapMode());
1395 rWriter.endElement();
1396 rWriter.endElement();
1397
1398 rWriter.startElement("metafile");
1399 writeXml(pMetaEPSAction->GetSubstitute(), rWriter);
1400 rWriter.endElement();
1401
1402 rWriter.endElement();
1403 }
1404 break;
1405
1407 {
1408 auto* pMeta = static_cast<MetaRefPointAction*>(pAction);
1409 rWriter.startElement(sCurrentElementTag);
1410 writePoint(rWriter, pMeta->GetRefPoint());
1411 rWriter.attribute("set", pMeta->IsSetting() ? "true" : "false");
1412 rWriter.endElement();
1413 }
1414 break;
1415
1417 {
1418 auto* pMeta = static_cast<MetaTextLineColorAction*>(pAction);
1419 rWriter.startElement(sCurrentElementTag);
1420 rWriter.attribute("color", convertColorToString(pMeta->GetColor()));
1421 rWriter.endElement();
1422 }
1423 break;
1424
1426 {
1427 auto* pMeta = static_cast<MetaTextLineAction*>(pAction);
1428 rWriter.startElement(sCurrentElementTag);
1429 writePoint(rWriter, pMeta->GetStartPoint());
1430 rWriter.attribute("width", pMeta->GetWidth());
1431 rWriter.attribute("strikeout", convertFontStrikeoutToString(pMeta->GetStrikeout()));
1432 rWriter.attribute("underline", convertFontLineStyleToString(pMeta->GetUnderline()));
1433 rWriter.attribute("overline", convertFontLineStyleToString(pMeta->GetOverline()));
1434 rWriter.endElement();
1435 }
1436 break;
1437
1439 {
1440 const auto* pMeta = static_cast<MetaFloatTransparentAction*>(pAction);
1441 rWriter.startElement(sCurrentElementTag);
1442 writePoint(rWriter, pMeta->GetPoint());
1443 writeSize(rWriter, pMeta->GetSize());
1444 rWriter.attribute("transparent", pMeta->IsTransparent() ? "true" : "false");
1445
1446 rWriter.startElement("gradient");
1447 writeGradient(rWriter, pMeta->GetGradient());
1448 rWriter.endElement();
1449
1450 rWriter.startElement("metafile");
1451 writeXml(pMeta->GetGDIMetaFile(), rWriter);
1452 rWriter.endElement();
1453
1454 rWriter.endElement();
1455 }
1456 break;
1457
1459 {
1460 const MetaGradientExAction* pMetaGradientExAction = static_cast<MetaGradientExAction*>(pAction);
1461
1462 rWriter.startElement(sCurrentElementTag);
1463 writeGradient(rWriter, pMetaGradientExAction->GetGradient());
1464
1465 tools::PolyPolygon const& rPolyPolygon(pMetaGradientExAction->GetPolyPolygon());
1466 for (sal_uInt16 j = 0; j < rPolyPolygon.Count(); ++j)
1467 {
1468 rWriter.startElement("polygon");
1469 tools::Polygon const& rPolygon = rPolyPolygon[j];
1470 bool bFlags = rPolygon.HasFlags();
1471 for (sal_uInt16 i = 0; i < rPolygon.GetSize(); ++i)
1472 {
1473 rWriter.startElement("point");
1474 writePoint(rWriter, rPolygon[i]);
1475 if (bFlags)
1476 rWriter.attribute("flags", convertPolygonFlags(rPolygon.GetFlags(i)));
1477 rWriter.endElement();
1478 }
1479 rWriter.endElement();
1480 }
1481
1482 rWriter.endElement();
1483 }
1484 break;
1485
1487 {
1488 const MetaLayoutModeAction* pMetaLayoutModeAction = static_cast<MetaLayoutModeAction*>(pAction);
1489
1490 rWriter.startElement(sCurrentElementTag);
1491
1492 rWriter.attribute("textlayout", convertComplexTestLayoutFlags(pMetaLayoutModeAction->GetLayoutMode()));
1493
1494 rWriter.endElement();
1495 }
1496 break;
1497
1499 {
1500 const MetaTextLanguageAction* pMetaTextLanguageAction = static_cast<MetaTextLanguageAction*>(pAction);
1501
1502 rWriter.startElement(sCurrentElementTag);
1503
1504 rWriter.attribute("language", convertLanguageTypeToString(pMetaTextLanguageAction->GetTextLanguage()));
1505
1506 rWriter.endElement();
1507 }
1508 break;
1509
1511 {
1512 const auto* pMetaAction = static_cast<MetaOverlineColorAction*>(pAction);
1513 rWriter.startElement(sCurrentElementTag);
1514 rWriter.attribute("color", convertColorToString(pMetaAction->GetColor()));
1515 rWriter.endElement();
1516 }
1517 break;
1518
1520 {
1521 MetaCommentAction* pMetaCommentAction = static_cast<MetaCommentAction*>(pAction);
1522 rWriter.startElement(sCurrentElementTag);
1523
1524 if (pMetaCommentAction->GetDataSize() > 0)
1525 {
1526 rWriter.attribute("datasize", pMetaCommentAction->GetDataSize());
1527 rWriter.attribute("data", toHexString(pMetaCommentAction->GetData(), pMetaCommentAction->GetDataSize()));
1528 }
1529 rWriter.attribute("value", pMetaCommentAction->GetValue());
1530
1531 if (!pMetaCommentAction->GetComment().isEmpty())
1532 {
1533 rWriter.startElement("comment");
1534 rWriter.content(pMetaCommentAction->GetComment());
1535 rWriter.endElement();
1536 }
1537 rWriter.endElement();
1538 }
1539 break;
1540
1541 default:
1542 {
1543 rWriter.startElement(sCurrentElementTag);
1544 rWriter.attribute("note", OString("not implemented in xml dump"));
1545 rWriter.endElement();
1546 }
1547 break;
1548 }
1549 }
1550}
1551
1552/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
DrawTextFlags
RasterOp
Definition: RasterOp.hxx:23
#define PUSH_ALLFONT
Definition: State.hxx:66
bool IsAlpha() const
Definition: BitmapEx.cxx:193
BitmapChecksum GetChecksum() const
Definition: BitmapEx.cxx:225
Bitmap GetBitmap(Color aTransparentReplaceColor) const
Definition: BitmapEx.cxx:203
const Size & GetSizePixel() const
Definition: bitmapex.hxx:72
BitmapChecksum GetChecksum() const
Size GetSizePixel() const
vcl::PixelFormat getPixelFormat() const
sal_uInt8 GetBlue() const
OUString AsRGBHexString() const
sal_uInt8 GetAlpha() const
sal_uInt8 GetRed() const
sal_uInt8 GetGreen() const
size_t GetActionSize() const
Definition: gdimtf.cxx:179
const Size & GetPrefSize() const
Definition: gdimtf.hxx:172
MetaAction * GetAction(size_t nAction) const
Definition: gdimtf.cxx:184
const MapMode & GetPrefMapMode() const
Definition: gdimtf.hxx:175
sal_uInt16 GetStartIntensity() const
Degree10 GetAngle() const
sal_uInt16 GetEndIntensity() const
sal_uInt16 GetOfsX() const
sal_uInt16 GetBorder() const
const Color & GetEndColor() const
sal_uInt16 GetOfsY() const
const Color & GetStartColor() const
css::awt::GradientStyle GetStyle() const
sal_uInt16 GetSteps() const
bool empty() const
Definition: kernarray.hxx:74
const Fraction & GetScaleX() const
Definition: mapmod.cxx:150
MapUnit GetMapUnit() const
Definition: mapmod.cxx:146
const Point & GetOrigin() const
Definition: mapmod.cxx:148
const Fraction & GetScaleY() const
Definition: mapmod.cxx:152
MetaActionType GetType() const
Definition: metaact.hxx:95
sal_Int32 GetValue() const
Definition: metaact.hxx:1701
const sal_uInt8 * GetData() const
Definition: metaact.hxx:1703
const OString & GetComment() const
Definition: metaact.hxx:1700
sal_uInt32 GetDataSize() const
Definition: metaact.hxx:1702
const GDIMetaFile & GetSubstitute() const
Definition: metaact.hxx:1638
const Point & GetPoint() const
Definition: metaact.hxx:1639
const Size & GetSize() const
Definition: metaact.hxx:1640
const GfxLink & GetLink() const
Definition: metaact.hxx:1637
const Color & GetColor() const
Definition: metaact.hxx:1278
const vcl::Font & GetFont() const
Definition: metaact.hxx:1471
const tools::Rectangle & GetRect() const
Definition: metaact.hxx:1021
const Gradient & GetGradient() const
Definition: metaact.hxx:1022
const tools::PolyPolygon & GetPolyPolygon() const
Definition: metaact.hxx:1051
const Gradient & GetGradient() const
Definition: metaact.hxx:1052
const tools::Rectangle & GetRect() const
Definition: metaact.hxx:1170
const vcl::Region & GetRegion() const
Definition: metaact.hxx:1197
vcl::text::ComplexTextLayoutFlags GetLayoutMode() const
Definition: metaact.hxx:1730
const LineInfo & GetLineInfo() const
Definition: metaact.hxx:186
const Point & GetEndPoint() const
Definition: metaact.hxx:185
const Point & GetStartPoint() const
Definition: metaact.hxx:184
const Color & GetColor() const
Definition: metaact.hxx:1251
const MapMode & GetMapMode() const
Definition: metaact.hxx:1437
const LineInfo & GetLineInfo() const
Definition: metaact.hxx:408
const tools::Polygon & GetPolygon() const
Definition: metaact.hxx:407
const tools::PolyPolygon & GetPolyPolygon() const
Definition: metaact.hxx:463
const tools::Polygon & GetPolygon() const
Definition: metaact.hxx:436
vcl::PushFlags GetFlags() const
Definition: metaact.hxx:1496
RasterOp GetRasterOp() const
Definition: metaact.hxx:1536
const tools::Rectangle & GetRect() const
Definition: metaact.hxx:215
TextAlign GetTextAlign() const
Definition: metaact.hxx:1411
sal_Int32 GetIndex() const
Definition: metaact.hxx:540
const KernArray & GetDXArray() const
Definition: metaact.hxx:542
sal_Int32 GetLen() const
Definition: metaact.hxx:541
const OUString & GetText() const
Definition: metaact.hxx:539
const Point & GetPoint() const
Definition: metaact.hxx:538
const Color & GetColor() const
Definition: metaact.hxx:1305
bool IsSetting() const
Definition: metaact.hxx:1333
const Color & GetColor() const
Definition: metaact.hxx:1330
LanguageType GetTextLanguage() const
Definition: metaact.hxx:1754
sal_uInt16 GetTransparence() const
Definition: metaact.hxx:1565
const tools::PolyPolygon & GetPolyPolygon() const
Definition: metaact.hxx:1564
void filterAllActionTypes()
Definition: mtfxmldump.cxx:629
void writeXml(const GDIMetaFile &rMetaFile, tools::XmlWriter &rWriter)
Definition: mtfxmldump.cxx:646
void dump(const GDIMetaFile &rMetaFile, SvStream &rStream)
The actual result that will be used for testing.
Definition: mtfxmldump.cxx:634
o3tl::enumarray< MetaActionType, bool > maFilter
Definition: mtfxmldump.hxx:46
void filterActionType(const MetaActionType nActionType, bool bShouldFilter)
Definition: mtfxmldump.cxx:624
constexpr tools::Long Height() const
constexpr tools::Long Width() const
void fill(V val)
sal_uInt16 Count() const
PolyFlags GetFlags(sal_uInt16 nPos) const
bool HasFlags() const
sal_uInt16 GetSize() const
constexpr tools::Long Top() const
constexpr tools::Long Right() const
constexpr bool IsWidthEmpty() const
constexpr bool IsHeightEmpty() const
constexpr tools::Long Left() const
constexpr tools::Long Bottom() const
void content(const OString &sValue)
bool startDocument(sal_Int32 nIndent=2, bool bWriteXmlHeader=true)
void attribute(const OString &sTagName, const OString &aValue)
void startElement(const OString &sName)
const OUString & GetStyleName() const
Definition: font/font.cxx:905
const OUString & GetFamilyName() const
Definition: font/font.cxx:904
const Size & GetFontSize() const
Definition: font/font.cxx:907
const Color & GetColor() const
Definition: font/font.cxx:898
FontWeight GetWeight()
Definition: font/font.cxx:925
bool IsVertical() const
Definition: font/font.cxx:921
Degree10 GetOrientation() const
Definition: font/font.cxx:920
const Color & GetFillColor() const
Definition: font/font.cxx:899
tools::PolyPolygon GetAsPolyPolygon() const
Definition: region.cxx:1266
bool HasPolyPolygonOrB2DPolyPolygon() const
Definition: region.hxx:107
tools::Rectangle GetBoundRect() const
Definition: region.cxx:1219
float u
float y
float x
std::deque< AttacherIndex_Impl > aIndex
FontLineStyle
LINESTYLE_BOLDDASHDOT
LINESTYLE_BOLDDASHDOTDOT
LINESTYLE_SINGLE
LINESTYLE_BOLDLONGDASH
LINESTYLE_BOLDWAVE
LINESTYLE_DASHDOTDOT
LINESTYLE_BOLDDASH
LINESTYLE_BOLDDOTTED
LINESTYLE_DOUBLEWAVE
LINESTYLE_DOUBLE
LINESTYLE_NONE
LINESTYLE_DASH
LINESTYLE_DONTKNOW
LINESTYLE_SMALLWAVE
LINESTYLE_DASHDOT
LINESTYLE_DOTTED
LINESTYLE_WAVE
LINESTYLE_LONGDASH
FontLineStyle_FORCE_EQUAL_SIZE
LINESTYLE_BOLD
FontStrikeout
STRIKEOUT_BOLD
STRIKEOUT_DOUBLE
STRIKEOUT_SINGLE
STRIKEOUT_X
STRIKEOUT_SLASH
FontStrikeout_FORCE_EQUAL_SIZE
STRIKEOUT_NONE
STRIKEOUT_DONTKNOW
TextAlign_FORCE_EQUAL_SIZE
ALIGN_BOTTOM
ALIGN_TOP
ALIGN_BASELINE
WEIGHT_ULTRALIGHT
WEIGHT_ULTRABOLD
WEIGHT_THIN
WEIGHT_BOLD
WEIGHT_NORMAL
WEIGHT_LIGHT
WEIGHT_DONTKNOW
WEIGHT_SEMIBOLD
WEIGHT_SEMILIGHT
FontWeight_FORCE_EQUAL_SIZE
WEIGHT_MEDIUM
WEIGHT_BLACK
uno_Any a
MapUnit
MetaActionType
HatchStyle
int i
TextAlign
FontWeight
long Long
ComplexTextLayoutFlags
Definition: State.hxx:76
PushFlags
Definition: State.hxx:40
PixelFormat
Pixel format of the bitmap in bits per pixel.
Definition: BitmapTypes.hxx:20
PolyFlags
UNDERLYING_TYPE get() const
unsigned char sal_uInt8
LineStyle
Definition: vclenum.hxx:153
WallpaperStyle
Definition: wall.hxx:35