/********************************************************************** ** Copyright (C) 1999-2008 Trolltech ASA. All rights reserved. ** ** This file is part of Qt/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 Qt Foundation. ** ** Please review the following information to ensure GNU General ** Public Licensing requirements 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 Qt Commercial licenses may use this file in ** accordance with the Qt 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 #include #include #include #include #include #include #include #include #include #include #include #ifdef Q_WS_QWS #include #endif #include class FontViewItem : public QListViewItem { QString family; int pointSize; int weight; bool italic; QFont font; public: FontViewItem(const QString& f, int pt, int w, bool ital, QListView* parent) : QListViewItem(parent), family(f), pointSize(pt), weight(w), italic(ital) { } void renderAndSave() { font = QFont(family,pointSize,weight,italic); #ifdef Q_WS_QWS memorymanager->savePrerenderedFont((QMemoryManager::FontID)font.handle()); #endif setHeight(QFontMetrics(font).lineSpacing()); repaint(); } void render(int from, int to) { font = QFont(family,pointSize,weight,italic); #ifdef Q_WS_QWS for (int i=from; i<=to; i++) { if ( memorymanager->inFont((QMemoryManager::FontID)font.handle(),QChar(i))) { memorymanager->lockGlyph((QMemoryManager::FontID)font.handle(),QChar(i)); memorymanager->unlockGlyph((QMemoryManager::FontID)font.handle(),QChar(i)); } } #endif } void save() { font = QFont(family,pointSize,weight,italic); #ifdef Q_WS_QWS memorymanager->savePrerenderedFont((QMemoryManager::FontID)font.handle(),FALSE); #endif setHeight(QFontMetrics(font).lineSpacing()); repaint(); } void paintCell( QPainter *p, const QColorGroup & cg, int column, int width, int alignment ) { p->setFont(font); QListViewItem::paintCell(p,cg,column,width,alignment); } int width( const QFontMetrics&, const QListView* lv, int column) const { QFontMetrics fm(font); return QListViewItem::width(fm,lv,column); } QString text(int col) const { switch (col) { case 0: return family; case 1: return QString::number(pointSize)+"pt"; case 2: if ( weight < QFont::Normal ) { return "Light"; } else if ( weight >= QFont::Black ) { return "Black"; } else if ( weight >= QFont::Bold ) { return "Bold"; } else if ( weight >= QFont::DemiBold ) { return "DemiBold"; } else { return "Normal"; } case 3: return italic ? "Italic" : "Roman"; } return QString::null; } }; class MakeQPF : public QMainWindow { Q_OBJECT QListView* view; public: MakeQPF() { view = new QListView(this); view->addColumn("Family"); view->addColumn("Size"); view->addColumn("Weight"); view->addColumn("Style"); setCentralWidget(view); QString fontdir = QString(getenv("QTDIR")) + "/lib/fonts"; readFontDir(fontdir); connect(view,SIGNAL(selectionChanged(QListViewItem*)), this,SLOT(renderAndSave(QListViewItem*))); } void readFontDir(const QString& fntd) { QString fontdir = fntd + "/fontdir"; QFile fd(fontdir); if ( !fd.open(IO_ReadOnly) ) { QMessageBox::warning(this, "Read Error", "

Cannot read "+fontdir); return; } while ( !fd.atEnd() ) { QString line; fd.readLine(line,9999); if ( line[0] != '#' ) { QStringList attr = QStringList::split(" ",line); if ( attr.count() >= 7 ) { QString family = attr[0]; int weight = QString(attr[4]).toInt(); bool italic = QString(attr[3]) == "y"; QStringList sizes = attr[5]; if ( sizes[0] == "0" ) { if ( attr[7].isNull() ) sizes = QStringList::split(',',attr[6]); else sizes = QStringList::split(',',attr[7]); } for (QStringList::Iterator it = sizes.begin(); it != sizes.end(); ++it) { int pointSize = (*it).toInt()/10; if ( pointSize ) new FontViewItem( family, pointSize, weight, italic, view); } } } } } void renderAndSaveAll() { QListViewItem* c = view->firstChild(); while ( c ) { renderAndSave(c); qApp->processEvents(); c = c->nextSibling(); } } void renderAndSave(const QString& family) { QListViewItem* c = view->firstChild(); while ( c ) { if ( c->text(0).lower() == family.lower() ) renderAndSave(c); c = c->nextSibling(); } } void render(const QString& family, int from, int to) { QListViewItem* c = view->firstChild(); while ( c ) { if ( c->text(0).lower() == family.lower() ) ((FontViewItem*)c)->render(from,to); c = c->nextSibling(); } } void save(const QString& family) { QListViewItem* c = view->firstChild(); while ( c ) { if ( c->text(0).lower() == family.lower() ) ((FontViewItem*)c)->save(); c = c->nextSibling(); } } private slots: void renderAndSave(QListViewItem* i) { ((FontViewItem*)i)->renderAndSave(); } }; static void usage() { qWarning("Usage: makeqpf [-A] [-f spec-file] [font ...]"); qWarning(""); qWarning(" Saves QPF 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) { QApplication app(argc, argv, QApplication::GuiServer); MakeQPF m; if ( argc > 1 ) { argv++; QString specfile; while ( *argv && argv[0][0] == '-' ) { if (argv[0][1] == 'A' ) m.renderAndSaveAll(); else if (argv[0][1] == 'f' ) specfile = *++argv; else { usage(); specfile=QString::null; *argv=0; break; } argv++; } if ( !specfile.isNull() ) { QFile f(specfile); if ( f.open(IO_ReadOnly) ) { QTextStream s(&f); while (!s.atEnd()) { QString family,ranges; s >> family >> ranges; QStringList r = QStringList::split(',',ranges); for (QStringList::Iterator it=r.begin(); it!=r.end(); ++it) { QString 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"