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