374 struct Q_GUI_EXPORT LayoutData {
375 LayoutData(
const QString &str,
void **stack_memory, qsizetype mem_size);
378 mutable QScriptItemArray items;
380 qsizetype available_glyphs;
382 unsigned short *logClustersPtr;
383 QGlyphLayout glyphLayout;
386 uint layoutState : 2;
387 uint memory_on_stack : 1;
388 uint haveCharAttributes : 1;
389 QFixed currentMaxWidth;
391 bool reallocate(
int totalGlyphs);
394 struct ItemDecoration {
396 ItemDecoration(qreal x1, qreal x2, qreal y,
const QPen &pen):
397 x1(x1), x2(x2), y(y), pen(pen) {}
405 typedef QList<ItemDecoration> ItemDecorationList;
408 QTextEngine(
const QString &str,
const QFont &f);
416 void clearLineData();
418 void validate()
const;
419 void itemize()
const;
421 bool isRightToLeft()
const;
422 static void bidiReorder(
int numRuns,
const quint8 *levels,
int *visualOrder);
424 const QCharAttributes *attributes()
const;
426 void shape(
int item)
const;
428 void justify(
const QScriptLine &si);
429 QFixed alignLine(
const QScriptLine &line);
431 QFixed width(
int charFrom,
int numChars)
const;
432 glyph_metrics_t boundingBox(
int from,
int len)
const;
433 glyph_metrics_t tightBoundingBox(
int from,
int len)
const;
435 int length(
int item)
const {
436 const QScriptItem &si = layoutData->items[item];
437 int from = si.position;
439 return (item < layoutData->items.size() ? layoutData->items[item].position : layoutData->string.size()) - from;
441 int length(
const QScriptItem *si)
const {
443 if (si + 1 < layoutData->items.constData()+ layoutData->items.size())
444 end = (si+1)->position;
446 end = layoutData->string.size();
447 return end - si->position;
450 QFontEngine *fontEngine(
const QScriptItem &si, QFixed *ascent =
nullptr, QFixed *descent =
nullptr, QFixed *leading =
nullptr)
const;
451 QFont font(
const QScriptItem &si)
const;
452 inline QFont font()
const {
return fnt; }
455
456
457
458
459
460
461
462 inline unsigned short *logClusters(
const QScriptItem *si)
const
463 {
return layoutData->logClustersPtr+si->position; }
465
466
467
468
469
470
471 inline QGlyphLayout availableGlyphs(
const QScriptItem *si)
const {
472 return layoutData->glyphLayout.mid(si->glyph_data_offset);
475
476
477
478
479
480 inline QGlyphLayout shapedGlyphs(
const QScriptItem *si)
const {
481 return layoutData->glyphLayout.mid(si->glyph_data_offset, si->num_glyphs);
484 inline bool ensureSpace(
int nGlyphs)
const {
485 if (layoutData->glyphLayout.numGlyphs - layoutData->used < nGlyphs)
486 return layoutData->reallocate((((layoutData->used + nGlyphs)*3/2 + 15) >> 4) << 4);
492 int findItem(
int strPos,
int firstItem = 0)
const;
493 inline QTextFormatCollection *formatCollection()
const {
494 if (QTextDocumentPrivate::get(block) !=
nullptr)
495 return const_cast<QTextFormatCollection *>(QTextDocumentPrivate::get(block)->formatCollection());
496 return specialData ? specialData->formatCollection.data() :
nullptr;
498 QTextCharFormat format(
const QScriptItem *si)
const;
499 inline QAbstractTextDocumentLayout *docLayout()
const {
500 Q_ASSERT(QTextDocumentPrivate::get(block) !=
nullptr);
501 return QTextDocumentPrivate::get(block)->document()->documentLayout();
503 int formatIndex(
const QScriptItem *si)
const;
506 QFixed calculateTabWidth(
int index, QFixed x)
const;
508 mutable QScriptLineArray lines;
511 struct FontEngineCache {
513 mutable QFontEngine *prevFontEngine;
514 mutable QFontEngine *prevScaledFontEngine;
515 mutable int prevScript;
516 mutable int prevPosition;
517 mutable int prevLength;
518 inline void reset() {
519 prevFontEngine =
nullptr;
520 prevScaledFontEngine =
nullptr;
526 mutable FontEngineCache feCache;
542 uint cacheGlyphs : 1;
543 uint stackEngine : 1;
544 uint forceJustification : 1;
545 uint visualMovement : 1;
546 uint delayDecorations: 1;
551 mutable LayoutData *layoutData;
553 ItemDecorationList underlineList;
554 ItemDecorationList strikeOutList;
555 ItemDecorationList overlineList;
557 inline bool visualCursorMovement()
const
558 {
return visualMovement || (QTextDocumentPrivate::get(block) !=
nullptr && QTextDocumentPrivate::get(block)->defaultCursorMoveStyle == Qt::VisualMoveStyle); }
560 inline int preeditAreaPosition()
const {
return specialData ? specialData->preeditPosition : -1; }
561 inline QString preeditAreaText()
const {
return specialData ? specialData->preeditText : QString(); }
562 void setPreeditArea(
int position,
const QString &text);
564 inline bool hasFormats()
const
565 {
return QTextDocumentPrivate::get(block) !=
nullptr || (specialData && !specialData->formats.isEmpty()); }
566 inline QList<QTextLayout::FormatRange> formats()
const
568 return specialData ? specialData->formats : QList<QTextLayout::FormatRange>();
570 void setFormats(
const QList<QTextLayout::FormatRange> &formats);
573 static void init(QTextEngine *e);
578 QList<QTextLayout::FormatRange> formats;
579 QList<QTextCharFormat> resolvedFormats;
581 QScopedPointer<QTextFormatCollection> formatCollection;
583 SpecialData *specialData;
586 void resolveFormats()
const;
588 mutable hb_buffer_t *buffer =
nullptr;
591 bool atWordSeparator(
int position)
const;
593 QString elidedText(Qt::TextElideMode mode, QFixed width,
int flags = 0,
int from = 0,
int count = -1)
const;
595 void shapeLine(
const QScriptLine &line);
596 QFixed leadingSpaceWidth(
const QScriptLine &line);
598 QFixed offsetInLigature(
const QScriptItem *si,
int pos,
int max,
int glyph_pos);
599 int positionInLigature(
const QScriptItem *si,
int end, QFixed x, QFixed edge,
int glyph_pos,
bool cursorOnCharacter);
600 int previousLogicalPosition(
int oldPos)
const;
601 int nextLogicalPosition(
int oldPos)
const;
602 int lineNumberForTextPosition(
int pos);
603 int positionAfterVisualMovement(
int oldPos, QTextCursor::MoveOperation op);
604 std::vector<
int> insertionPointsForLine(
int lineNum);
605 void resetFontEngineCache();
607 void enableDelayDecorations(
bool enable =
true) { delayDecorations = enable; }
609 void addUnderline(QPainter *painter,
const QLineF &line);
610 void addStrikeOut(QPainter *painter,
const QLineF &line);
611 void addOverline(QPainter *painter,
const QLineF &line);
613 void drawDecorations(QPainter *painter);
614 void clearDecorations();
615 void adjustUnderlines();
618 void addItemDecoration(QPainter *painter,
const QLineF &line, ItemDecorationList *decorationList);
619 void adjustUnderlines(ItemDecorationList::iterator start,
620 ItemDecorationList::iterator end,
621 qreal underlinePos, qreal penWidth);
622 void drawItemDecorationList(QPainter *painter,
const ItemDecorationList &decorationList);
623 void setBoundary(
int strPos)
const;
624 void addRequiredBoundaries()
const;
625 void shapeText(
int item)
const;
626#if QT_CONFIG(harfbuzz)
627 int shapeTextWithHarfbuzzNG(
const QScriptItem &si,
const ushort *string,
int stringBaseIndex,
628 int stringLength,
int itemLength, QFontEngine *fontEngine,
629 QSpan<uint> itemBoundaries,
bool kerningEnabled,
630 bool hasLetterSpacing,
631 const QHash<QFont::Tag, quint32> &features)
const;
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);
QTextBlockUserData * userData
QString toHtml(ExportMode mode=ExportEntireDocument)
Returns the document in HTML format.
QTextHtmlExporter(const QTextDocument *_doc)
void initWithScriptItem(const QScriptItem &si)
const QTextCharFormat charFormat
QTextItemInt midItem(QFontEngine *fontEngine, int firstGlyphIndex, int numGlyphs) const
const unsigned short * logClusters
QTextCharFormat::UnderlineStyle underlineStyle
QTextItemInt(const QGlyphLayout &g, QFont *font, const QChar *chars, int numChars, QFontEngine *fe, const QTextCharFormat &format=QTextCharFormat())
QTextItemInt(const QScriptItem &si, QFont *font, const QTextCharFormat &format=QTextCharFormat())
The QTextObjectInterface class allows drawing of custom text objects in \l{QTextDocument}...
QAbstractUndoItem * custom
bool tryMerge(const QTextUndoCommand &other)
Q_DECLARE_TYPEINFO(QTextUndoCommand, Q_PRIMITIVE_TYPE)
Q_DECLARE_TYPEINFO(QGlyphAttributes, Q_PRIMITIVE_TYPE)
Q_DECLARE_TYPEINFO(QScriptItem, Q_PRIMITIVE_TYPE)
QList< QScriptItem > QScriptItemArray
QList< QScriptLine > QScriptLineArray
Q_DECLARE_TYPEINFO(QGlyphJustification, Q_PRIMITIVE_TYPE)
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
QVarLengthArray< int > visualOrder
bool isOutsideSelection() const