1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2007,2008,2009,2010 Red Hat, Inc.
3*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2010,2012,2013 Google, Inc.
4*2d1272b8SAndroid Build Coastguard Worker *
5*2d1272b8SAndroid Build Coastguard Worker * This is part of HarfBuzz, a text shaping library.
6*2d1272b8SAndroid Build Coastguard Worker *
7*2d1272b8SAndroid Build Coastguard Worker * Permission is hereby granted, without written agreement and without
8*2d1272b8SAndroid Build Coastguard Worker * license or royalty fees, to use, copy, modify, and distribute this
9*2d1272b8SAndroid Build Coastguard Worker * software and its documentation for any purpose, provided that the
10*2d1272b8SAndroid Build Coastguard Worker * above copyright notice and the following two paragraphs appear in
11*2d1272b8SAndroid Build Coastguard Worker * all copies of this software.
12*2d1272b8SAndroid Build Coastguard Worker *
13*2d1272b8SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
14*2d1272b8SAndroid Build Coastguard Worker * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
15*2d1272b8SAndroid Build Coastguard Worker * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
16*2d1272b8SAndroid Build Coastguard Worker * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
17*2d1272b8SAndroid Build Coastguard Worker * DAMAGE.
18*2d1272b8SAndroid Build Coastguard Worker *
19*2d1272b8SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
20*2d1272b8SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21*2d1272b8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
22*2d1272b8SAndroid Build Coastguard Worker * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
23*2d1272b8SAndroid Build Coastguard Worker * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24*2d1272b8SAndroid Build Coastguard Worker *
25*2d1272b8SAndroid Build Coastguard Worker * Red Hat Author(s): Behdad Esfahbod
26*2d1272b8SAndroid Build Coastguard Worker * Google Author(s): Behdad Esfahbod
27*2d1272b8SAndroid Build Coastguard Worker */
28*2d1272b8SAndroid Build Coastguard Worker
29*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_OT_LAYOUT_GSUB_TABLE_HH
30*2d1272b8SAndroid Build Coastguard Worker #define HB_OT_LAYOUT_GSUB_TABLE_HH
31*2d1272b8SAndroid Build Coastguard Worker
32*2d1272b8SAndroid Build Coastguard Worker #include "OT/Layout/GSUB/GSUB.hh"
33*2d1272b8SAndroid Build Coastguard Worker
34*2d1272b8SAndroid Build Coastguard Worker namespace OT {
35*2d1272b8SAndroid Build Coastguard Worker namespace Layout {
36*2d1272b8SAndroid Build Coastguard Worker namespace GSUB_impl {
37*2d1272b8SAndroid Build Coastguard Worker
38*2d1272b8SAndroid Build Coastguard Worker // TODO(garretrieger): Move into the new layout directory.
39*2d1272b8SAndroid Build Coastguard Worker /* Out-of-class implementation for methods recursing */
40*2d1272b8SAndroid Build Coastguard Worker
41*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_NO_OT_LAYOUT
is_reverse() const42*2d1272b8SAndroid Build Coastguard Worker /*static*/ inline bool ExtensionSubst::is_reverse () const
43*2d1272b8SAndroid Build Coastguard Worker {
44*2d1272b8SAndroid Build Coastguard Worker return SubstLookup::lookup_type_is_reverse (get_type ());
45*2d1272b8SAndroid Build Coastguard Worker }
46*2d1272b8SAndroid Build Coastguard Worker template <typename context_t>
dispatch_recurse_func(context_t * c,unsigned int lookup_index)47*2d1272b8SAndroid Build Coastguard Worker /*static*/ typename context_t::return_t SubstLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index)
48*2d1272b8SAndroid Build Coastguard Worker {
49*2d1272b8SAndroid Build Coastguard Worker const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (lookup_index);
50*2d1272b8SAndroid Build Coastguard Worker return l.dispatch (c);
51*2d1272b8SAndroid Build Coastguard Worker }
52*2d1272b8SAndroid Build Coastguard Worker
closure_glyphs_recurse_func(hb_closure_context_t * c,unsigned lookup_index,hb_set_t * covered_seq_indices,unsigned seq_index,unsigned end_index)53*2d1272b8SAndroid Build Coastguard Worker /*static*/ typename hb_closure_context_t::return_t SubstLookup::closure_glyphs_recurse_func (hb_closure_context_t *c, unsigned lookup_index, hb_set_t *covered_seq_indices, unsigned seq_index, unsigned end_index)
54*2d1272b8SAndroid Build Coastguard Worker {
55*2d1272b8SAndroid Build Coastguard Worker const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (lookup_index);
56*2d1272b8SAndroid Build Coastguard Worker if (l.may_have_non_1to1 ())
57*2d1272b8SAndroid Build Coastguard Worker hb_set_add_range (covered_seq_indices, seq_index, end_index);
58*2d1272b8SAndroid Build Coastguard Worker return l.dispatch (c);
59*2d1272b8SAndroid Build Coastguard Worker }
60*2d1272b8SAndroid Build Coastguard Worker
61*2d1272b8SAndroid Build Coastguard Worker template <>
62*2d1272b8SAndroid Build Coastguard Worker inline hb_closure_lookups_context_t::return_t
dispatch_recurse_func(hb_closure_lookups_context_t * c,unsigned this_index)63*2d1272b8SAndroid Build Coastguard Worker SubstLookup::dispatch_recurse_func<hb_closure_lookups_context_t> (hb_closure_lookups_context_t *c, unsigned this_index)
64*2d1272b8SAndroid Build Coastguard Worker {
65*2d1272b8SAndroid Build Coastguard Worker const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (this_index);
66*2d1272b8SAndroid Build Coastguard Worker return l.closure_lookups (c, this_index);
67*2d1272b8SAndroid Build Coastguard Worker }
68*2d1272b8SAndroid Build Coastguard Worker
69*2d1272b8SAndroid Build Coastguard Worker template <>
dispatch_recurse_func(hb_ot_apply_context_t * c,unsigned int lookup_index)70*2d1272b8SAndroid Build Coastguard Worker inline bool SubstLookup::dispatch_recurse_func<hb_ot_apply_context_t> (hb_ot_apply_context_t *c, unsigned int lookup_index)
71*2d1272b8SAndroid Build Coastguard Worker {
72*2d1272b8SAndroid Build Coastguard Worker auto *gsub = c->face->table.GSUB.get_relaxed ();
73*2d1272b8SAndroid Build Coastguard Worker const SubstLookup &l = gsub->table->get_lookup (lookup_index);
74*2d1272b8SAndroid Build Coastguard Worker unsigned int saved_lookup_props = c->lookup_props;
75*2d1272b8SAndroid Build Coastguard Worker unsigned int saved_lookup_index = c->lookup_index;
76*2d1272b8SAndroid Build Coastguard Worker c->set_lookup_index (lookup_index);
77*2d1272b8SAndroid Build Coastguard Worker c->set_lookup_props (l.get_props ());
78*2d1272b8SAndroid Build Coastguard Worker
79*2d1272b8SAndroid Build Coastguard Worker bool ret = false;
80*2d1272b8SAndroid Build Coastguard Worker auto *accel = gsub->get_accel (lookup_index);
81*2d1272b8SAndroid Build Coastguard Worker ret = accel && accel->apply (c, l.get_subtable_count (), false);
82*2d1272b8SAndroid Build Coastguard Worker
83*2d1272b8SAndroid Build Coastguard Worker c->set_lookup_index (saved_lookup_index);
84*2d1272b8SAndroid Build Coastguard Worker c->set_lookup_props (saved_lookup_props);
85*2d1272b8SAndroid Build Coastguard Worker return ret;
86*2d1272b8SAndroid Build Coastguard Worker }
87*2d1272b8SAndroid Build Coastguard Worker #endif
88*2d1272b8SAndroid Build Coastguard Worker
89*2d1272b8SAndroid Build Coastguard Worker } /* namespace GSUB_impl */
90*2d1272b8SAndroid Build Coastguard Worker } /* namespace Layout */
91*2d1272b8SAndroid Build Coastguard Worker } /* namespace OT */
92*2d1272b8SAndroid Build Coastguard Worker
93*2d1272b8SAndroid Build Coastguard Worker
94*2d1272b8SAndroid Build Coastguard Worker #endif /* HB_OT_LAYOUT_GSUB_TABLE_HH */
95