1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 359d709d503bab6e2b61931737e662dd293b40578ccornelius * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "LETypes.h" 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "OpenTypeTables.h" 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "OpenTypeUtilities.h" 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ClassDefinitionTables.h" 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "LESwaps.h" 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1559d709d503bab6e2b61931737e662dd293b40578ccorneliusle_int32 ClassDefinitionTable::getGlyphClass(const LETableReference& base, LEGlyphID glyphID, LEErrorCode &success) const 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1759d709d503bab6e2b61931737e662dd293b40578ccornelius LEReferenceTo<ClassDefinitionTable> thisRef(base, success); 1859d709d503bab6e2b61931737e662dd293b40578ccornelius if (LE_FAILURE(success)) return 0; 1959d709d503bab6e2b61931737e662dd293b40578ccornelius 2059d709d503bab6e2b61931737e662dd293b40578ccornelius switch(SWAPW(classFormat)) { 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0: 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 1: 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2659d709d503bab6e2b61931737e662dd293b40578ccornelius const LEReferenceTo<ClassDefFormat1Table> f1Table(thisRef, success); 2759d709d503bab6e2b61931737e662dd293b40578ccornelius return f1Table->getGlyphClass(f1Table, glyphID, success); 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 2: 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 3259d709d503bab6e2b61931737e662dd293b40578ccornelius const LEReferenceTo<ClassDefFormat2Table> f2Table(thisRef, success); 3359d709d503bab6e2b61931737e662dd293b40578ccornelius return f2Table->getGlyphClass(f2Table, glyphID, success); 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 3859d709d503bab6e2b61931737e662dd293b40578ccornelius } 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4159d709d503bab6e2b61931737e662dd293b40578ccorneliusle_bool ClassDefinitionTable::hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4359d709d503bab6e2b61931737e662dd293b40578ccornelius LEReferenceTo<ClassDefinitionTable> thisRef(base, success); 4459d709d503bab6e2b61931737e662dd293b40578ccornelius if (LE_FAILURE(success)) return 0; 4559d709d503bab6e2b61931737e662dd293b40578ccornelius 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch(SWAPW(classFormat)) { 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0: 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 1: 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 5259d709d503bab6e2b61931737e662dd293b40578ccornelius const LEReferenceTo<ClassDefFormat1Table> f1Table(thisRef, success); 5359d709d503bab6e2b61931737e662dd293b40578ccornelius return f1Table->hasGlyphClass(f1Table, glyphClass, success); 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 2: 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 5859d709d503bab6e2b61931737e662dd293b40578ccornelius const LEReferenceTo<ClassDefFormat2Table> f2Table(thisRef, success); 5959d709d503bab6e2b61931737e662dd293b40578ccornelius return f2Table->hasGlyphClass(f2Table, glyphClass, success); 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 6759d709d503bab6e2b61931737e662dd293b40578ccorneliusle_int32 ClassDefFormat1Table::getGlyphClass(const LETableReference& base, LEGlyphID glyphID, LEErrorCode &success) const 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 6959d709d503bab6e2b61931737e662dd293b40578ccornelius if(LE_FAILURE(success)) return 0; 7059d709d503bab6e2b61931737e662dd293b40578ccornelius 7159d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 count = SWAPW(glyphCount); 7259d709d503bab6e2b61931737e662dd293b40578ccornelius LEReferenceToArrayOf<le_uint16> classValueArrayRef(base, success, &classValueArray[0], count); 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID); 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TTGlyphID firstGlyph = SWAPW(startGlyph); 7559d709d503bab6e2b61931737e662dd293b40578ccornelius TTGlyphID lastGlyph = firstGlyph + count; 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 7759d709d503bab6e2b61931737e662dd293b40578ccornelius if (LE_SUCCESS(success) && ttGlyphID >= firstGlyph && ttGlyphID < lastGlyph) { 7859d709d503bab6e2b61931737e662dd293b40578ccornelius return SWAPW( classValueArrayRef(ttGlyphID - firstGlyph, success) ); 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 8459d709d503bab6e2b61931737e662dd293b40578ccorneliusle_bool ClassDefFormat1Table::hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 8659d709d503bab6e2b61931737e662dd293b40578ccornelius if(LE_FAILURE(success)) return 0; 8759d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 count = SWAPW(glyphCount); 8859d709d503bab6e2b61931737e662dd293b40578ccornelius LEReferenceToArrayOf<le_uint16> classValueArrayRef(base, success, &classValueArray[0], count); 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 9159d709d503bab6e2b61931737e662dd293b40578ccornelius for (i = 0; LE_SUCCESS(success)&& (i < count); i += 1) { 9259d709d503bab6e2b61931737e662dd293b40578ccornelius if (SWAPW(classValueArrayRef(i,success)) == glyphClass) { 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 10059d709d503bab6e2b61931737e662dd293b40578ccorneliusle_int32 ClassDefFormat2Table::getGlyphClass(const LETableReference& base, LEGlyphID glyphID, LEErrorCode &success) const 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 10259d709d503bab6e2b61931737e662dd293b40578ccornelius if(LE_FAILURE(success)) return 0; 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyphID); 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru le_uint16 rangeCount = SWAPW(classRangeCount); 10559d709d503bab6e2b61931737e662dd293b40578ccornelius LEReferenceToArrayOf<GlyphRangeRecord> classRangeRecordArrayRef(base, success, &classRangeRecordArray[0], rangeCount); 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru le_int32 rangeIndex = 10759d709d503bab6e2b61931737e662dd293b40578ccornelius OpenTypeUtilities::getGlyphRangeIndex(ttGlyph, classRangeRecordArrayRef, success); 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 10959d709d503bab6e2b61931737e662dd293b40578ccornelius if (rangeIndex < 0 || LE_FAILURE(success)) { 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 11359d709d503bab6e2b61931737e662dd293b40578ccornelius return SWAPW(classRangeRecordArrayRef(rangeIndex, success).rangeValue); 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 11659d709d503bab6e2b61931737e662dd293b40578ccorneliusle_bool ClassDefFormat2Table::hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 11859d709d503bab6e2b61931737e662dd293b40578ccornelius if(LE_FAILURE(success)) return 0; 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru le_uint16 rangeCount = SWAPW(classRangeCount); 12059d709d503bab6e2b61931737e662dd293b40578ccornelius LEReferenceToArrayOf<GlyphRangeRecord> classRangeRecordArrayRef(base, success, &classRangeRecordArray[0], rangeCount); 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 12359d709d503bab6e2b61931737e662dd293b40578ccornelius for (i = 0; i < rangeCount && LE_SUCCESS(success); i += 1) { 12459d709d503bab6e2b61931737e662dd293b40578ccornelius if (SWAPW(classRangeRecordArrayRef(i,success).rangeValue) == glyphClass) { 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END 133