| /**************************************************************************** |
| ** |
| ** 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 <QAbstractListModel> |
| #include <QRawFont> |
| #include <QtGui/qpainterpath.h> |
| #include <QtGui/private/qtextengine_p.h> |
| #include <QMultiHash> |
| #include <QScopedPointer> |
| #include <QMetaEnum> |
| #include <QThread> |
| |
| 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<UnicodeRange> unicodeRanges() const; |
| QList<glyph_t> 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<QThread> m_workerThread; |
| quint16 m_glyphCount; |
| QVector<QImage> m_distanceFields; |
| QVector<QPainterPath> m_paths; |
| QMultiHash<UnicodeRange, glyph_t> m_glyphsPerUnicodeRange; |
| QHash<quint32, glyph_t> m_glyphsPerUcs4; |
| bool m_doubleGlyphResolution; |
| qreal m_pixelSize; |
| QMetaEnum m_rangeEnum; |
| }; |
| |
| QT_END_NAMESPACE |
| |
| #endif // DISTANCEFIELDMODEL_H |