/**************************************************************************** ** ** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the tools applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef DISTANCEFIELDMODEL_H #define DISTANCEFIELDMODEL_H #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QThread; class DistanceFieldModelWorker; class DistanceFieldModel : public QAbstractListModel { Q_OBJECT public: enum UnicodeRange { Other = 0x00, BasicLatin = 0x20, Latin1Supplement = 0xa0, LatinExtendedA = 0x100, LatinExtendedB = 0x180, IPAExtensions = 0x250, SpacingModifierLetters = 0x2b0, CombiningDiacriticalMarks = 0x300, GreekAndCoptic = 0x370, Cyrillic = 0x400, CyrillicSupplementary = 0x500, Armenian = 0x530, Hebrew = 0x590, Arabic = 0x600, Syriac = 0x700, Thaana = 0x780, Devanagari = 0x900, Bengali = 0x980, Gurmukhi = 0xa00, Gujarati = 0xa80, Oriya = 0xb00, Tamil = 0xb80, Telugu = 0xc00, Kannada = 0xc80, Malayalam = 0xd00, Sinhala = 0xd80, Thai = 0xe00, Lao = 0xe80, Tibetan = 0xf00, Myanmar = 0x1000, Georgian = 0x10a0, HangulJamo = 0x1100, Ethiopic = 0x1200, Cherokee = 0x13a0, UnifiedCanadianAboriginalSyllabics = 0x1400, Ogham = 0x1680, Runic = 0x16a0, Tagalog = 0x1700, Hanunoo = 0x1720, Buhid = 0x1740, Tagbanwa = 0x1760, Khmer = 0x1780, Mongolian = 0x1800, Limbu = 0x1900, TaiLe = 0x1950, KhmerSymbols = 0x19e0, PhoneticExtensions = 0x1d00, LatinExtendedAdditional = 0x1e00, GreekExtended = 0x1f00, GeneralPunctuation = 0x2000, SuperscriptsAndSubscripts = 0x2070, CurrencySymbols = 0x20a0, CombiningDiacriticalMarksForSymbols = 0x20d0, LetterlikeSymbols = 0x2100, NumberForms = 0x2150, Arrows = 0x2190, MathematicalOperators = 0x2200, MiscellaneousTechnical = 0x2300, ControlPictures = 0x2400, OpticalCharacterRecognition = 0x2440, EnclosedAlphanumerics = 0x2460, BoxDrawing = 0x2500, BlockElements = 0x2580, GeometricShapes = 0x25a0, MiscellaneousSymbols = 0x2600, Dingbats = 0x2700, MiscellaneousMathematicalSymbolsA = 0x27c0, SupplementalArrowsA = 0x27f0, BraillePatterns = 0x2800, SupplementalArrowsB = 0x2900, MiscellaneousMathematicalSymbolsB = 0x2980, SupplementalMathematicalOperators = 0x2a00, MiscellaneousSymbolsAndArrows = 0x2b00, CJKRadicalsSupplement = 0x2e80, KangxiRadicals = 0x2f00, IdeographicDescriptionCharacters = 0x2ff0, CJKSymbolsAndPunctuation = 0x3000, Hiragana = 0x3040, Katakana = 0x30a0, Bopomofo = 0x3100, HangulCompatibilityJamo = 0x3130, Kanbun = 0x3190, BopomofoExtended = 0x31a0, KatakanaPhoneticExtensions = 0x31f0, EnclosedCJKLettersAndMonths = 0x3200, CJKCompatibility = 0x3300, CJKUnifiedIdeographsExtensionA = 0x3400, YijingHexagramSymbols = 0x4dc0, CJKUnifiedIdeographs = 0x4e00, YiSyllables = 0xa000, YiRadicals = 0xa490, HangulSyllables = 0xac00, HighSurrogates = 0xd800, HighPrivateUseSurrogates = 0xdb80, LowSurrogates = 0xdc00, PrivateUseArea = 0xe000, CJKCompatibilityIdeographs = 0xf900, AlphabeticPresentationForms = 0xfb00, ArabicPresentationFormsA = 0xfb50, VariationSelectors = 0xfe00, CombiningHalfMarks = 0xfe20, CJKCompatibilityForms = 0xfe30, SmallFormVariants = 0xfe50, ArabicPresentationFormsB = 0xfe70, HalfwidthAndFullwidthForms = 0xff00, Specials = 0xfff0, LinearBSyllabary = 0x10000, LinearBIdeograms = 0x10080, AegeanNumbers = 0x10100, OldItalic = 0x10300, Gothic = 0x10330, Ugaritic = 0x10380, Deseret = 0x10400, Shavian = 0x10450, Osmanya = 0x10480, CypriotSyllabary = 0x10800, ByzantineMusicalSymbols = 0x1d000, MusicalSymbols = 0x1d100, TaiXuanJingSymbols = 0x1d300, MathematicalAlphanumericSymbols = 0x1d400, CJKUnifiedIdeographsExtensionB = 0x20000, CJKCompatibilityIdeographsSupplement = 0x2f800, Tags = 0xe0000, End = 0xe007f }; Q_ENUM(UnicodeRange) explicit DistanceFieldModel(QObject *parent = nullptr); ~DistanceFieldModel() override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; void setFont(const QString &fileName); QList unicodeRanges() const; QList glyphIndexesForUnicodeRange(UnicodeRange range) const; QString nameForUnicodeRange(UnicodeRange range) const; glyph_t glyphIndexForUcs4(quint32 ucs4) const; QImage distanceField(int row) const { return m_distanceFields.at(row); } QPainterPath path(int row) const { return m_paths.at(row); } qreal pixelSize() const { return m_pixelSize; } bool doubleGlyphResolution() const { return m_doubleGlyphResolution; } signals: void startGeneration(quint16 glyphCount); void stopGeneration(); void distanceFieldGenerated(); void error(const QString &errorString); private slots: void addDistanceField(const QImage &distanceField, const QPainterPath &path, glyph_t glyphId, quint32 ucs4); void reserveSpace(quint16 glyphCount, bool doubleResolution, qreal pixelSize); private: UnicodeRange unicodeRangeForUcs4(quint32 ucs4) const; QRawFont m_font; DistanceFieldModelWorker *m_worker; QScopedPointer m_workerThread; quint16 m_glyphCount; QVector m_distanceFields; QVector m_paths; QMultiHash m_glyphsPerUnicodeRange; QHash m_glyphsPerUcs4; bool m_doubleGlyphResolution; qreal m_pixelSize; QMetaEnum m_rangeEnum; }; QT_END_NAMESPACE #endif // DISTANCEFIELDMODEL_H