Coverage Report

Created: 2026-04-29 07:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libcdr/src/lib/CDROutputElementList.cpp
Line
Count
Source
1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/*
3
 * This file is part of the libcdr 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 "CDROutputElementList.h"
11
12
namespace libcdr
13
{
14
15
namespace
16
{
17
18
static void separateTabsAndInsertText(librevenge::RVNGDrawingInterface *iface, const librevenge::RVNGString &text)
19
2.11k
{
20
2.11k
  if (!iface || text.empty())
21
0
    return;
22
2.11k
  librevenge::RVNGString tmpText;
23
2.11k
  librevenge::RVNGString::Iter i(text);
24
10.9k
  for (i.rewind(); i.next();)
25
8.87k
  {
26
8.87k
    if (*(i()) == '\t')
27
0
    {
28
0
      if (!tmpText.empty())
29
0
      {
30
0
        if (iface)
31
0
          iface->insertText(tmpText);
32
0
        tmpText.clear();
33
0
      }
34
35
0
      if (iface)
36
0
        iface->insertTab();
37
0
    }
38
8.87k
    else if (*(i()) == '\n')
39
283
    {
40
283
      if (!tmpText.empty())
41
3
      {
42
3
        if (iface)
43
3
          iface->insertText(tmpText);
44
3
        tmpText.clear();
45
3
      }
46
47
283
      if (iface)
48
283
        iface->insertLineBreak();
49
283
    }
50
8.58k
    else
51
8.58k
    {
52
8.58k
      tmpText.append(i());
53
8.58k
    }
54
8.87k
  }
55
2.11k
  if (iface && !tmpText.empty())
56
1.83k
    iface->insertText(tmpText);
57
2.11k
}
58
59
static void separateSpacesAndInsertText(librevenge::RVNGDrawingInterface *iface, const librevenge::RVNGString &text)
60
2.11k
{
61
2.11k
  if (!iface)
62
0
    return;
63
2.11k
  if (text.empty())
64
0
  {
65
0
    iface->insertText(text);
66
0
    return;
67
0
  }
68
2.11k
  librevenge::RVNGString tmpText;
69
2.11k
  int numConsecutiveSpaces = 0;
70
2.11k
  librevenge::RVNGString::Iter i(text);
71
10.9k
  for (i.rewind(); i.next();)
72
8.87k
  {
73
8.87k
    if (*(i()) == ' ')
74
937
      numConsecutiveSpaces++;
75
7.93k
    else
76
7.93k
      numConsecutiveSpaces = 0;
77
78
8.87k
    if (numConsecutiveSpaces > 1)
79
0
    {
80
0
      if (!tmpText.empty())
81
0
      {
82
0
        separateTabsAndInsertText(iface, tmpText);
83
0
        tmpText.clear();
84
0
      }
85
86
0
      if (iface)
87
0
        iface->insertSpace();
88
0
    }
89
8.87k
    else
90
8.87k
    {
91
8.87k
      tmpText.append(i());
92
8.87k
    }
93
8.87k
  }
94
2.11k
  separateTabsAndInsertText(iface, tmpText);
95
2.11k
}
96
97
} // anonymous namespace
98
99
class CDROutputElement
100
{
101
public:
102
629k
  CDROutputElement() {}
103
629k
  virtual ~CDROutputElement() {}
104
  virtual void draw(librevenge::RVNGDrawingInterface *painter) = 0;
105
};
106
107
108
class CDRStyleOutputElement : public CDROutputElement
109
{
110
public:
111
  CDRStyleOutputElement(const librevenge::RVNGPropertyList &propList);
112
308k
  ~CDRStyleOutputElement() override {}
113
  void draw(librevenge::RVNGDrawingInterface *painter) override;
114
private:
115
  librevenge::RVNGPropertyList m_propList;
116
};
117
118
119
class CDRPathOutputElement : public CDROutputElement
120
{
121
public:
122
  CDRPathOutputElement(const librevenge::RVNGPropertyList &propList);
123
299k
  ~CDRPathOutputElement() override {}
124
  void draw(librevenge::RVNGDrawingInterface *painter) override;
125
private:
126
  librevenge::RVNGPropertyList m_propList;
127
};
128
129
130
class CDRGraphicObjectOutputElement : public CDROutputElement
131
{
132
public:
133
  CDRGraphicObjectOutputElement(const librevenge::RVNGPropertyList &propList);
134
3.40k
  ~CDRGraphicObjectOutputElement() override {}
135
  void draw(librevenge::RVNGDrawingInterface *painter) override;
136
private:
137
  librevenge::RVNGPropertyList m_propList;
138
};
139
140
141
class CDRStartTextObjectOutputElement : public CDROutputElement
142
{
143
public:
144
  CDRStartTextObjectOutputElement(const librevenge::RVNGPropertyList &propList);
145
242
  ~CDRStartTextObjectOutputElement() override {}
146
  void draw(librevenge::RVNGDrawingInterface *painter) override;
147
private:
148
  librevenge::RVNGPropertyList m_propList;
149
};
150
151
152
class CDROpenParagraphOutputElement : public CDROutputElement
153
{
154
public:
155
  CDROpenParagraphOutputElement(const librevenge::RVNGPropertyList &propList);
156
438
  ~CDROpenParagraphOutputElement() override {}
157
  void draw(librevenge::RVNGDrawingInterface *painter) override;
158
private:
159
  librevenge::RVNGPropertyList m_propList;
160
};
161
162
163
class CDROpenSpanOutputElement : public CDROutputElement
164
{
165
public:
166
  CDROpenSpanOutputElement(const librevenge::RVNGPropertyList &propList);
167
5.67k
  ~CDROpenSpanOutputElement() override {}
168
  void draw(librevenge::RVNGDrawingInterface *painter) override;
169
private:
170
  librevenge::RVNGPropertyList m_propList;
171
};
172
173
174
class CDRInsertTextOutputElement : public CDROutputElement
175
{
176
public:
177
  CDRInsertTextOutputElement(const librevenge::RVNGString &text);
178
5.67k
  ~CDRInsertTextOutputElement() override {}
179
  void draw(librevenge::RVNGDrawingInterface *painter) override;
180
private:
181
  librevenge::RVNGString m_text;
182
};
183
184
185
class CDRCloseSpanOutputElement : public CDROutputElement
186
{
187
public:
188
  CDRCloseSpanOutputElement();
189
0
  ~CDRCloseSpanOutputElement() override {}
190
  void draw(librevenge::RVNGDrawingInterface *painter) override;
191
};
192
193
194
class CDRCloseParagraphOutputElement : public CDROutputElement
195
{
196
public:
197
  CDRCloseParagraphOutputElement();
198
0
  ~CDRCloseParagraphOutputElement() override {}
199
  void draw(librevenge::RVNGDrawingInterface *painter) override;
200
};
201
202
203
class CDREndTextObjectOutputElement : public CDROutputElement
204
{
205
public:
206
  CDREndTextObjectOutputElement();
207
0
  ~CDREndTextObjectOutputElement() override {}
208
  void draw(librevenge::RVNGDrawingInterface *painter) override;
209
};
210
211
class CDRStartLayerOutputElement : public CDROutputElement
212
{
213
public:
214
  CDRStartLayerOutputElement(const librevenge::RVNGPropertyList &propList);
215
8
  ~CDRStartLayerOutputElement() override {}
216
  void draw(librevenge::RVNGDrawingInterface *painter) override;
217
private:
218
  librevenge::RVNGPropertyList m_propList;
219
};
220
221
class CDREndLayerOutputElement : public CDROutputElement
222
{
223
public:
224
  CDREndLayerOutputElement();
225
0
  ~CDREndLayerOutputElement() override {}
226
  void draw(librevenge::RVNGDrawingInterface *painter) override;
227
};
228
229
CDRStyleOutputElement::CDRStyleOutputElement(const librevenge::RVNGPropertyList &propList) :
230
308k
  m_propList(propList) {}
231
232
void CDRStyleOutputElement::draw(librevenge::RVNGDrawingInterface *painter)
233
197k
{
234
197k
  if (painter)
235
197k
    painter->setStyle(m_propList);
236
197k
}
237
238
239
CDRPathOutputElement::CDRPathOutputElement(const librevenge::RVNGPropertyList &propList) :
240
299k
  m_propList(propList) {}
241
242
void CDRPathOutputElement::draw(librevenge::RVNGDrawingInterface *painter)
243
196k
{
244
196k
  if (painter)
245
196k
    painter->drawPath(m_propList);
246
196k
}
247
248
249
CDRGraphicObjectOutputElement::CDRGraphicObjectOutputElement(const librevenge::RVNGPropertyList &propList) :
250
3.40k
  m_propList(propList) {}
251
252
void CDRGraphicObjectOutputElement::draw(librevenge::RVNGDrawingInterface *painter)
253
2.67k
{
254
2.67k
  if (painter)
255
2.67k
    painter->drawGraphicObject(m_propList);
256
2.67k
}
257
258
259
CDRStartTextObjectOutputElement::CDRStartTextObjectOutputElement(const librevenge::RVNGPropertyList &propList) :
260
242
  m_propList(propList) {}
261
262
void CDRStartTextObjectOutputElement::draw(librevenge::RVNGDrawingInterface *painter)
263
239
{
264
239
  if (painter)
265
239
    painter->startTextObject(m_propList);
266
239
}
267
268
CDROpenSpanOutputElement::CDROpenSpanOutputElement(const librevenge::RVNGPropertyList &propList) :
269
5.67k
  m_propList(propList) {}
270
271
void CDROpenSpanOutputElement::draw(librevenge::RVNGDrawingInterface *painter)
272
2.11k
{
273
2.11k
  if (painter)
274
2.11k
    painter->openSpan(m_propList);
275
2.11k
}
276
277
278
CDROpenParagraphOutputElement::CDROpenParagraphOutputElement(const librevenge::RVNGPropertyList &propList) :
279
438
  m_propList(propList) {}
280
281
void CDROpenParagraphOutputElement::draw(librevenge::RVNGDrawingInterface *painter)
282
435
{
283
435
  if (painter)
284
435
    painter->openParagraph(m_propList);
285
435
}
286
287
288
CDRInsertTextOutputElement::CDRInsertTextOutputElement(const librevenge::RVNGString &text) :
289
5.67k
  m_text(text) {}
290
291
void CDRInsertTextOutputElement::draw(librevenge::RVNGDrawingInterface *painter)
292
2.11k
{
293
2.11k
  if (painter)
294
2.11k
    separateSpacesAndInsertText(painter, m_text);
295
2.11k
}
296
297
5.67k
CDRCloseSpanOutputElement::CDRCloseSpanOutputElement() {}
298
299
void CDRCloseSpanOutputElement::draw(librevenge::RVNGDrawingInterface *painter)
300
2.11k
{
301
2.11k
  if (painter)
302
2.11k
    painter->closeSpan();
303
2.11k
}
304
305
306
438
CDRCloseParagraphOutputElement::CDRCloseParagraphOutputElement() {}
307
308
void CDRCloseParagraphOutputElement::draw(librevenge::RVNGDrawingInterface *painter)
309
435
{
310
435
  if (painter)
311
435
    painter->closeParagraph();
312
435
}
313
314
315
242
CDREndTextObjectOutputElement::CDREndTextObjectOutputElement() {}
316
317
void CDREndTextObjectOutputElement::draw(librevenge::RVNGDrawingInterface *painter)
318
239
{
319
239
  if (painter)
320
239
    painter->endTextObject();
321
239
}
322
323
324
8
CDREndLayerOutputElement::CDREndLayerOutputElement() {}
325
326
void CDREndLayerOutputElement::draw(librevenge::RVNGDrawingInterface *painter)
327
8
{
328
8
  if (painter)
329
8
    painter->endLayer();
330
8
}
331
332
333
CDRStartLayerOutputElement::CDRStartLayerOutputElement(const librevenge::RVNGPropertyList &propList) :
334
8
  m_propList(propList) {}
335
336
void CDRStartLayerOutputElement::draw(librevenge::RVNGDrawingInterface *painter)
337
8
{
338
8
  if (painter)
339
8
    painter->startLayer(m_propList);
340
8
}
341
342
343
CDROutputElementList::CDROutputElementList()
344
424k
  : m_elements()
345
424k
{
346
424k
}
347
348
CDROutputElementList::~CDROutputElementList()
349
732k
{
350
732k
}
351
352
void CDROutputElementList::draw(librevenge::RVNGDrawingInterface *painter) const
353
197k
{
354
197k
  for (const auto &element : m_elements)
355
404k
    element->draw(painter);
356
197k
}
357
358
void CDROutputElementList::addStyle(const librevenge::RVNGPropertyList &propList)
359
308k
{
360
308k
  m_elements.push_back(std::make_shared<CDRStyleOutputElement>(propList));
361
308k
}
362
363
void CDROutputElementList::addPath(const librevenge::RVNGPropertyList &propList)
364
299k
{
365
299k
  m_elements.push_back(std::make_shared<CDRPathOutputElement>(propList));
366
299k
}
367
368
void CDROutputElementList::addGraphicObject(const librevenge::RVNGPropertyList &propList)
369
3.40k
{
370
3.40k
  m_elements.push_back(std::make_shared<CDRGraphicObjectOutputElement>(propList));
371
3.40k
}
372
373
void CDROutputElementList::addStartTextObject(const librevenge::RVNGPropertyList &propList)
374
242
{
375
242
  m_elements.push_back(std::make_shared<CDRStartTextObjectOutputElement>(propList));
376
242
}
377
378
void CDROutputElementList::addOpenParagraph(const librevenge::RVNGPropertyList &propList)
379
438
{
380
438
  m_elements.push_back(std::make_shared<CDROpenParagraphOutputElement>(propList));
381
438
}
382
383
void CDROutputElementList::addOpenSpan(const librevenge::RVNGPropertyList &propList)
384
5.67k
{
385
5.67k
  m_elements.push_back(std::make_shared<CDROpenSpanOutputElement>(propList));
386
5.67k
}
387
388
void CDROutputElementList::addInsertText(const librevenge::RVNGString &text)
389
5.67k
{
390
5.67k
  m_elements.push_back(std::make_shared<CDRInsertTextOutputElement>(text));
391
5.67k
}
392
393
void CDROutputElementList::addCloseSpan()
394
5.67k
{
395
5.67k
  m_elements.push_back(std::make_shared<CDRCloseSpanOutputElement>());
396
5.67k
}
397
398
void CDROutputElementList::addCloseParagraph()
399
438
{
400
438
  m_elements.push_back(std::make_shared<CDRCloseParagraphOutputElement>());
401
438
}
402
403
void CDROutputElementList::addEndTextObject()
404
242
{
405
242
  m_elements.push_back(std::make_shared<CDREndTextObjectOutputElement>());
406
242
}
407
408
void CDROutputElementList::addStartGroup(const librevenge::RVNGPropertyList &propList)
409
8
{
410
8
  m_elements.push_back(std::make_shared<CDRStartLayerOutputElement>(propList));
411
8
}
412
413
void CDROutputElementList::addEndGroup()
414
8
{
415
8
  m_elements.push_back(std::make_shared<CDREndLayerOutputElement>());
416
8
}
417
418
} // namespace libcdr
419
420
/* vim:set shiftwidth=2 softtabstop=2 expandtab: */