blob: 5c71a20ab89d53638f2826dfec7333f55f31d8bb [file] [log] [blame]
/****************************************************************************
**
** 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