diff options
Diffstat (limited to 'src/gui/text/qfontsubset.cpp')
-rw-r--r-- | src/gui/text/qfontsubset.cpp | 148 |
1 files changed, 44 insertions, 104 deletions
diff --git a/src/gui/text/qfontsubset.cpp b/src/gui/text/qfontsubset.cpp index 93ab5e27db..f6c973e522 100644 --- a/src/gui/text/qfontsubset.cpp +++ b/src/gui/text/qfontsubset.cpp @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** 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 Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** 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-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qfontsubset_p.h" #include <qdebug.h> @@ -49,6 +13,8 @@ QT_BEGIN_NAMESPACE +using namespace Qt::StringLiterals; + #ifndef QT_NO_PDF // This map is used for symbol fonts to get the correct glyph names for the latin range @@ -112,24 +78,6 @@ QByteArray QFontSubset::glyphName(unsigned short unicode, bool symbol) return buffer; } -QByteArray QFontSubset::glyphName(unsigned int glyph, const QList<int> &reverseMap) const -{ - uint glyphIndex = glyph_indices[glyph]; - - if (glyphIndex == 0) - return "/.notdef"; - - QByteArray ba; - QPdf::ByteStream s(&ba); - if (reverseMap[glyphIndex] && reverseMap[glyphIndex] < 0x10000) { - s << '/' << glyphName(reverseMap[glyphIndex], false); - } else { - s << "/gl" << (int)glyphIndex; - } - return ba; -} - - QByteArray QFontSubset::widthArray() const { Q_ASSERT(!widths.isEmpty()); @@ -142,7 +90,7 @@ QByteArray QFontSubset::widthArray() const QFixed defWidth = widths[0]; //qDebug("defWidth=%d, scale=%f", defWidth.toInt(), scale.toReal()); - for (int i = 0; i < nGlyphs(); ++i) { + for (qsizetype i = 0; i < nGlyphs(); ++i) { if (defWidth != widths[i]) defWidth = 0; } @@ -150,10 +98,10 @@ QByteArray QFontSubset::widthArray() const s << "/DW " << qRound(defWidth.toInt() * scale); } else { s << "/W ["; - for (int g = 0; g < nGlyphs();) { + for (qsizetype g = 0; g < nGlyphs();) { QFixed w = widths[g]; - int start = g; - int startLinear = 0; + qsizetype start = g; + qsizetype startLinear = 0; ++g; while (g < nGlyphs()) { QFixed nw = widths[g]; @@ -171,11 +119,11 @@ QByteArray QFontSubset::widthArray() const // qDebug("start=%x startLinear=%x g-1=%x",start,startLinear,g-1); if (g - startLinear < 10) startLinear = 0; - int endnonlinear = startLinear ? startLinear : g; + qsizetype endnonlinear = startLinear ? startLinear : g; // qDebug(" startLinear=%x endnonlinear=%x", startLinear,endnonlinear); if (endnonlinear > start) { s << start << '['; - for (int i = start; i < endnonlinear; ++i) + for (qsizetype i = start; i < endnonlinear; ++i) s << qRound(widths[i].toInt() * scale); s << "]\n"; } @@ -229,14 +177,14 @@ QByteArray QFontSubset::createToUnicodeMap() const QPdf::ByteStream s(&ranges); char buf[5]; - for (int g = 1; g < nGlyphs(); ) { + for (qsizetype g = 1; g < nGlyphs(); ) { int uc0 = reverseMap.at(g); if (!uc0) { ++g; continue; } - int start = g; - int startLinear = 0; + qsizetype start = g; + qsizetype startLinear = 0; ++g; while (g < nGlyphs()) { int uc = reverseMap[g]; @@ -257,7 +205,7 @@ QByteArray QFontSubset::createToUnicodeMap() const // qDebug("start=%x startLinear=%x g-1=%x",start,startLinear,g-1); if (g - startLinear < 10) startLinear = 0; - int endnonlinear = startLinear ? startLinear : g; + qsizetype endnonlinear = startLinear ? startLinear : g; // qDebug(" startLinear=%x endnonlinear=%x", startLinear,endnonlinear); if (endnonlinear > start) { s << '<' << QPdf::toHex((ushort)start, buf) << "> <"; @@ -266,7 +214,7 @@ QByteArray QFontSubset::createToUnicodeMap() const s << '<' << QPdf::toHex((ushort)reverseMap[start], buf) << ">\n"; } else { s << '['; - for (int i = start; i < endnonlinear; ++i) { + for (qsizetype i = start; i < endnonlinear; ++i) { s << '<' << QPdf::toHex((ushort)reverseMap[i], buf) << "> "; } s << "]\n"; @@ -275,9 +223,9 @@ QByteArray QFontSubset::createToUnicodeMap() const } if (startLinear) { while (startLinear < g) { - int len = g - startLinear; - int uc_start = reverseMap[startLinear]; - int uc_end = uc_start + len - 1; + qsizetype len = g - startLinear; + qsizetype uc_start = reverseMap[startLinear]; + qsizetype uc_end = uc_start + len - 1; if ((uc_end >> 8) != (uc_start >> 8)) len = 256 - (uc_start & 0xff); s << '<' << QPdf::toHex((ushort)startLinear, buf) << "> <"; @@ -300,14 +248,14 @@ QByteArray QFontSubset::createToUnicodeMap() const return touc; } -int QFontSubset::addGlyph(uint index) +qsizetype QFontSubset::addGlyph(uint index) { qsizetype idx = glyph_indices.indexOf(index); if (idx < 0) { idx = glyph_indices.size(); glyph_indices.append(index); } - return (int)idx; + return idx; } #endif // QT_NO_PDF @@ -453,7 +401,7 @@ static QTtfTable generateHead(const qttf_head_table &head) { const int head_size = 54; QTtfTable t; - t.tag = MAKE_TAG('h', 'e', 'a', 'd'); + t.tag = QFont::Tag("head").value(); t.data.resize(head_size); QTtfStream s(t.data); @@ -524,7 +472,7 @@ static QTtfTable generateHhea(const qttf_hhea_table &hhea) { const int hhea_size = 36; QTtfTable t; - t.tag = MAKE_TAG('h', 'h', 'e', 'a'); + t.tag = QFont::Tag("hhea").value(); t.data.resize(hhea_size); QTtfStream s(t.data); @@ -575,7 +523,7 @@ static QTtfTable generateMaxp(const qttf_maxp_table &maxp) { const int maxp_size = 32; QTtfTable t; - t.tag = MAKE_TAG('m', 'a', 'x', 'p'); + t.tag = QFont::Tag("maxp").value(); t.data.resize(maxp_size); QTtfStream s(t.data); @@ -639,8 +587,8 @@ static QTtfTable generateName(const qttf_name_table &name) list.append(rec); rec.nameId = 4; rec.value = name.family; - if (name.subfamily != QLatin1String("Regular")) - rec.value += QLatin1Char(' ') + name.subfamily; + if (name.subfamily != "Regular"_L1) + rec.value += u' ' + name.subfamily; list.append(rec); rec.nameId = 6; rec.value = name.postscript_name; @@ -655,12 +603,12 @@ static QTtfTable generateName(const QList<QTtfNameRecord> &name) const int char_size = 2; QTtfTable t; - t.tag = MAKE_TAG('n', 'a', 'm', 'e'); + t.tag = QFont::Tag("name").value(); const int name_size = 6 + 12*name.size(); int string_size = 0; for (int i = 0; i < name.size(); ++i) { - string_size += name.at(i).value.length()*char_size; + string_size += name.at(i).value.size()*char_size; } t.data.resize(name_size + string_size); @@ -676,7 +624,7 @@ static QTtfTable generateName(const QList<QTtfNameRecord> &name) int off = 0; for (int i = 0; i < name.size(); ++i) { - int len = name.at(i).value.length()*char_size; + int len = name.at(i).value.size()*char_size; // quint16 platformID Platform ID. // quint16 encodingID Platform-specific encoding ID. // quint16 languageID Language ID. @@ -692,12 +640,8 @@ static QTtfTable generateName(const QList<QTtfNameRecord> &name) off += len; } for (int i = 0; i < name.size(); ++i) { - const QString &n = name.at(i).value; - const ushort *uc = n.utf16(); - for (int i = 0; i < n.length(); ++i) { - s << quint16(*uc); - ++uc; - } + for (QChar ch : name.at(i).value) + s << quint16(ch.unicode()); } return t; } @@ -1014,15 +958,15 @@ static QList<QTtfTable> generateGlyphTables(qttf_font_tables &tables, const QLis tables.hhea.numberOfHMetrics = nGlyphs; QTtfTable glyf; - glyf.tag = MAKE_TAG('g', 'l', 'y', 'f'); + glyf.tag = QFont::Tag("glyf").value(); QTtfTable loca; - loca.tag = MAKE_TAG('l', 'o', 'c', 'a'); + loca.tag = QFont::Tag("loca").value(); loca.data.resize(glyf_size < max_size_small ? (nGlyphs+1)*sizeof(quint16) : (nGlyphs+1)*sizeof(quint32)); QTtfStream ls(loca.data); QTtfTable hmtx; - hmtx.tag = MAKE_TAG('h', 'm', 't', 'x'); + hmtx.tag = QFont::Tag("hmtx").value(); hmtx.data.resize(nGlyphs*4); QTtfStream hs(hmtx.data); @@ -1122,7 +1066,7 @@ static QByteArray bindFont(const QList<QTtfTable>& _tables) for (int i = 0; i < tables.size(); ++i) { const QTtfTable &t = tables.at(i); const quint32 size = (t.data.size() + 3) & ~3; - if (t.tag == MAKE_TAG('h', 'e', 'a', 'd')) + if (t.tag == QFont::Tag("head").value()) head_offset = table_offset; f << t.tag << checksum(t.data) @@ -1203,13 +1147,12 @@ QByteArray QFontSubset::toTruetype() const font.maxp.maxCompositeContours = 0; font.maxp.maxComponentElements = 0; font.maxp.maxComponentDepth = 0; - const int numGlyphs = nGlyphs(); - font.maxp.numGlyphs = numGlyphs; + const qsizetype numGlyphs = nGlyphs(); + font.maxp.numGlyphs = quint16(numGlyphs); QList<QTtfGlyph> glyphs; glyphs.reserve(numGlyphs); - uint sumAdvances = 0; - for (int i = 0; i < numGlyphs; ++i) { + for (qsizetype i = 0; i < numGlyphs; ++i) { glyph_t g = glyph_indices.at(i); QPainterPath path; glyph_metrics_t metric; @@ -1231,9 +1174,6 @@ QByteArray QFontSubset::toTruetype() const font.maxp.maxPoints = qMax(font.maxp.maxPoints, glyph.numPoints); font.maxp.maxContours = qMax(font.maxp.maxContours, glyph.numContours); - if (glyph.xMax > glyph.xMin) - sumAdvances += glyph.xMax - glyph.xMin; - // qDebug("adding glyph %d size=%d", glyph.index, glyph.data.size()); glyphs.append(glyph); widths[i] = glyph.advanceWidth; @@ -1246,25 +1186,25 @@ QByteArray QFontSubset::toTruetype() const tables.append(generateMaxp(font.maxp)); // name QTtfTable name_table; - name_table.tag = MAKE_TAG('n', 'a', 'm', 'e'); + name_table.tag = QFont::Tag("name").value(); if (!noEmbed) name_table.data = fontEngine->getSfntTable(name_table.tag); if (name_table.data.isEmpty()) { qttf_name_table name; if (noEmbed) - name.copyright = QLatin1String("Fake font"); + name.copyright = "Fake font"_L1; else - name.copyright = QLatin1String(properties.copyright); - name.family = fontEngine->fontDef.families.first(); - name.subfamily = QLatin1String("Regular"); // ###### - name.postscript_name = QLatin1String(properties.postscriptName); + name.copyright = QLatin1StringView(properties.copyright); + name.family = fontEngine->fontDef.families.constFirst(); + name.subfamily = "Regular"_L1; // ###### + name.postscript_name = QLatin1StringView(properties.postscriptName); name_table = generateName(name); } tables.append(name_table); if (!noEmbed) { QTtfTable os2; - os2.tag = MAKE_TAG('O', 'S', '/', '2'); + os2.tag = QFont::Tag("OS/2").value(); os2.data = fontEngine->getSfntTable(os2.tag); if (!os2.data.isEmpty()) tables.append(os2); |