Coverage Report

Created: 2026-09-28 10:59

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