]>
Commit | Line | Data |
---|---|---|
b75a7d8f A |
1 | /* |
2 | * @(#)Features.cpp 1.4 00/03/15 | |
3 | * | |
b331163b | 4 | * (C) Copyright IBM Corp. 1998-2015 - All Rights Reserved |
b75a7d8f A |
5 | * |
6 | */ | |
7 | ||
8 | #include "LETypes.h" | |
9 | #include "OpenTypeUtilities.h" | |
10 | #include "OpenTypeTables.h" | |
729e4ab9 | 11 | #include "ICUFeatures.h" |
b75a7d8f A |
12 | #include "LESwaps.h" |
13 | ||
14 | U_NAMESPACE_BEGIN | |
15 | ||
57a6839d | 16 | LEReferenceTo<FeatureTable> FeatureListTable::getFeatureTable(const LETableReference &base, le_uint16 featureIndex, LETag *featureTag, LEErrorCode &success) const |
b75a7d8f | 17 | { |
b331163b | 18 | LEReferenceToArrayOf<FeatureRecord> |
2ca993e8 | 19 | featureRecordArrayRef(base, success, featureRecordArray, featureIndex+1); |
b331163b | 20 | |
57a6839d A |
21 | if (featureIndex >= SWAPW(featureCount) || LE_FAILURE(success)) { |
22 | return LEReferenceTo<FeatureTable>(); | |
23 | } | |
b75a7d8f A |
24 | |
25 | Offset featureTableOffset = featureRecordArray[featureIndex].featureTableOffset; | |
26 | ||
27 | *featureTag = SWAPT(featureRecordArray[featureIndex].featureTag); | |
28 | ||
57a6839d | 29 | return LEReferenceTo<FeatureTable>(base, success, SWAPW(featureTableOffset)); |
b75a7d8f A |
30 | } |
31 | ||
57a6839d | 32 | #if 0 |
b75a7d8f A |
33 | /* |
34 | * Note: according to the OpenType Spec. v 1.4, the entries in the Feature | |
35 | * List Table are sorted alphabetically by feature tag; however, there seem | |
36 | * to be some fonts which have an unsorted list; that's why the binary search | |
37 | * is #if 0'd out and replaced by a linear search. | |
38 | * | |
39 | * Also note: as of ICU 2.6, this method isn't called anyhow... | |
40 | */ | |
41 | const FeatureTable *FeatureListTable::getFeatureTable(LETag featureTag) const | |
42 | { | |
43 | #if 0 | |
44 | Offset featureTableOffset = | |
45 | OpenTypeUtilities::getTagOffset(featureTag, (TagAndOffsetRecord *) featureRecordArray, SWAPW(featureCount)); | |
46 | ||
47 | if (featureTableOffset == 0) { | |
48 | return 0; | |
49 | } | |
50 | ||
51 | return (const FeatureTable *) ((char *) this + SWAPW(featureTableOffset)); | |
52 | #else | |
53 | int count = SWAPW(featureCount); | |
54 | ||
55 | for (int i = 0; i < count; i += 1) { | |
56 | if (SWAPT(featureRecordArray[i].featureTag) == featureTag) { | |
57 | return (const FeatureTable *) ((char *) this + SWAPW(featureRecordArray[i].featureTableOffset)); | |
58 | } | |
59 | } | |
60 | ||
61 | return 0; | |
62 | #endif | |
63 | } | |
57a6839d | 64 | #endif |
b75a7d8f A |
65 | |
66 | U_NAMESPACE_END |