1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "LETypes.h" 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "OpenTypeTables.h" 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "GlyphDefinitionTables.h" 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "GlyphPositionAdjustments.h" 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "GlyphIterator.h" 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "LEGlyphStorage.h" 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "Lookups.h" 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "LESwaps.h" 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruGlyphIterator::GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags, 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader) 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : direction(1), position(-1), nextLimit(-1), prevLimit(-1), 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphStorage(theGlyphStorage), glyphPositionAdjustments(theGlyphPositionAdjustments), 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask), glyphGroup(0), 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphClassDefinitionTable(NULL), markAttachClassDefinitionTable(NULL) 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru le_int32 glyphCount = glyphStorage.getGlyphCount(); 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (theGlyphDefinitionTableHeader != NULL) { 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphClassDefinitionTable = theGlyphDefinitionTableHeader->getGlyphClassDefinitionTable(); 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru markAttachClassDefinitionTable = theGlyphDefinitionTableHeader->getMarkAttachClassDefinitionTable(); 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nextLimit = glyphCount; 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (rightToLeft) { 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru direction = -1; 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = glyphCount; 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nextLimit = -1; 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prevLimit = glyphCount; 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruGlyphIterator::GlyphIterator(GlyphIterator &that) 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : glyphStorage(that.glyphStorage) 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru direction = that.direction; 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = that.position; 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nextLimit = that.nextLimit; 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prevLimit = that.prevLimit; 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments = that.glyphPositionAdjustments; 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcIndex = that.srcIndex; 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destIndex = that.destIndex; 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lookupFlags = that.lookupFlags; 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru featureMask = that.featureMask; 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphGroup = that.glyphGroup; 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphClassDefinitionTable = that.glyphClassDefinitionTable; 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru markAttachClassDefinitionTable = that.markAttachClassDefinitionTable; 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruGlyphIterator::GlyphIterator(GlyphIterator &that, FeatureMask newFeatureMask) 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : glyphStorage(that.glyphStorage) 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru direction = that.direction; 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = that.position; 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nextLimit = that.nextLimit; 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prevLimit = that.prevLimit; 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments = that.glyphPositionAdjustments; 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcIndex = that.srcIndex; 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destIndex = that.destIndex; 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lookupFlags = that.lookupFlags; 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru featureMask = newFeatureMask; 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphGroup = 0; 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphClassDefinitionTable = that.glyphClassDefinitionTable; 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru markAttachClassDefinitionTable = that.markAttachClassDefinitionTable; 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruGlyphIterator::GlyphIterator(GlyphIterator &that, le_uint16 newLookupFlags) 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : glyphStorage(that.glyphStorage) 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru direction = that.direction; 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = that.position; 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nextLimit = that.nextLimit; 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prevLimit = that.prevLimit; 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments = that.glyphPositionAdjustments; 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcIndex = that.srcIndex; 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destIndex = that.destIndex; 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lookupFlags = newLookupFlags; 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru featureMask = that.featureMask; 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphGroup = that.glyphGroup; 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphClassDefinitionTable = that.glyphClassDefinitionTable; 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru markAttachClassDefinitionTable = that.markAttachClassDefinitionTable; 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruGlyphIterator::~GlyphIterator() 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // nothing to do, right? 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::reset(le_uint16 newLookupFlags, FeatureMask newFeatureMask) 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = prevLimit; 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru featureMask = newFeatureMask; 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphGroup = 0; 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lookupFlags = newLookupFlags; 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 11085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoLEGlyphID *GlyphIterator::insertGlyphs(le_int32 count, LEErrorCode& success) 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return glyphStorage.insertGlyphs(position, count, success); 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_int32 GlyphIterator::applyInsertions() 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru le_int32 newGlyphCount = glyphStorage.applyInsertions(); 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (direction < 0) { 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prevLimit = newGlyphCount; 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nextLimit = newGlyphCount; 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return newGlyphCount; 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_int32 GlyphIterator::getCurrStreamPosition() const 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return position; 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::isRightToLeft() const 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return direction < 0; 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::ignoresMarks() const 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (lookupFlags & lfIgnoreMarks) != 0; 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::baselineIsLogicalEnd() const 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (lookupFlags & lfBaselineIsLogicalEnd) != 0; 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLEGlyphID GlyphIterator::getCurrGlyphID() const 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (direction < 0) { 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= nextLimit || position >= prevLimit) { 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0xFFFF; 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= prevLimit || position >= nextLimit) { 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0xFFFF; 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return glyphStorage[position]; 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::getCursiveEntryPoint(LEPoint &entryPoint) const 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (direction < 0) { 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= nextLimit || position >= prevLimit) { 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= prevLimit || position >= nextLimit) { 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->getEntryPoint(position, entryPoint); 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::getCursiveExitPoint(LEPoint &exitPoint) const 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (direction < 0) { 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= nextLimit || position >= prevLimit) { 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= prevLimit || position >= nextLimit) { 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->getExitPoint(position, exitPoint); 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::setCurrGlyphID(TTGlyphID glyphID) 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LEGlyphID glyph = glyphStorage[position]; 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphStorage[position] = LE_SET_GLYPH(glyph, glyphID); 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::setCurrStreamPosition(le_int32 newPosition) 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (direction < 0) { 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (newPosition >= prevLimit) { 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = prevLimit; 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (newPosition <= nextLimit) { 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = nextLimit; 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (newPosition <= prevLimit) { 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = prevLimit; 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (newPosition >= nextLimit) { 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = nextLimit; 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = newPosition - direction; 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru next(); 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::setCurrGlyphBaseOffset(le_int32 baseOffset) 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (direction < 0) { 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= nextLimit || position >= prevLimit) { 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= prevLimit || position >= nextLimit) { 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->setBaseOffset(position, baseOffset); 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::adjustCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru float xAdvanceAdjust, float yAdvanceAdjust) 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (direction < 0) { 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= nextLimit || position >= prevLimit) { 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= prevLimit || position >= nextLimit) { 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->adjustXPlacement(position, xPlacementAdjust); 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->adjustYPlacement(position, yPlacementAdjust); 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->adjustXAdvance(position, xAdvanceAdjust); 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->adjustYAdvance(position, yAdvanceAdjust); 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::setCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru float xAdvanceAdjust, float yAdvanceAdjust) 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (direction < 0) { 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= nextLimit || position >= prevLimit) { 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= prevLimit || position >= nextLimit) { 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->setXPlacement(position, xPlacementAdjust); 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->setYPlacement(position, yPlacementAdjust); 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->setXAdvance(position, xAdvanceAdjust); 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->setYAdvance(position, yAdvanceAdjust); 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::clearCursiveEntryPoint() 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (direction < 0) { 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= nextLimit || position >= prevLimit) { 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= prevLimit || position >= nextLimit) { 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->clearEntryPoint(position); 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::clearCursiveExitPoint() 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (direction < 0) { 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= nextLimit || position >= prevLimit) { 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= prevLimit || position >= nextLimit) { 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->clearExitPoint(position); 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::setCursiveEntryPoint(LEPoint &entryPoint) 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (direction < 0) { 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= nextLimit || position >= prevLimit) { 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= prevLimit || position >= nextLimit) { 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->setEntryPoint(position, entryPoint, baselineIsLogicalEnd()); 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::setCursiveExitPoint(LEPoint &exitPoint) 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (direction < 0) { 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= nextLimit || position >= prevLimit) { 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= prevLimit || position >= nextLimit) { 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->setExitPoint(position, exitPoint, baselineIsLogicalEnd()); 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::setCursiveGlyph() 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (direction < 0) { 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= nextLimit || position >= prevLimit) { 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (position <= prevLimit || position >= nextLimit) { 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphPositionAdjustments->setCursiveGlyph(position, baselineIsLogicalEnd()); 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::filterGlyph(le_uint32 index) const 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LEGlyphID glyphID = glyphStorage[index]; 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru le_int32 glyphClass = gcdNoGlyphClass; 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (LE_GET_GLYPH(glyphID) >= 0xFFFE) { 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (glyphClassDefinitionTable != NULL) { 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphClass = glyphClassDefinitionTable->getGlyphClass(glyphID); 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (glyphClass) 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case gcdNoGlyphClass: 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case gcdSimpleGlyph: 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (lookupFlags & lfIgnoreBaseGlyphs) != 0; 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case gcdLigatureGlyph: 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (lookupFlags & lfIgnoreLigatures) != 0; 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case gcdMarkGlyph: 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((lookupFlags & lfIgnoreMarks) != 0) { 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru le_uint16 markAttachType = (lookupFlags & lfMarkAttachTypeMask) >> lfMarkAttachTypeShift; 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((markAttachType != 0) && (markAttachClassDefinitionTable != NULL)) { 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return markAttachClassDefinitionTable->getGlyphClass(glyphID) != markAttachType; 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case gcdComponentGlyph: 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (lookupFlags & lfIgnoreBaseGlyphs) != 0; 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::hasFeatureTag(le_bool matchGroup) const 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (featureMask == 0) { 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LEErrorCode success = LE_NO_ERROR; 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FeatureMask fm = glyphStorage.getAuxData(position, success); 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 41285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return ((fm & featureMask) == featureMask) && (!matchGroup || (le_int32)(fm & LE_GLYPH_GROUP_MASK) == glyphGroup); 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::findFeatureTag() 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //glyphGroup = 0; 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (nextInternal()) { 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (hasFeatureTag(FALSE)) { 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LEErrorCode success = LE_NO_ERROR; 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru glyphGroup = (glyphStorage.getAuxData(position, success) & LE_GLYPH_GROUP_MASK); 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::nextInternal(le_uint32 delta) 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru le_int32 newPosition = position; 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (newPosition != nextLimit && delta > 0) { 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru do { 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru newPosition += direction; 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } while (newPosition != nextLimit && filterGlyph(newPosition)); 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delta -= 1; 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = newPosition; 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return position != nextLimit; 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::next(le_uint32 delta) 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return nextInternal(delta) && hasFeatureTag(TRUE); 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::prevInternal(le_uint32 delta) 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru le_int32 newPosition = position; 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (newPosition != prevLimit && delta > 0) { 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru do { 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru newPosition -= direction; 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } while (newPosition != prevLimit && filterGlyph(newPosition)); 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delta -= 1; 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = newPosition; 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return position != prevLimit; 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::prev(le_uint32 delta) 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return prevInternal(delta) && hasFeatureTag(TRUE); 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_int32 GlyphIterator::getMarkComponent(le_int32 markPosition) const 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru le_int32 component = 0; 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru le_int32 posn; 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (posn = position; posn != markPosition; posn += direction) { 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (glyphStorage[posn] == 0xFFFE) { 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru component += 1; 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return component; 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This is basically prevInternal except that it 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// doesn't take a delta argument, and it doesn't 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// filter out 0xFFFE glyphs. 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::findMark2Glyph() 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru le_int32 newPosition = position; 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru do { 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru newPosition -= direction; 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } while (newPosition != prevLimit && glyphStorage[newPosition] != 0xFFFE && filterGlyph(newPosition)); 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = newPosition; 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return position != prevLimit; 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END 507