michael@0: /* GRAPHITE2 LICENSING michael@0: michael@0: Copyright 2010, SIL International michael@0: All rights reserved. michael@0: michael@0: This library is free software; you can redistribute it and/or modify michael@0: it under the terms of the GNU Lesser General Public License as published michael@0: by the Free Software Foundation; either version 2.1 of License, or michael@0: (at your option) any later version. michael@0: michael@0: This program is distributed in the hope that it will be useful, michael@0: but WITHOUT ANY WARRANTY; without even the implied warranty of michael@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU michael@0: Lesser General Public License for more details. michael@0: michael@0: You should also have received a copy of the GNU Lesser General Public michael@0: License along with this library in the file named "LICENSE". michael@0: If not, write to the Free Software Foundation, 51 Franklin Street, michael@0: Suite 500, Boston, MA 02110-1335, USA or visit their web page on the michael@0: internet at http://www.fsf.org/licenses/lgpl.html. michael@0: michael@0: Alternatively, the contents of this file may be used under the terms of the michael@0: Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public michael@0: License, as published by the Free Software Foundation, either version 2 michael@0: of the License or (at your option) any later version. michael@0: */ michael@0: #pragma once michael@0: michael@0: #include michael@0: #include "inc/Code.h" michael@0: michael@0: namespace graphite2 { michael@0: michael@0: class Segment; michael@0: class Face; michael@0: class Silf; michael@0: struct Rule; michael@0: struct RuleEntry; michael@0: struct State; michael@0: class FiniteStateMachine; michael@0: class Error; michael@0: michael@0: class Pass michael@0: { michael@0: public: michael@0: Pass(); michael@0: ~Pass(); michael@0: michael@0: bool readPass(const byte * pPass, size_t pass_length, size_t subtable_base, Face & face, Error &e); michael@0: void runGraphite(vm::Machine & m, FiniteStateMachine & fsm) const; michael@0: void init(Silf *silf) { m_silf = silf; } michael@0: byte spaceContextuals() const { return (m_flags & 0x0E) >> 1; } michael@0: michael@0: CLASS_NEW_DELETE michael@0: private: michael@0: void findNDoRule(Slot* & iSlot, vm::Machine &, FiniteStateMachine& fsm) const; michael@0: int doAction(const vm::Machine::Code* codeptr, Slot * & slot_out, vm::Machine &) const; michael@0: bool testPassConstraint(vm::Machine & m) const; michael@0: bool testConstraint(const Rule & r, vm::Machine &) const; michael@0: bool readRules(const byte * rule_map, const size_t num_entries, michael@0: const byte *precontext, const uint16 * sort_key, michael@0: const uint16 * o_constraint, const byte *constraint_data, michael@0: const uint16 * o_action, const byte * action_data, michael@0: Face &, Error &e); michael@0: bool readStates(const byte * starts, const byte * states, const byte * o_rule_map, Face &, Error &e); michael@0: bool readRanges(const byte * ranges, size_t num_ranges, Error &e); michael@0: uint16 glyphToCol(const uint16 gid) const; michael@0: bool runFSM(FiniteStateMachine & fsm, Slot * slot) const; michael@0: void dumpRuleEventConsidered(const FiniteStateMachine & fsm, const RuleEntry & re) const; michael@0: void dumpRuleEventOutput(const FiniteStateMachine & fsm, const Rule & r, Slot * os) const; michael@0: void adjustSlot(int delta, Slot * & slot_out, SlotMap &) const; michael@0: const Silf* m_silf; michael@0: uint16 * m_cols; michael@0: Rule * m_rules; // rules michael@0: RuleEntry * m_ruleMap; michael@0: uint16 * m_startStates; // prectxt length michael@0: uint16 * m_transitions; michael@0: State * m_states; michael@0: michael@0: byte m_flags; michael@0: byte m_iMaxLoop; michael@0: uint16 m_numGlyphs; michael@0: uint16 m_numRules; michael@0: uint16 m_numStates; michael@0: uint16 m_numTransition; michael@0: uint16 m_numSuccess; michael@0: uint16 m_successStart; michael@0: uint16 m_numColumns; michael@0: byte m_minPreCtxt; michael@0: byte m_maxPreCtxt; michael@0: vm::Machine::Code m_cPConstraint; michael@0: michael@0: private: //defensive michael@0: Pass(const Pass&); michael@0: Pass& operator=(const Pass&); michael@0: }; michael@0: michael@0: } // namespace graphite2