ICU-12020 merge in Layout updates

Upstream: http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/rev/dbb4e2bdfa9e

One missed patch in MorphTables.cpp (noted in ticket)

X-SVN-Rev: 38141
This commit is contained in:
Steven R. Loomis 2015-12-17 01:29:24 +00:00
parent f6296491cc
commit 32af290668
11 changed files with 192 additions and 34 deletions

View file

@ -1,6 +1,6 @@
/*
*
* (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved
* (C) Copyright IBM Corp. 1998-2015 - All Rights Reserved
*
*/
@ -46,14 +46,14 @@ ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphS
IndicRearrangementFlags flags = (IndicRearrangementFlags) SWAPW(entry->flags);
if (flags & irfMarkFirst) {
firstGlyph = currGlyph;
firstGlyph = (le_uint32)currGlyph;
}
if (flags & irfMarkLast) {
lastGlyph = currGlyph;
lastGlyph = (le_uint32)currGlyph;
}
doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask));
doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask), success);
if (!(flags & irfDontAdvance)) {
// XXX: Should handle reverse too...
@ -67,18 +67,29 @@ void IndicRearrangementProcessor::endStateTable()
{
}
void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb) const
void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb, LEErrorCode &success) const
{
LEGlyphID a, b, c, d;
le_int32 ia, ib, ic, id, ix, x;
LEErrorCode success = LE_NO_ERROR;
if (LE_FAILURE(success)) return;
if (verb == irvNoAction) {
return;
}
if (firstGlyph > lastGlyph) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
return;
}
switch(verb)
{
case irvNoAction:
break;
case irvxA:
if (firstGlyph == lastGlyph) break;
if (firstGlyph + 1 < firstGlyph) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
ia = glyphStorage.getCharIndex(firstGlyph, success);
x = firstGlyph + 1;
@ -95,6 +106,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvDx:
if (firstGlyph == lastGlyph) break;
if (lastGlyph - 1 > lastGlyph) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
d = glyphStorage[lastGlyph];
id = glyphStorage.getCharIndex(lastGlyph, success);
x = lastGlyph - 1;
@ -123,6 +139,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvxAB:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 1)) { // difference == 1 is a no-op, < 1 is an error.
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
ia = glyphStorage.getCharIndex(firstGlyph, success);
@ -144,6 +165,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvxBA:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 1)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
ia = glyphStorage.getCharIndex(firstGlyph, success);
@ -165,6 +191,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvCDx:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 1)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
ic = glyphStorage.getCharIndex(lastGlyph - 1, success);
@ -186,6 +217,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvDCx:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 1)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
ic = glyphStorage.getCharIndex(lastGlyph - 1, success);
@ -207,6 +243,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvCDxA:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
@ -232,6 +273,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvDCxA:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
@ -257,6 +303,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvDxAB:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
d = glyphStorage[lastGlyph];
@ -282,6 +333,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvDxBA:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
d = glyphStorage[lastGlyph];
@ -307,6 +363,10 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvCDxAB:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
@ -329,6 +389,10 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvCDxBA:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
@ -351,6 +415,10 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvDCxAB:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
@ -373,6 +441,10 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvDCxBA:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];

View file

@ -1,6 +1,6 @@
/*
*
* (C) Copyright IBM Corp. 1998-2014 - All Rights Reserved
* (C) Copyright IBM Corp. 1998-2015 - All Rights Reserved
*
*/
@ -31,7 +31,7 @@ public:
virtual void endStateTable();
void doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb) const;
void doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb, LEErrorCode &success) const;
IndicRearrangementProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success);
virtual ~IndicRearrangementProcessor();
@ -51,8 +51,8 @@ public:
static UClassID getStaticClassID();
protected:
le_int32 firstGlyph;
le_int32 lastGlyph;
le_uint32 firstGlyph;
le_uint32 lastGlyph;
LEReferenceTo<IndicRearrangementSubtableHeader> indicRearrangementSubtableHeader;
LEReferenceToArrayOf<IndicRearrangementStateEntry> entryTable;

View file

