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