summaryrefslogtreecommitdiffstats
path: root/util/aglfn/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'util/aglfn/main.cpp')
-rw-r--r--util/aglfn/main.cpp216
1 files changed, 216 insertions, 0 deletions
diff --git a/util/aglfn/main.cpp b/util/aglfn/main.cpp
new file mode 100644
index 0000000000..1c79bf32a4
--- /dev/null
+++ b/util/aglfn/main.cpp
@@ -0,0 +1,216 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the utils of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qbytearray.h>
+#include <qlist.h>
+#include <qmap.h>
+#include <qfile.h>
+
+static QByteArray fileVersion;
+
+static QList<QByteArray> glyphNames;
+static QList<ushort> glyphNameOffsets;
+static QMap<ushort, ushort> uni_to_agl_map; // sort by code point for bsearch
+
+static void readGlyphList()
+{
+ qDebug("Reading aglfn.txt:");
+ QFile f("data/aglfn.txt");
+ if (!f.exists())
+ qFatal("Couldn't find aglfn.txt");
+
+ f.open(QFile::ReadOnly);
+
+ glyphNames.append(".notdef");
+ glyphNameOffsets.append(0);
+ uni_to_agl_map.insert(0, 0);
+ while (!f.atEnd()) {
+ QByteArray line;
+ line.resize(1024);
+ int len = f.readLine(line.data(), 1024);
+ line.resize(len-1);
+
+ int comment = line.indexOf('#');
+ if (comment != -1) {
+ if (fileVersion.isEmpty()) {
+ int commentTableVersion = line.indexOf("Table version:", comment);
+ if (commentTableVersion != -1)
+ fileVersion = line.mid(commentTableVersion + 15).trimmed();
+ }
+ line = line.left(comment);
+ }
+ line = line.trimmed();
+
+ if (line.isEmpty())
+ continue;
+
+ QList<QByteArray> l = line.split(';');
+ Q_ASSERT(l.size() == 3);
+
+ bool ok;
+ ushort codepoint = l[0].toUShort(&ok, 16);
+ Q_ASSERT(ok);
+ QByteArray glyphName = l[1].trimmed();
+
+ int glyphIndex = glyphNames.indexOf(glyphName);
+ if (glyphIndex == -1) {
+ glyphIndex = glyphNames.size();
+ glyphNameOffsets.append(glyphNameOffsets.last() + glyphNames.last().size() + 1);
+ glyphNames.append(glyphName);
+ }
+ uni_to_agl_map.insert(codepoint, glyphIndex);
+ }
+
+ qDebug(" %d unique glyph names found", glyphNames.size());
+}
+
+static QByteArray createGlyphList()
+{
+ qDebug("createGlyphList:");
+
+ QByteArray out;
+
+ out += "static const char glyph_names[] =\n\"";
+ int linelen = 2;
+ for (int i = 0; i < glyphNames.size(); ++i) {
+ if (linelen + glyphNames.at(i).size() + 2 >= 80) {
+ linelen = 2;
+ out += "\"\n\"";
+ }
+ linelen += glyphNames.at(i).size() + 2;
+ out += glyphNames.at(i) + "\\0";
+ }
+ if (out.endsWith("\""))
+ out.chop(2);
+ out += "\"\n;\n\n";
+
+ out += "struct AGLEntry {\n"
+ " unsigned short uc;\n"
+ " unsigned short index;\n"
+ "};\n"
+ "\n"
+ "inline bool operator<(unsigned short uc, AGLEntry entry)\n"
+ "{ return uc < entry.uc; }\n"
+ "inline bool operator<(AGLEntry entry, unsigned short uc)\n"
+ "{ return entry.uc < uc; }\n"
+ "\n"
+ "static const AGLEntry unicode_to_agl_map[] = {";
+
+ int i = 0;
+ QMap<ushort, ushort>::const_iterator it = uni_to_agl_map.constBegin();
+ while (it != uni_to_agl_map.constEnd()) {
+ if (i++ % 4 == 0)
+ out += "\n ";
+ out += " { 0x" + QByteArray::number(it.key(), 16).rightJustified(4, '0') + ", ";
+ out += QByteArray::number(glyphNameOffsets.at(it.value())).leftJustified(4, ' ') + " },";
+ ++it;
+ }
+ out.chop(1);
+ out += "\n};\n\n";
+
+ out += "enum { unicode_to_agl_map_size = sizeof(unicode_to_agl_map) / sizeof(unicode_to_agl_map[0]) };\n\n";
+
+ qDebug(" Glyph names list uses : %d bytes", glyphNameOffsets.last() + glyphNames.last().size() + 1);
+ qDebug(" Unicode to Glyph names map uses : %d bytes", uni_to_agl_map.size()*4);
+
+ return out;
+}
+
+
+int main(int, char **)
+{
+ readGlyphList();
+
+ QByteArray header =
+ "/****************************************************************************\n"
+ "**\n"
+ "** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).\n"
+ "** Contact: http://www.qt-project.org/\n"
+ "**\n"
+ "** This file is part of the QtGui module of the Qt Toolkit.\n"
+ "**\n"
+ "** $QT_BEGIN_LICENSE:LGPL$\n"
+ "** GNU Lesser General Public License Usage\n"
+ "** This file may be used under the terms of the GNU Lesser General Public\n"
+ "** License version 2.1 as published by the Free Software Foundation and\n"
+ "** appearing in the file LICENSE.LGPL included in the packaging of this\n"
+ "** file. Please review the following information to ensure the GNU Lesser\n"
+ "** General Public License version 2.1 requirements will be met:\n"
+ "** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n"
+ "**\n"
+ "** In addition, as a special exception, Nokia gives you certain additional\n"
+ "** rights. These rights are described in the Nokia Qt LGPL Exception\n"
+ "** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.\n"
+ "**\n"
+ "** GNU General Public License Usage\n"
+ "** Alternatively, this file may be used under the terms of the GNU General\n"
+ "** Public License version 3.0 as published by the Free Software Foundation\n"
+ "** and appearing in the file LICENSE.GPL included in the packaging of this\n"
+ "** file. Please review the following information to ensure the GNU General\n"
+ "** Public License version 3.0 requirements will be met:\n"
+ "** http://www.gnu.org/copyleft/gpl.html.\n"
+ "**\n"
+ "** Other Usage\n"
+ "** Alternatively, this file may be used in accordance with the terms and\n"
+ "** conditions contained in a signed written agreement between you and Nokia.\n"
+ "**\n"
+ "**\n"
+ "**\n"
+ "**\n"
+ "**\n"
+ "**\n"
+ "** $QT_END_LICENSE$\n"
+ "**\n"
+ "****************************************************************************/\n\n";
+
+ QByteArray note =
+ "/* This file is autogenerated from the Adobe Glyph List database" +
+ (!fileVersion.isEmpty() ? " v" + fileVersion : "") + ". Do not edit */\n\n";
+
+ QFile f("../../src/gui/text/qfontsubset_agl.cpp");
+ f.open(QFile::WriteOnly|QFile::Truncate);
+ f.write(header);
+ f.write(note);
+ f.write("namespace {\n\n");
+ f.write(createGlyphList());
+ f.write("}\n");
+ f.close();
+}