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