@ -1,6 +1,6 @@
/*
*
* (C) Copyright IBM Corp. and others 1998-2014 - All Rights Reserved
* (C) Copyright IBM Corp. and others 1998-2015 - All Rights Reserved
*
*/
@ -44,14 +44,14 @@ le_uint16 IndicRearrangementProcessor2::processStateEntry(LEGlyphStorage &glyphS
IndicRearrangementFlags flags = (IndicRearrangementFlags) SWAPW(entry->flags);
if (flags & irfMarkFirst) {
firstGlyph = currGlyph;
firstGlyph = (le_uint32)currGlyph;
}
if (flags & irfMarkLast) {
lastGlyph = currGlyph;
lastGlyph = (le_uint32)currGlyph;
}
doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask));
doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask), success);
if (!(flags & irfDontAdvance)) {
currGlyph += dir;
@ -64,18 +64,29 @@ void IndicRearrangementProcessor2::endStateTable()
{
}
void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb) const
void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb, LEErrorCode &success) const
{
LEGlyphID a, b, c, d;
le_int32 ia, ib, ic, id, ix, x;
LEErrorCode success = LE_NO_ERROR;
if (LE_FAILURE(success)) return;
if (verb == irvNoAction) {
return;
}
if (firstGlyph > lastGlyph) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
return;
}
switch(verb)
{
case irvNoAction:
break;
case irvxA:
if (firstGlyph == lastGlyph) break;
if (firstGlyph + 1 < firstGlyph) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
ia = glyphStorage.getCharIndex(firstGlyph, success);
x = firstGlyph + 1;
@ -92,6 +103,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvDx:
if (firstGlyph == lastGlyph) break;
if (lastGlyph - 1 > lastGlyph) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
d = glyphStorage[lastGlyph];
id = glyphStorage.getCharIndex(lastGlyph, success);
x = lastGlyph - 1;
@ -120,6 +136,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvxAB:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 1)) { // difference == 1 is a no-op, < 1 is an error.
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
ia = glyphStorage.getCharIndex(firstGlyph, success);
@ -141,6 +162,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvxBA:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 1)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
ia = glyphStorage.getCharIndex(firstGlyph, success);
@ -162,6 +188,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvCDx:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 1)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
ic = glyphStorage.getCharIndex(lastGlyph - 1, success);
@ -183,6 +214,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvDCx:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 1)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
ic = glyphStorage.getCharIndex(lastGlyph - 1, success);
@ -204,6 +240,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvCDxA:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
@ -229,6 +270,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvDCxA:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
@ -254,6 +300,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvDxAB:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
d = glyphStorage[lastGlyph];
@ -279,6 +330,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvDxBA:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
d = glyphStorage[lastGlyph];
@ -304,6 +360,10 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvCDxAB:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
@ -326,6 +386,10 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvCDxBA:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
@ -348,6 +412,10 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvDCxAB:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
@ -370,6 +438,10 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvDCxBA:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];

View file

@ -1,6 +1,6 @@
/*
*
* (C) Copyright IBM Corp. and others 1998-2014 - All Rights Reserved
* (C) Copyright IBM Corp. and others 1998-2015 - All Rights Reserved
*
*/
@ -31,7 +31,7 @@ public:
virtual void endStateTable();
void doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb) const;
void doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb, LEErrorCode &success) const;
IndicRearrangementProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success);
virtual ~IndicRearrangementProcessor2();
@ -51,8 +51,8 @@ public:
static UClassID getStaticClassID();
protected:
le_int32 firstGlyph;
le_int32 lastGlyph;
le_uint32 firstGlyph;
le_uint32 lastGlyph;
LEReferenceToArrayOf<IndicRearrangementStateEntry2> entryTable;
LEReferenceTo<IndicRearrangementSubtableHeader2> indicRearrangementSubtableHeader;

View file

