Mercurial > hg > openjdk > aarch64-port > jdk
changeset 10952:1fa5fb9632e9
8072490: Better font morphing redux
Reviewed-by: prr, srl, mschoene
author | vadim |
---|---|
date | Mon, 02 Mar 2015 15:45:37 +0300 |
parents | 39f3f16bbc96 |
children | 3f9845510b47 |
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 Fri Feb 27 19:21:36 2015 +0300 +++ b/src/share/native/sun/font/layout/LETableReference.h Mon Mar 02 15:45:37 2015 +0300 @@ -188,7 +188,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; @@ -203,7 +203,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 Fri Feb 27 19:21:36 2015 +0300 +++ b/src/share/native/sun/font/layout/LigatureSubstProc.cpp Mon Mar 02 15:45:37 2015 +0300 @@ -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 Fri Feb 27 19:21:36 2015 +0300 +++ b/src/share/native/sun/font/layout/LigatureSubstProc2.cpp Mon Mar 02 15:45:37 2015 +0300 @@ -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 Fri Feb 27 19:21:36 2015 +0300 +++ b/src/share/native/sun/font/layout/MorphTables.cpp Mon Mar 02 15:45:37 2015 +0300 @@ -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 Fri Feb 27 19:21:36 2015 +0300 +++ b/src/share/native/sun/font/layout/PairPositioningSubtables.cpp Mon Mar 02 15:45:37 2015 +0300 @@ -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.