16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (C) 1998-2006, International Business Machines Corporation and   *
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved.                                               *
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ******************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h>
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h>
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <ctype.h>
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uscript.h"
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "layout/LETypes.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "layout/LEScripts.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "layout/LEFontInstance.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "GUISupport.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "FontMap.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgFontMap::FontMap(const char *fileName, le_int16 pointSize, GUISupport *guiSupport, LEErrorCode &status)
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    : fPointSize(pointSize), fFontCount(0), fAscent(0), fDescent(0), fLeading(0), fGUISupport(guiSupport)
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    le_int32 defaultFont = -1, i, script;
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    le_bool haveFonts = FALSE;
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**/
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0; i < scriptCodeCount; i += 1) {
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fFontIndices[i] = -1;
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fFontNames[i] = NULL;
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fFontInstances[i] = NULL;
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /**/
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (LE_FAILURE(status)) {
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *c, *scriptName, *fontName, *line, buffer[BUFFER_SIZE];
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    FILE *file;
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    file = fopen(fileName, "r");
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (file == NULL) {
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sprintf(errorMessage, "Could not open the font map file: %s.", fileName);
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fGUISupport->postErrorMessage(errorMessage, "Font Map Error");
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = LE_FONT_FILE_NOT_FOUND_ERROR;
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (fgets(buffer, BUFFER_SIZE, file) != NULL) {
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UScriptCode scriptCode;
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode scriptStatus = U_ZERO_ERROR;
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        line = strip(buffer);
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (line[0] == '#' || line[0] == 0) {
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c = strchr(line, ':');
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c[0] = 0;
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fontName   = strip(&c[1]);
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        scriptName = strip(line);
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (strcmp(scriptName, "DEFAULT") == 0) {
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            defaultFont = getFontIndex(fontName);
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            haveFonts = TRUE;
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        le_int32 fillCount = uscript_getCode(scriptName, &scriptCode, 1, &scriptStatus);
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(scriptStatus) || fillCount <= 0 ||
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            scriptStatus == U_USING_FALLBACK_WARNING || scriptStatus == U_USING_DEFAULT_WARNING) {
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sprintf(errorMessage, "The script name %s is invalid.", line);
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fGUISupport->postErrorMessage(errorMessage, "Font Map Error");
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        script = (le_int32) scriptCode;
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (fFontIndices[script] >= 0) {
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // FIXME: complain that this is a duplicate entry and bail (?)
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fFontIndices[script] = -1;
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fFontIndices[script] = getFontIndex(fontName);
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        haveFonts = TRUE;
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (defaultFont >= 0) {
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (script = 0; script < scriptCodeCount; script += 1) {
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (fFontIndices[script] < 0) {
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                fFontIndices[script] = defaultFont;
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (! haveFonts) {
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sprintf(errorMessage, "The font map file %s does not contain any valid scripts.", fileName);
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fGUISupport->postErrorMessage(errorMessage, "Font Map Error");
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = LE_ILLEGAL_ARGUMENT_ERROR;
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fclose(file);
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgFontMap::~FontMap()
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    le_int32 font;
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (font = 0; font < fFontCount; font += 1) {
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (fFontNames[font] != NULL) {
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            delete[] (char *) fFontNames[font];
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (font = 0; font < fFontCount; font += 1) {
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (fFontInstances[font] != NULL) {
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            delete fFontInstances[font];
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgle_int32 FontMap::getFontIndex(const char *fontName)
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    le_int32 index;
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (index = 0; index < fFontCount; index += 1) {
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (strcmp(fontName, fFontNames[index]) == 0) {
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return index;
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fFontCount < (le_int32) scriptCodeCount) {
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        index = fFontCount++;
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // The font name table is full. Since there can
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // only be scriptCodeCount fonts in use at once,
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // there should be at least one that's not being
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // referenced; find it and resue it's index.
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (index = 0; index < fFontCount; index += 1) {
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            le_int32 script;
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (script = 0; script < scriptCodeCount; script += 1) {
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (fFontIndices[script] == index) {
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    break;
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (script >= scriptCodeCount) {
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (index >= scriptCodeCount) {
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return -1;
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    le_int32 len = strlen(fontName);
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *s = new char[len + 1];
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fFontNames[index] = strcpy(s, fontName);
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return index;
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgchar *FontMap::strip(char *s)
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    le_int32 start, end, len;
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    start = 0;
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    len = strlen(s);
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (start < len && isspace(s[start])) {
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        start += 1;
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    end = len - 1;
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (end > start && isspace(s[end])) {
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        end -= 1;
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (end < len) {
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        s[end + 1] = '\0';
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return &s[start];
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst LEFontInstance *FontMap::getScriptFont(le_int32 scriptCode, LEErrorCode &status)
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (LE_FAILURE(status)) {
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (scriptCode <= -1 || scriptCode >= scriptCodeCount) {
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = LE_ILLEGAL_ARGUMENT_ERROR;
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    le_int32 fontIndex = fFontIndices[scriptCode];
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fontIndex < 0) {
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sprintf(errorMessage, "No font was set for script %s", uscript_getName((UScriptCode) scriptCode));
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fGUISupport->postErrorMessage(errorMessage, "Font Map Error");
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = LE_FONT_FILE_NOT_FOUND_ERROR;
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fFontInstances[fontIndex] == NULL) {
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fFontInstances[fontIndex] = openFont(fFontNames[fontIndex], fPointSize, status);
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (LE_FAILURE(status)) {
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sprintf(errorMessage, "Could not open font file %s", fFontNames[fontIndex]);
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fGUISupport->postErrorMessage(errorMessage, "Font Map Error");
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return NULL;
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return fFontInstances[fontIndex];
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgle_int32 FontMap::getAscent() const
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fAscent <= 0) {
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ((FontMap *) this)->getMaxMetrics();
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return fAscent;
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgle_int32 FontMap::getDescent() const
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fDescent <= 0) {
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ((FontMap *) this)->getMaxMetrics();
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return fDescent;
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgle_int32 FontMap::getLeading() const
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fLeading <= 0) {
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ((FontMap *) this)->getMaxMetrics();
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return fLeading;
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid FontMap::getMaxMetrics()
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (le_int32 i = 0; i < fFontCount; i += 1) {
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        LEErrorCode status = LE_NO_ERROR;
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        le_int32 ascent, descent, leading;
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (fFontInstances[i] == NULL) {
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fFontInstances[i] = openFont(fFontNames[i], fPointSize, status);
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (LE_FAILURE(status)) {
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                continue;
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ascent  = fFontInstances[i]->getAscent();
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        descent = fFontInstances[i]->getDescent();
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        leading = fFontInstances[i]->getLeading();
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (ascent > fAscent) {
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fAscent = ascent;
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (descent > fDescent) {
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fDescent = descent;
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (leading > fLeading) {
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fLeading = leading;
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
288