Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.h
38918 views
/*1* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.2*3* This code is free software; you can redistribute it and/or modify it4* under the terms of the GNU General Public License version 2 only, as5* published by the Free Software Foundation. Oracle designates this6* particular file as subject to the "Classpath" exception as provided7* by Oracle in the LICENSE file that accompanied this code.8*9* This code is distributed in the hope that it will be useful, but WITHOUT10* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or11* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License12* version 2 for more details (a copy is included in the LICENSE file that13* accompanied this code).14*15* You should have received a copy of the GNU General Public License version16* 2 along with this work; if not, write to the Free Software Foundation,17* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.18*19* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA20* or visit www.oracle.com if you need additional information or have any21* questions.22*23*/2425/*26*27* (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved28*29*/3031#ifndef __CONTEXTUALSUBSTITUTIONSUBTABLES_H32#define __CONTEXTUALSUBSTITUTIONSUBTABLES_H3334/**35* \file36* \internal37*/3839#include "LETypes.h"40#include "LEFontInstance.h"41#include "OpenTypeTables.h"42#include "GlyphSubstitutionTables.h"43#include "GlyphIterator.h"44#include "LookupProcessor.h"45#include "LETableReference.h"4647U_NAMESPACE_BEGIN4849struct SubstitutionLookupRecord50{51le_uint16 sequenceIndex;52le_uint16 lookupListIndex;53};5455struct ContextualSubstitutionBase : GlyphSubstitutionSubtable56{57static le_bool matchGlyphIDs(58const LEReferenceToArrayOf<TTGlyphID> &glyphArray, le_uint16 glyphCount, GlyphIterator *glyphIterator,59le_bool backtrack = FALSE);6061static le_bool matchGlyphClasses(62const LEReferenceToArrayOf<le_uint16> &classArray, le_uint16 glyphCount, GlyphIterator *glyphIterator,63const LEReferenceTo<ClassDefinitionTable> &classDefinitionTable, LEErrorCode &success, le_bool backtrack = FALSE);6465static le_bool matchGlyphCoverages(66const LEReferenceToArrayOf<Offset> &coverageTableOffsetArray, le_uint16 glyphCount,67GlyphIterator *glyphIterator, const LETableReference& offsetBase, LEErrorCode &success, le_bool backtrack = FALSE);6869/**70* little shim to wrap the Offset array in range checking71* @private72*/73static le_bool matchGlyphCoverages(74const Offset *coverageTableOffsetArray, le_uint16 glyphCount,75GlyphIterator *glyphIterator, const LETableReference& offsetBase, LEErrorCode &success, le_bool backtrack = FALSE) {76LEReferenceToArrayOf<Offset> ref(offsetBase, success, coverageTableOffsetArray, glyphCount);77if( LE_FAILURE(success) ) { return FALSE; }78return matchGlyphCoverages(ref, glyphCount, glyphIterator, offsetBase, success, backtrack);79}8081static void applySubstitutionLookups(82const LookupProcessor *lookupProcessor,83const LEReferenceToArrayOf<SubstitutionLookupRecord>& substLookupRecordArray,84le_uint16 substCount,85GlyphIterator *glyphIterator,86const LEFontInstance *fontInstance,87le_int32 position,88LEErrorCode& success);89};9091struct ContextualSubstitutionSubtable : ContextualSubstitutionBase92{93le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor,94GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;95};9697struct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable98{99le_uint16 subRuleSetCount;100Offset subRuleSetTableOffsetArray[ANY_NUMBER];101102le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,103const LEFontInstance *fontInstance, LEErrorCode& success) const;104};105LE_VAR_ARRAY(ContextualSubstitutionFormat1Subtable, subRuleSetTableOffsetArray)106107108struct SubRuleSetTable109{110le_uint16 subRuleCount;111Offset subRuleTableOffsetArray[ANY_NUMBER];112113};114LE_VAR_ARRAY(SubRuleSetTable, subRuleTableOffsetArray)115116// NOTE: Multiple variable size arrays!!117struct SubRuleTable118{119le_uint16 glyphCount;120le_uint16 substCount;121TTGlyphID inputGlyphArray[ANY_NUMBER];122//SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];123};124LE_VAR_ARRAY(SubRuleTable, inputGlyphArray)125126struct ContextualSubstitutionFormat2Subtable : ContextualSubstitutionSubtable127{128Offset classDefTableOffset;129le_uint16 subClassSetCount;130Offset subClassSetTableOffsetArray[ANY_NUMBER];131132le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;133};134LE_VAR_ARRAY(ContextualSubstitutionFormat2Subtable, subClassSetTableOffsetArray)135136137struct SubClassSetTable138{139le_uint16 subClassRuleCount;140Offset subClassRuleTableOffsetArray[ANY_NUMBER];141};142LE_VAR_ARRAY(SubClassSetTable, subClassRuleTableOffsetArray)143144145// NOTE: Multiple variable size arrays!!146struct SubClassRuleTable147{148le_uint16 glyphCount;149le_uint16 substCount;150le_uint16 classArray[ANY_NUMBER];151//SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];152};153LE_VAR_ARRAY(SubClassRuleTable, classArray)154155156// NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause157// it has an array of coverage tables instead of a single coverage table...158//159// NOTE: Multiple variable size arrays!!160struct ContextualSubstitutionFormat3Subtable161{162le_uint16 substFormat;163le_uint16 glyphCount;164le_uint16 substCount;165Offset coverageTableOffsetArray[ANY_NUMBER];166//SubstitutionLookupRecord substLookupRecord[ANY_NUMBER];167168le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,169const LEFontInstance *fontInstance, LEErrorCode& success) const;170};171LE_VAR_ARRAY(ContextualSubstitutionFormat3Subtable, coverageTableOffsetArray)172173struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase174{175le_uint32 process(const LEReferenceTo<ChainingContextualSubstitutionSubtable> &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,176const LEFontInstance *fontInstance, LEErrorCode& success) const;177};178179struct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstitutionSubtable180{181le_uint16 chainSubRuleSetCount;182Offset chainSubRuleSetTableOffsetArray[ANY_NUMBER];183184le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,185const LEFontInstance *fontInstance, LEErrorCode& success) const;186};187LE_VAR_ARRAY(ChainingContextualSubstitutionFormat1Subtable, chainSubRuleSetTableOffsetArray)188189190struct ChainSubRuleSetTable191{192le_uint16 chainSubRuleCount;193Offset chainSubRuleTableOffsetArray[ANY_NUMBER];194195};196LE_VAR_ARRAY(ChainSubRuleSetTable, chainSubRuleTableOffsetArray)197198// NOTE: Multiple variable size arrays!!199struct ChainSubRuleTable200{201le_uint16 backtrackGlyphCount;202TTGlyphID backtrackGlyphArray[ANY_NUMBER];203//le_uint16 inputGlyphCount;204//TTGlyphID inputGlyphArray[ANY_NUMBER];205//le_uint16 lookaheadGlyphCount;206//TTGlyphID lookaheadGlyphArray[ANY_NUMBER];207//le_uint16 substCount;208//SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];209};210LE_VAR_ARRAY(ChainSubRuleTable, backtrackGlyphArray)211212struct ChainingContextualSubstitutionFormat2Subtable : ChainingContextualSubstitutionSubtable213{214Offset backtrackClassDefTableOffset;215Offset inputClassDefTableOffset;216Offset lookaheadClassDefTableOffset;217le_uint16 chainSubClassSetCount;218Offset chainSubClassSetTableOffsetArray[ANY_NUMBER];219220le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,221const LEFontInstance *fontInstance, LEErrorCode& success) const;222};223LE_VAR_ARRAY(ChainingContextualSubstitutionFormat2Subtable, chainSubClassSetTableOffsetArray)224225struct ChainSubClassSetTable226{227le_uint16 chainSubClassRuleCount;228Offset chainSubClassRuleTableOffsetArray[ANY_NUMBER];229};230LE_VAR_ARRAY(ChainSubClassSetTable, chainSubClassRuleTableOffsetArray)231232233// NOTE: Multiple variable size arrays!!234struct ChainSubClassRuleTable235{236le_uint16 backtrackGlyphCount;237le_uint16 backtrackClassArray[ANY_NUMBER];238//le_uint16 inputGlyphCount;239//le_uint16 inputClassArray[ANY_NUMBER];240//le_uint16 lookaheadGlyphCount;241//le_uint16 lookaheadClassArray[ANY_NUMBER];242//le_uint16 substCount;243//SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];244};245LE_VAR_ARRAY(ChainSubClassRuleTable, backtrackClassArray)246247// NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause248// it has arrays of coverage tables instead of a single coverage table...249//250// NOTE: Multiple variable size arrays!!251struct ChainingContextualSubstitutionFormat3Subtable252{253le_uint16 substFormat;254le_uint16 backtrackGlyphCount;255Offset backtrackCoverageTableOffsetArray[ANY_NUMBER];256//le_uint16 inputGlyphCount;257//Offset inputCoverageTableOffsetArray[ANY_NUMBER];258//le_uint16 lookaheadGlyphCount;259//le_uint16 lookaheadCoverageTableOffsetArray[ANY_NUMBER];260//le_uint16 substCount;261//SubstitutionLookupRecord substLookupRecord[ANY_NUMBER];262263le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor,264GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;265};266LE_VAR_ARRAY(ChainingContextualSubstitutionFormat3Subtable, backtrackCoverageTableOffsetArray)267268269U_NAMESPACE_END270#endif271272273