1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ******************************************************************************
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Copyright (C) 1998-2006, International Business Machines Corporation and   *
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * others. All Rights Reserved.                                               *
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ******************************************************************************
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h>
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <string.h>
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <ctype.h>
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uscript.h"
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "layout/LETypes.h"
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "layout/LEScripts.h"
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "layout/LEFontInstance.h"
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "GUISupport.h"
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "FontMap.h"
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruFontMap::FontMap(const char *fileName, le_int16 pointSize, GUISupport *guiSupport, LEErrorCode &status)
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    : fPointSize(pointSize), fFontCount(0), fAscent(0), fDescent(0), fLeading(0), fGUISupport(guiSupport)
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_int32 defaultFont = -1, i, script;
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_bool haveFonts = FALSE;
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**/
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (i = 0; i < scriptCodeCount; i += 1) {
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fFontIndices[i] = -1;
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fFontNames[i] = NULL;
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fFontInstances[i] = NULL;
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /**/
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (LE_FAILURE(status)) {
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *c, *scriptName, *fontName, *line, buffer[BUFFER_SIZE];
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    FILE *file;
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    file = fopen(fileName, "r");
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (file == NULL) {
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sprintf(errorMessage, "Could not open the font map file: %s.", fileName);
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fGUISupport->postErrorMessage(errorMessage, "Font Map Error");
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = LE_FONT_FILE_NOT_FOUND_ERROR;
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (fgets(buffer, BUFFER_SIZE, file) != NULL) {
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UScriptCode scriptCode;
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode scriptStatus = U_ZERO_ERROR;
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        line = strip(buffer);
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (line[0] == '#' || line[0] == 0) {
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            continue;
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = strchr(line, ':');
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c[0] = 0;
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fontName   = strip(&c[1]);
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        scriptName = strip(line);
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (strcmp(scriptName, "DEFAULT") == 0) {
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            defaultFont = getFontIndex(fontName);
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            haveFonts = TRUE;
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            continue;
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        le_int32 fillCount = uscript_getCode(scriptName, &scriptCode, 1, &scriptStatus);
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(scriptStatus) || fillCount <= 0 ||
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            scriptStatus == U_USING_FALLBACK_WARNING || scriptStatus == U_USING_DEFAULT_WARNING) {
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            sprintf(errorMessage, "The script name %s is invalid.", line);
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            fGUISupport->postErrorMessage(errorMessage, "Font Map Error");
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            continue;
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        script = (le_int32) scriptCode;
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (fFontIndices[script] >= 0) {
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            // FIXME: complain that this is a duplicate entry and bail (?)
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            fFontIndices[script] = -1;
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fFontIndices[script] = getFontIndex(fontName);
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        haveFonts = TRUE;
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (defaultFont >= 0) {
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for (script = 0; script < scriptCodeCount; script += 1) {
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (fFontIndices[script] < 0) {
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                fFontIndices[script] = defaultFont;
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (! haveFonts) {
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sprintf(errorMessage, "The font map file %s does not contain any valid scripts.", fileName);
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fGUISupport->postErrorMessage(errorMessage, "Font Map Error");
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = LE_ILLEGAL_ARGUMENT_ERROR;
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fclose(file);
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruFontMap::~FontMap()
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_int32 font;
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (font = 0; font < fFontCount; font += 1) {
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (fFontNames[font] != NULL) {
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            delete[] (char *) fFontNames[font];
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (font = 0; font < fFontCount; font += 1) {
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (fFontInstances[font] != NULL) {
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            delete fFontInstances[font];
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querule_int32 FontMap::getFontIndex(const char *fontName)
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_int32 index;
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (index = 0; index < fFontCount; index += 1) {
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (strcmp(fontName, fFontNames[index]) == 0) {
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return index;
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (fFontCount < (le_int32) scriptCodeCount) {
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        index = fFontCount++;
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // The font name table is full. Since there can
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // only be scriptCodeCount fonts in use at once,
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // there should be at least one that's not being
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // referenced; find it and resue it's index.
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for (index = 0; index < fFontCount; index += 1) {
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            le_int32 script;
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            for (script = 0; script < scriptCodeCount; script += 1) {
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if (fFontIndices[script] == index) {
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    break;
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (script >= scriptCodeCount) {
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                break;
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (index >= scriptCodeCount) {
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return -1;
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_int32 len = strlen(fontName);
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *s = new char[len + 1];
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fFontNames[index] = strcpy(s, fontName);
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return index;
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruchar *FontMap::strip(char *s)
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_int32 start, end, len;
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    start = 0;
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    len = strlen(s);
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (start < len && isspace(s[start])) {
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        start += 1;
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    end = len - 1;
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (end > start && isspace(s[end])) {
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        end -= 1;
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (end < len) {
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        s[end + 1] = '\0';
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return &s[start];
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst LEFontInstance *FontMap::getScriptFont(le_int32 scriptCode, LEErrorCode &status)
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (LE_FAILURE(status)) {
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (scriptCode <= -1 || scriptCode >= scriptCodeCount) {
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = LE_ILLEGAL_ARGUMENT_ERROR;
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_int32 fontIndex = fFontIndices[scriptCode];
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (fontIndex < 0) {
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sprintf(errorMessage, "No font was set for script %s", uscript_getName((UScriptCode) scriptCode));
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fGUISupport->postErrorMessage(errorMessage, "Font Map Error");
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = LE_FONT_FILE_NOT_FOUND_ERROR;
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (fFontInstances[fontIndex] == NULL) {
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fFontInstances[fontIndex] = openFont(fFontNames[fontIndex], fPointSize, status);
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (LE_FAILURE(status)) {
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            sprintf(errorMessage, "Could not open font file %s", fFontNames[fontIndex]);
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            fGUISupport->postErrorMessage(errorMessage, "Font Map Error");
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return NULL;
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return fFontInstances[fontIndex];
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querule_int32 FontMap::getAscent() const
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (fAscent <= 0) {
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ((FontMap *) this)->getMaxMetrics();
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return fAscent;
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querule_int32 FontMap::getDescent() const
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (fDescent <= 0) {
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ((FontMap *) this)->getMaxMetrics();
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return fDescent;
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querule_int32 FontMap::getLeading() const
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (fLeading <= 0) {
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ((FontMap *) this)->getMaxMetrics();
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return fLeading;
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid FontMap::getMaxMetrics()
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (le_int32 i = 0; i < fFontCount; i += 1) {
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        LEErrorCode status = LE_NO_ERROR;
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        le_int32 ascent, descent, leading;
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (fFontInstances[i] == NULL) {
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            fFontInstances[i] = openFont(fFontNames[i], fPointSize, status);
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (LE_FAILURE(status)) {
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                continue;
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ascent  = fFontInstances[i]->getAscent();
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        descent = fFontInstances[i]->getDescent();
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        leading = fFontInstances[i]->getLeading();
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (ascent > fAscent) {
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            fAscent = ascent;
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (descent > fDescent) {
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            fDescent = descent;
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (leading > fLeading) {
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            fLeading = leading;
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
288