diff -r 000000000000 -r 1fb32624e06b fontservices/textshaperplugin/IcuSource/layout/LookupTables.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fontservices/textshaperplugin/IcuSource/layout/LookupTables.cpp Tue Feb 02 02:02:46 2010 +0200 @@ -0,0 +1,85 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LayoutTables.h" +#include "LookupTables.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +/* + These are the rolled-up versions of the uniform binary search. + Someday, if we need more performance, we can un-roll them. + + Note: I put these in the base class, so they only have to + be written once. Since the base class doesn't define the + segment table, these routines assume that it's right after + the binary search header. + + Another way to do this is to put each of these routines in one + 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 +{ + 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); + + if (SWAPW(trial->lastGlyph) <= ttGlyph) { + entry = trial; + } + + while (probe > unity) { + probe >>= 1; + trial = (const LookupSegment *) ((char *) entry + probe); + + if (SWAPW(trial->lastGlyph) <= ttGlyph) { + entry = trial; + } + } + + if (SWAPW(entry->firstGlyph) <= ttGlyph) { + return entry; + } + + return NULL; +} + +const LookupSingle *BinarySearchLookupTable::lookupSingle(const LookupSingle *entries, LEGlyphID glyph) 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); + + if (SWAPW(trial->glyph) <= ttGlyph) { + entry = trial; + } + + while (probe > unity) { + probe >>= 1; + trial = (const LookupSingle *) ((char *) entry + probe); + + if (SWAPW(trial->glyph) <= ttGlyph) { + entry = trial; + } + } + + if (SWAPW(entry->glyph) == ttGlyph) { + return entry; + } + + return NULL; +} + +U_NAMESPACE_END