📄 qtextengine_p.h
字号:
unsigned short charShape :1; unsigned short digitSubstitute :1; unsigned short inhibitLigate :1; unsigned short fDisplayZWG :1; unsigned short arabicNumContext :1; unsigned short gcpClusters :1; unsigned short reserved :1; unsigned short engineReserved :2;};Q_DECLARE_TYPEINFO(QScriptAnalysis, Q_PRIMITIVE_TYPE);inline bool operator == (const QScriptAnalysis &sa1, const QScriptAnalysis &sa2){ return sa1.script == sa2.script && sa1.bidiLevel == sa2.bidiLevel; // ###// && override == other.override;}#endifstruct QGlyphLayout{ inline QGlyphLayout() : glyph(0), justificationType(0), nKashidas(0), space_18d6(0) {} // highest value means highest priority for justification. Justification is done by first inserting kashidas // starting with the highest priority positions, then stretching spaces, afterwards extending inter char // spacing, and last spacing between arabic words. // NoJustification is for example set for arabic where no Kashida can be inserted or for diacritics. enum Justification { NoJustification= 0, // Justification can't be applied after this glyph Arabic_Space = 1, // This glyph represents a space inside arabic text Character = 2, // Inter-character justification point follows this glyph Space = 4, // This glyph represents a blank outside an Arabic run Arabic_Normal = 7, // Normal Middle-Of-Word glyph that connects to the right (begin) Arabic_Waw = 8, // Next character is final form of Waw/Ain/Qaf/Fa Arabic_BaRa = 9, // Next two chars are Ba + Ra/Ya/AlefMaksura Arabic_Alef = 10, // Next character is final form of Alef/Tah/Lam/Kaf/Gaf Arabic_HaaDal = 11, // Next character is final form of Haa/Dal/Taa Marbutah Arabic_Seen = 12, // Initial or Medial form Of Seen/Sad Arabic_Kashida = 13 // Kashida(U+640) in middle of word }; glyph_t glyph; struct Attributes { unsigned short justification :4; // Justification class unsigned short clusterStart :1; // First glyph of representation of cluster unsigned short mark :1; // needs to be positioned around base char unsigned short zeroWidth :1; // ZWJ, ZWNJ etc, with no width unsigned short dontPrint :1; unsigned short combiningClass :8; }; Attributes attributes; QFixedPoint advance; QFixedPoint offset; enum JustificationType { JustifyNone, JustifySpace, JustifyKashida }; uint justificationType :2; uint nKashidas : 6; // more do not make sense... uint space_18d6 : 24;};Q_DECLARE_TYPEINFO(QGlyphLayout, Q_PRIMITIVE_TYPE);inline bool qIsControlChar(ushort uc){ return uc >= 0x200b && uc <= 0x206f && (uc <= 0x200f /* ZW Space, ZWNJ, ZWJ, LRM and RLM */ || (uc >= 0x2028 && uc <= 0x202f /* LS, PS, LRE, RLE, PDF, LRO, RLO, NNBSP */) || uc >= 0x206a /* ISS, ASS, IAFS, AFS, NADS, NODS */);}struct QCharAttributes { enum LineBreakType { NoBreak, SoftHyphen, Break, ForcedBreak }; uchar lineBreakType :2; uchar whiteSpace :1; // A unicode whitespace character, except NBSP, ZWNBSP uchar charStop :1; // Valid cursor position (for left/right arrow)};Q_DECLARE_TYPEINFO(QCharAttributes, Q_PRIMITIVE_TYPE);struct QScriptItem{ inline QScriptItem() : position(0), isSpace(false), isTab(false), isObject(false), num_glyphs(0), descent(-1), ascent(-1), width(-1), glyph_data_offset(0) {} int position; QScriptAnalysis analysis; unsigned short isSpace : 1; unsigned short isTab : 1; unsigned short isObject : 1; int num_glyphs; QFixed descent; QFixed ascent; QFixed width; int glyph_data_offset; QFixed height() const { return ascent + descent; }};Q_DECLARE_TYPEINFO(QScriptItem, Q_MOVABLE_TYPE);typedef QVector<QScriptItem> QScriptItemArray;struct QScriptLine{ QScriptLine() : from(0), length(0), justified(0), gridfitted(0), hasTrailingSpaces(0) {} QFixed descent; QFixed ascent; QFixed x; QFixed y; QFixed width; QFixed textWidth; int from; signed int length : 29; mutable uint justified : 1; mutable uint gridfitted : 1; uint hasTrailingSpaces : 1; QFixed height() const { return ascent + descent + 1; } void setDefaultHeight(QTextEngine *eng); void operator+=(const QScriptLine &other);};Q_DECLARE_TYPEINFO(QScriptLine, Q_PRIMITIVE_TYPE);inline void QScriptLine::operator+=(const QScriptLine &other){ descent = qMax(descent, other.descent); ascent = qMax(ascent, other.ascent); textWidth += other.textWidth; length += other.length;}typedef QVector<QScriptLine> QScriptLineArray;class QFontPrivate;class QTextFormatCollection;class Q_GUI_EXPORT QTextEngine {public: struct LayoutData { LayoutData(const QString &str, void **stack_memory, int mem_size); LayoutData(); ~LayoutData(); mutable QScriptItemArray items; int allocated; int available_glyphs; void **memory; unsigned short *logClustersPtr; QGlyphLayout *glyphPtr; int num_glyphs; mutable int used; uint hasBidi : 1; uint inLayout : 1; uint memory_on_stack : 1; bool haveCharAttributes; QString string; void reallocate(int totalGlyphs); }; QTextEngine(LayoutData *data); QTextEngine(); QTextEngine(const QString &str, const QFont &f); ~QTextEngine(); enum Mode { WidthOnly = 0x07 }; // keep in sync with QAbstractFontEngine::TextShapingFlag!! enum ShaperFlag { RightToLeft = 0x0001, DesignMetrics = 0x0002, GlyphIndicesOnly = 0x0004 }; Q_DECLARE_FLAGS(ShaperFlags, ShaperFlag) void invalidate(); void validate() const; void itemize() const; static void bidiReorder(int numRuns, const quint8 *levels, int *visualOrder); const QCharAttributes *attributes() const; void shape(int item) const; void justify(const QScriptLine &si); QFixed width(int charFrom, int numChars) const; glyph_metrics_t boundingBox(int from, int len) const; glyph_metrics_t tightBoundingBox(int from, int len) const; int length(int item) const { const QScriptItem &si = layoutData->items[item]; int from = si.position; item++; return (item < layoutData->items.size() ? layoutData->items[item].position : layoutData->string.length()) - from; } int length(const QScriptItem *si) const { int end; if (si + 1 < layoutData->items.constData()+ layoutData->items.size()) end = (si+1)->position; else end = layoutData->string.length(); return end - si->position; } QFontEngine *fontEngine(const QScriptItem &si, QFixed *ascent = 0, QFixed *descent = 0) const; QFont font(const QScriptItem &si) const; inline QFont font() const { return fnt; } inline unsigned short *logClusters(const QScriptItem *si) const { return layoutData->logClustersPtr+si->position; } inline QGlyphLayout *glyphs(const QScriptItem *si) const { return layoutData->glyphPtr + si->glyph_data_offset; } inline void ensureSpace(int nGlyphs) const { if (layoutData->num_glyphs - layoutData->used < nGlyphs) layoutData->reallocate((((layoutData->used + nGlyphs)*3/2 + 15) >> 4) << 4); } void freeMemory(); int findItem(int strPos) const; inline QTextFormatCollection *formats() const {#ifdef QT_BUILD_COMPAT_LIB return 0; // Compat should never reference this symbol#else return block.docHandle()->formatCollection();#endif } QTextCharFormat format(const QScriptItem *si) const; inline QAbstractTextDocumentLayout *docLayout() const {#ifdef QT_BUILD_COMPAT_LIB return 0; // Compat should never reference this symbol#else return block.docHandle()->document()->documentLayout();#endif } int formatIndex(const QScriptItem *si) const; QFixed nextTab(const QScriptItem *si, QFixed x) const; mutable QScriptLineArray lines; QString text; QFont fnt; QTextBlock block; QTextOption option; QFixed minWidth; QFixed maxWidth; QPointF position; uint ignoreBidi : 1; uint cacheGlyphs : 1; uint stackEngine : 1; uint forceJustification : 1; int *underlinePositions; mutable LayoutData *layoutData; inline bool hasFormats() const { return (block.docHandle() || specialData); } struct SpecialData { int preeditPosition; QString preeditText; QList<QTextLayout::FormatRange> addFormats; QVector<int> addFormatIndices; QVector<int> resolvedFormatIndices; }; SpecialData *specialData; bool atWordSeparator(int position) const; void indexAdditionalFormats(); QString elidedText(Qt::TextElideMode mode, const QFixed &width, int flags = 0) const;private: void setBoundary(int strPos) const; void addRequiredBoundaries() const; void shapeText(int item) const; void splitItem(int item, int pos) const; void resolveAdditionalFormats() const;};class QStackTextEngine : public QTextEngine {public: enum { MemSize = 256*40/sizeof(void *) }; QStackTextEngine(const QString &string, const QFont &f); LayoutData _layoutData; void *_memory[MemSize];};Q_DECLARE_OPERATORS_FOR_FLAGS(QTextEngine::ShaperFlags)#endif // QTEXTENGINE_P_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -