summaryrefslogtreecommitdiff
path: root/library/fontdatabase.cpp
Unidiff
Diffstat (limited to 'library/fontdatabase.cpp') (more/less context) (show whitespace changes)
-rw-r--r--library/fontdatabase.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/library/fontdatabase.cpp b/library/fontdatabase.cpp
index 147134c..899d5cf 100644
--- a/library/fontdatabase.cpp
+++ b/library/fontdatabase.cpp
@@ -1,230 +1,234 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#include <qpe/qpeapplication.h> 21#include <qpe/qpeapplication.h>
22#include "fontfactoryinterface.h" 22#include "fontfactoryinterface.h"
23#include "fontdatabase.h" 23#include "fontdatabase.h"
24 24
25#include <qpe/qlibrary.h> 25#include <qpe/qlibrary.h>
26 26
27#include <qfontmanager_qws.h> 27#include <qfontmanager_qws.h>
28#include <qdir.h> 28#include <qdir.h>
29#include <qdict.h> 29#include <qdict.h>
30#include <stdio.h> 30#include <stdio.h>
31#include <stdlib.h> 31#include <stdlib.h>
32 32
33static QString fontDir() 33static QString fontDir()
34{ 34{
35 QString qtdir = getenv("QTDIR"); 35 QString qtdir = getenv("QTDIR");
36 if ( qtdir.isEmpty() ) qtdir = "/usr/local/qt-embedded"; 36 if ( qtdir.isEmpty() ) qtdir = "/usr/local/qt-embedded";
37 return qtdir+"/lib/fonts/"; 37 return qtdir+"/lib/fonts/";
38} 38}
39 39
40#ifdef QT_NO_FONTDATABASE 40#ifdef QT_NO_FONTDATABASE
41static QString fontFamily( const QString& key ) 41static QString fontFamily( const QString& key )
42{ 42{
43 int u0 = key.find('_'); 43 int u0 = key.find('_');
44 int u1 = key.find('_',u0+1); 44 int u1 = key.find('_',u0+1);
45 int u2 = key.find('_',u1+1); 45 int u2 = key.find('_',u1+1);
46 QString family = key.left(u0); 46 QString family = key.left(u0);
47 //int pointSize = key.mid(u0+1,u1-u0-1).toInt(); 47 //int pointSize = key.mid(u0+1,u1-u0-1).toInt();
48 //int weight = key.mid(u1+1,u2-u1-1).toInt(); 48 //int weight = key.mid(u1+1,u2-u1-1).toInt();
49 //bool italic = key.mid(u2-1,1) == "i"; 49 //bool italic = key.mid(u2-1,1) == "i";
50 // #### ignores _t and _I fields 50 // #### ignores _t and _I fields
51 return family; 51 return family;
52} 52}
53#endif 53#endif
54 54
55QValueList<FontFactory> *FontDatabase::factoryList = 0; 55QValueList<FontFactory> *FontDatabase::factoryList = 0;
56 56
57/*! 57/*!
58 \class FontDatabase fontdatabase.h 58 \class FontDatabase fontdatabase.h
59 \brief The FontDatabase class provides information about available fonts. 59 \brief The FontDatabase class provides information about available fonts.
60 60
61 Most often you will simply want to query the database for the 61 Most often you will simply want to query the database for the
62 available font families(). 62 available font families().
63 63
64 Use FontDatabase rather than QFontDatabase when you may need access 64 Use FontDatabase rather than QFontDatabase when you may need access
65 to fonts that are not normally available. For example, if the 65 to fonts that are not normally available. For example, if the
66 freetype library and the Qtopia freetype plugin are installed, 66 freetype library and the Qtopia freetype plugin are installed,
67 TrueType fonts will be available to your application. Font renderer 67 TrueType fonts will be available to your application. Font renderer
68 plugins have greater resource requirements than system fonts so they 68 plugins have greater resource requirements than system fonts so they
69 should be used only when necessary. You can force the loading of 69 should be used only when necessary. You can force the loading of
70 font renderer plugins with loadRenderers(). 70 font renderer plugins with loadRenderers().
71 71
72 \ingroup qtopiaemb 72 \ingroup qtopiaemb
73*/ 73*/
74 74
75/*! 75/*!
76 Constructs a FontDatabase object. 76 Constructs a FontDatabase object.
77*/ 77*/
78FontDatabase::FontDatabase() 78FontDatabase::FontDatabase()
79#ifndef QT_NO_FONTDATABASE 79#ifndef QT_NO_FONTDATABASE
80 : QFontDatabase() 80 : QFontDatabase()
81#endif 81#endif
82{ 82{
83 if ( !factoryList ) 83 if ( !factoryList )
84 loadRenderers(); 84 loadRenderers();
85} 85}
86 86
87/*! 87/*!
88 Returns a list of names of all the available font families. 88 Returns a list of names of all the available font families.
89*/ 89*/
90QStringList FontDatabase::families() const 90QStringList FontDatabase::families() const
91{ 91{
92#ifndef QT_NO_FONTDATABASE 92#ifndef QT_NO_FONTDATABASE
93 return QFontDatabase::families(); 93 return QFontDatabase::families();
94#else 94#else
95 QStringList list; 95 QStringList list;
96 QDict<void> familyDict; 96 QDict<void> familyDict;
97 QDiskFont *qdf; 97 QDiskFont *qdf;
98 for ( qdf=qt_fontmanager->diskfonts.first(); qdf!=0; 98 for ( qdf=qt_fontmanager->diskfonts.first(); qdf!=0;
99 qdf=qt_fontmanager->diskfonts.next()) { 99 qdf=qt_fontmanager->diskfonts.next()) {
100 QString familyname = qdf->name; 100 QString familyname = qdf->name;
101 if ( !familyDict.find( familyname ) ) { 101 if ( !familyDict.find( familyname ) ) {
102 familyDict.insert( familyname, (void *)1 ); 102 familyDict.insert( familyname, (void *)1 );
103 list.append( familyname ); 103 list.append( familyname );
104 } 104 }
105 } 105 }
106 106
107 QDir dir(fontDir(),"*.qpf"); 107 QDir dir(fontDir(),"*.qpf");
108 for (int i=0; i<(int)dir.count(); i++) { 108 for (int i=0; i<(int)dir.count(); i++) {
109 QString familyname = fontFamily(dir[i]); 109 QString familyname = fontFamily(dir[i]);
110 if ( !familyDict.find( familyname ) ) { 110 if ( !familyDict.find( familyname ) ) {
111 familyDict.insert( familyname, (void *)1 ); 111 familyDict.insert( familyname, (void *)1 );
112 list.append( familyname ); 112 list.append( familyname );
113 } 113 }
114 } 114 }
115 115
116 return list; 116 return list;
117#endif 117#endif
118} 118}
119 119
120#ifdef QT_NO_FONTDATABASE 120#ifdef QT_NO_FONTDATABASE
121/*! 121/*!
122 Returns a list of standard fontsizes. 122 Returns a list of standard fontsizes.
123*/ 123*/
124QValueList<int> FontDatabase::standardSizes() 124QValueList<int> FontDatabase::standardSizes()
125{ 125{
126 static int s[]={ 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 126 static int s[]={ 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28,
127 36, 48, 72, 0 }; 127 36, 48, 72, 0 };
128 static bool first = TRUE; 128 static bool first = TRUE;
129 static QValueList<int> sList; 129 static QValueList<int> sList;
130 if ( first ) { 130 if ( first ) {
131 first = FALSE; 131 first = FALSE;
132 int i = 0; 132 int i = 0;
133 while( s[i] ) 133 while( s[i] )
134 sList.append( s[i++] ); 134 sList.append( s[i++] );
135 } 135 }
136 return sList; 136 return sList;
137} 137}
138 138
139#endif 139#endif
140 140
141/*! 141/*!
142 Load any font renderer plugins that are available and make the fonts 142 Load any font renderer plugins that are available and make the fonts
143 that the plugins can read available. 143 that the plugins can read available.
144*/ 144*/
145void FontDatabase::loadRenderers() 145void FontDatabase::loadRenderers()
146{ 146{
147#ifndef QT_NO_COMPONENT 147#ifndef QT_NO_COMPONENT
148 if ( !factoryList ) 148 if ( !factoryList )
149 factoryList = new QValueList<FontFactory>; 149 factoryList = new QValueList<FontFactory>;
150 150
151 QValueList<FontFactory>::Iterator mit; 151 QValueList<FontFactory>::Iterator mit;
152 for ( mit = factoryList->begin(); mit != factoryList->end(); ++mit ) { 152 for ( mit = factoryList->begin(); mit != factoryList->end(); ++mit ) {
153 qt_fontmanager->factories.setAutoDelete( false ); 153 qt_fontmanager->factories.setAutoDelete( false );
154 qt_fontmanager->factories.removeRef( (*mit).factory ); 154 qt_fontmanager->factories.removeRef( (*mit).factory );
155 qt_fontmanager->factories.setAutoDelete( true ); 155 qt_fontmanager->factories.setAutoDelete( true );
156 (*mit).interface->release(); 156 (*mit).interface->release();
157 (*mit).library->unload(); 157 (*mit).library->unload();
158 delete (*mit).library; 158 delete (*mit).library;
159 } 159 }
160 factoryList->clear(); 160 factoryList->clear();
161 161
162 QString path = QPEApplication::qpeDir() + "/plugins/fontfactories"; 162 QString path = QPEApplication::qpeDir() + "/plugins/fontfactories";
163 QDir dir( path, "lib*.so" ); 163 QDir dir( path, "lib*.so" );
164
165 if ( !dir.exists())
166 return;
167
164 QStringList list = dir.entryList(); 168 QStringList list = dir.entryList();
165 QStringList::Iterator it; 169 QStringList::Iterator it;
166 for ( it = list.begin(); it != list.end(); ++it ) { 170 for ( it = list.begin(); it != list.end(); ++it ) {
167 FontFactoryInterface *iface = 0; 171 FontFactoryInterface *iface = 0;
168 QLibrary *lib = new QLibrary( path + "/" + *it ); 172 QLibrary *lib = new QLibrary( path + "/" + *it );
169 if ( lib->queryInterface( IID_FontFactory, (QUnknownInterface**)&iface ) == QS_OK ) { 173 if ( lib->queryInterface( IID_FontFactory, (QUnknownInterface**)&iface ) == QS_OK ) {
170 FontFactory factory; 174 FontFactory factory;
171 factory.library = lib; 175 factory.library = lib;
172 factory.interface = iface; 176 factory.interface = iface;
173 factory.factory = factory.interface->fontFactory(); 177 factory.factory = factory.interface->fontFactory();
174 factoryList->append( factory ); 178 factoryList->append( factory );
175 qt_fontmanager->factories.append( factory.factory ); 179 qt_fontmanager->factories.append( factory.factory );
176 readFonts( factory.factory ); 180 readFonts( factory.factory );
177 } else { 181 } else {
178 delete lib; 182 delete lib;
179 } 183 }
180 } 184 }
181#endif 185#endif
182} 186}
183 187
184/*! 188/*!
185 \internal 189 \internal
186*/ 190*/
187void FontDatabase::readFonts( QFontFactory *factory ) 191void FontDatabase::readFonts( QFontFactory *factory )
188{ 192{
189 // Load in font definition file 193 // Load in font definition file
190 QString fn = fontDir() + "fontdir"; 194 QString fn = fontDir() + "fontdir";
191 FILE* fontdef=fopen(fn.local8Bit(),"r"); 195 FILE* fontdef=fopen(fn.local8Bit(),"r");
192 if(!fontdef) { 196 if(!fontdef) {
193 QCString temp=fn.local8Bit(); 197 QCString temp=fn.local8Bit();
194 qWarning("Cannot find font definition file %s - is $QTDIR set correctly?", 198 qWarning("Cannot find font definition file %s - is $QTDIR set correctly?",
195 temp.data()); 199 temp.data());
196 return; 200 return;
197 } 201 }
198 char buf[200]=""; 202 char buf[200]="";
199 char name[200]=""; 203 char name[200]="";
200 char render[200]=""; 204 char render[200]="";
201 char file[200]=""; 205 char file[200]="";
202 char flags[200]=""; 206 char flags[200]="";
203 char isitalic[10]=""; 207 char isitalic[10]="";
204 fgets(buf,200,fontdef); 208 fgets(buf,200,fontdef);
205 while(!feof(fontdef)) { 209 while(!feof(fontdef)) {
206 if ( buf[0] != '#' ) { 210 if ( buf[0] != '#' ) {
207 int weight=50; 211 int weight=50;
208 int size=0; 212 int size=0;
209 flags[0]=0; 213 flags[0]=0;
210 sscanf(buf,"%s %s %s %s %d %d %s",name,file,render,isitalic,&weight,&size,flags); 214 sscanf(buf,"%s %s %s %s %d %d %s",name,file,render,isitalic,&weight,&size,flags);
211 QString filename; 215 QString filename;
212 if ( file[0] != '/' ) 216 if ( file[0] != '/' )
213 filename = fontDir(); 217 filename = fontDir();
214 filename += file; 218 filename += file;
215 if ( QFile::exists(filename) ) { 219 if ( QFile::exists(filename) ) {
216 if( factory->name() == render ) { 220 if( factory->name() == render ) {
217 QDiskFont * qdf=new QDiskFont(factory,name,isitalic[0]=='y', 221 QDiskFont * qdf=new QDiskFont(factory,name,isitalic[0]=='y',
218 weight,size,flags,filename); 222 weight,size,flags,filename);
219 qt_fontmanager->diskfonts.append(qdf); 223 qt_fontmanager->diskfonts.append(qdf);
220#if QT_VERSION >= 232 224#if QT_VERSION >= 232
221 QFontDatabase::qwsAddDiskFont( qdf ); 225 QFontDatabase::qwsAddDiskFont( qdf );
222#endif 226#endif
223 } 227 }
224 } 228 }
225 } 229 }
226 fgets(buf,200,fontdef); 230 fgets(buf,200,fontdef);
227 } 231 }
228 fclose(fontdef); 232 fclose(fontdef);
229} 233}
230 234