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