QCAD
Open Source 2D CAD
Loading...
Searching...
No Matches
RTextRenderer.h
Go to the documentation of this file.
1
20#ifndef RTEXTRENDERER_H
21#define RTEXTRENDERER_H
22
23#include "core_global.h"
24
25#include <QTextLayout>
26#include <QMutex>
27#include <QStack>
28
29#include "RPainterPath.h"
30#include "RTextLayout.h"
31
32class RColor;
33class RTextBasedData;
34
42public:
43 enum Target {
44 PainterPaths = 0x01,
45 RichText = 0x02
46 // TODO: TextLayout = 0x03
47 };
48
49public:
50 RTextRenderer(const RTextBasedData& textData, bool draft, RTextRenderer::Target target, double fontHeightFactor = 1.0);
51
52 void renderSimple();
53 void render();
54
55 QList<RPainterPath> getPainterPaths() const {
56 return painterPaths;
57 }
58
59 QList<RTextLayout> getTextLayouts() const {
60 return textLayouts;
61 }
62
63// QList<QTransform> getTextTransforms() const {
64// return textTransforms;
65// }
66
68 return boundingBox;
69 }
70
71 double getHeight() const {
72 return height;
73 }
74
75 double getWidth() const {
76 return width;
77 }
78
79 QString getRichText() const {
80 return richText;
81 }
82
83 static void lockForDrawing() {
84 m.lock();
85 }
86
87 static void unlockForDrawing() {
88 m.unlock();
89 }
90
91private:
92 QList<RPainterPath> getPainterPathsForBlock(
93 const QString& blockText,
94 const QList<QTextLayout::FormatRange>& formats,
95 double& horizontalAdvance,
96 double& horizontalAdvanceNoSpacing,
97 double& horizontalAdvanceNoTrailingSpace,
98 double& ascent,
99 double& descent,
100 double& usedHeight);
101
102 QList<RPainterPath> getPainterPathsForBlockTtf(
103 const QString& blockText,
104 const QList<QTextLayout::FormatRange>& formats,
105 double& horizontalAdvance,
106 double& horizontalAdvanceNoSpacing,
107 double& horizontalAdvanceNoTrailingSpace,
108 double& ascent,
109 double& descent,
110 double& usedHeight);
111
112 QList<RPainterPath> getPainterPathsForBlockCad(
113 const QString& blockText,
114 const QList<QTextLayout::FormatRange>& formats,
115 double& horizontalAdvance,
116 double& horizontalAdvanceNoSpacing,
117 double& horizontalAdvanceNoTrailingSpace,
118 double& ascent,
119 double& descent,
120 double& usedHeight);
121
122 void preparePath(RPainterPath& path,
123 const RColor& color,
124 double cursor,
125 double cxfScale);
126
127 void preparePathColor(RPainterPath& path, const RColor& color);
128 void preparePathTransform(RPainterPath& path, double cursor, double cxfScale);
129
130 QRectF getCharacterRect(const QString& fontName, const QChar& ch) const;
131 QRectF getCharacterRect(const QFont& font, const QChar& ch) const;
132
133 QString getRichTextForBlock(const QString& blockText,
134 const QList<QTextLayout::FormatRange>& formats);
135
136 void setBlockFont(const QString& f) {
137 if (!blockFont.isEmpty()) {
138 blockFont.top() = f;
139 }
140 }
141
142 QString getBlockFont() const {
143 if (!blockFont.isEmpty()) {
144 return blockFont.top();
145 }
146 return "";
147 }
148
149 void setBlockFontFile(const QString& f) {
150 if (!blockFontFile.isEmpty()) {
151 blockFontFile.top() = f;
152 }
153 }
154
155 QString getBlockFontFile() const {
156 if (!blockFontFile.isEmpty()) {
157 return blockFontFile.top();
158 }
159 return "";
160 }
161
162 void setUseCadFont(bool on) {
163 if (!useCadFont.isEmpty()) {
164 useCadFont.top() = on;
165 }
166 }
167
168 bool getUseCadFont() const {
169 if (!useCadFont.isEmpty()) {
170 return useCadFont.top();
171 }
172 return false;
173 }
174
175 void setBlockBold(bool on) {
176 if (!blockBold.isEmpty()) {
177 blockBold.top() = on;
178 }
179 }
180
181 bool getBlockBold() const {
182 if (!blockBold.isEmpty()) {
183 return blockBold.top();
184 }
185 return false;
186 }
187
188 void setBlockItalic(bool on) {
189 if (!blockItalic.isEmpty()) {
190 blockItalic.top() = on;
191 }
192 }
193
194 bool getBlockItalic() const {
195 if (!blockItalic.isEmpty()) {
196 return blockItalic.top();
197 }
198 return false;
199 }
200
201 void setBlockUnderline(bool on) {
202 if (!blockUnderline.isEmpty()) {
203 blockUnderline.top() = on;
204 }
205 }
206
207 bool getBlockUnderline() const {
208 if (!blockUnderline.isEmpty()) {
209 return blockUnderline.top();
210 }
211 return false;
212 }
213
214 void setBlockHeight(double h) {
215 if (!blockHeight.isEmpty()) {
216 blockHeight.top() = h;
217 }
218 }
219
220 double getBlockHeight() const {
221 if (!blockHeight.isEmpty()) {
222 return blockHeight.top();
223 }
224 return 1.0;
225 }
226
227 void setCurrentFormat(QTextCharFormat f) {
228 if (!currentFormat.isEmpty()) {
229 currentFormat.top() = f;
230 }
231 }
232
233 QTextCharFormat getCurrentFormat() const {
234 if (!currentFormat.isEmpty()) {
235 return currentFormat.top();
236 }
237 return QTextCharFormat();
238 }
239
240public:
241 static QString rxLineFeedStr;
243 static QString rxAlignmentLeftStr;
245 static QString rxAlignmentCenterStr;
247 static QString rxAlignmentRightStr;
249 static QString rxXAlignmentLeftStr;
251 static QString rxXAlignmentCenterStr;
253 static QString rxXAlignmentRightStr;
255 static QString rxXSpaceMTextStr;
257 static QString rxTabMMStr;
259 static QString rxTabINStr;
261 static QString rxParagraphFeedStr;
263 static QString rxXFeedStr;
265 static QString rxHeightChangeStr;
267 static QString rxUnderlineChangeStr;
269 //static QString rxRelativeHeightChange;
270 static QString rxStackedTextStr;
272 static QString rxColorChangeIndexStr;
276 static QString rxNonBreakingSpaceStr;
278 static QString rxOverlineOnStr;
280 static QString rxOverlineOffStr;
282 static QString rxUnderlineOnStr;
284 static QString rxUnderlineOffStr;
286 static QString rxStrikethroughOnStr;
288 static QString rxStrikethroughOffStr;
290 static QString rxWidthChangeStr;
294 static QString rxTrackChangeStr;
296 static QString rxAlignmentChangeStr;
300 static QString rxFontChangeCadStr;
302 static QString rxFontChangeTtfStr;
304 static QString rxBeginBlockStr;
306 static QString rxEndBlockStr;
308 static QString rxBackslashStr;
310 static QString rxCurlyOpenStr;
312 static QString rxCurlyCloseStr;
314 static QString rxDegreeStr;
316 static QString escDegreeStr;
318 static QString rxPlusMinusStr;
320 static QString escPlusMinusStr;
322 static QString rxDiameterStr;
324 static QString escDiameterStr;
326 static QString rxUnderlineStr;
328 static QString escUnderlineStr;
330 static QString rxNoOpStr;
332 static QString rxNoOpEndStr;
334 static QString escNoOpStr;
336 static QString rxUnicodeStr;
338 static QString rxOptionalBreakStr;
340
341 static QString rxAllStr;
342 static QString rxAllBreakStr;
345
346 static QChar chDegree;
347 static QChar chPlusMinus;
348 static QChar chDiameter;
349
350private:
351 static QMutex m;
352
354
356
357 // painter paths used to draw text geometry as painter path:
358 QList<RPainterPath> painterPaths;
359
360 // text layouts and transformations used to draw text as QTextLayout instead of painter paths:
361 QList<RTextLayout> textLayouts;
362 // list of block transforms of all QTextLayout blocks of the current line:
363 QList<QTransform> lineBlockTransforms;
364
366 double height;
367 double width;
368 bool draft;
369 QString richText;
371
372 QStack<bool> useCadFont;
373 QStack<QTextCharFormat> currentFormat;
374 QStack<double> blockHeight;
375 QStack<QString> blockFont;
376 QStack<QString> blockFontFile;
377 QStack<bool> blockBold;
378 QStack<bool> blockItalic;
379 QStack<bool> blockUnderline;
380 QStack<QStringList> openTags;
381};
382
383
387
388#endif
Q_DECLARE_METATYPE(RMath *)
#define QRegularExpression
Definition RS.h:53
Represents a box e.g.
Definition RBox.h:46
Color.
Definition RColor.h:43
Extended painter path with a z-level and a pen.
Definition RPainterPath.h:48
Stores and manages all data that defines the geometry and appearance of a text based entity (text,...
Definition RTextBasedData.h:68
Renders formatted text into painter paths.
Definition RTextRenderer.h:41
QStack< QTextCharFormat > currentFormat
Definition RTextRenderer.h:373
static void lockForDrawing()
Definition RTextRenderer.h:83
static QString rxFontChangeCadStr
Definition RTextRenderer.h:300
static QString rxAlignmentChangeBlockStr
Definition RTextRenderer.h:298
static QRegularExpression escDegree
Definition RTextRenderer.h:317
static QString rxStackedTextStr
Definition RTextRenderer.h:270
QList< RTextLayout > textLayouts
Definition RTextRenderer.h:361
static QRegularExpression rxStrikethroughOff
Definition RTextRenderer.h:289
static QRegularExpression rxAll
Definition RTextRenderer.h:343
QStack< double > blockHeight
Definition RTextRenderer.h:374
Target
Definition RTextRenderer.h:43
static QRegularExpression rxXFeed
Definition RTextRenderer.h:264
static QRegularExpression rxLineFeed
Definition RTextRenderer.h:242
static QRegularExpression rxStrikethroughOn
Definition RTextRenderer.h:287
static QString rxUnderlineOffStr
Definition RTextRenderer.h:284
const RTextBasedData & textData
Definition RTextRenderer.h:353
static QString rxBackslashStr
Definition RTextRenderer.h:308
static QString rxNoOpEndStr
Definition RTextRenderer.h:332
static QRegularExpression rxAlignmentRight
Definition RTextRenderer.h:248
QStack< bool > blockBold
Definition RTextRenderer.h:377
static QString rxAlignmentRightStr
Definition RTextRenderer.h:247
QStack< QString > blockFontFile
Definition RTextRenderer.h:376
static QRegularExpression rxCurlyClose
Definition RTextRenderer.h:313
static QString rxColorChangeIndexStr
Definition RTextRenderer.h:272
bool getUseCadFont() const
Definition RTextRenderer.h:168
static QString rxUnderlineStr
Definition RTextRenderer.h:326
QStack< bool > blockUnderline
Definition RTextRenderer.h:379
static QRegularExpression rxNonBreakingSpace
Definition RTextRenderer.h:277
static QString rxFontChangeTtfStr
Definition RTextRenderer.h:302
bool getBlockItalic() const
Definition RTextRenderer.h:194
QString richText
Definition RTextRenderer.h:369
static QString rxNoOpStr
Definition RTextRenderer.h:330
double getBlockHeight() const
Definition RTextRenderer.h:220
static QString rxObliqueAngleChangeStr
Definition RTextRenderer.h:292
static QRegularExpression rxOverlineOff
Definition RTextRenderer.h:281
static QString rxAlignmentCenterStr
Definition RTextRenderer.h:245
static QRegularExpression rxTabIN
Definition RTextRenderer.h:260
static QString escDegreeStr
Definition RTextRenderer.h:316
static QString rxTabMMStr
Definition RTextRenderer.h:257
static QString rxTrackChangeStr
Definition RTextRenderer.h:294
void setCurrentFormat(QTextCharFormat f)
Definition RTextRenderer.h:227
static QString escUnderlineStr
Definition RTextRenderer.h:328
static QRegularExpression rxTrackChange
Definition RTextRenderer.h:295
static QRegularExpression rxNoOp
Definition RTextRenderer.h:331
static QRegularExpression rxColorChangeIndex
Definition RTextRenderer.h:273
QString getBlockFontFile() const
Definition RTextRenderer.h:155
RBox boundingBox
Definition RTextRenderer.h:365
void setBlockFont(const QString &f)
Definition RTextRenderer.h:136
QTextCharFormat getCurrentFormat() const
Definition RTextRenderer.h:233
void setBlockUnderline(bool on)
Definition RTextRenderer.h:201
static QString rxXAlignmentRightStr
Definition RTextRenderer.h:253
static QRegularExpression rxUnderlineOn
Definition RTextRenderer.h:283
static QRegularExpression rxNoOpEnd
Definition RTextRenderer.h:333
static QString rxColorChangeCustomStr
Definition RTextRenderer.h:274
static QRegularExpression rxAlignmentLeft
Definition RTextRenderer.h:244
static QString rxOptionalBreakStr
Definition RTextRenderer.h:338
static QRegularExpression rxTabMM
Definition RTextRenderer.h:258
double getHeight() const
Definition RTextRenderer.h:71
static QString rxUnderlineChangeStr
Definition RTextRenderer.h:267
static QString rxUnicodeStr
Definition RTextRenderer.h:336
static QString rxPlusMinusStr
Definition RTextRenderer.h:318
static QString rxWidthChangeStr
Definition RTextRenderer.h:290
static QRegularExpression rxColorChangeCustom
Definition RTextRenderer.h:275
QList< RPainterPath > painterPaths
Definition RTextRenderer.h:358
void setBlockBold(bool on)
Definition RTextRenderer.h:175
static QString escPlusMinusStr
Definition RTextRenderer.h:320
static QRegularExpression rxDegree
Definition RTextRenderer.h:315
void setBlockHeight(double h)
Definition RTextRenderer.h:214
static QRegularExpression rxBeginBlock
Definition RTextRenderer.h:305
static QString escDiameterStr
Definition RTextRenderer.h:324
static QRegularExpression rxAlignmentChangeBlock
Definition RTextRenderer.h:299
static QRegularExpression rxWidthChange
Definition RTextRenderer.h:291
static QRegularExpression escNoOp
Definition RTextRenderer.h:335
static QRegularExpression rxEndBlock
Definition RTextRenderer.h:307
static QRegularExpression rxCurlyOpen
Definition RTextRenderer.h:311
static QString rxAllBreakStr
Definition RTextRenderer.h:342
bool getBlockUnderline() const
Definition RTextRenderer.h:207
void setUseCadFont(bool on)
Definition RTextRenderer.h:162
RBox getBoundingBox() const
Definition RTextRenderer.h:67
static QRegularExpression rxUnderlineChange
Definition RTextRenderer.h:268
static QRegularExpression escPlusMinus
Definition RTextRenderer.h:321
static QRegularExpression escUnderline
Definition RTextRenderer.h:329
static QRegularExpression escDiameter
Definition RTextRenderer.h:325
static QRegularExpression rxUnicode
Definition RTextRenderer.h:337
static QString rxXSpaceMTextStr
Definition RTextRenderer.h:255
static QChar chDegree
Copyright (c) 2011-2018 by Andrew Mustun.
Definition RTextRenderer.h:346
static QString rxTabINStr
Definition RTextRenderer.h:259
static QString rxXAlignmentLeftStr
Definition RTextRenderer.h:249
static void unlockForDrawing()
Definition RTextRenderer.h:87
static QString rxUnderlineOnStr
Definition RTextRenderer.h:282
static QRegularExpression rxAlignmentCenter
Definition RTextRenderer.h:246
bool draft
Definition RTextRenderer.h:368
void setBlockFontFile(const QString &f)
Definition RTextRenderer.h:149
static QRegularExpression rxXAlignmentCenter
Definition RTextRenderer.h:252
static QRegularExpression rxXAlignmentLeft
Definition RTextRenderer.h:250
static QRegularExpression rxXSpaceMText
Definition RTextRenderer.h:256
static QRegularExpression rxObliqueAngleChange
Definition RTextRenderer.h:293
static QString rxBeginBlockStr
Definition RTextRenderer.h:304
static QString escNoOpStr
Definition RTextRenderer.h:334
static QRegularExpression rxAllBreak
Definition RTextRenderer.h:344
static QString rxXFeedStr
Definition RTextRenderer.h:263
static QString rxOverlineOffStr
Definition RTextRenderer.h:280
static QRegularExpression rxXAlignmentRight
Definition RTextRenderer.h:254
double getWidth() const
Definition RTextRenderer.h:75
QList< RTextLayout > getTextLayouts() const
Definition RTextRenderer.h:59
static QString rxHeightChangeStr
Definition RTextRenderer.h:265
static QRegularExpression rxBackslash
Definition RTextRenderer.h:309
bool getBlockBold() const
Definition RTextRenderer.h:181
static QMutex m
Definition RTextRenderer.h:351
static QString rxParagraphFeedStr
Definition RTextRenderer.h:261
static QString rxCurlyCloseStr
Definition RTextRenderer.h:312
static QString rxNonBreakingSpaceStr
Definition RTextRenderer.h:276
static QRegularExpression rxFontChangeCad
Definition RTextRenderer.h:301
QStack< QStringList > openTags
Definition RTextRenderer.h:380
QString getRichText() const
Definition RTextRenderer.h:79
static QRegularExpression rxUnderlineOff
Definition RTextRenderer.h:285
static QRegularExpression rxFontChangeTtf
Definition RTextRenderer.h:303
static QRegularExpression rxParagraphFeed
Definition RTextRenderer.h:262
static QRegularExpression rxPlusMinus
Definition RTextRenderer.h:319
double height
Definition RTextRenderer.h:366
static QRegularExpression rxOptionalBreak
Definition RTextRenderer.h:339
static QRegularExpression rxHeightChange
Definition RTextRenderer.h:266
QStack< QString > blockFont
Definition RTextRenderer.h:375
static QString rxAllStr
Definition RTextRenderer.h:341
static QRegularExpression rxOverlineOn
Definition RTextRenderer.h:279
static QString rxDiameterStr
Definition RTextRenderer.h:322
QList< RPainterPath > getPainterPaths() const
Definition RTextRenderer.h:55
static QRegularExpression rxAlignmentChange
Definition RTextRenderer.h:297
static QChar chDiameter
Definition RTextRenderer.h:348
static QString rxOverlineOnStr
Definition RTextRenderer.h:278
static QRegularExpression rxStackedText
Definition RTextRenderer.h:271
static QString rxAlignmentChangeStr
Definition RTextRenderer.h:296
static QRegularExpression rxDiameter
Definition RTextRenderer.h:323
static QString rxLineFeedStr
Definition RTextRenderer.h:241
static QString rxCurlyOpenStr
Definition RTextRenderer.h:310
void setBlockItalic(bool on)
Definition RTextRenderer.h:188
QStack< bool > blockItalic
Definition RTextRenderer.h:378
double width
Definition RTextRenderer.h:367
static QString rxEndBlockStr
Definition RTextRenderer.h:306
static QString rxStrikethroughOffStr
Definition RTextRenderer.h:288
static QString rxAlignmentLeftStr
Definition RTextRenderer.h:243
static QRegularExpression rxUnderline
Definition RTextRenderer.h:327
static QString rxXAlignmentCenterStr
Definition RTextRenderer.h:251
static QString rxDegreeStr
Definition RTextRenderer.h:314
QString getBlockFont() const
Definition RTextRenderer.h:142
static QChar chPlusMinus
Definition RTextRenderer.h:347
Target target
Definition RTextRenderer.h:355
QStack< bool > useCadFont
Definition RTextRenderer.h:372
double fontHeightFactor
Definition RTextRenderer.h:370
QList< QTransform > lineBlockTransforms
Definition RTextRenderer.h:363
static QString rxStrikethroughOnStr
Definition RTextRenderer.h:286
#define QCADCORE_EXPORT
Definition core_global.h:10