372 struct Q_GUI_EXPORT LayoutData {
373 LayoutData(
const QString &str,
void **stack_memory, qsizetype mem_size);
376 mutable QScriptItemArray items;
378 qsizetype available_glyphs;
380 unsigned short *logClustersPtr;
381 QGlyphLayout glyphLayout;
384 uint layoutState : 2;
385 uint memory_on_stack : 1;
386 uint haveCharAttributes : 1;
387 QFixed currentMaxWidth;
389 bool reallocate(
int totalGlyphs);
392 struct ItemDecoration {
394 ItemDecoration(qreal x1, qreal x2, qreal y,
const QPen &pen):
395 x1(x1), x2(x2), y(y), pen(pen) {}
403 typedef QList<ItemDecoration> ItemDecorationList;
406 QTextEngine(
const QString &str,
const QFont &f);
414 void clearLineData();
416 void validate()
const;
417 void itemize()
const;
419 bool isRightToLeft()
const;
420 static void bidiReorder(
int numRuns,
const quint8 *levels,
int *visualOrder);
422 const QCharAttributes *attributes()
const;
424 void shape(
int item)
const;
426 void justify(
const QScriptLine &si);
427 QFixed alignLine(
const QScriptLine &line);
429 QFixed width(
int charFrom,
int numChars)
const;
430 glyph_metrics_t boundingBox(
int from,
int len)
const;
431 glyph_metrics_t tightBoundingBox(
int from,
int len)
const;
433 int length(
int item)
const {
434 const QScriptItem &si = layoutData->items[item];
435 int from = si.position;
437 return (item < layoutData->items.size() ? layoutData->items[item].position : layoutData->string.size()) - from;
439 int length(
const QScriptItem *si)
const {
441 if (si + 1 < layoutData->items.constData()+ layoutData->items.size())
442 end = (si+1)->position;
444 end = layoutData->string.size();
445 return end - si->position;
448 QFontEngine *fontEngine(
const QScriptItem &si, QFixed *ascent =
nullptr, QFixed *descent =
nullptr, QFixed *leading =
nullptr)
const;
449 QFont font(
const QScriptItem &si)
const;
450 inline QFont font()
const {
return fnt; }
453
454
455
456
457
458
459
460 inline unsigned short *logClusters(
const QScriptItem *si)
const
461 {
return layoutData->logClustersPtr+si->position; }
463
464
465
466
467
468
469 inline QGlyphLayout availableGlyphs(
const QScriptItem *si)
const {
470 return layoutData->glyphLayout.mid(si->glyph_data_offset);
473
474
475
476
477
478 inline QGlyphLayout shapedGlyphs(
const QScriptItem *si)
const {
479 return layoutData->glyphLayout.mid(si->glyph_data_offset, si->num_glyphs);
482 inline bool ensureSpace(
int nGlyphs)
const {
483 if (layoutData->glyphLayout.numGlyphs - layoutData->used < nGlyphs)
484 return layoutData->reallocate((((layoutData->used + nGlyphs)*3/2 + 15) >> 4) << 4);
490 int findItem(
int strPos,
int firstItem = 0)
const;
491 inline QTextFormatCollection *formatCollection()
const {
492 if (QTextDocumentPrivate::get(block) !=
nullptr)
493 return const_cast<QTextFormatCollection *>(QTextDocumentPrivate::get(block)->formatCollection());
494 return specialData ? specialData->formatCollection.data() :
nullptr;
496 QTextCharFormat format(
const QScriptItem *si)
const;
497 inline QAbstractTextDocumentLayout *docLayout()
const {
498 Q_ASSERT(QTextDocumentPrivate::get(block) !=
nullptr);
499 return QTextDocumentPrivate::get(block)->document()->documentLayout();
501 int formatIndex(
const QScriptItem *si)
const;
504 QFixed calculateTabWidth(
int index, QFixed x)
const;
506 mutable QScriptLineArray lines;
509 struct FontEngineCache {
511 mutable QFontEngine *prevFontEngine;
512 mutable QFontEngine *prevScaledFontEngine;
513 mutable int prevScript;
514 mutable int prevPosition;
515 mutable int prevLength;
516 inline void reset() {
517 prevFontEngine =
nullptr;
518 prevScaledFontEngine =
nullptr;
524 mutable FontEngineCache feCache;
540 uint cacheGlyphs : 1;
541 uint stackEngine : 1;
542 uint forceJustification : 1;
543 uint visualMovement : 1;
544 uint delayDecorations: 1;
549 mutable LayoutData *layoutData;
551 ItemDecorationList underlineList;
552 ItemDecorationList strikeOutList;
553 ItemDecorationList overlineList;
555 inline bool visualCursorMovement()
const
556 {
return visualMovement || (QTextDocumentPrivate::get(block) !=
nullptr && QTextDocumentPrivate::get(block)->defaultCursorMoveStyle == Qt::VisualMoveStyle); }
558 inline int preeditAreaPosition()
const {
return specialData ? specialData->preeditPosition : -1; }
559 inline QString preeditAreaText()
const {
return specialData ? specialData->preeditText : QString(); }
560 void setPreeditArea(
int position,
const QString &text);
562 inline bool hasFormats()
const
563 {
return QTextDocumentPrivate::get(block) !=
nullptr || (specialData && !specialData->formats.isEmpty()); }
564 inline QList<QTextLayout::FormatRange> formats()
const
566 return specialData ? specialData->formats : QList<QTextLayout::FormatRange>();
568 void setFormats(
const QList<QTextLayout::FormatRange> &formats);
571 static void init(QTextEngine *e);
576 QList<QTextLayout::FormatRange> formats;
577 QList<QTextCharFormat> resolvedFormats;
579 QScopedPointer<QTextFormatCollection> formatCollection;
581 SpecialData *specialData;
584 void resolveFormats()
const;
587 bool atWordSeparator(
int position)
const;
589 QString elidedText(Qt::TextElideMode mode, QFixed width,
int flags = 0,
int from = 0,
int count = -1)
const;
591 void shapeLine(
const QScriptLine &line);
592 QFixed leadingSpaceWidth(
const QScriptLine &line);
594 QFixed offsetInLigature(
const QScriptItem *si,
int pos,
int max,
int glyph_pos);
595 int positionInLigature(
const QScriptItem *si,
int end, QFixed x, QFixed edge,
int glyph_pos,
bool cursorOnCharacter);
596 int previousLogicalPosition(
int oldPos)
const;
597 int nextLogicalPosition(
int oldPos)
const;
598 int lineNumberForTextPosition(
int pos);
599 int positionAfterVisualMovement(
int oldPos, QTextCursor::MoveOperation op);
600 std::vector<
int> insertionPointsForLine(
int lineNum);
601 void resetFontEngineCache();
603 void enableDelayDecorations(
bool enable =
true) { delayDecorations = enable; }
605 void addUnderline(QPainter *painter,
const QLineF &line);
606 void addStrikeOut(QPainter *painter,
const QLineF &line);
607 void addOverline(QPainter *painter,
const QLineF &line);
609 void drawDecorations(QPainter *painter);
610 void clearDecorations();
611 void adjustUnderlines();
614 void addItemDecoration(QPainter *painter,
const QLineF &line, ItemDecorationList *decorationList);
615 void adjustUnderlines(ItemDecorationList::iterator start,
616 ItemDecorationList::iterator end,
617 qreal underlinePos, qreal penWidth);
618 void drawItemDecorationList(QPainter *painter,
const ItemDecorationList &decorationList);
619 void setBoundary(
int strPos)
const;
620 void addRequiredBoundaries()
const;
621 void shapeText(
int item)
const;
622#if QT_CONFIG(harfbuzz)
623 int shapeTextWithHarfbuzzNG(
const QScriptItem &si,
const ushort *string,
int stringBaseIndex,
624 int stringLength,
int itemLength, QFontEngine *fontEngine,
625 QSpan<uint> itemBoundaries,
bool kerningEnabled,
626 bool hasLetterSpacing,
627 const QHash<QFont::Tag, quint32> &features)
const;
630 int endOfLine(
int lineNum);
631 int beginningOfLine(
int lineNum);
632 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