Home | History | Annotate | Download | only in layout
      1 /*
      2  * @(#)DeviceTables.cpp 1.5 00/03/15
      3  *
      4  * (C) Copyright IBM Corp. 1998 - 2006 - All Rights Reserved
      5  *
      6  */
      7 
      8 #include "LETypes.h"
      9 #include "OpenTypeTables.h"
     10 #include "DeviceTables.h"
     11 #include "LESwaps.h"
     12 
     13 U_NAMESPACE_BEGIN
     14 
     15 const le_uint16 DeviceTable::fieldMasks[]    = {0x0003, 0x000F, 0x00FF};
     16 const le_uint16 DeviceTable::fieldSignBits[] = {0x0002, 0x0008, 0x0080};
     17 const le_uint16 DeviceTable::fieldBits[]     = {     2,      4,      8};
     18 
     19 #define FORMAT_COUNT LE_ARRAY_SIZE(fieldBits)
     20 
     21 le_int16 DeviceTable::getAdjustment(le_uint16 ppem) const
     22 {
     23     le_uint16 start = SWAPW(startSize);
     24     le_uint16 format = SWAPW(deltaFormat) - 1;
     25     le_int16 result = 0;
     26 
     27     if (ppem >= start && ppem <= SWAPW(endSize) && format < FORMAT_COUNT) {
     28         le_uint16 sizeIndex = ppem - start;
     29         le_uint16 bits = fieldBits[format];
     30         le_uint16 count = 16 / bits;
     31         le_uint16 word = SWAPW(deltaValues[sizeIndex / count]);
     32         le_uint16 fieldIndex = sizeIndex % count;
     33         le_uint16 shift = 16 - (bits * (fieldIndex + 1));
     34         le_uint16 field = (word >> shift) & fieldMasks[format];
     35 
     36         result = field;
     37 
     38         if ((field & fieldSignBits[format]) != 0) {
     39             result |= ~ fieldMasks[format];
     40         }
     41     }
     42 
     43     return result;
     44 }
     45 
     46 U_NAMESPACE_END
     47