1 /* 2 ******************************************************************************* 3 * 4 * Copyright (C) 1999-2003, International Business Machines 5 * Corporation and others. All Rights Reserved. 6 * 7 ******************************************************************************* 8 * file name: ScriptCompositeFontInstance.cpp 9 * 10 * created on: 02/05/2003 11 * created by: Eric R. Mader 12 */ 13 14 #include "layout/LETypes.h" 15 16 #include "unicode/uscript.h" 17 18 #include "FontMap.h" 19 20 #include "ScriptCompositeFontInstance.h" 21 22 const char ScriptCompositeFontInstance::fgClassID=0; 23 24 ScriptCompositeFontInstance::ScriptCompositeFontInstance(FontMap *fontMap) 25 : fFontMap(fontMap) 26 { 27 // nothing else to do 28 } 29 30 ScriptCompositeFontInstance::~ScriptCompositeFontInstance() 31 { 32 delete fFontMap; 33 fFontMap = NULL; 34 } 35 36 void ScriptCompositeFontInstance::getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const 37 { 38 LEErrorCode status = LE_NO_ERROR; 39 le_int32 script = LE_GET_SUB_FONT(glyph); 40 const LEFontInstance *font = fFontMap->getScriptFont(script, status); 41 42 advance.fX = 0; 43 advance.fY = 0; 44 45 if (LE_SUCCESS(status)) { 46 font->getGlyphAdvance(LE_GET_GLYPH(glyph), advance); 47 } 48 } 49 50 le_bool ScriptCompositeFontInstance::getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const 51 { 52 LEErrorCode status = LE_NO_ERROR; 53 le_int32 script = LE_GET_SUB_FONT(glyph); 54 const LEFontInstance *font = fFontMap->getScriptFont(script, status); 55 56 if (LE_SUCCESS(status)) { 57 return font->getGlyphPoint(LE_GET_GLYPH(glyph), pointNumber, point); 58 } 59 60 return FALSE; 61 } 62 63 const LEFontInstance *ScriptCompositeFontInstance::getSubFont(const LEUnicode chars[], le_int32 *offset, le_int32 limit, le_int32 script, LEErrorCode &success) const 64 { 65 if (LE_FAILURE(success)) { 66 return NULL; 67 } 68 69 if (chars == NULL || *offset < 0 || limit < 0 || *offset >= limit || script < 0 || script >= scriptCodeCount) { 70 success = LE_ILLEGAL_ARGUMENT_ERROR; 71 return NULL; 72 } 73 74 const LEFontInstance *result = fFontMap->getScriptFont(script, success); 75 76 if (LE_FAILURE(success)) { 77 return NULL; 78 } 79 80 *offset = limit; 81 return result; 82 } 83 84 // This is the really stupid version that doesn't look in any other font for the character... 85 // It would be better to also look in the "DEFAULT:" font. Another thing to do would be to 86 // look in all the fonts in some order, script code order being the most obvious... 87 LEGlyphID ScriptCompositeFontInstance::mapCharToGlyph(LEUnicode32 ch) const 88 { 89 UErrorCode error = U_ZERO_ERROR; 90 LEErrorCode status = LE_NO_ERROR; 91 le_int32 script = uscript_getScript(ch, &error); 92 const LEFontInstance *scriptFont = fFontMap->getScriptFont(script, status); 93 LEGlyphID subFont = LE_SET_SUB_FONT(0, script); 94 95 if (LE_FAILURE(status)) { 96 return subFont; 97 } 98 99 LEGlyphID glyph = scriptFont->mapCharToGlyph(ch); 100 101 return LE_SET_GLYPH(subFont, glyph); 102 } 103 104