sl@0: /* sl@0: * sl@0: * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved sl@0: * sl@0: */ sl@0: sl@0: #include "LETypes.h" sl@0: #include "OpenTypeTables.h" sl@0: #include "OpenTypeUtilities.h" sl@0: #include "CoverageTables.h" sl@0: #include "LESwaps.h" sl@0: sl@0: U_NAMESPACE_BEGIN sl@0: sl@0: le_int32 CoverageTable::getGlyphCoverage(LEGlyphID glyphID) const sl@0: { sl@0: switch(SWAPW(coverageFormat)) sl@0: { sl@0: case 0: sl@0: return -1; sl@0: sl@0: case 1: sl@0: { sl@0: const CoverageFormat1Table *f1Table = (const CoverageFormat1Table *) this; sl@0: sl@0: return f1Table->getGlyphCoverage(glyphID); sl@0: } sl@0: sl@0: case 2: sl@0: { sl@0: const CoverageFormat2Table *f2Table = (const CoverageFormat2Table *) this; sl@0: sl@0: return f2Table->getGlyphCoverage(glyphID); sl@0: } sl@0: sl@0: default: sl@0: return -1; sl@0: } sl@0: } sl@0: sl@0: le_int32 CoverageFormat1Table::getGlyphCoverage(LEGlyphID glyphID) const sl@0: { sl@0: TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID); sl@0: le_uint16 count = SWAPW(glyphCount); sl@0: le_uint8 bit = OpenTypeUtilities::highBit(count); sl@0: le_uint16 power = 1 << bit; sl@0: le_uint16 extra = count - power; sl@0: le_uint16 probe = power; sl@0: le_uint16 index = 0; sl@0: sl@0: if (SWAPW(glyphArray[extra]) <= ttGlyphID) { sl@0: index = extra; sl@0: } sl@0: sl@0: while (probe > (1 << 0)) { sl@0: probe >>= 1; sl@0: sl@0: if (SWAPW(glyphArray[index + probe]) <= ttGlyphID) { sl@0: index += probe; sl@0: } sl@0: } sl@0: sl@0: if (SWAPW(glyphArray[index]) == ttGlyphID) { sl@0: return index; sl@0: } sl@0: sl@0: return -1; sl@0: } sl@0: sl@0: le_int32 CoverageFormat2Table::getGlyphCoverage(LEGlyphID glyphID) const sl@0: { sl@0: TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID); sl@0: le_uint16 count = SWAPW(rangeCount); sl@0: le_int32 rangeIndex = sl@0: OpenTypeUtilities::getGlyphRangeIndex(ttGlyphID, rangeRecordArray, count); sl@0: sl@0: if (rangeIndex < 0) { sl@0: return -1; sl@0: } sl@0: sl@0: TTGlyphID firstInRange = SWAPW(rangeRecordArray[rangeIndex].firstGlyph); sl@0: le_uint16 startCoverageIndex = SWAPW(rangeRecordArray[rangeIndex].rangeValue); sl@0: sl@0: return startCoverageIndex + (ttGlyphID - firstInRange); sl@0: } sl@0: sl@0: U_NAMESPACE_END