Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qtextengine_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QTEXTENGINE_P_H
5#define QTEXTENGINE_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists for the convenience
12// of other Qt classes. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtGui/private/qtguiglobal_p.h>
19#include "QtGui/qpaintengine.h"
20#include "QtGui/qtextcursor.h"
21#include "QtGui/qtextobject.h"
22#include "QtGui/qtextoption.h"
23#include "QtGui/qtextlayout.h"
24
25#include "QtCore/qdebug.h"
26#include "QtCore/qlist.h"
27#include "QtCore/qnamespace.h"
28#include "QtCore/qset.h"
29#include <QtCore/qspan.h>
30#include "QtCore/qstring.h"
31#include "QtCore/qvarlengtharray.h"
32
33#include "private/qfixed_p.h"
34#include "private/qfont_p.h"
35#include "private/qtextformat_p.h"
36#include "private/qunicodetools_p.h"
37#ifndef QT_BUILD_COMPAT_LIB
38#include "private/qtextdocument_p.h"
39#endif
40
41#include <stdlib.h>
42#include <vector>
43
45
46class QFontPrivate;
47class QFontEngine;
48
49class QString;
50class QPainter;
51
53
55
56// this uses the same coordinate system as Qt, but a different one to freetype.
57// * y is usually negative, and is equal to the ascent.
58// * negative yoff means the following stuff is drawn higher up.
59// the characters bounding rect is given by QRect(x,y,width,height), its advance by
60// xoo and yoff
61struct Q_GUI_EXPORT glyph_metrics_t
62{
64 : x(100000), y(100000) {}
65 inline glyph_metrics_t(QFixed _x, QFixed _y, QFixed _width, QFixed _height, QFixed _xoff, QFixed _yoff)
66 : x(_x),
67 y(_y),
68 width(_width),
69 height(_height),
70 xoff(_xoff),
71 yoff(_yoff)
72 {}
79
80 glyph_metrics_t transformed(const QTransform &xform) const;
81 inline bool isValid() const {return x != 100000 && y != 100000;}
82
83 inline QFixed leftBearing() const
84 {
85 if (!isValid())
86 return QFixed();
87
88 return x;
89 }
90
91 inline QFixed rightBearing() const
92 {
93 if (!isValid())
94 return QFixed();
95
96 return xoff - x - width;
97 }
98};
100
102{
103 enum Flags {
104 None = 0,
105 Lowercase = 1,
106 Uppercase = 2,
107 SmallCaps = 3,
108 LineOrParagraphSeparator = 4,
109 Space = 5,
110 SpaceTabOrObject = Space,
111 Nbsp = 6,
112 Tab = 7,
113 TabOrObject = Tab,
114 Object = 8
115 };
117 BidiBN = 1,
118 BidiMaybeResetToParagraphLevel = 2,
119 BidiResetToParagraphLevel = 4,
120 BidiMirrored = 8
121 };
122 unsigned short script : 8;
123 unsigned short flags : 4;
124 unsigned short bidiFlags : 4;
125 unsigned short bidiLevel : 8; // Unicode Bidi algorithm embedding level (0-125)
126 QChar::Direction bidiDirection : 8; // used when running the bidi algorithm
127 inline bool operator == (const QScriptAnalysis &other) const {
128 return script == other.script && bidiLevel == other.bidiLevel && flags == other.flags;
129 }
130};
132
134{
136 : type(0), nKashidas(0), space_18d6(0)
137 {}
138
144
146 uint nKashidas : 6; // more do not make sense...
148};
150
157static_assert(sizeof(QGlyphAttributes) == 1);
159
161{
162 static constexpr qsizetype SpaceNeeded = sizeof(glyph_t) + sizeof(QFixed) + sizeof(QFixedPoint)
163 + sizeof(QGlyphAttributes) + sizeof(QGlyphJustification);
164
165 // init to 0 not needed, done when shaping
166 QFixedPoint *offsets; // 8 bytes per element
167 glyph_t *glyphs; // 4 bytes per element
168 QFixed *advances; // 4 bytes per element
169 QGlyphJustification *justifications; // 4 bytes per element
170 QGlyphAttributes *attributes; // 1 byte per element
171
173
174 inline QGlyphLayout() : numGlyphs(0) {}
175
176 inline explicit QGlyphLayout(char *address, int totalGlyphs)
177 {
178 offsets = reinterpret_cast<QFixedPoint *>(address);
179 qsizetype offset = totalGlyphs * sizeof(QFixedPoint);
180 glyphs = reinterpret_cast<glyph_t *>(address + offset);
181 offset += totalGlyphs * sizeof(glyph_t);
182 advances = reinterpret_cast<QFixed *>(address + offset);
183 offset += totalGlyphs * sizeof(QFixed);
184 justifications = reinterpret_cast<QGlyphJustification *>(address + offset);
185 offset += totalGlyphs * sizeof(QGlyphJustification);
186 attributes = reinterpret_cast<QGlyphAttributes *>(address + offset);
187 numGlyphs = totalGlyphs;
188 }
189
190 inline QGlyphLayout mid(int position, int n = -1) const {
191 QGlyphLayout copy = *this;
193 copy.advances += position;
194 copy.offsets += position;
195 copy.justifications += position;
196 copy.attributes += position;
197 if (n == -1)
198 copy.numGlyphs -= position;
199 else
200 copy.numGlyphs = n;
201 return copy;
202 }
203
204 inline QFixed effectiveAdvance(int item) const
206
207 inline void clear(int first = 0, int last = -1) {
208 if (last == -1)
209 last = numGlyphs;
210 if (first == 0 && last == numGlyphs
211 && reinterpret_cast<char *>(offsets + numGlyphs) == reinterpret_cast<char *>(glyphs)) {
212 memset(static_cast<void *>(offsets), 0, qsizetype(numGlyphs) * SpaceNeeded);
213 } else {
214 const int num = last - first;
215 memset(static_cast<void *>(offsets + first), 0, num * sizeof(QFixedPoint));
216 memset(glyphs + first, 0, num * sizeof(glyph_t));
217 memset(static_cast<void *>(advances + first), 0, num * sizeof(QFixed));
218 memset(static_cast<void *>(justifications + first), 0, num * sizeof(QGlyphJustification));
219 memset(attributes + first, 0, num * sizeof(QGlyphAttributes));
220 }
221 }
222
223 inline char *data() {
224 return reinterpret_cast<char *>(offsets);
225 }
226
227 void copy(QGlyphLayout *other);
228 void grow(char *address, int totalGlyphs);
229};
230
232{
233private:
234 typedef QVarLengthArray<void *> Array;
235public:
237 : Array((totalGlyphs * SpaceNeeded) / sizeof(void *) + 1)
238 , QGlyphLayout(reinterpret_cast<char *>(Array::data()), totalGlyphs)
239 {
240 memset(Array::data(), 0, Array::size() * sizeof(void *));
241 }
242
243 void resize(int totalGlyphs)
244 {
245 Array::resize((totalGlyphs * SpaceNeeded) / sizeof(void *) + 1);
246
247 *((QGlyphLayout *)this) = QGlyphLayout(reinterpret_cast<char *>(Array::data()), totalGlyphs);
248 memset(Array::data(), 0, Array::size() * sizeof(void *));
249 }
250};
251
252template <int N> struct QGlyphLayoutArray : public QGlyphLayout
253{
254public:
256 : QGlyphLayout(reinterpret_cast<char *>(buffer), N)
257 {
258 memset(buffer, 0, sizeof(buffer));
259 }
260
261private:
262 void *buffer[(N * SpaceNeeded) / sizeof(void *) + 1];
263};
264
265struct QScriptItem;
268{
269public:
270 inline QTextItemInt() = default;
272 QTextItemInt(const QGlyphLayout &g, QFont *font, const QChar *chars, int numChars, QFontEngine *fe,
274
278 void initWithScriptItem(const QScriptItem &si);
279
283
284 RenderFlags flags;
285 bool justified = false;
288 int num_chars = 0;
289 const QChar *chars = nullptr;
290 const unsigned short *logClusters = nullptr;
291 const QFont *f = nullptr;
292
295};
296
298{
299 constexpr QScriptItem(int p, QScriptAnalysis a) noexcept
300 : position(p), analysis(a),
301 num_glyphs(0), descent(-1), ascent(-1), leading(-1), width(-1),
303
306 unsigned short num_glyphs;
312 constexpr QFixed height() const noexcept { return ascent + descent; }
313private:
314 friend class QList<QScriptItem>;
315 QScriptItem() {} // for QList, don't use
316};
318
319typedef QList<QScriptItem> QScriptItemArray;
320
322{
323 // created and filled in QTextLine::layout_helper
325 : from(0), trailingSpaces(0), length(0),
326 justified(0), gridfitted(0),
327 hasTrailingSpaces(0), leadingIncluded(0) {}
336 int from;
337 unsigned short trailingSpaces;
338 signed int length : 28;
339 mutable uint justified : 1;
340 mutable uint gridfitted : 1;
343 QFixed height() const { return ascent + descent
344 + (leadingIncluded? qMax(QFixed(),leading) : QFixed()); }
345 QFixed base() const { return ascent; }
346 void setDefaultHeight(QTextEngine *eng);
347 void operator+=(const QScriptLine &other);
348};
350
351
353{
354 leading= qMax(leading + ascent, other.leading + other.ascent) - qMax(ascent, other.ascent);
355 descent = qMax(descent, other.descent);
356 ascent = qMax(ascent, other.ascent);
357 textWidth += other.textWidth;
358 length += other.length;
359}
360
361typedef QList<QScriptLine> QScriptLineArray;
362
363class QFontPrivate;
365
366class Q_GUI_EXPORT QTextEngine {
367public:
371 LayoutFailed
372 };
373 struct Q_GUI_EXPORT LayoutData {
374 LayoutData(const QString &str, void **stack_memory, qsizetype mem_size);
375 LayoutData();
376 ~LayoutData();
380 void **memory;
381 unsigned short *logClustersPtr;
383 mutable int used;
390 bool reallocate(int totalGlyphs);
391 };
392
394 ItemDecoration() { } // for QList, don't use
396 x1(x1), x2(x2), y(y), pen(pen) {}
397
402 };
403
404 typedef QList<ItemDecoration> ItemDecorationList;
405
406 QTextEngine();
407 QTextEngine(const QString &str, const QFont &f);
408 ~QTextEngine();
409
410 enum Mode {
411 WidthOnly = 0x07
412 };
413
414 void invalidate();
415 void clearLineData();
416
417 void validate() const;
418 void itemize() const;
419
420 bool isRightToLeft() const;
421 static void bidiReorder(int numRuns, const quint8 *levels, int *visualOrder);
422
423 const QCharAttributes *attributes() const;
424
425 void shape(int item) const;
426
427 void justify(const QScriptLine &si);
428 QFixed alignLine(const QScriptLine &line);
429
430 QFixed width(int charFrom, int numChars) const;
431 glyph_metrics_t boundingBox(int from, int len) const;
432 glyph_metrics_t tightBoundingBox(int from, int len) const;
433
434 int length(int item) const {
435 const QScriptItem &si = layoutData->items[item];
436 int from = si.position;
437 item++;
438 return (item < layoutData->items.size() ? layoutData->items[item].position : layoutData->string.size()) - from;
439 }
440 int length(const QScriptItem *si) const {
441 int end;
442 if (si + 1 < layoutData->items.constData()+ layoutData->items.size())
443 end = (si+1)->position;
444 else
445 end = layoutData->string.size();
446 return end - si->position;
447 }
448
449 QFontEngine *fontEngine(const QScriptItem &si, QFixed *ascent = nullptr, QFixed *descent = nullptr, QFixed *leading = nullptr) const;
450 QFont font(const QScriptItem &si) const;
451 inline QFont font() const { return fnt; }
452
461 inline unsigned short *logClusters(const QScriptItem *si) const
462 { return layoutData->logClustersPtr+si->position; }
470 inline QGlyphLayout availableGlyphs(const QScriptItem *si) const {
471 return layoutData->glyphLayout.mid(si->glyph_data_offset);
472 }
479 inline QGlyphLayout shapedGlyphs(const QScriptItem *si) const {
480 return layoutData->glyphLayout.mid(si->glyph_data_offset, si->num_glyphs);
481 }
482
483 inline bool ensureSpace(int nGlyphs) const {
484 if (layoutData->glyphLayout.numGlyphs - layoutData->used < nGlyphs)
485 return layoutData->reallocate((((layoutData->used + nGlyphs)*3/2 + 15) >> 4) << 4);
486 return true;
487 }
488
489 void freeMemory();
490
491 int findItem(int strPos, int firstItem = 0) const;
493 if (QTextDocumentPrivate::get(block) != nullptr)
494 return const_cast<QTextFormatCollection *>(QTextDocumentPrivate::get(block)->formatCollection());
495 return specialData ? specialData->formatCollection.data() : nullptr;
496 }
497 QTextCharFormat format(const QScriptItem *si) const;
499 Q_ASSERT(QTextDocumentPrivate::get(block) != nullptr);
500 return QTextDocumentPrivate::get(block)->document()->documentLayout();
501 }
502 int formatIndex(const QScriptItem *si) const;
503
505 QFixed calculateTabWidth(int index, QFixed x) const;
506
508
509private:
510 struct FontEngineCache {
511 FontEngineCache();
512 mutable QFontEngine *prevFontEngine;
513 mutable QFontEngine *prevScaledFontEngine;
514 mutable int prevScript;
515 mutable int prevPosition;
516 mutable int prevLength;
517 inline void reset() {
518 prevFontEngine = nullptr;
519 prevScaledFontEngine = nullptr;
520 prevScript = -1;
521 prevPosition = -1;
522 prevLength = -1;
523 }
524 };
525 mutable FontEngineCache feCache;
526
527public:
529 mutable QFont fnt;
530#ifndef QT_NO_RAWFONT
532#endif
534
536
546#ifndef QT_NO_RAWFONT
548#endif
549
551
555
556 inline bool visualCursorMovement() const
557 { return visualMovement || (QTextDocumentPrivate::get(block) != nullptr && QTextDocumentPrivate::get(block)->defaultCursorMoveStyle == Qt::VisualMoveStyle); }
558
559 inline int preeditAreaPosition() const { return specialData ? specialData->preeditPosition : -1; }
560 inline QString preeditAreaText() const { return specialData ? specialData->preeditText : QString(); }
561 void setPreeditArea(int position, const QString &text);
562
563 inline bool hasFormats() const
564 { return QTextDocumentPrivate::get(block) != nullptr || (specialData && !specialData->formats.isEmpty()); }
565 inline QList<QTextLayout::FormatRange> formats() const
566 {
567 return specialData ? specialData->formats : QList<QTextLayout::FormatRange>();
568 }
569 void setFormats(const QList<QTextLayout::FormatRange> &formats);
570
571private:
572 static void init(QTextEngine *e);
573
574 struct SpecialData {
575 int preeditPosition;
576 QString preeditText;
577 QList<QTextLayout::FormatRange> formats;
578 QList<QTextCharFormat> resolvedFormats;
579 // only used when no QTextDocumentPrivate is available
580 QScopedPointer<QTextFormatCollection> formatCollection;
581 };
582 SpecialData *specialData;
583
584 void indexFormats();
585 void resolveFormats() const;
586
587public:
588 bool atWordSeparator(int position) const;
589
590 QString elidedText(Qt::TextElideMode mode, QFixed width, int flags = 0, int from = 0, int count = -1) const;
591
592 void shapeLine(const QScriptLine &line);
593 QFixed leadingSpaceWidth(const QScriptLine &line);
594
595 QFixed offsetInLigature(const QScriptItem *si, int pos, int max, int glyph_pos);
596 int positionInLigature(const QScriptItem *si, int end, QFixed x, QFixed edge, int glyph_pos, bool cursorOnCharacter);
597 int previousLogicalPosition(int oldPos) const;
598 int nextLogicalPosition(int oldPos) const;
599 int lineNumberForTextPosition(int pos);
600 int positionAfterVisualMovement(int oldPos, QTextCursor::MoveOperation op);
601 std::vector<int> insertionPointsForLine(int lineNum);
602 void resetFontEngineCache();
603
604 void enableDelayDecorations(bool enable = true) { delayDecorations = enable; }
605
606 void addUnderline(QPainter *painter, const QLineF &line);
607 void addStrikeOut(QPainter *painter, const QLineF &line);
608 void addOverline(QPainter *painter, const QLineF &line);
609
610 void drawDecorations(QPainter *painter);
611 void clearDecorations();
612 void adjustUnderlines();
613
614private:
615 void addItemDecoration(QPainter *painter, const QLineF &line, ItemDecorationList *decorationList);
616 void adjustUnderlines(ItemDecorationList::iterator start,
617 ItemDecorationList::iterator end,
618 qreal underlinePos, qreal penWidth);
619 void drawItemDecorationList(QPainter *painter, const ItemDecorationList &decorationList);
620 void setBoundary(int strPos) const;
621 void addRequiredBoundaries() const;
622 void shapeText(int item) const;
623#if QT_CONFIG(harfbuzz)
624 int shapeTextWithHarfbuzzNG(const QScriptItem &si,
625 const ushort *string,
626 int itemLength,
627 QFontEngine *fontEngine,
628 QSpan<uint> itemBoundaries,
629 bool kerningEnabled,
630 bool hasLetterSpacing,
631 const QHash<QFont::Tag, quint32> &features) const;
632#endif
633
634 int endOfLine(int lineNum);
635 int beginningOfLine(int lineNum);
636 int getClusterLength(unsigned short *logClusters, const QCharAttributes *attributes, int from, int to, int glyph_pos, int *start);
637};
638
639class Q_GUI_EXPORT QStackTextEngine : public QTextEngine {
640public:
641 enum { MemSize = 256*40/sizeof(void *) };
642 QStackTextEngine(const QString &string, const QFont &f);
644 void *_memory[MemSize];
645};
647
649{
651 const QTextLayout::FormatRange *_selection = nullptr);
652
653 inline bool atEnd() const { return logicalItem >= nItems - 1; }
654 inline bool atBeginning() const { return logicalItem <= 0; }
655 QScriptItem &next();
656
657 bool getSelectionBounds(QFixed *selectionX, QFixed *selectionWidth) const;
658 inline bool isOutsideSelection() const {
659 QFixed tmp1, tmp2;
660 return !getSelectionBounds(&tmp1, &tmp2);
661 }
662
664
668
669 const int lineNum;
670 const int lineEnd;
671 const int firstItem;
672 const int lastItem;
673 const int nItems;
675 int item;
677
682
684
685 QVarLengthArray<int> visualOrder;
686
688};
689
691
692#endif // QTEXTENGINE_P_H
Definition main.cpp:8
\inmodule QtCore
\reentrant
Definition qfont.h:22
\inmodule QtCore\compares equality \compareswith equality QLine \endcompareswith
Definition qline.h:192
Definition qlist.h:75
qsizetype size() const noexcept
Definition qlist.h:397
The QPainter class performs low-level painting on widgets and other paint devices.
Definition qpainter.h:46
\inmodule QtGui
Definition qpen.h:28
\inmodule QtCore\reentrant
Definition qpoint.h:217
The QRawFont class provides access to a single physical instance of a font.
Definition qrawfont.h:24
LayoutData _layoutData
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
\reentrant
UnderlineStyle
This enum describes the different ways drawing underlined text.
MoveOperation
\value NoMove Keep the cursor where it is
Definition qtextcursor.h:61
static const QTextDocumentPrivate * get(const QTextDocument *document)
QList< ItemDecoration > ItemDecorationList
QList< QTextLayout::FormatRange > formats() const
QTextOption option
ItemDecorationList strikeOutList
unsigned short * logClusters(const QScriptItem *si) const
ItemDecorationList underlineList
QScriptLineArray lines
LayoutData * layoutData
QGlyphLayout shapedGlyphs(const QScriptItem *si) const
bool hasFormats() const
int preeditAreaPosition() const
uint forceJustification
void enableDelayDecorations(bool enable=true)
QTextBlock block
uint delayDecorations
bool ensureSpace(int nGlyphs) const
QString preeditAreaText() const
QRawFont rawFont
bool visualCursorMovement() const
QGlyphLayout availableGlyphs(const QScriptItem *si) const
QPointF position
int length(const QScriptItem *si) const
QFont font() const
int length(int item) const
QTextFormatCollection * formatCollection() const
QAbstractTextDocumentLayout * docLayout() const
ItemDecorationList overlineList
Internal QTextItem.
void initWithScriptItem(const QScriptItem &si)
RenderFlags flags
const QTextCharFormat charFormat
QTextItemInt midItem(QFontEngine *fontEngine, int firstGlyphIndex, int numGlyphs) const
const QChar * chars
QGlyphLayout glyphs
const unsigned short * logClusters
QTextCharFormat::UnderlineStyle underlineStyle
QTextItemInt()=default
QFontEngine * fontEngine
\inmodule QtGui
QFont font() const
Returns the font that should be used to draw the text.
\reentrant
Definition qtextoption.h:18
The QTransform class specifies 2D transformations of a coordinate system.
Definition qtransform.h:20
constexpr size_type size() const noexcept
void resize(qsizetype sz)
void * * data() noexcept
QVarLengthGlyphLayoutArray(int totalGlyphs)
void resize(int totalGlyphs)
QString str
[2]
QString text
EGLint EGLint * formats
Combined button and popup list for selecting options.
@ VisualMoveStyle
TextElideMode
Definition qnamespace.h:188
constexpr timespec & operator+=(timespec &t1, const timespec &t2)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
@ None
Definition qhash.cpp:531
@ Tab
@ Space
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
GLint GLint GLint GLint GLint x
[0]
GLenum mode
GLint GLsizei GLsizei height
GLboolean GLboolean GLboolean GLboolean a
[7]
GLuint index
[2]
GLuint GLuint end
GLuint GLfloat GLfloat GLfloat x1
GLenum GLuint GLenum GLsizei length
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum const void GLbitfield GLsizei numGlyphs
GLfloat GLfloat f
GLsizei levels
GLenum GLuint buffer
GLint GLsizei width
GLenum type
GLbitfield flags
GLboolean enable
GLuint start
GLenum GLuint GLintptr offset
GLboolean GLboolean g
GLint first
GLfloat n
GLint GLsizei GLsizei GLenum format
GLenum const void GLbitfield GLuint firstGlyphIndex
GLint y
GLboolean reset
GLuint GLsizei const GLuint const GLintptr * offsets
GLfixed GLfixed x2
GLuint GLuint64EXT address
GLfloat GLfloat p
[1]
GLenum GLsizei len
GLuint num
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
bool operator==(const QRandomGenerator &rng1, const QRandomGenerator &rng2)
Definition qrandom.cpp:1220
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define Q_AUTOTEST_EXPORT
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
QList< QScriptItem > QScriptItemArray
quint32 glyph_t
QList< QScriptLine > QScriptLineArray
@ Q_PRIMITIVE_TYPE
Definition qtypeinfo.h:157
@ Q_RELOCATABLE_TYPE
Definition qtypeinfo.h:158
#define Q_DECLARE_TYPEINFO(TYPE, FLAGS)
Definition qtypeinfo.h:180
unsigned int quint32
Definition qtypes.h:50
unsigned char uchar
Definition qtypes.h:32
ptrdiff_t qsizetype
Definition qtypes.h:165
unsigned int uint
Definition qtypes.h:34
unsigned short ushort
Definition qtypes.h:33
double qreal
Definition qtypes.h:187
unsigned char quint8
Definition qtypes.h:46
QSharedPointer< T > other(t)
[5]
QGraphicsItem * item
QList< QTreeWidgetItem * > items
QPainter painter(this)
[7]
static constexpr QFixed fromFixed(int fixed)
Definition qfixed_p.h:36
QGlyphJustification * justifications
void grow(char *address, int totalGlyphs)
QFixed effectiveAdvance(int item) const
void copy(QGlyphLayout *other)
QGlyphLayout(char *address, int totalGlyphs)
void clear(int first=0, int last=-1)
static constexpr qsizetype SpaceNeeded
QGlyphAttributes * attributes
glyph_t * glyphs
QGlyphLayout mid(int position, int n=-1) const
QFixedPoint * offsets
QFixed * advances
unsigned short flags
unsigned short bidiFlags
unsigned short bidiLevel
QChar::Direction bidiDirection
unsigned short script
constexpr QScriptItem(int p, QScriptAnalysis a) noexcept
QScriptAnalysis analysis
constexpr QFixed height() const noexcept
unsigned short num_glyphs
QFixed base() const
void operator+=(const QScriptLine &other)
QFixed height() const
signed int length
QFixed textAdvance
unsigned short trailingSpaces
uint hasTrailingSpaces
ItemDecoration(qreal x1, qreal x2, qreal y, const QPen &pen)
unsigned short * logClustersPtr
QScriptItemArray items
bool getSelectionBounds(QFixed *selectionX, QFixed *selectionWidth) const
QTextLineItemIterator(QTextEngine *eng, int lineNum, const QPointF &pos=QPointF(), const QTextLayout::FormatRange *_selection=nullptr)
const QTextLayout::FormatRange * selection
const QScriptLine & line
QVarLengthArray< int > visualOrder
bool isOutsideSelection() const
QFixed rightBearing() const
bool isValid() const
QFixed leftBearing() const
glyph_metrics_t(QFixed _x, QFixed _y, QFixed _width, QFixed _height, QFixed _xoff, QFixed _yoff)