# HG changeset patch # User vadim # Date 1435955779 -3600 # Node ID 14328f612d88dd11cf6b9886555e4b340470fcbd # Parent 19bab48772f474e4c310bcf59a85eab6eb648e3c 8072490: Better font morphing redux Reviewed-by: prr, srl, mschoene diff -r 19bab48772f4 -r 14328f612d88 src/share/native/sun/font/layout/LETableReference.h --- 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; diff -r 19bab48772f4 -r 14328f612d88 src/share/native/sun/font/layout/LigatureSubstProc.cpp --- 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 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; diff -r 19bab48772f4 -r 14328f612d88 src/share/native/sun/font/layout/LigatureSubstProc2.cpp --- 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 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) { diff -r 19bab48772f4 -r 14328f612d88 src/share/native/sun/font/layout/MorphTables.cpp --- 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 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); } } diff -r 19bab48772f4 -r 14328f612d88 src/share/native/sun/font/layout/PairPositioningSubtables.cpp --- 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 record(records); for(le_int32 r = 0; r < recordCount; r += 1) { + if (r > 0) { + record.addOffset(recordSize, success); + } if(LE_FAILURE(success)) return LEReferenceTo(); if (SWAPW(record->secondGlyph) == glyphID) { return record; } - - record.addOffset(recordSize, success); } #else #error dead code - not updated.