os/textandloc/fontservices/textshaperplugin/IcuSource/layout/ClassDefinitionTables.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /*
     2  *
     3  * (C) Copyright IBM Corp. 1998-2004 - 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 
    13 U_NAMESPACE_BEGIN
    14 
    15 le_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 
    40 le_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 
    65 le_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 
    78 le_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 
    92 le_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 
   106 le_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 
   120 U_NAMESPACE_END