1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * (C) Copyright IBM Corp. 1998 - 2010 - All Rights Reserved 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "LETypes.h" 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "LEFontInstance.h" 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "OpenTypeTables.h" 950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "ICUFeatures.h" 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "Lookups.h" 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ScriptAndLanguage.h" 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "GlyphDefinitionTables.h" 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "GlyphPositioningTables.h" 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "SinglePositioningSubtables.h" 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "PairPositioningSubtables.h" 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "CursiveAttachmentSubtables.h" 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "MarkToBasePosnSubtables.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "MarkToLigaturePosnSubtables.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "MarkToMarkPosnSubtables.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//#include "ContextualPositioningSubtables.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ContextualSubstSubtables.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ExtensionSubtables.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "LookupProcessor.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "GlyphPosnLookupProc.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "LESwaps.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Aside from the names, the contextual positioning subtables are 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// the same as the contextual substitution subtables. 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef ContextualSubstitutionSubtable ContextualPositioningSubtable; 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef ChainingContextualSubstitutionSubtable ChainingContextualPositioningSubtable; 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruGlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor( 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const GlyphPositioningTableHeader *glyphPositioningTableHeader, 36b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru LETag scriptTag, 37b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru LETag languageTag, 38b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const FeatureMap *featureMap, 39b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru le_int32 featureMapCount, 40b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru le_bool featureOrder, 41b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru LEErrorCode& success) 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : LookupProcessor( 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (char *) glyphPositioningTableHeader, 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SWAPW(glyphPositioningTableHeader->scriptListOffset), 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SWAPW(glyphPositioningTableHeader->featureListOffset), 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SWAPW(glyphPositioningTableHeader->lookupListOffset), 47b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru scriptTag, 48b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru languageTag, 49b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru featureMap, 50b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru featureMapCount, 51b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru featureOrder, 52b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru success 53b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ) 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // anything? 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruGlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor() 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_uint32 GlyphPositioningLookupProcessor::applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru GlyphIterator *glyphIterator, 64b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const LEFontInstance *fontInstance, 65b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru LEErrorCode& success) const 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 67b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (LE_FAILURE(success)) { 68b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 0; 69b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 70b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru le_uint32 delta = 0; 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch(lookupType) 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0: 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case gpstSingle: 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const SinglePositioningSubtable *subtable = (const SinglePositioningSubtable *) lookupSubtable; 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delta = subtable->process(glyphIterator, fontInstance); 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case gpstPair: 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const PairPositioningSubtable *subtable = (const PairPositioningSubtable *) lookupSubtable; 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delta = subtable->process(glyphIterator, fontInstance); 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case gpstCursive: 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const CursiveAttachmentSubtable *subtable = (const CursiveAttachmentSubtable *) lookupSubtable; 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delta = subtable->process(glyphIterator, fontInstance); 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case gpstMarkToBase: 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const MarkToBasePositioningSubtable *subtable = (const MarkToBasePositioningSubtable *) lookupSubtable; 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delta = subtable->process(glyphIterator, fontInstance); 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case gpstMarkToLigature: 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const MarkToLigaturePositioningSubtable *subtable = (const MarkToLigaturePositioningSubtable *) lookupSubtable; 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delta = subtable->process(glyphIterator, fontInstance); 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case gpstMarkToMark: 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const MarkToMarkPositioningSubtable *subtable = (const MarkToMarkPositioningSubtable *) lookupSubtable; 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delta = subtable->process(glyphIterator, fontInstance); 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case gpstContext: 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const ContextualPositioningSubtable *subtable = (const ContextualPositioningSubtable *) lookupSubtable; 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 130b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delta = subtable->process(this, glyphIterator, fontInstance, success); 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case gpstChainedContext: 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const ChainingContextualPositioningSubtable *subtable = (const ChainingContextualPositioningSubtable *) lookupSubtable; 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delta = subtable->process(this, glyphIterator, fontInstance, success); 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case gpstExtension: 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const ExtensionSubtable *subtable = (const ExtensionSubtable *) lookupSubtable; 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 146b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delta = subtable->process(this, lookupType, glyphIterator, fontInstance, success); 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return delta; 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruGlyphPositioningLookupProcessor::~GlyphPositioningLookupProcessor() 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END 162