]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/layout/MPreFixups.cpp
ICU-551.24.tar.gz
[apple/icu.git] / icuSources / layout / MPreFixups.cpp
index 964292a0af0022e7bfff1827927d8b9a3e6c06a8..08ad7a75dffec76ac4ed6f2bd48b9d8c56fb4b87 100644 (file)
@@ -1,13 +1,11 @@
 /*
- * (C) Copyright IBM Corp. 2002-2003 - All Rights Reserved
  *
- * $Source: /cvs/root/ICU/icuSources/layout/MPreFixups.cpp,v $
- * $Date: 2003/07/03 18:13:45 $
- * $Revision: 1.1.1.1 $
+ * (C) Copyright IBM Corp. 2002-2008 - All Rights Reserved
  *
  */
 
 #include "LETypes.h"
+#include "LEGlyphStorage.h"
 #include "MPreFixups.h"
 
 U_NAMESPACE_BEGIN
@@ -42,18 +40,22 @@ void MPreFixups::add(le_int32 baseIndex, le_int32 mpreIndex)
     }
 }
 
-void MPreFixups::apply(LEGlyphID *glyphs, le_int32 *charIndices)
+void MPreFixups::apply(LEGlyphStorage &glyphStorage, LEErrorCode& success)
 {
+    if (LE_FAILURE(success)) { 
+        return;
+    }
+
     for (le_int32 fixup = 0; fixup < fFixupCount; fixup += 1) {
         le_int32 baseIndex = fFixupData[fixup].fBaseIndex;
         le_int32 mpreIndex = fFixupData[fixup].fMPreIndex;
         le_int32 mpreLimit = mpreIndex + 1;
 
-        while (glyphs[baseIndex] == 0xFFFF || glyphs[baseIndex] == 0xFFFE) {
+        while (glyphStorage[baseIndex] == 0xFFFF || glyphStorage[baseIndex] == 0xFFFE) {
             baseIndex -= 1;
         }
 
-        while (glyphs[mpreLimit] == 0xFFFF || glyphs[mpreLimit] == 0xFFFE) {
+        while (glyphStorage[mpreLimit] == 0xFFFF || glyphStorage[mpreLimit] == 0xFFFE) {
             mpreLimit += 1;
         }
 
@@ -61,26 +63,38 @@ void MPreFixups::apply(LEGlyphID *glyphs, le_int32 *charIndices)
             continue;
         }
 
+        LEErrorCode success = LE_NO_ERROR;
         le_int32   mpreCount = mpreLimit - mpreIndex;
         le_int32   moveCount = baseIndex - mpreLimit;
         le_int32   mpreDest  = baseIndex - mpreCount;
         LEGlyphID *mpreSave  = LE_NEW_ARRAY(LEGlyphID, mpreCount);
         le_int32  *indexSave = LE_NEW_ARRAY(le_int32, mpreCount);
+
+        if (mpreSave == NULL || indexSave == NULL) {
+            LE_DELETE_ARRAY(mpreSave);
+            LE_DELETE_ARRAY(indexSave);
+            success = LE_MEMORY_ALLOCATION_ERROR;
+            return;
+        }
+
         le_int32   i;
 
         for (i = 0; i < mpreCount; i += 1) {
-            mpreSave[i]  = glyphs[mpreIndex + i];
-            indexSave[i] = charIndices[mpreIndex + i];
+            mpreSave[i]  = glyphStorage[mpreIndex + i];
+            indexSave[i] = glyphStorage.getCharIndex(mpreIndex + i, success); //charIndices[mpreIndex + i];
         }
 
         for (i = 0; i < moveCount; i += 1) {
-            glyphs[mpreIndex + i] = glyphs[mpreLimit + i];
-            charIndices[mpreIndex + i] = charIndices[mpreLimit + i];
+            LEGlyphID glyph = glyphStorage[mpreLimit + i];
+            le_int32 charIndex = glyphStorage.getCharIndex(mpreLimit + i, success);
+
+            glyphStorage[mpreIndex + i] = glyph;
+            glyphStorage.setCharIndex(mpreIndex + i, charIndex, success);
         }
 
         for (i = 0; i < mpreCount; i += 1) {
-            glyphs[mpreDest + i] = mpreSave[i];
-            charIndices[mpreDest + i] = indexSave[i];
+            glyphStorage[mpreDest + i] = mpreSave[i];
+            glyphStorage.setCharIndex(mpreDest, indexSave[i], success);
         }
         
         LE_DELETE_ARRAY(indexSave);