- Offset scriptTableOffset =
- OpenTypeUtilities::getTagOffset(scriptTag, scriptRecordArray, count);
+
+ if (count == 0) {
+ return LEReferenceTo<ScriptTable>(); // no items, no search
+ }
+
+ // attempt to construct a ref with at least one element
+ LEReferenceToArrayOf<ScriptRecord> oneElementTable(base, success, &scriptRecordArray[0], 1);
+
+ if( LE_FAILURE(success) ) {
+ return LEReferenceTo<ScriptTable>(); // couldn't even read the first record - bad font.
+ }
+
+ le_uint16 limit = ((SWAPW(scriptRecordArray[0].offset) - sizeof(ScriptListTable)) / sizeof(scriptRecordArray)) + ANY_NUMBER;
+ Offset scriptTableOffset = 0;
+
+
+ if (count > limit) {
+ // the scriptCount value is bogus; do a linear search
+ // because limit may still be too large.
+ LEReferenceToArrayOf<ScriptRecord> scriptRecordArrayRef(base, success, &scriptRecordArray[0], limit);
+ for(le_int32 s = 0; (s < limit)&&LE_SUCCESS(success); s += 1) {
+ if (SWAPT(scriptRecordArrayRef(s,success).tag) == scriptTag) {
+ scriptTableOffset = SWAPW(scriptRecordArrayRef(s,success).offset);
+ break;
+ }
+ }
+ } else {
+ LEReferenceToArrayOf<ScriptRecord> scriptRecordArrayRef(base, success, &scriptRecordArray[0], count);
+
+ scriptTableOffset = OpenTypeUtilities::getTagOffset(scriptTag, scriptRecordArrayRef, success);
+ }