1/* 2 * 3 * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved 4 * 5 */ 6 7#include "LETypes.h" 8#include "OpenTypeTables.h" 9#include "OpenTypeUtilities.h" 10#include "ClassDefinitionTables.h" 11#include "LESwaps.h" 12 13U_NAMESPACE_BEGIN 14 15le_int32 ClassDefinitionTable::getGlyphClass(LEGlyphID glyphID) const 16{ 17 switch(SWAPW(classFormat)) { 18 case 0: 19 return 0; 20 21 case 1: 22 { 23 const ClassDefFormat1Table *f1Table = (const ClassDefFormat1Table *) this; 24 25 return f1Table->getGlyphClass(glyphID); 26 } 27 28 case 2: 29 { 30 const ClassDefFormat2Table *f2Table = (const ClassDefFormat2Table *) this; 31 32 return f2Table->getGlyphClass(glyphID); 33 } 34 35 default: 36 return 0; 37 } 38} 39 40le_bool ClassDefinitionTable::hasGlyphClass(le_int32 glyphClass) const 41{ 42 switch(SWAPW(classFormat)) { 43 case 0: 44 return 0; 45 46 case 1: 47 { 48 const ClassDefFormat1Table *f1Table = (const ClassDefFormat1Table *) this; 49 50 return f1Table->hasGlyphClass(glyphClass); 51 } 52 53 case 2: 54 { 55 const ClassDefFormat2Table *f2Table = (const ClassDefFormat2Table *) this; 56 57 return f2Table->hasGlyphClass(glyphClass); 58 } 59 60 default: 61 return 0; 62 } 63} 64 65le_int32 ClassDefFormat1Table::getGlyphClass(LEGlyphID glyphID) const 66{ 67 TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID); 68 TTGlyphID firstGlyph = SWAPW(startGlyph); 69 TTGlyphID lastGlyph = firstGlyph + SWAPW(glyphCount); 70 71 if (ttGlyphID >= firstGlyph && ttGlyphID < lastGlyph) { 72 return SWAPW(classValueArray[ttGlyphID - firstGlyph]); 73 } 74 75 return 0; 76} 77 78le_bool ClassDefFormat1Table::hasGlyphClass(le_int32 glyphClass) const 79{ 80 le_uint16 count = SWAPW(glyphCount); 81 int i; 82 83 for (i = 0; i < count; i += 1) { 84 if (SWAPW(classValueArray[i]) == glyphClass) { 85 return TRUE; 86 } 87 } 88 89 return FALSE; 90} 91 92le_int32 ClassDefFormat2Table::getGlyphClass(LEGlyphID glyphID) const 93{ 94 TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyphID); 95 le_uint16 rangeCount = SWAPW(classRangeCount); 96 le_int32 rangeIndex = 97 OpenTypeUtilities::getGlyphRangeIndex(ttGlyph, classRangeRecordArray, rangeCount); 98 99 if (rangeIndex < 0) { 100 return 0; 101 } 102 103 return SWAPW(classRangeRecordArray[rangeIndex].rangeValue); 104} 105 106le_bool ClassDefFormat2Table::hasGlyphClass(le_int32 glyphClass) const 107{ 108 le_uint16 rangeCount = SWAPW(classRangeCount); 109 int i; 110 111 for (i = 0; i < rangeCount; i += 1) { 112 if (SWAPW(classRangeRecordArray[i].rangeValue) == glyphClass) { 113 return TRUE; 114 } 115 } 116 117 return FALSE; 118} 119 120U_NAMESPACE_END 121