diff options
Diffstat (limited to 'tools/makeqpf/main.cpp')
-rw-r--r-- | tools/makeqpf/main.cpp | 320 |
1 files changed, 320 insertions, 0 deletions
diff --git a/tools/makeqpf/main.cpp b/tools/makeqpf/main.cpp new file mode 100644 index 000000000..bd15bd4e3 --- /dev/null +++ b/tools/makeqpf/main.cpp @@ -0,0 +1,320 @@ +/********************************************************************** +** Copyright (C) 1999-2008 Trolltech ASA. All rights reserved. +** +** This file is part of TQt/Embedded. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing retquirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** Licensees holding valid TQt Commercial licenses may use this file in +** accordance with the TQt Commercial License Agreement provided with +** the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#include <qapplication.h> +#include <qtextstream.h> +#include <qscrollview.h> +#include <qfile.h> +#include <qfont.h> +#include <qvbox.h> +#include <qlabel.h> +#include <qstringlist.h> +#include <qlistview.h> +#include <qmainwindow.h> +#include <qmessagebox.h> +#include <qpainter.h> +#ifdef Q_WS_QWS +#include <qmemorymanager_qws.h> +#endif + +#include <cstdlib> + + +class FontViewItem : public TQListViewItem { + TQString family; + int pointSize; + int weight; + bool italic; + TQFont font; + +public: + FontViewItem(const TQString& f, int pt, int w, bool ital, TQListView* parent) : + TQListViewItem(parent), + family(f), pointSize(pt), weight(w), italic(ital) + { + } + + void renderAndSave() + { + font = TQFont(family,pointSize,weight,italic); +#ifdef Q_WS_QWS + memorymanager->savePrerenderedFont((TQMemoryManager::FontID)font.handle()); +#endif + setHeight(TQFontMetrics(font).lineSpacing()); + repaint(); + } + + void render(int from, int to) + { + font = TQFont(family,pointSize,weight,italic); +#ifdef Q_WS_QWS + for (int i=from; i<=to; i++) { + if ( memorymanager->inFont((TQMemoryManager::FontID)font.handle(),TQChar(i))) { + memorymanager->lockGlyph((TQMemoryManager::FontID)font.handle(),TQChar(i)); + memorymanager->unlockGlyph((TQMemoryManager::FontID)font.handle(),TQChar(i)); + } + } +#endif + } + + void save() + { + font = TQFont(family,pointSize,weight,italic); +#ifdef Q_WS_QWS + memorymanager->savePrerenderedFont((TQMemoryManager::FontID)font.handle(),FALSE); +#endif + setHeight(TQFontMetrics(font).lineSpacing()); + repaint(); + } + + void paintCell( TQPainter *p, const TQColorGroup & cg, + int column, int width, int alignment ) + { + p->setFont(font); + TQListViewItem::paintCell(p,cg,column,width,alignment); + } + + int width( const TQFontMetrics&, + const TQListView* lv, int column) const + { + TQFontMetrics fm(font); + return TQListViewItem::width(fm,lv,column); + } + + TQString text(int col) const + { + switch (col) { + case 0: + return family; + case 1: + return TQString::number(pointSize)+"pt"; + case 2: + if ( weight < TQFont::Normal ) { + return "Light"; + } else if ( weight >= TQFont::Black ) { + return "Black"; + } else if ( weight >= TQFont::Bold ) { + return "Bold"; + } else if ( weight >= TQFont::DemiBold ) { + return "DemiBold"; + } else { + return "Normal"; + } + case 3: + return italic ? "Italic" : "Roman"; + } + return TQString::null; + } +}; + +class MakeTQPF : public TQMainWindow +{ + Q_OBJECT + TQListView* view; +public: + MakeTQPF() + { + view = new TQListView(this); + view->addColumn("Family"); + view->addColumn("Size"); + view->addColumn("Weight"); + view->addColumn("Style"); + setCentralWidget(view); + TQString fontdir = TQString(getenv("QTDIR")) + "/lib/fonts"; + readFontDir(fontdir); + + connect(view,SIGNAL(selectionChanged(TQListViewItem*)), + this,SLOT(renderAndSave(TQListViewItem*))); + } + + void readFontDir(const TQString& fntd) + { + TQString fontdir = fntd + "/fontdir"; + TQFile fd(fontdir); + if ( !fd.open(IO_ReadOnly) ) { + TQMessageBox::warning(this, "Read Error", + "<p>Cannot read "+fontdir); + return; + } + while ( !fd.atEnd() ) { + TQString line; + fd.readLine(line,9999); + if ( line[0] != '#' ) { + TQStringList attr = TQStringList::split(" ",line); + if ( attr.count() >= 7 ) { + TQString family = attr[0]; + int weight = TQString(attr[4]).toInt(); + bool italic = TQString(attr[3]) == "y"; + TQStringList sizes = attr[5]; + if ( sizes[0] == "0" ) { + if ( attr[7].isNull() ) + sizes = TQStringList::split(',',attr[6]); + else + sizes = TQStringList::split(',',attr[7]); + } + for (TQStringList::Iterator it = sizes.begin(); it != sizes.end(); ++it) { + int pointSize = (*it).toInt()/10; + if ( pointSize ) + new FontViewItem( + family, pointSize, weight, italic, view); + } + } + } + } + } + + void renderAndSaveAll() + { + TQListViewItem* c = view->firstChild(); + while ( c ) { + renderAndSave(c); + qApp->processEvents(); + c = c->nextSibling(); + } + } + + void renderAndSave(const TQString& family) + { + TQListViewItem* c = view->firstChild(); + while ( c ) { + if ( c->text(0).lower() == family.lower() ) + renderAndSave(c); + c = c->nextSibling(); + } + } + + void render(const TQString& family, int from, int to) + { + TQListViewItem* c = view->firstChild(); + while ( c ) { + if ( c->text(0).lower() == family.lower() ) + ((FontViewItem*)c)->render(from,to); + c = c->nextSibling(); + } + } + + void save(const TQString& family) + { + TQListViewItem* c = view->firstChild(); + while ( c ) { + if ( c->text(0).lower() == family.lower() ) + ((FontViewItem*)c)->save(); + c = c->nextSibling(); + } + } + +private slots: + void renderAndSave(TQListViewItem* i) + { + ((FontViewItem*)i)->renderAndSave(); + } +}; + +static void usage() +{ + qWarning("Usage: makeqpf [-A] [-f spec-file] [font ...]"); + qWarning(""); + qWarning(" Saves TQPF font files by rendering and saving fonts."); + qWarning(""); + qWarning(" -A = Render and save all fonts in fontdir"); + qWarning(" -f = File of lines:"); + qWarning(" fontname character-ranges"); + qWarning(" eg."); + qWarning(" smoothtimes 0-ff,20a0-20af"); + qWarning(" font = Font to render and save"); +} + +int main(int argc, char** argv) +{ + TQApplication app(argc, argv, TQApplication::GuiServer); + MakeTQPF m; + if ( argc > 1 ) { + argv++; + TQString specfile; + while ( *argv && argv[0][0] == '-' ) { + if (argv[0][1] == 'A' ) + m.renderAndSaveAll(); + else if (argv[0][1] == 'f' ) + specfile = *++argv; + else { + usage(); + specfile=TQString::null; + *argv=0; + break; + } + argv++; + } + if ( !specfile.isNull() ) { + TQFile f(specfile); + if ( f.open(IO_ReadOnly) ) { + TQTextStream s(&f); + while (!s.atEnd()) { + TQString family,ranges; + s >> family >> ranges; + TQStringList r = TQStringList::split(',',ranges); + for (TQStringList::Iterator it=r.begin(); it!=r.end(); ++it) { + TQString rng = *it; + int dash = rng.find('-'); + int from,to; + if ( dash==0 ) { + from=0; + to=rng.mid(1).toInt(0,16); + } else if ( dash==(int)rng.length()-1 ) { + from=rng.left(dash).toInt(0,16); + to=65535; + } else if ( dash<0 ) { + from=to=rng.toInt(0,16); + } else { + from=rng.left(dash).toInt(0,16); + to=rng.mid(dash+1).toInt(0,16); + } + m.render(family,from,to); + } + m.save(family); + } + } else { + qWarning("Cannot open %s",specfile.latin1()); + } + } else { + while (*argv) + m.renderAndSave(*argv++); + } + } else { + // Interactive + app.setMainWidget(&m); + m.show(); + return app.exec(); + } +} + +#include "main.moc" |