changeset 8217:14328f612d88

8072490: Better font morphing redux Reviewed-by: prr, srl, mschoene
author vadim
date Fri, 03 Jul 2015 21:36:19 +0100
parents 19bab48772f4
children 91de177bd39e
files src/share/native/sun/font/layout/LETableReference.h src/share/native/sun/font/layout/LigatureSubstProc.cpp src/share/native/sun/font/layout/LigatureSubstProc2.cpp src/share/native/sun/font/layout/MorphTables.cpp src/share/native/sun/font/layout/PairPositioningSubtables.cpp
diffstat 5 files changed, 23 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/native/sun/font/layout/LETableReference.h	Tue Mar 10 14:52:55 2015 -0700
+++ b/src/share/native/sun/font/layout/LETableReference.h	Fri Jul 03 21:36:19 2015 +0100
@@ -189,7 +189,7 @@
 
   void addOffset(size_t offset, LEErrorCode &success) {
     if(hasBounds()) {
-      if(offset > fLength) {
+      if(offset >= fLength) {
         LE_DEBUG_TR("addOffset off end");
         success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
         return;
@@ -204,7 +204,7 @@
     if(atPtr==NULL) return 0;
     if(LE_FAILURE(success)) return LE_UINTPTR_MAX;
     if((atPtr < fStart) ||
-       (hasBounds() && (atPtr > fStart+fLength))) {
+       (hasBounds() && (atPtr >= fStart+fLength))) {
       LE_DEBUG_TR3("ptrToOffset args out of range: %p", atPtr, 0);
       success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
       return LE_UINTPTR_MAX;
--- a/src/share/native/sun/font/layout/LigatureSubstProc.cpp	Tue Mar 10 14:52:55 2015 -0700
+++ b/src/share/native/sun/font/layout/LigatureSubstProc.cpp	Fri Jul 03 21:36:19 2015 +0100
@@ -92,15 +92,18 @@
     if (actionOffset != 0) {
       LEReferenceTo<LigatureActionEntry> ap(stHeader, success, actionOffset);
         LigatureActionEntry action;
-        le_int32 offset, i = 0;
+        le_int32 offset, i = 0, j = 0;
         le_int32 stack[nComponents];
         le_int16 mm = -1;
 
         do {
             le_uint32 componentGlyph = componentStack[m--];
 
+            if (j++ > 0) {
+                ap.addObject(success);
+            }
+
             action = SWAPL(*ap.getAlias());
-            ap.addObject(success); // ap++
 
             if (m < 0) {
                 m = nComponents - 1;
--- a/src/share/native/sun/font/layout/LigatureSubstProc2.cpp	Tue Mar 10 14:52:55 2015 -0700
+++ b/src/share/native/sun/font/layout/LigatureSubstProc2.cpp	Fri Jul 03 21:36:19 2015 +0100
@@ -98,7 +98,7 @@
         ap.addObject(ligActionIndex, success);
         LEReferenceToArrayOf<TTGlyphID> ligatureTable(stHeader, success, ligatureOffset, LE_UNBOUNDED_ARRAY);
         LigatureActionEntry action;
-        le_int32 offset, i = 0;
+        le_int32 offset, i = 0, j = 0;
         le_int32 stack[nComponents];
         le_int16 mm = -1;
 
@@ -111,6 +111,10 @@
         do {
             le_uint32 componentGlyph = componentStack[m--]; // pop off
 
+            if (j++ > 0) {
+                ap.addObject(success);
+            }
+
             action = SWAPL(*ap.getAlias());
 
             if (m < 0) {
@@ -144,7 +148,6 @@
               LE_DEBUG_BAD_FONT("m<0")
             }
 #endif
-            ap.addObject(success);
         } while (LE_SUCCESS(success) && !(action & lafLast) && (m>=0) ); // stop if last bit is set, or if run out of items
 
         while (mm >= 0) {
--- a/src/share/native/sun/font/layout/MorphTables.cpp	Tue Mar 10 14:52:55 2015 -0700
+++ b/src/share/native/sun/font/layout/MorphTables.cpp	Fri Jul 03 21:36:19 2015 +0100
@@ -52,8 +52,11 @@
     le_uint32 chain;
 
     for (chain = 0; LE_SUCCESS(success) && (chain < chainCount); chain += 1) {
+        if (chain > 0) {
+            le_uint32 chainLength = SWAPL(chainHeader->chainLength);
+            chainHeader.addOffset(chainLength, success);
+        }
         FeatureFlags defaultFlags = SWAPL(chainHeader->defaultFlags);
-        le_uint32 chainLength = SWAPL(chainHeader->chainLength);
         le_int16 nFeatureEntries = SWAPW(chainHeader->nFeatureEntries);
         le_int16 nSubtables = SWAPW(chainHeader->nSubtables);
         LEReferenceTo<MorphSubtableHeader> subtableHeader =
@@ -61,7 +64,10 @@
         le_int16 subtable;
 
         for (subtable = 0; LE_SUCCESS(success) && (subtable < nSubtables); subtable += 1) {
-            le_int16 length = SWAPW(subtableHeader->length);
+            if (subtable > 0) {
+                le_int16 length = SWAPW(subtableHeader->length);
+                subtableHeader.addOffset(length, success);
+            }
             SubtableCoverage coverage = SWAPW(subtableHeader->coverage);
             FeatureFlags subtableFeatures = SWAPL(subtableHeader->subtableFeatures);
 
@@ -69,10 +75,7 @@
             if ((coverage & scfVertical) == 0 && (subtableFeatures & defaultFlags) != 0  && LE_SUCCESS(success)) {
               subtableHeader->process(subtableHeader, glyphStorage, success);
             }
-
-            subtableHeader.addOffset(length, success);
         }
-        chainHeader.addOffset(chainLength, success);
     }
 }
 
--- a/src/share/native/sun/font/layout/PairPositioningSubtables.cpp	Tue Mar 10 14:52:55 2015 -0700
+++ b/src/share/native/sun/font/layout/PairPositioningSubtables.cpp	Fri Jul 03 21:36:19 2015 +0100
@@ -179,12 +179,13 @@
         LEReferenceTo<PairValueRecord> record(records);
 
         for(le_int32 r = 0; r < recordCount; r += 1) {
+          if (r > 0) {
+            record.addOffset(recordSize, success);
+          }
           if(LE_FAILURE(success)) return LEReferenceTo<PairValueRecord>();
                 if (SWAPW(record->secondGlyph) == glyphID) {
                         return record;
                 }
-
-          record.addOffset(recordSize, success);
         }
 #else
   #error dead code - not updated.