sl@0: /* sl@0: * @(#)DeviceTables.cpp 1.5 00/03/15 sl@0: * sl@0: * (C) Copyright IBM Corp. 1998 - 2005 - All Rights Reserved sl@0: * sl@0: */ sl@0: sl@0: #include "LETypes.h" sl@0: #include "OpenTypeTables.h" sl@0: #include "DeviceTables.h" sl@0: #include "LESwaps.h" sl@0: sl@0: U_NAMESPACE_BEGIN sl@0: sl@0: const le_uint16 DeviceTable::fieldMasks[] = {0x0003, 0x000F, 0x00FF}; sl@0: const le_uint16 DeviceTable::fieldSignBits[] = {0x0002, 0x0008, 0x0080}; sl@0: const le_uint16 DeviceTable::fieldBits[] = { 2, 4, 8}; sl@0: sl@0: le_int16 DeviceTable::getAdjustment(le_uint16 ppem) const sl@0: { sl@0: le_uint16 start = SWAPW(startSize); sl@0: le_uint16 format = SWAPW(deltaFormat) - 1; sl@0: le_int16 result = 0; sl@0: sl@0: if (ppem >= start && ppem <= SWAPW(endSize)) { sl@0: le_uint16 sizeIndex = ppem - start; sl@0: le_uint16 bits = fieldBits[format]; sl@0: le_uint16 count = 16 / bits; sl@0: le_uint16 word = SWAPW(deltaValues[sizeIndex / count]); sl@0: le_uint16 fieldIndex = sizeIndex % count; sl@0: le_uint16 shift = 16 - (bits * (fieldIndex + 1)); sl@0: le_uint16 field = (word >> shift) & fieldMasks[format]; sl@0: sl@0: result = field; sl@0: sl@0: if ((field & fieldSignBits[format]) != 0) { sl@0: result |= ~ fieldMasks[format]; sl@0: } sl@0: } sl@0: sl@0: return result; sl@0: } sl@0: sl@0: U_NAMESPACE_END