--- a/jdk/src/share/native/sun/font/layout/LookupTables.cpp Tue Feb 26 10:07:26 2013 -0800
+++ b/jdk/src/share/native/sun/font/layout/LookupTables.cpp Thu Mar 07 10:02:20 2013 -0800
@@ -49,22 +49,26 @@
of the derived classes, and implement it in the others by casting
the "this" pointer to the type that has the implementation.
*/
-const LookupSegment *BinarySearchLookupTable::lookupSegment(const LookupSegment *segments, LEGlyphID glyph) const
+const LookupSegment *BinarySearchLookupTable::lookupSegment(const LETableReference &base, const LookupSegment *segments, LEGlyphID glyph, LEErrorCode &success) const
{
+
le_int16 unity = SWAPW(unitSize);
le_int16 probe = SWAPW(searchRange);
le_int16 extra = SWAPW(rangeShift);
TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyph);
- const LookupSegment *entry = segments;
- const LookupSegment *trial = (const LookupSegment *) ((char *) entry + extra);
+ LEReferenceTo<LookupSegment> entry(base, success, segments);
+ LEReferenceTo<LookupSegment> trial(entry, success, extra);
+
+ if(LE_FAILURE(success)) return NULL;
if (SWAPW(trial->lastGlyph) <= ttGlyph) {
entry = trial;
}
- while (probe > unity) {
+ while (probe > unity && LE_SUCCESS(success)) {
probe >>= 1;
- trial = (const LookupSegment *) ((char *) entry + probe);
+ trial = entry; // copy
+ trial.addOffset(probe, success);
if (SWAPW(trial->lastGlyph) <= ttGlyph) {
entry = trial;
@@ -72,28 +76,29 @@
}
if (SWAPW(entry->firstGlyph) <= ttGlyph) {
- return entry;
+ return entry.getAlias();
}
return NULL;
}
-const LookupSingle *BinarySearchLookupTable::lookupSingle(const LookupSingle *entries, LEGlyphID glyph) const
+const LookupSingle *BinarySearchLookupTable::lookupSingle(const LETableReference &base, const LookupSingle *entries, LEGlyphID glyph, LEErrorCode &success) const
{
le_int16 unity = SWAPW(unitSize);
le_int16 probe = SWAPW(searchRange);
le_int16 extra = SWAPW(rangeShift);
TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyph);
- const LookupSingle *entry = entries;
- const LookupSingle *trial = (const LookupSingle *) ((char *) entry + extra);
+ LEReferenceTo<LookupSingle> entry(base, success, entries);
+ LEReferenceTo<LookupSingle> trial(entry, success, extra);
if (SWAPW(trial->glyph) <= ttGlyph) {
entry = trial;
}
- while (probe > unity) {
+ while (probe > unity && LE_SUCCESS(success)) {
probe >>= 1;
- trial = (const LookupSingle *) ((char *) entry + probe);
+ trial = entry;
+ trial.addOffset(probe, success);
if (SWAPW(trial->glyph) <= ttGlyph) {
entry = trial;
@@ -101,7 +106,7 @@
}
if (SWAPW(entry->glyph) == ttGlyph) {
- return entry;
+ return entry.getAlias();
}
return NULL;