source: trunk/poppler/fc-emulate-os2/fontconfig/fontconfig.cpp @ 56

Last change on this file since 56 was 56, checked in by Eugene Romanenko, 15 years ago

added basic fontconfig replacement for poppler

File size: 7.9 KB
Line 
1/*
2 * Copyright (c) 2006, Eugene Romanenko, netlabs.org
3 *
4 *----------------------------------------------------------------------
5 * This file is part of poppler plugin for Lucide (lupoppler).
6 *
7 *  lupoppler is free software; you can redistribute it and/or modify
8 *  it under the terms of the GNU General Public License as published by
9 *  the Free Software Foundation; either version 2 of the License, or
10 *  (at your option) any later version.
11 *
12 *  lupoppler is distributed in the hope that it will be useful,
13 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *  GNU General Public License for more details.
16 *
17 *  You should have received a copy of the GNU General Public License
18 *  along with gtk-gnutella; if not, write to the Free Software
19 *  Foundation, Inc.:
20 *      59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21 *----------------------------------------------------------------------
22 */
23
24// This file is fontconfig replacement which emulates functions
25// used by poppler.
26 
27#define INCL_DOS
28#define INCL_WIN
29#include <os2.h>
30
31#include <map>
32#include <string>
33using namespace std;
34
35#include <stdio.h>
36#include <dos.h>
37#include <string.h>
38
39#include "fontconfig.h"
40
41#include <ft2build.h>
42#include FT_FREETYPE_H
43
44
45static map<string,string> *fontmap = NULL;
46
47
48struct _FcPattern
49{
50    char *family;
51    int slant;
52    int weight;
53    int width;
54    int spacing;
55    char *lang;
56
57    char *filename;
58};
59
60static char *newstrdup( const char *s )
61{
62    if ( s == NULL ) {
63        return NULL;
64    }
65    char *temp = new char[ strlen( s ) + 1 ];
66    strcpy( temp, s );
67    return temp;
68}
69
70
71FcConfig *FcConfigGetCurrent()
72{
73    return NULL;
74}
75
76FcBool FcConfigSubstitute( FcConfig *config, FcPattern *p, FcMatchKind kind )
77{
78    return FcTrue;
79}
80
81
82void FcDefaultSubstitute( FcPattern *pattern )
83{
84}
85
86void FcFontSetDestroy( FcFontSet *s )
87{
88    for ( int i = 0; i < s->nfont; i++ ) {
89        FcPatternDestroy( s->fonts[i] );
90    }
91    delete s->fonts;
92    delete s;
93}
94
95
96FT_Library ftlib;
97
98
99static void ftLoad( char *fn )
100{
101    int l = strlen( fn );
102    if ( l < 5 ) {
103        return;
104    }
105
106    if ( stricmp( fn + ( l - 4 ), ".OFM" ) == 0 ) {
107        fn[ l - 3 ] = 'P';
108        fn[ l - 1 ] = 'B';
109    }
110
111    FT_Face ftface;
112    if ( FT_New_Face( ftlib, fn, 0, &ftface ) ) {
113        return;
114    }
115
116    string key = ftface->family_name;
117    if ( stricmp( ftface->style_name, "regular" ) != 0 ) {
118        key += ' ';
119        key += ftface->style_name;
120    }
121
122    char *tmpkey = newstrdup( key.c_str() );
123    strlwr( tmpkey );
124    key = tmpkey;
125    delete tmpkey;
126
127    (*fontmap)[ key ] = fn;
128    //printf( "%s: %s\n", fn, key.c_str() );
129
130    FT_Done_Face( ftface );
131}
132
133
134static void loadDir( string path )
135{
136    string pathnam = path + "\\*";
137
138    struct find_t ffblk;
139    unsigned done = _dos_findfirst( pathnam.c_str(), _A_RDONLY | _A_NORMAL, &ffblk );
140    while ( done == 0 )
141    {
142        string fname = path + '\\' + ffblk.name;
143        char *fn = newstrdup( fname.c_str() );
144        ftLoad( fn );
145        delete fn;
146        done = _dos_findnext( &ffblk );
147    }
148    _dos_findclose( &ffblk );
149}
150
151
152#define FLIST_SIZE  (1024*64)
153
154FcBool FcInit()
155{
156    if ( fontmap != NULL ) {
157        return FcTrue;
158    }
159
160    if ( FT_Init_FreeType( &ftlib ) ) {
161        return FcFalse;
162    }
163
164    fontmap = new map<string,string>;
165
166    // enum installed fonts
167    ULONG uldrv = 0;
168    DosQuerySysInfo( QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &uldrv, sizeof( ULONG ) );
169    char drv = (char)( uldrv + '@' );
170
171    const char *pmfonts = "PM_Fonts";
172    char *fnames = new char[ FLIST_SIZE ];
173    memset( fnames, 0, FLIST_SIZE );
174    PrfQueryProfileString( HINI_USER, pmfonts, NULL, NULL, fnames, FLIST_SIZE );
175
176    char *fn1 = new char[ CCHMAXPATH ];
177    char *fn2 = new char[ CCHMAXPATH ];
178    int noffset = 0;
179    while ( fnames[ noffset ] != 0 )
180    {
181
182        const char *fname = fnames + noffset;
183
184        PrfQueryProfileString( HINI_USER, pmfonts, fname, "", fn1, CCHMAXPATH );
185
186        if ( fn1[ 0 ] == '\\' ) {
187            fn2[ 0 ] = drv;
188            fn2[ 1 ] = ':';
189            fn2[ 2 ] = 0;
190            strcat( fn2, fn1 );
191        }
192        else {
193            strcpy( fn2, fn1 );
194        }
195
196        ftLoad( fn2 );
197
198        noffset += ( strlen( fname ) + 1 );
199    }
200    delete fn1;
201    delete fn2;
202    delete fnames;
203
204    // TODO: load some fonts dir?
205    //loadDir( "C:\\Programs\\AcrobatReader\\Adobe\\Acrobat 4.0\\Resource\\Font" );
206
207    return FcTrue;
208}
209
210
211#define DEFAULT_SERIF_FONT          "times new roman"
212#define DEFAULT_SANSSERIF_FONT      "helvetica"
213#define DEFAULT_MONOSPACED_FONT     "courier"
214
215static string buildFontKey( FcPattern *p, bool useDefaultFonts )
216{
217    string key = p->family;
218
219    if ( useDefaultFonts )
220    {
221        if ( p->spacing == FC_MONO ) {
222            key = DEFAULT_MONOSPACED_FONT;
223        }
224        else
225        {
226            if ( ( strstr( p->family, "swiss" ) != NULL ) ||
227                 ( strstr( p->family, "sans" ) != NULL ) )
228            {
229                key = DEFAULT_SANSSERIF_FONT;
230            }
231            else {
232                key = DEFAULT_SERIF_FONT;
233            }
234        }
235    }
236
237    if ( p->weight > FC_WEIGHT_NORMAL ) {
238        key += ' ';
239        key += "bold";
240    }
241
242    if ( p->slant != FC_SLANT_ROMAN ) {
243        key += ' ';
244        key += "italic";
245    }
246
247    return key;
248}
249
250FcFontSet *FcFontSort( FcConfig *config, FcPattern *p, FcBool trim,
251                       FcCharSet **csp, FcResult *result )
252{
253    FcPattern *pat = new FcPattern;
254    pat->family   = newstrdup( p->family );
255    pat->slant    = p->slant;
256    pat->weight   = p->weight;
257    pat->width    = p->width;
258    pat->spacing  = p->spacing;
259    pat->lang     = newstrdup( p->lang );
260    pat->filename = NULL;
261
262    string key = buildFontKey( pat, false );
263
264    if ( fontmap->find( key ) == fontmap->end() ) {
265        key = buildFontKey( pat, true );
266        pat->filename = newstrdup( (*fontmap)[ key ].c_str() );
267    }
268    else {
269        pat->filename = newstrdup( (*fontmap)[ key ].c_str() );
270    }
271
272    printf( "MATCHED STYLE: %s, FILENAME: %s\n", key.c_str(), pat->filename );
273
274    FcFontSet *fs = new FcFontSet;
275    fs->nfont = 1;
276    fs->sfont = 1;
277    fs->fonts = new FcPattern *[ 1 ];
278    fs->fonts[ 0 ] = pat;
279
280    return fs;
281}
282
283void FcFontSetSortDestroy( FcFontSet *fs )
284{
285}
286
287void FcPatternDestroy( FcPattern *p )
288{
289    delete p->family;
290    delete p->lang;
291    delete p->filename;
292}
293
294FcResult FcPatternGetInteger( const FcPattern *p, const char *object, int n, int *i )
295{
296    return FcResultMatch;
297}
298
299FcResult FcPatternGetString( const FcPattern *p, const char *object, int n, FcChar8 **s )
300{
301    if ( strcmp( object, FC_FILE ) == 0 )
302    {
303        *s = p->filename;
304        return FcResultMatch;
305    }
306    return FcResultNoMatch;
307}
308
309FcPattern *FcPatternBuild( void *,
310                    const char *fcFamily, FcType tFamily, const char *family,
311                    const char *fcSlant, FcType tSlant, int slant,
312                    const char *fcWeight, FcType tWeight, int weight,
313                    const char *fcWidth, FcType tWidth, int width,
314                    const char *fcSpacing, FcType tSpacing, int spacing,
315                    const char *fcLang, FcType tLang, const char *lang, void * )
316{
317    printf( "FAMILY: %s, SLANT: %d, WEIGHT: %d, WIDTH: %d, SPACING: %d, LANG: %s\n",
318            family, slant, weight, width, spacing, lang );
319
320    FcPattern *p = new FcPattern;
321    p->family   = newstrdup( family );
322    strlwr( p->family );
323    p->slant    = slant;
324    p->weight   = weight;
325    p->width    = width;
326    p->spacing  = spacing;
327    p->lang     = newstrdup( lang );
328    p->filename = NULL;
329
330    return p;
331}
332
Note: See TracBrowser for help on using the repository browser.