]>
Commit | Line | Data |
---|---|---|
b75a7d8f A |
1 | /* |
2 | * @(#)DeviceTables.cpp 1.5 00/03/15 | |
3 | * | |
46f4442e | 4 | * (C) Copyright IBM Corp. 1998 - 2006 - All Rights Reserved |
b75a7d8f A |
5 | * |
6 | */ | |
7 | ||
8 | #include "LETypes.h" | |
9 | #include "OpenTypeTables.h" | |
10 | #include "DeviceTables.h" | |
b75a7d8f A |
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 | ||
46f4442e A |
19 | #define FORMAT_COUNT LE_ARRAY_SIZE(fieldBits) |
20 | ||
b75a7d8f A |
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 | ||
46f4442e | 27 | if (ppem >= start && ppem <= SWAPW(endSize) && format < FORMAT_COUNT) { |
b75a7d8f A |
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) { | |
374ca955 | 39 | result |= ~ fieldMasks[format]; |
b75a7d8f A |
40 | } |
41 | } | |
42 | ||
43 | return result; | |
44 | } | |
45 | ||
46 | U_NAMESPACE_END |