summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/winrt/qwinrtfontdatabase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/winrt/qwinrtfontdatabase.cpp')
-rw-r--r--src/plugins/platforms/winrt/qwinrtfontdatabase.cpp134
1 files changed, 95 insertions, 39 deletions
diff --git a/src/plugins/platforms/winrt/qwinrtfontdatabase.cpp b/src/plugins/platforms/winrt/qwinrtfontdatabase.cpp
index a41e5f8f38..8a3205220b 100644
--- a/src/plugins/platforms/winrt/qwinrtfontdatabase.cpp
+++ b/src/plugins/platforms/winrt/qwinrtfontdatabase.cpp
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/legal
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
**
** This file is part of the plugins of the Qt Toolkit.
**
@@ -10,9 +10,9 @@
** 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 Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
@@ -23,8 +23,8 @@
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** $QT_END_LICENSE$
@@ -46,6 +46,71 @@ using namespace Microsoft::WRL;
QT_BEGIN_NAMESPACE
+// Based on unicode range tables at http://www.microsoft.com/typography/otspec/os2.htm#ur
+static QFontDatabase::WritingSystem writingSystemFromUnicodeRange(const DWRITE_UNICODE_RANGE &range)
+{
+ if (range.first >= 0x0000 && range.last <= 0x007F)
+ return QFontDatabase::Latin;
+ if (range.first >= 0x0370 && range.last <= 0x03FF)
+ return QFontDatabase::Greek;
+ if (range.first >= 0x0400 && range.last <= 0x04FF)
+ return QFontDatabase::Cyrillic;
+ if (range.first >= 0x0530 && range.last <= 0x058F)
+ return QFontDatabase::Armenian;
+ if (range.first >= 0x0590 && range.last <= 0x05FF)
+ return QFontDatabase::Hebrew;
+ if (range.first >= 0x0600 && range.last <= 0x06FF)
+ return QFontDatabase::Arabic;
+ if (range.first >= 0x0700 && range.last <= 0x074F)
+ return QFontDatabase::Syriac;
+ if (range.first >= 0x0780 && range.last <= 0x07BF)
+ return QFontDatabase::Thaana;
+ if (range.first >= 0x0900 && range.last <= 0x097F)
+ return QFontDatabase::Devanagari;
+ if (range.first >= 0x0980 && range.last <= 0x09FF)
+ return QFontDatabase::Bengali;
+ if (range.first >= 0x0A00 && range.last <= 0x0A7F)
+ return QFontDatabase::Gurmukhi;
+ if (range.first >= 0x0A80 && range.last <= 0x0AFF)
+ return QFontDatabase::Gujarati;
+ if (range.first >= 0x0B00 && range.last <= 0x0B7F)
+ return QFontDatabase::Oriya;
+ if (range.first >= 0x0B80 && range.last <= 0x0BFF)
+ return QFontDatabase::Tamil;
+ if (range.first >= 0x0C00 && range.last <= 0x0C7F)
+ return QFontDatabase::Telugu;
+ if (range.first >= 0x0C80 && range.last <= 0x0CFF)
+ return QFontDatabase::Kannada;
+ if (range.first >= 0x0D00 && range.last <= 0x0D7F)
+ return QFontDatabase::Malayalam;
+ if (range.first >= 0x0D80 && range.last <= 0x0DFF)
+ return QFontDatabase::Sinhala;
+ if (range.first >= 0x0E00 && range.last <= 0x0E7F)
+ return QFontDatabase::Thai;
+ if (range.first >= 0x0E80 && range.last <= 0x0EFF)
+ return QFontDatabase::Lao;
+ if (range.first >= 0x0F00 && range.last <= 0x0FFF)
+ return QFontDatabase::Tibetan;
+ if (range.first >= 0x1000 && range.last <= 0x109F)
+ return QFontDatabase::Myanmar;
+ if (range.first >= 0x10A0 && range.last <= 0x10FF)
+ return QFontDatabase::Georgian;
+ if (range.first >= 0x1780 && range.last <= 0x17FF)
+ return QFontDatabase::Khmer;
+ if (range.first >= 0x4E00 && range.last <= 0x9FFF)
+ return QFontDatabase::SimplifiedChinese;
+ if (range.first >= 0xAC00 && range.last <= 0xD7AF)
+ return QFontDatabase::Korean;
+ if (range.first >= 0x1680 && range.last <= 0x169F)
+ return QFontDatabase::Ogham;
+ if (range.first >= 0x16A0 && range.last <= 0x16FF)
+ return QFontDatabase::Runic;
+ if (range.first >= 0x07C0 && range.last <= 0x07FF)
+ return QFontDatabase::Nko;
+
+ return QFontDatabase::Other;
+}
+
QString QWinRTFontDatabase::fontDir() const
{
QString fontDirectory = QBasicFontDatabase::fontDir();
@@ -80,6 +145,11 @@ QFont QWinRTFontDatabase::defaultFont() const
return QFont(QStringLiteral("Segoe UI"));
}
+bool QWinRTFontDatabase::fontsAlwaysScalable() const
+{
+ return true;
+}
+
void QWinRTFontDatabase::populateFontDatabase()
{
ComPtr<IDWriteFactory1> factory;
@@ -204,31 +274,7 @@ void QWinRTFontDatabase::populateFamily(const QString &familyName)
}
}
- QFont::Weight weight;
- switch (font->GetWeight()) {
- case DWRITE_FONT_WEIGHT_THIN:
- case DWRITE_FONT_WEIGHT_EXTRA_LIGHT:
- case DWRITE_FONT_WEIGHT_LIGHT:
- case DWRITE_FONT_WEIGHT_SEMI_LIGHT:
- weight = QFont::Light;
- break;
- default:
- case DWRITE_FONT_WEIGHT_NORMAL:
- case DWRITE_FONT_WEIGHT_MEDIUM:
- weight = QFont::Normal;
- break;
- case DWRITE_FONT_WEIGHT_DEMI_BOLD:
- weight = QFont::DemiBold;
- break;
- case DWRITE_FONT_WEIGHT_BOLD:
- case DWRITE_FONT_WEIGHT_EXTRA_BOLD:
- weight = QFont::Bold;
- break;
- case DWRITE_FONT_WEIGHT_BLACK:
- case DWRITE_FONT_WEIGHT_EXTRA_BLACK:
- weight = QFont::Black;
- break;
- }
+ QFont::Weight weight = QPlatformFontDatabase::weightFromInteger(font->GetWeight());
QFont::Style style;
switch (font->GetStyle()) {
@@ -279,17 +325,27 @@ void QWinRTFontDatabase::populateFamily(const QString &familyName)
const bool fixedPitch = fontFace->IsMonospacedFont();
- quint32 unicodeRange[4];
+ // Get writing systems from unicode ranges
quint32 actualRangeCount;
- hr = fontFace->GetUnicodeRanges(
- 2, reinterpret_cast<DWRITE_UNICODE_RANGE *>(unicodeRange), &actualRangeCount);
- if (FAILED(hr) && hr != E_NOT_SUFFICIENT_BUFFER) { // Ignore insufficient buffer; we only need 4 indices
+ hr = fontFace->GetUnicodeRanges(0, nullptr, &actualRangeCount);
+ Q_ASSERT(hr == E_NOT_SUFFICIENT_BUFFER);
+ QVector<DWRITE_UNICODE_RANGE> unicodeRanges(actualRangeCount);
+ hr = fontFace->GetUnicodeRanges(actualRangeCount, unicodeRanges.data(), &actualRangeCount);
+ if (FAILED(hr)) {
qWarning("Unable to get font unicode range: %s", qPrintable(qt_error_string(hr)));
continue;
}
- quint32 codePageRange[2] = { 0, 0 };
- QSupportedWritingSystems writingSystems =
- QPlatformFontDatabase::writingSystemsFromTrueTypeBits(unicodeRange, codePageRange);
+ QSupportedWritingSystems writingSystems;
+ for (quint32 i = 0; i < actualRangeCount; ++i) {
+ const QFontDatabase::WritingSystem writingSystem = writingSystemFromUnicodeRange(unicodeRanges.at(i));
+ writingSystems.setSupported(writingSystem);
+ }
+ if (writingSystems.supported(QFontDatabase::SimplifiedChinese)) {
+ writingSystems.setSupported(QFontDatabase::TraditionalChinese);
+ writingSystems.setSupported(QFontDatabase::Japanese);
+ }
+ if (writingSystems.supported(QFontDatabase::Latin))
+ writingSystems.setSupported(QFontDatabase::Vietnamese);
IDWriteFontFile *fontFile;
hr = fontFace->GetFiles(&fileCount, &fontFile);