text/qrawfont.cpp

Source codeSwitch to Preprocessed file
LineSource CodeCoverage
1/**************************************************************************** -
2** -
3** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -
4** Contact: http://www.qt-project.org/legal -
5** -
6** This file is part of the QtGui module of the Qt Toolkit. -
7** -
8** $QT_BEGIN_LICENSE:LGPL$ -
9** Commercial License Usage -
10** Licensees holding valid commercial Qt licenses may use this file in -
11** accordance with the commercial license agreement provided with the -
12** Software or, alternatively, in accordance with the terms contained in -
13** a written agreement between you and Digia. For licensing terms and -
14** conditions see http://qt.digia.com/licensing. For further information -
15** use the contact form at http://qt.digia.com/contact-us. -
16** -
17** GNU Lesser General Public License Usage -
18** Alternatively, this file may be used under the terms of the GNU Lesser -
19** General Public License version 2.1 as published by the Free Software -
20** Foundation and appearing in the file LICENSE.LGPL included in the -
21** packaging of this file. Please review the following information to -
22** ensure the GNU Lesser General Public License version 2.1 requirements -
23** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -
24** -
25** In addition, as a special exception, Digia gives you certain additional -
26** rights. These rights are described in the Digia Qt LGPL Exception -
27** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -
28** -
29** GNU General Public License Usage -
30** Alternatively, this file may be used under the terms of the GNU -
31** General Public License version 3.0 as published by the Free Software -
32** Foundation and appearing in the file LICENSE.GPL included in the -
33** packaging of this file. Please review the following information to -
34** ensure the GNU General Public License version 3.0 requirements will be -
35** met: http://www.gnu.org/copyleft/gpl.html. -
36** -
37** -
38** $QT_END_LICENSE$ -
39** -
40****************************************************************************/ -
41 -
42#include "qglobal.h" -
43 -
44#if !defined(QT_NO_RAWFONT) -
45 -
46#include "qrawfont.h" -
47#include "qrawfont_p.h" -
48 -
49#include <QtCore/qendian.h> -
50 -
51QT_BEGIN_NAMESPACE -
52 -
53/*! -
54 \class QRawFont -
55 \brief The QRawFont class provides access to a single physical instance of a font. -
56 \since 4.8 -
57 \inmodule QtGui -
58 -
59 \ingroup text -
60 \ingroup shared -
61 \mainclass -
62 -
63 \note QRawFont is a low level class. For most purposes QFont is a more appropriate class. -
64 -
65 Most commonly, when presenting text in a user interface, the exact fonts used -
66 to render the characters is to some extent unknown. This can be the case for several -
67 reasons: For instance, the actual, physical fonts present on the target system could be -
68 unexpected to the developers, or the text could contain user selected styles, sizes or -
69 writing systems that are not supported by font chosen in the code. -
70 -
71 Therefore, Qt's QFont class really represents a query for fonts. When text is interpreted, -
72 Qt will do its best to match the text to the query, but depending on the support, different -
73 fonts can be used behind the scenes. -
74 -
75 For most use cases, this is both expected and necessary, as it minimizes the possibility of -
76 text in the user interface being undisplayable. In some cases, however, more direct control -
77 over the process might be useful. It is for these use cases the QRawFont class exists. -
78 -
79 A QRawFont object represents a single, physical instance of a given font in a given pixel size. -
80 I.e. in the typical case it represents a set of TrueType or OpenType font tables and uses a -
81 user specified pixel size to convert metrics into logical pixel units. It can be used in -
82 combination with the QGlyphRun class to draw specific glyph indexes at specific positions, and -
83 also have accessors to some relevant data in the physical font. -
84 -
85 QRawFont only provides support for the main font technologies: GDI and DirectWrite on Windows -
86 platforms, FreeType on Linux platforms and CoreText on Mac OS X. For other -
87 font back-ends, the APIs will be disabled. -
88 -
89 QRawFont can be constructed in a number of ways: -
90 \list -
91 \li It can be constructed by calling QTextLayout::glyphs() or QTextFragment::glyphs(). The -
92 returned QGlyphs objects will contain QRawFont objects which represent the actual fonts -
93 used to render each portion of the text. -
94 \li It can be constructed by passing a QFont object to QRawFont::fromFont(). The function -
95 will return a QRawFont object representing the font that will be selected as response to -
96 the QFont query and the selected writing system. -
97 \li It can be constructed by passing a file name or QByteArray directly to the QRawFont -
98 constructor, or by calling loadFromFile() or loadFromData(). In this case, the -
99 font will not be registered in QFontDatabase, and it will not be available as part of -
100 regular font selection. -
101 \endlist -
102 -
103 QRawFont is considered local to the thread in which it is constructed (either using a -
104 constructor, or by calling loadFromData() or loadFromFile()). The QRawFont cannot be moved to a -
105 different thread, but will have to be recreated in the thread in question. -
106 -
107 \note For the requirement of caching glyph indexes and font selections for static text to avoid -
108 reshaping and relayouting in the inner loop of an application, a better choice is the QStaticText -
109 class, since it optimizes the memory cost of the cache and also provides the possibility of paint -
110 engine specific caches for an additional speed-up. -
111*/ -
112 -
113/*! -
114 \enum QRawFont::AntialiasingType -
115 -
116 This enum represents the different ways a glyph can be rasterized in the function -
117 alphaMapForGlyph(). -
118 -
119 \value PixelAntialiasing Will rasterize by measuring the coverage of the shape on whole pixels. -
120 The returned image contains the alpha values of each pixel based on the coverage of -
121 the glyph shape. -
122 \value SubPixelAntialiasing Will rasterize by measuring the coverage of each subpixel, -
123 returning a separate alpha value for each of the red, green and blue components of -
124 each pixel. -
125*/ -
126 -
127/*! -
128 Constructs an invalid QRawFont. -
129*/ -
130QRawFont::QRawFont() -
131 : d(new QRawFontPrivate) -
132{ -
133}
executed: }
Execution Count:203591
203591
134 -
135/*! -
136 Constructs a QRawFont representing the font contained in the file referenced -
137 by \a fileName for the size (in pixels) given by \a pixelSize, and using the -
138 hinting preference specified by \a hintingPreference. -
139 -
140 \note The referenced file must contain a TrueType or OpenType font. -
141*/ -
142QRawFont::QRawFont(const QString &fileName, -
143 qreal pixelSize, -
144 QFont::HintingPreference hintingPreference) -
145 : d(new QRawFontPrivate) -
146{ -
147 loadFromFile(fileName, pixelSize, hintingPreference);
executed (the execution status of this line is deduced): loadFromFile(fileName, pixelSize, hintingPreference);
-
148}
executed: }
Execution Count:1233
1233
149 -
150/*! -
151 Constructs a QRawFont representing the font contained in the supplied -
152 \a fontData for the size (in pixels) given by \a pixelSize, and using the -
153 hinting preference specified by \a hintingPreference. -
154 -
155 \note The data must contain a TrueType or OpenType font. -
156*/ -
157QRawFont::QRawFont(const QByteArray &fontData, -
158 qreal pixelSize, -
159 QFont::HintingPreference hintingPreference) -
160 : d(new QRawFontPrivate) -
161{ -
162 loadFromData(fontData, pixelSize, hintingPreference);
never executed (the execution status of this line is deduced): loadFromData(fontData, pixelSize, hintingPreference);
-
163}
never executed: }
0
164 -
165/*! -
166 Creates a QRawFont which is a copy of \a other. -
167*/ -
168QRawFont::QRawFont(const QRawFont &other) -
169{ -
170 d = other.d;
executed (the execution status of this line is deduced): d = other.d;
-
171}
executed: }
Execution Count:70
70
172 -
173/*! -
174 Destroys the QRawFont -
175*/ -
176QRawFont::~QRawFont() -
177{ -
178} -
179 -
180/*! -
181 Assigns \a other to this QRawFont. -
182*/ -
183QRawFont &QRawFont::operator=(const QRawFont &other) -
184{ -
185 d = other.d;
executed (the execution status of this line is deduced): d = other.d;
-
186 return *this;
executed: return *this;
Execution Count:50
50
187} -
188 -
189/*! -
190 \fn void QRawFont::swap(QRawFont &other) -
191 \since 5.0 -
192 -
193 Swaps this raw font with \a other. This function is very fast and -
194 never fails. -
195*/ -
196 -
197/*! -
198 Returns true if the QRawFont is valid and false otherwise. -
199*/ -
200bool QRawFont::isValid() const -
201{ -
202 return d->isValid();
executed: return d->isValid();
Execution Count:1292
1292
203} -
204 -
205/*! -
206 Replaces the current QRawFont with the contents of the file referenced -
207 by \a fileName for the size (in pixels) given by \a pixelSize, and using the -
208 hinting preference specified by \a hintingPreference. -
209 -
210 The file must reference a TrueType or OpenType font. -
211 -
212 \sa loadFromData() -
213*/ -
214void QRawFont::loadFromFile(const QString &fileName, -
215 qreal pixelSize, -
216 QFont::HintingPreference hintingPreference) -
217{ -
218 QFile file(fileName);
executed (the execution status of this line is deduced): QFile file(fileName);
-
219 if (file.open(QIODevice::ReadOnly))
partially evaluated: file.open(QIODevice::ReadOnly)
TRUEFALSE
yes
Evaluation Count:1245
no
Evaluation Count:0
0-1245
220 loadFromData(file.readAll(), pixelSize, hintingPreference);
executed: loadFromData(file.readAll(), pixelSize, hintingPreference);
Execution Count:1245
1245
221}
executed: }
Execution Count:1245
1245
222 -
223/*! -
224 Replaces the current QRawFont with the font contained in the supplied -
225 \a fontData for the size (in pixels) given by \a pixelSize, and using the -
226 hinting preference specified by \a hintingPreference. -
227 -
228 The \a fontData must contain a TrueType or OpenType font. -
229 -
230 \sa loadFromFile() -
231*/ -
232void QRawFont::loadFromData(const QByteArray &fontData, -
233 qreal pixelSize, -
234 QFont::HintingPreference hintingPreference) -
235{ -
236 d.detach();
executed (the execution status of this line is deduced): d.detach();
-
237 d->cleanUp();
executed (the execution status of this line is deduced): d->cleanUp();
-
238 d->hintingPreference = hintingPreference;
executed (the execution status of this line is deduced): d->hintingPreference = hintingPreference;
-
239 d->thread = QThread::currentThread();
executed (the execution status of this line is deduced): d->thread = QThread::currentThread();
-
240 d->platformLoadFromData(fontData, pixelSize, hintingPreference);
executed (the execution status of this line is deduced): d->platformLoadFromData(fontData, pixelSize, hintingPreference);
-
241}
executed: }
Execution Count:1247
1247
242 -
243/*! -
244 This function returns a rasterized image of the glyph at the given -
245 \a glyphIndex in the underlying font, using the \a transform specified. -
246 If the QRawFont is not valid, this function will return an invalid QImage. -
247 -
248 If \a antialiasingType is set to QRawFont::SubPixelAntialiasing, then the resulting image will be -
249 in QImage::Format_RGB32 and the RGB values of each pixel will represent the subpixel opacities of -
250 the pixel in the rasterization of the glyph. Otherwise, the image will be in the format of -
251 QImage::Format_Indexed8 and each pixel will contain the opacity of the pixel in the -
252 rasterization. -
253 -
254 \sa pathForGlyph(), QPainter::drawGlyphRun() -
255*/ -
256QImage QRawFont::alphaMapForGlyph(quint32 glyphIndex, AntialiasingType antialiasingType, -
257 const QTransform &transform) const -
258{ -
259 if (!d->isValid())
never evaluated: !d->isValid()
0
260 return QImage();
never executed: return QImage();
0
261 -
262 if (antialiasingType == SubPixelAntialiasing)
never evaluated: antialiasingType == SubPixelAntialiasing
0
263 return d->fontEngine->alphaRGBMapForGlyph(glyphIndex, QFixed(), transform);
never executed: return d->fontEngine->alphaRGBMapForGlyph(glyphIndex, QFixed(), transform);
0
264 -
265 return d->fontEngine->alphaMapForGlyph(glyphIndex, QFixed(), transform);
never executed: return d->fontEngine->alphaMapForGlyph(glyphIndex, QFixed(), transform);
0
266} -
267 -
268/*! -
269 This function returns the shape of the glyph at a given \a glyphIndex in the underlying font -
270 if the QRawFont is valid. Otherwise, it returns an empty QPainterPath. -
271 -
272 The returned glyph will always be unhinted. -
273 -
274 \sa alphaMapForGlyph(), QPainterPath::addText() -
275*/ -
276QPainterPath QRawFont::pathForGlyph(quint32 glyphIndex) const -
277{ -
278 if (!d->isValid())
never evaluated: !d->isValid()
0
279 return QPainterPath();
never executed: return QPainterPath();
0
280 -
281 QFixedPoint position;
never executed (the execution status of this line is deduced): QFixedPoint position;
-
282 QPainterPath path;
never executed (the execution status of this line is deduced): QPainterPath path;
-
283 d->fontEngine->addGlyphsToPath(&glyphIndex, &position, 1, &path, 0);
never executed (the execution status of this line is deduced): d->fontEngine->addGlyphsToPath(&glyphIndex, &position, 1, &path, 0);
-
284 return path;
never executed: return path;
0
285} -
286 -
287/*! -
288 Returns true if this QRawFont is equal to \a other. Otherwise, returns false. -
289*/ -
290bool QRawFont::operator==(const QRawFont &other) const -
291{ -
292 return d->fontEngine == other.d->fontEngine;
executed: return d->fontEngine == other.d->fontEngine;
Execution Count:7
7
293} -
294 -
295/*! -
296 \fn bool QRawFont::operator!=(const QRawFont &other) const -
297 -
298 Returns true if this QRawFont is not equal to \a other. Otherwise, returns false. -
299*/ -
300 -
301/*! -
302 Returns the ascent of this QRawFont in pixel units. -
303 -
304 \sa QFontMetricsF::ascent() -
305*/ -
306qreal QRawFont::ascent() const -
307{ -
308 return d->isValid() ? d->fontEngine->ascent().toReal() : 0.0;
executed: return d->isValid() ? d->fontEngine->ascent().toReal() : 0.0;
Execution Count:79
79
309} -
310 -
311/*! -
312 Returns the descent of this QRawFont in pixel units. -
313 -
314 \sa QFontMetricsF::descent() -
315*/ -
316qreal QRawFont::descent() const -
317{ -
318 return d->isValid() ? d->fontEngine->descent().toReal() : 0.0;
executed: return d->isValid() ? d->fontEngine->descent().toReal() : 0.0;
Execution Count:56
56
319} -
320 -
321/*! -
322 Returns the xHeight of this QRawFont in pixel units. -
323 -
324 \sa QFontMetricsF::xHeight() -
325*/ -
326qreal QRawFont::xHeight() const -
327{ -
328 return d->isValid() ? d->fontEngine->xHeight().toReal() : 0.0;
never executed: return d->isValid() ? d->fontEngine->xHeight().toReal() : 0.0;
0
329} -
330 -
331/*! -
332 Returns the leading of this QRawFont in pixel units. -
333 -
334 \sa QFontMetricsF::leading() -
335*/ -
336qreal QRawFont::leading() const -
337{ -
338 return d->isValid() ? d->fontEngine->leading().toReal() : 0.0;
never executed: return d->isValid() ? d->fontEngine->leading().toReal() : 0.0;
0
339} -
340 -
341/*! -
342 Returns the average character width of this QRawFont in pixel units. -
343 -
344 \sa QFontMetricsF::averageCharWidth() -
345*/ -
346qreal QRawFont::averageCharWidth() const -
347{ -
348 return d->isValid() ? d->fontEngine->averageCharWidth().toReal() : 0.0;
never executed: return d->isValid() ? d->fontEngine->averageCharWidth().toReal() : 0.0;
0
349} -
350 -
351/*! -
352 Returns the width of the widest character in the font. -
353 -
354 \sa QFontMetricsF::maxWidth() -
355*/ -
356qreal QRawFont::maxCharWidth() const -
357{ -
358 return d->isValid() ? d->fontEngine->maxCharWidth() : 0.0;
never executed: return d->isValid() ? d->fontEngine->maxCharWidth() : 0.0;
0
359} -
360 -
361/*! -
362 Returns the pixel size set for this QRawFont. The pixel size affects how glyphs are -
363 rasterized, the size of glyphs returned by pathForGlyph(), and is used to convert -
364 internal metrics from design units to logical pixel units. -
365 -
366 \sa setPixelSize() -
367*/ -
368qreal QRawFont::pixelSize() const -
369{ -
370 return d->isValid() ? d->fontEngine->fontDef.pixelSize : 0.0;
executed: return d->isValid() ? d->fontEngine->fontDef.pixelSize : 0.0;
Execution Count:79
79
371} -
372 -
373/*! -
374 Returns the number of design units define the width and height of the em square -
375 for this QRawFont. This value is used together with the pixel size when converting design metrics -
376 to pixel units, as the internal metrics are specified in design units and the pixel size gives -
377 the size of 1 em in pixels. -
378 -
379 \sa pixelSize(), setPixelSize() -
380*/ -
381qreal QRawFont::unitsPerEm() const -
382{ -
383 return d->isValid() ? d->fontEngine->emSquareSize().toReal() : 0.0;
executed: return d->isValid() ? d->fontEngine->emSquareSize().toReal() : 0.0;
Execution Count:8
8
384} -
385 -
386/*! -
387 Returns the thickness for drawing lines (underline, overline, etc.) -
388 along with text drawn in this font. -
389 */ -
390qreal QRawFont::lineThickness() const -
391{ -
392 return d->isValid() ? d->fontEngine->lineThickness().toReal() : 0.0;
never executed: return d->isValid() ? d->fontEngine->lineThickness().toReal() : 0.0;
0
393} -
394 -
395/*! -
396 Returns the position from baseline for drawing underlines below the text -
397 rendered with this font. -
398 */ -
399qreal QRawFont::underlinePosition() const -
400{ -
401 return d->isValid() ? d->fontEngine->underlinePosition().toReal() : 0.0;
never executed: return d->isValid() ? d->fontEngine->underlinePosition().toReal() : 0.0;
0
402} -
403 -
404/*! -
405 Returns the family name of this QRawFont. -
406*/ -
407QString QRawFont::familyName() const -
408{ -
409 return d->isValid() ? d->fontEngine->fontDef.family : QString();
executed: return d->isValid() ? d->fontEngine->fontDef.family : QString();
Execution Count:84
84
410} -
411 -
412/*! -
413 Returns the style name of this QRawFont. -
414 -
415 \sa QFont::styleName() -
416*/ -
417QString QRawFont::styleName() const -
418{ -
419 return d->isValid() ? d->fontEngine->fontDef.styleName : QString();
never executed: return d->isValid() ? d->fontEngine->fontDef.styleName : QString();
0
420} -
421 -
422/*! -
423 Returns the style of this QRawFont. -
424 -
425 \sa QFont::style() -
426*/ -
427QFont::Style QRawFont::style() const -
428{ -
429 return d->isValid() ? QFont::Style(d->fontEngine->fontDef.style) : QFont::StyleNormal;
executed: return d->isValid() ? QFont::Style(d->fontEngine->fontDef.style) : QFont::StyleNormal;
Execution Count:11
11
430} -
431 -
432/*! -
433 Returns the weight of this QRawFont. -
434 -
435 \sa QFont::weight() -
436*/ -
437int QRawFont::weight() const -
438{ -
439 return d->isValid() ? int(d->fontEngine->fontDef.weight) : -1;
executed: return d->isValid() ? int(d->fontEngine->fontDef.weight) : -1;
Execution Count:9
9
440} -
441 -
442/*! -
443 Converts the string of unicode points given by \a text to glyph indexes -
444 using the CMAP table in the underlying font, and returns a vector containing -
445 the result. -
446 -
447 Note that, in cases where there are other tables in the font that affect the -
448 shaping of the text, the returned glyph indexes will not correctly represent -
449 the rendering of the text. To get the correctly shaped text, you can use -
450 QTextLayout to lay out and shape the text, then call QTextLayout::glyphs() -
451 to get the set of glyph index list and QRawFont pairs. -
452 -
453 \sa advancesForGlyphIndexes(), glyphIndexesForChars(), QGlyphRun, QTextLayout::glyphRuns(), QTextFragment::glyphRuns() -
454*/ -
455QVector<quint32> QRawFont::glyphIndexesForString(const QString &text) const -
456{ -
457 QVector<quint32> glyphIndexes;
executed (the execution status of this line is deduced): QVector<quint32> glyphIndexes;
-
458 if (!d->isValid() || text.isEmpty())
evaluated: !d->isValid()
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:3
evaluated: text.isEmpty()
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:2
1-3
459 return glyphIndexes;
executed: return glyphIndexes;
Execution Count:2
2
460 -
461 int numGlyphs = text.size();
executed (the execution status of this line is deduced): int numGlyphs = text.size();
-
462 glyphIndexes.resize(numGlyphs);
executed (the execution status of this line is deduced): glyphIndexes.resize(numGlyphs);
-
463 -
464 QGlyphLayout glyphs;
executed (the execution status of this line is deduced): QGlyphLayout glyphs;
-
465 glyphs.numGlyphs = numGlyphs;
executed (the execution status of this line is deduced): glyphs.numGlyphs = numGlyphs;
-
466 glyphs.glyphs = glyphIndexes.data();
executed (the execution status of this line is deduced): glyphs.glyphs = glyphIndexes.data();
-
467 if (!d->fontEngine->stringToCMap(text.data(), text.size(), &glyphs, &numGlyphs, QFontEngine::GlyphIndicesOnly)) {
partially evaluated: !d->fontEngine->stringToCMap(text.data(), text.size(), &glyphs, &numGlyphs, QFontEngine::GlyphIndicesOnly)
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:2
0-2
468 glyphIndexes.resize(numGlyphs);
never executed (the execution status of this line is deduced): glyphIndexes.resize(numGlyphs);
-
469 -
470 glyphs.numGlyphs = numGlyphs;
never executed (the execution status of this line is deduced): glyphs.numGlyphs = numGlyphs;
-
471 glyphs.glyphs = glyphIndexes.data();
never executed (the execution status of this line is deduced): glyphs.glyphs = glyphIndexes.data();
-
472 if (!d->fontEngine->stringToCMap(text.data(), text.size(), &glyphs, &numGlyphs, QFontEngine::GlyphIndicesOnly)) {
never evaluated: !d->fontEngine->stringToCMap(text.data(), text.size(), &glyphs, &numGlyphs, QFontEngine::GlyphIndicesOnly)
0
473 Q_ASSERT_X(false, Q_FUNC_INFO, "stringToCMap shouldn't fail twice");
never executed (the execution status of this line is deduced): qt_noop();
-
474 return QVector<quint32>();
never executed: return QVector<quint32>();
0
475 } -
476 }
never executed: }
0
477 -
478 glyphIndexes.resize(numGlyphs);
executed (the execution status of this line is deduced): glyphIndexes.resize(numGlyphs);
-
479 return glyphIndexes;
executed: return glyphIndexes;
Execution Count:2
2
480} -
481 -
482/*! -
483 Converts a string of unicode points to glyph indexes using the CMAP table in the -
484 underlying font. The function works like glyphIndexesForString() except it take -
485 an array (\a chars), the results will be returned though \a glyphIndexes array -
486 and number of glyphs will be set in \a numGlyphs. The size of \a glyphIndexes array -
487 must be at least \a numChars, if that's still not enough, this function will return -
488 false, then you can resize \a glyphIndexes from the size returned in \a numGlyphs. -
489 -
490 \sa glyphIndexesForString(), advancesForGlyphIndexes(), QGlyphRun, QTextLayout::glyphRuns(), QTextFragment::glyphRuns() -
491*/ -
492bool QRawFont::glyphIndexesForChars(const QChar *chars, int numChars, quint32 *glyphIndexes, int *numGlyphs) const -
493{ -
494 Q_ASSERT(numGlyphs);
executed (the execution status of this line is deduced): qt_noop();
-
495 if (!d->isValid() || numChars <= 0) {
partially evaluated: !d->isValid()
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:3
evaluated: numChars <= 0
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:2
0-3
496 *numGlyphs = 0;
executed (the execution status of this line is deduced): *numGlyphs = 0;
-
497 return false;
executed: return false;
Execution Count:1
1
498 } -
499 -
500 if (*numGlyphs <= 0 || !glyphIndexes) {
evaluated: *numGlyphs <= 0
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:1
partially evaluated: !glyphIndexes
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:1
0-1
501 *numGlyphs = numChars;
executed (the execution status of this line is deduced): *numGlyphs = numChars;
-
502 return false;
executed: return false;
Execution Count:1
1
503 } -
504 -
505 QGlyphLayout glyphs;
executed (the execution status of this line is deduced): QGlyphLayout glyphs;
-
506 glyphs.numGlyphs = *numGlyphs;
executed (the execution status of this line is deduced): glyphs.numGlyphs = *numGlyphs;
-
507 glyphs.glyphs = glyphIndexes;
executed (the execution status of this line is deduced): glyphs.glyphs = glyphIndexes;
-
508 return d->fontEngine->stringToCMap(chars, numChars, &glyphs, numGlyphs, QFontEngine::GlyphIndicesOnly);
executed: return d->fontEngine->stringToCMap(chars, numChars, &glyphs, numGlyphs, QFontEngine::GlyphIndicesOnly);
Execution Count:1
1
509} -
510 -
511/*! -
512 \fn QVector<QPointF> QRawFont::advancesForGlyphIndexes(const QVector<quint32> &glyphIndexes) const -
513 -
514 Returns the QRawFont's advances for each of the \a glyphIndexes in pixel units. The advances -
515 give the distance from the position of a given glyph to where the next glyph should be drawn -
516 to make it appear as if the two glyphs are unspaced. -
517 -
518 \sa QTextLine::horizontalAdvance(), QFontMetricsF::width() -
519*/ -
520 -
521/*! -
522 Returns the QRawFont's advances for each of the \a glyphIndexes in pixel units. The advances -
523 give the distance from the position of a given glyph to where the next glyph should be drawn -
524 to make it appear as if the two glyphs are unspaced. The glyph indexes are given with the -
525 array \a glyphIndexes while the results are returned through \a advances, both of them must -
526 have \a numGlyphs elements. -
527 -
528 \sa QTextLine::horizontalAdvance(), QFontMetricsF::width() -
529*/ -
530bool QRawFont::advancesForGlyphIndexes(const quint32 *glyphIndexes, QPointF *advances, int numGlyphs) const -
531{ -
532 Q_ASSERT(glyphIndexes && advances);
executed (the execution status of this line is deduced): qt_noop();
-
533 if (!d->isValid() || numGlyphs <= 0)
partially evaluated: !d->isValid()
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:17
evaluated: numGlyphs <= 0
TRUEFALSE
yes
Evaluation Count:8
yes
Evaluation Count:9
0-17
534 return false;
executed: return false;
Execution Count:8
8
535 -
536 QGlyphLayout glyphs;
executed (the execution status of this line is deduced): QGlyphLayout glyphs;
-
537 glyphs.glyphs = const_cast<HB_Glyph *>(glyphIndexes);
executed (the execution status of this line is deduced): glyphs.glyphs = const_cast<HB_Glyph *>(glyphIndexes);
-
538 glyphs.numGlyphs = numGlyphs;
executed (the execution status of this line is deduced): glyphs.numGlyphs = numGlyphs;
-
539 QVarLengthArray<QFixed> advances_x(numGlyphs);
executed (the execution status of this line is deduced): QVarLengthArray<QFixed> advances_x(numGlyphs);
-
540 QVarLengthArray<QFixed> advances_y(numGlyphs);
executed (the execution status of this line is deduced): QVarLengthArray<QFixed> advances_y(numGlyphs);
-
541 glyphs.advances_x = advances_x.data();
executed (the execution status of this line is deduced): glyphs.advances_x = advances_x.data();
-
542 glyphs.advances_y = advances_y.data();
executed (the execution status of this line is deduced): glyphs.advances_y = advances_y.data();
-
543 -
544 d->fontEngine->recalcAdvances(&glyphs, 0);
executed (the execution status of this line is deduced): d->fontEngine->recalcAdvances(&glyphs, 0);
-
545 -
546 for (int i=0; i<numGlyphs; ++i)
evaluated: i<numGlyphs
TRUEFALSE
yes
Evaluation Count:53
yes
Evaluation Count:9
9-53
547 advances[i] = QPointF(glyphs.advances_x[i].toReal(), glyphs.advances_y[i].toReal());
executed: advances[i] = QPointF(glyphs.advances_x[i].toReal(), glyphs.advances_y[i].toReal());
Execution Count:53
53
548 -
549 return true;
executed: return true;
Execution Count:9
9
550} -
551 -
552/*! -
553 Returns the hinting preference used to construct this QRawFont. -
554 -
555 \sa QFont::hintingPreference() -
556*/ -
557QFont::HintingPreference QRawFont::hintingPreference() const -
558{ -
559 return d->isValid() ? d->hintingPreference : QFont::PreferDefaultHinting;
executed: return d->isValid() ? d->hintingPreference : QFont::PreferDefaultHinting;
Execution Count:32
32
560} -
561 -
562/*! -
563 Retrieves the sfnt table named \a tagName from the underlying physical font, or an empty -
564 byte array if no such table was found. The returned font table's byte order is Big Endian, like -
565 the sfnt format specifies. The \a tagName must be four characters long and should be formatted -
566 in the default endianness of the current platform. -
567*/ -
568QByteArray QRawFont::fontTable(const char *tagName) const -
569{ -
570 if (!d->isValid())
partially evaluated: !d->isValid()
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:44
0-44
571 return QByteArray();
never executed: return QByteArray();
0
572 -
573 const quint32 *tagId = reinterpret_cast<const quint32 *>(tagName);
executed (the execution status of this line is deduced): const quint32 *tagId = reinterpret_cast<const quint32 *>(tagName);
-
574 return d->fontEngine->getSfntTable(qToBigEndian(*tagId));
executed: return d->fontEngine->getSfntTable(qToBigEndian(*tagId));
Execution Count:44
44
575} -
576 -
577// From qfontdatabase.cpp -
578extern QList<QFontDatabase::WritingSystem> qt_determine_writing_systems_from_truetype_bits(quint32 unicodeRange[4], quint32 codePageRange[2]); -
579 -
580/*! -
581 Returns a list of writing systems supported by the font according to designer supplied -
582 information in the font file. Please note that this does not guarantee support for a -
583 specific unicode point in the font. You can use the supportsCharacter() to check support -
584 for a single, specific character. -
585 -
586 \note The list is determined based on the unicode ranges and codepage ranges set in the font's -
587 OS/2 table and requires such a table to be present in the underlying font file. -
588 -
589 \sa supportsCharacter() -
590*/ -
591QList<QFontDatabase::WritingSystem> QRawFont::supportedWritingSystems() const -
592{ -
593 if (d->isValid()) {
partially evaluated: d->isValid()
TRUEFALSE
yes
Evaluation Count:8
no
Evaluation Count:0
0-8
594 QByteArray os2Table = fontTable("OS/2");
executed (the execution status of this line is deduced): QByteArray os2Table = fontTable("OS/2");
-
595 if (os2Table.size() > 86) {
partially evaluated: os2Table.size() > 86
TRUEFALSE
yes
Evaluation Count:8
no
Evaluation Count:0
0-8
596 char *data = os2Table.data();
executed (the execution status of this line is deduced): char *data = os2Table.data();
-
597 quint32 *bigEndianUnicodeRanges = reinterpret_cast<quint32 *>(data + 42);
executed (the execution status of this line is deduced): quint32 *bigEndianUnicodeRanges = reinterpret_cast<quint32 *>(data + 42);
-
598 quint32 *bigEndianCodepageRanges = reinterpret_cast<quint32 *>(data + 78);
executed (the execution status of this line is deduced): quint32 *bigEndianCodepageRanges = reinterpret_cast<quint32 *>(data + 78);
-
599 -
600 quint32 unicodeRanges[4];
executed (the execution status of this line is deduced): quint32 unicodeRanges[4];
-
601 quint32 codepageRanges[2];
executed (the execution status of this line is deduced): quint32 codepageRanges[2];
-
602 -
603 for (int i=0; i<4; ++i) {
evaluated: i<4
TRUEFALSE
yes
Evaluation Count:32
yes
Evaluation Count:8
8-32
604 if (i < 2)
evaluated: i < 2
TRUEFALSE
yes
Evaluation Count:16
yes
Evaluation Count:16
16
605 codepageRanges[i] = qFromBigEndian(bigEndianCodepageRanges[i]);
executed: codepageRanges[i] = qFromBigEndian(bigEndianCodepageRanges[i]);
Execution Count:16
16
606 unicodeRanges[i] = qFromBigEndian(bigEndianUnicodeRanges[i]);
executed (the execution status of this line is deduced): unicodeRanges[i] = qFromBigEndian(bigEndianUnicodeRanges[i]);
-
607 }
executed: }
Execution Count:32
32
608 -
609 return qt_determine_writing_systems_from_truetype_bits(unicodeRanges, codepageRanges);
executed: return qt_determine_writing_systems_from_truetype_bits(unicodeRanges, codepageRanges);
Execution Count:8
8
610 } -
611 }
never executed: }
0
612 -
613 return QList<QFontDatabase::WritingSystem>();
never executed: return QList<QFontDatabase::WritingSystem>();
0
614} -
615 -
616/*! -
617 Returns true if the font has a glyph that corresponds to the given \a character. -
618 -
619 \sa supportedWritingSystems() -
620*/ -
621bool QRawFont::supportsCharacter(QChar character) const -
622{ -
623 return d->isValid() && d->fontEngine->canRender(&character, 1);
executed: return d->isValid() && d->fontEngine->canRender(&character, 1);
Execution Count:976
976
624} -
625 -
626/*! -
627 \overload -
628 -
629 Returns true if the font has a glyph that corresponds to the UCS-4 encoded character \a ucs4. -
630 -
631 \sa supportedWritingSystems() -
632*/ -
633bool QRawFont::supportsCharacter(uint ucs4) const -
634{ -
635 return d->isValid() && d->fontEngine->canRender(ucs4);
executed: return d->isValid() && d->fontEngine->canRender(ucs4);
Execution Count:216
216
636} -
637 -
638// qfontdatabase.cpp -
639extern int qt_script_for_writing_system(QFontDatabase::WritingSystem writingSystem); -
640 -
641/*! -
642 Fetches the physical representation based on a \a font query. The physical font returned is -
643 the font that will be preferred by Qt in order to display text in the selected \a writingSystem. -
644 -
645 \warning This function is potentially expensive and should not be called in performance -
646 sensitive code. -
647*/ -
648QRawFont QRawFont::fromFont(const QFont &font, QFontDatabase::WritingSystem writingSystem) -
649{ -
650 QRawFont rawFont;
executed (the execution status of this line is deduced): QRawFont rawFont;
-
651 QFontPrivate *font_d = QFontPrivate::get(font);
executed (the execution status of this line is deduced): QFontPrivate *font_d = QFontPrivate::get(font);
-
652 int script = qt_script_for_writing_system(writingSystem);
executed (the execution status of this line is deduced): int script = qt_script_for_writing_system(writingSystem);
-
653 QFontEngine *fe = font_d->engineForScript(script);
executed (the execution status of this line is deduced): QFontEngine *fe = font_d->engineForScript(script);
-
654 -
655 if (fe != 0 && fe->type() == QFontEngine::Multi) {
partially evaluated: fe != 0
TRUEFALSE
yes
Evaluation Count:32
no
Evaluation Count:0
partially evaluated: fe->type() == QFontEngine::Multi
TRUEFALSE
yes
Evaluation Count:32
no
Evaluation Count:0
0-32
656 QFontEngineMulti *multiEngine = static_cast<QFontEngineMulti *>(fe);
executed (the execution status of this line is deduced): QFontEngineMulti *multiEngine = static_cast<QFontEngineMulti *>(fe);
-
657 fe = multiEngine->engine(0);
executed (the execution status of this line is deduced): fe = multiEngine->engine(0);
-
658 if (fe == 0) {
partially evaluated: fe == 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:32
0-32
659 multiEngine->loadEngine(0);
never executed (the execution status of this line is deduced): multiEngine->loadEngine(0);
-
660 fe = multiEngine->engine(0);
never executed (the execution status of this line is deduced): fe = multiEngine->engine(0);
-
661 }
never executed: }
0
662 }
executed: }
Execution Count:32
32
663 -
664 if (fe != 0) {
partially evaluated: fe != 0
TRUEFALSE
yes
Evaluation Count:32
no
Evaluation Count:0
0-32
665 rawFont.d.data()->fontEngine = fe;
executed (the execution status of this line is deduced): rawFont.d.data()->fontEngine = fe;
-
666 rawFont.d.data()->fontEngine->ref.ref();
executed (the execution status of this line is deduced): rawFont.d.data()->fontEngine->ref.ref();
-
667 rawFont.d.data()->hintingPreference = font.hintingPreference();
executed (the execution status of this line is deduced): rawFont.d.data()->hintingPreference = font.hintingPreference();
-
668 }
executed: }
Execution Count:32
32
669 return rawFont;
executed: return rawFont;
Execution Count:32
32
670} -
671 -
672/*! -
673 Sets the pixel size with which this font should be rendered to \a pixelSize. -
674*/ -
675void QRawFont::setPixelSize(qreal pixelSize) -
676{ -
677 if (d->fontEngine == 0 || qFuzzyCompare(d->fontEngine->fontDef.pixelSize, pixelSize))
partially evaluated: d->fontEngine == 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:4
partially evaluated: qFuzzyCompare(d->fontEngine->fontDef.pixelSize, pixelSize)
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:4
0-4
678 return;
never executed: return;
0
679 -
680 d.detach();
executed (the execution status of this line is deduced): d.detach();
-
681 QFontEngine *oldFontEngine = d->fontEngine;
executed (the execution status of this line is deduced): QFontEngine *oldFontEngine = d->fontEngine;
-
682 -
683 d->fontEngine = d->fontEngine->cloneWithSize(pixelSize);
executed (the execution status of this line is deduced): d->fontEngine = d->fontEngine->cloneWithSize(pixelSize);
-
684 if (d->fontEngine != 0)
partially evaluated: d->fontEngine != 0
TRUEFALSE
yes
Evaluation Count:4
no
Evaluation Count:0
0-4
685 d->fontEngine->ref.ref();
executed: d->fontEngine->ref.ref();
Execution Count:4
4
686 -
687 oldFontEngine->ref.deref();
executed (the execution status of this line is deduced): oldFontEngine->ref.deref();
-
688 if (oldFontEngine->cache_count == 0 && oldFontEngine->ref.load() == 0)
partially evaluated: oldFontEngine->cache_count == 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:4
never evaluated: oldFontEngine->ref.load() == 0
0-4
689 delete oldFontEngine;
never executed: delete oldFontEngine;
0
690}
executed: }
Execution Count:4
4
691 -
692/*! -
693 \internal -
694*/ -
695void QRawFontPrivate::cleanUp() -
696{ -
697 platformCleanUp();
executed (the execution status of this line is deduced): platformCleanUp();
-
698 if (fontEngine != 0) {
evaluated: fontEngine != 0
TRUEFALSE
yes
Evaluation Count:1318
yes
Evaluation Count:204750
1318-204750
699 fontEngine->ref.deref();
executed (the execution status of this line is deduced): fontEngine->ref.deref();
-
700 if (fontEngine->cache_count == 0 && fontEngine->ref.load() == 0)
evaluated: fontEngine->cache_count == 0
TRUEFALSE
yes
Evaluation Count:1263
yes
Evaluation Count:55
evaluated: fontEngine->ref.load() == 0
TRUEFALSE
yes
Evaluation Count:1251
yes
Evaluation Count:12
12-1263
701 delete fontEngine;
executed: delete fontEngine;
Execution Count:1251
1251
702 fontEngine = 0;
executed (the execution status of this line is deduced): fontEngine = 0;
-
703 }
executed: }
Execution Count:1318
1318
704 hintingPreference = QFont::PreferDefaultHinting;
executed (the execution status of this line is deduced): hintingPreference = QFont::PreferDefaultHinting;
-
705}
executed: }
Execution Count:206068
206068
706 -
707/*! -
708 Returns the smallest rectangle containing the glyph with the given \a glyphIndex. -
709 -
710 \since 5.0 -
711*/ -
712QRectF QRawFont::boundingRect(quint32 glyphIndex) const -
713{ -
714 if (!isValid())
partially evaluated: !isValid()
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:10
0-10
715 return QRectF();
never executed: return QRectF();
0
716 -
717 glyph_metrics_t gm = d->fontEngine->boundingBox(glyphIndex);
executed (the execution status of this line is deduced): glyph_metrics_t gm = d->fontEngine->boundingBox(glyphIndex);
-
718 return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal());
executed: return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal());
Execution Count:10
10
719} -
720 -
721#endif // QT_NO_RAWFONT -
722 -
723QT_END_NAMESPACE -
724 -
Source codeSwitch to Preprocessed file

Generated by Squish Coco Non-Commercial