Coverage Report

Created: 2025-11-16 09:57

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