]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/layout/LookupProcessor.cpp
ICU-511.32.tar.gz
[apple/icu.git] / icuSources / layout / LookupProcessor.cpp
index 4d4347cad8f35f1e4045e0260a83df6180521f60..03986bafbf6f75c70e01ece7e73a3611293637b8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved
+ * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved
  *
  */
 
@@ -70,6 +70,9 @@ le_int32 LookupProcessor::process(LEGlyphStorage &glyphStorage, GlyphPositionAdj
 
         if (selectMask != 0) {
             const LookupTable *lookupTable = lookupListTable->getLookupTable(lookup);
+            if (!lookupTable) {
+                continue;
+            }
             le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags);
             
             glyphIterator.reset(lookupFlags, selectMask);
@@ -96,6 +99,10 @@ le_uint32 LookupProcessor::applySingleLookup(le_uint16 lookupTableIndex, GlyphIt
     }    
 
     const LookupTable *lookupTable = lookupListTable->getLookupTable(lookupTableIndex);
+    if (lookupTable == NULL) {
+        success = LE_INTERNAL_ERROR;
+        return 0;
+    }
     le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags);
     GlyphIterator tempIterator(*glyphIterator, lookupFlags);
     le_uint32 delta = applyLookupTable(lookupTable, &tempIterator, fontInstance, success);
@@ -110,6 +117,9 @@ le_int32 LookupProcessor::selectLookups(const FeatureTable *featureTable, Featur
 
     for (le_uint16 lookup = 0; lookup < lookupCount; lookup += 1) {
         le_uint16 lookupListIndex = SWAPW(featureTable->lookupListIndexArray[lookup]);
+       if (lookupListIndex >= lookupSelectCount) {
+           continue;
+        }
 
         lookupSelectArray[lookupListIndex] |= featureMask;
         lookupOrderArray[store++] = lookupListIndex;
@@ -122,7 +132,7 @@ LookupProcessor::LookupProcessor(const char *baseAddress,
         Offset scriptListOffset, Offset featureListOffset, Offset lookupListOffset,
         LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures, 
         LEErrorCode& success)
-    : lookupListTable(NULL), featureListTable(NULL), lookupSelectArray(NULL),
+    : lookupListTable(NULL), featureListTable(NULL), lookupSelectArray(NULL), lookupSelectCount(0),
       lookupOrderArray(NULL), lookupOrderCount(0)
 {
     const ScriptListTable *scriptListTable = NULL;
@@ -169,6 +179,7 @@ LookupProcessor::LookupProcessor(const char *baseAddress,
     for (int i = 0; i < lookupListCount; i += 1) {
         lookupSelectArray[i] = 0;
     }
+    lookupSelectCount = lookupListCount;
 
     le_int32 count, order = 0;
     le_int32 featureReferences = 0;
@@ -186,9 +197,17 @@ LookupProcessor::LookupProcessor(const char *baseAddress,
         le_uint16 featureIndex = SWAPW(langSysTable->featureIndexArray[feature]);
 
         featureTable = featureListTable->getFeatureTable(featureIndex, &featureTag);
+        if (!featureTable) {
+             continue;
+        }
         featureReferences += SWAPW(featureTable->lookupCount);
     }
 
+    if (!featureTable) {
+        success = LE_INTERNAL_ERROR;
+        return;
+    }
+
     if (requiredFeatureIndex != 0xFFFF) {
         requiredFeatureTable = featureListTable->getFeatureTable(requiredFeatureIndex, &requiredFeatureTag);
         featureReferences += SWAPW(featureTable->lookupCount);