@ -1,7 +1,7 @@
/*
* %W% %W%
*
* (C) Copyright IBM Corp. 1998 - 2013 - All Rights Reserved
* (C) Copyright IBM Corp. 1998 - 2015 - All Rights Reserved
*
*/
@ -56,6 +56,8 @@ void MorphSubtableHeader::process(const LEReferenceTo<MorphSubtableHeader> &base
{
SubtableProcessor *processor = NULL;
if (LE_FAILURE(success)) return;
switch (SWAPW(coverage) & scfTypeMask)
{
case mstIndicRearrangement:

View file

@ -1,5 +1,5 @@
/*
* (C) Copyright IBM Corp. and others 1998 - 2013 - All Rights Reserved
* (C) Copyright IBM Corp. and others 1998 - 2015 - All Rights Reserved
*
*/
@ -164,6 +164,7 @@ void MorphTableHeader2::process(const LEReferenceTo<MorphTableHeader2> &base, LE
if(subtable>0) {
le_uint32 length = SWAPL(subtableHeader->length);
subtableHeader.addOffset(length, success); // Don't addOffset for the last entry.
if (LE_FAILURE(success)) break;
}
le_uint32 coverage = SWAPL(subtableHeader->coverage);
FeatureFlags subtableFeatures = SWAPL(subtableHeader->subtableFeatures);
@ -179,6 +180,8 @@ void MorphSubtableHeader2::process(const LEReferenceTo<MorphSubtableHeader2> &ba
{
SubtableProcessor2 *processor = NULL;
if (LE_FAILURE(success)) return;
switch (SWAPL(coverage) & scfTypeMask2)
{
case mstIndicRearrangement:

View file

@ -1,6 +1,6 @@
/*
*
* (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved
* (C) Copyright IBM Corp. 1998-2015 - All Rights Reserved
*
*/
@ -38,6 +38,8 @@ void SegmentArrayProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &s
le_int32 glyphCount = glyphStorage.getGlyphCount();
le_int32 glyph;
if (LE_FAILURE(success)) return;
for (glyph = 0; glyph < glyphCount; glyph += 1) {
LEGlyphID thisGlyph = glyphStorage[glyph];
const LookupSegment *lookupSegment = segmentArrayLookupTable->lookupSegment(segmentArrayLookupTable, segments, thisGlyph, success);

View file

@ -1,6 +1,6 @@
/*
*
* (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved
* (C) Copyright IBM Corp. and others 1998-2015 - All Rights Reserved
*
*/
@ -38,6 +38,8 @@ void SegmentArrayProcessor2::process(LEGlyphStorage &glyphStorage, LEErrorCode &
le_int32 glyphCount = glyphStorage.getGlyphCount();
le_int32 glyph;
if (LE_FAILURE(success)) return;
for (glyph = 0; glyph < glyphCount; glyph += 1) {
LEGlyphID thisGlyph = glyphStorage[glyph];
const LookupSegment *lookupSegment = segmentArrayLookupTable->lookupSegment(segmentArrayLookupTable, segments, thisGlyph, success);

View file

@ -1,6 +1,6 @@
/*
*
* (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved
* (C) Copyright IBM Corp. and others 1998-2015 - All Rights Reserved
*
*/
@ -39,6 +39,8 @@ void SegmentSingleProcessor2::process(LEGlyphStorage &glyphStorage, LEErrorCode
le_int32 glyphCount = glyphStorage.getGlyphCount();
le_int32 glyph;
if (LE_FAILURE(success)) return;
for (glyph = 0; glyph < glyphCount; glyph += 1) {
LEGlyphID thisGlyph = glyphStorage[glyph];
const LookupSegment *lookupSegment = segmentSingleLookupTable->lookupSegment(segmentSingleLookupTable, segments, thisGlyph, success);

View file

@ -1,6 +1,6 @@
/*
*
* (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved
* (C) Copyright IBM Corp. and others 1998-2015 - All Rights Reserved
*
*/
@ -36,10 +36,11 @@ SimpleArrayProcessor2::~SimpleArrayProcessor2()
void SimpleArrayProcessor2::process(LEGlyphStorage &glyphStorage, LEErrorCode &success)
{
if (LE_FAILURE(success)) return;
le_int32 glyphCount = glyphStorage.getGlyphCount();
le_int32 glyph;
if (LE_FAILURE(success)) return;
for (glyph = 0; glyph < glyphCount; glyph += 1) {
LEGlyphID thisGlyph = glyphStorage[glyph];
if (LE_GET_GLYPH(thisGlyph) < 0xFFFF) {

View file

@ -1,6 +1,6 @@
/*
*
* (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved
* (C) Copyright IBM Corp. 1998-2015 - All Rights Reserved
*
*/
@ -38,6 +38,8 @@ void SingleTableProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &su
le_int32 glyph;
le_int32 glyphCount = glyphStorage.getGlyphCount();
if (LE_FAILURE(success)) return;
for (glyph = 0; glyph < glyphCount; glyph += 1) {
const LookupSingle *lookupSingle = singleTableLookupTable->lookupSingle(singleTableLookupTable, entries, glyphStorage[glyph], success);