1*2d1272b8SAndroid Build Coastguard Worker /* 2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2012 Google, Inc. 3*2d1272b8SAndroid Build Coastguard Worker * 4*2d1272b8SAndroid Build Coastguard Worker * This is part of HarfBuzz, a text shaping library. 5*2d1272b8SAndroid Build Coastguard Worker * 6*2d1272b8SAndroid Build Coastguard Worker * Permission is hereby granted, without written agreement and without 7*2d1272b8SAndroid Build Coastguard Worker * license or royalty fees, to use, copy, modify, and distribute this 8*2d1272b8SAndroid Build Coastguard Worker * software and its documentation for any purpose, provided that the 9*2d1272b8SAndroid Build Coastguard Worker * above copyright notice and the following two paragraphs appear in 10*2d1272b8SAndroid Build Coastguard Worker * all copies of this software. 11*2d1272b8SAndroid Build Coastguard Worker * 12*2d1272b8SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 13*2d1272b8SAndroid Build Coastguard Worker * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 14*2d1272b8SAndroid Build Coastguard Worker * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 15*2d1272b8SAndroid Build Coastguard Worker * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 16*2d1272b8SAndroid Build Coastguard Worker * DAMAGE. 17*2d1272b8SAndroid Build Coastguard Worker * 18*2d1272b8SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 19*2d1272b8SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 20*2d1272b8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 21*2d1272b8SAndroid Build Coastguard Worker * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 22*2d1272b8SAndroid Build Coastguard Worker * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 23*2d1272b8SAndroid Build Coastguard Worker * 24*2d1272b8SAndroid Build Coastguard Worker * Google Author(s): Behdad Esfahbod 25*2d1272b8SAndroid Build Coastguard Worker */ 26*2d1272b8SAndroid Build Coastguard Worker 27*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_SHAPER_HH 28*2d1272b8SAndroid Build Coastguard Worker #define HB_SHAPER_HH 29*2d1272b8SAndroid Build Coastguard Worker 30*2d1272b8SAndroid Build Coastguard Worker #include "hb.hh" 31*2d1272b8SAndroid Build Coastguard Worker #include "hb-machinery.hh" 32*2d1272b8SAndroid Build Coastguard Worker 33*2d1272b8SAndroid Build Coastguard Worker typedef hb_bool_t hb_shape_func_t (hb_shape_plan_t *shape_plan, 34*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font, 35*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer, 36*2d1272b8SAndroid Build Coastguard Worker const hb_feature_t *features, 37*2d1272b8SAndroid Build Coastguard Worker unsigned int num_features); 38*2d1272b8SAndroid Build Coastguard Worker 39*2d1272b8SAndroid Build Coastguard Worker #define HB_SHAPER_IMPLEMENT(name) \ 40*2d1272b8SAndroid Build Coastguard Worker extern "C" HB_INTERNAL hb_shape_func_t _hb_##name##_shape; 41*2d1272b8SAndroid Build Coastguard Worker #include "hb-shaper-list.hh" 42*2d1272b8SAndroid Build Coastguard Worker #undef HB_SHAPER_IMPLEMENT 43*2d1272b8SAndroid Build Coastguard Worker 44*2d1272b8SAndroid Build Coastguard Worker struct hb_shaper_entry_t { 45*2d1272b8SAndroid Build Coastguard Worker char name[16]; 46*2d1272b8SAndroid Build Coastguard Worker hb_shape_func_t *func; 47*2d1272b8SAndroid Build Coastguard Worker }; 48*2d1272b8SAndroid Build Coastguard Worker 49*2d1272b8SAndroid Build Coastguard Worker HB_INTERNAL const hb_shaper_entry_t * 50*2d1272b8SAndroid Build Coastguard Worker _hb_shapers_get (); 51*2d1272b8SAndroid Build Coastguard Worker 52*2d1272b8SAndroid Build Coastguard Worker 53*2d1272b8SAndroid Build Coastguard Worker template <typename Data, unsigned int WheresData, typename T> 54*2d1272b8SAndroid Build Coastguard Worker struct hb_shaper_lazy_loader_t; 55*2d1272b8SAndroid Build Coastguard Worker 56*2d1272b8SAndroid Build Coastguard Worker #define HB_SHAPER_ORDER(Shaper) \ 57*2d1272b8SAndroid Build Coastguard Worker HB_PASTE (HB_SHAPER_ORDER_, Shaper) 58*2d1272b8SAndroid Build Coastguard Worker enum hb_shaper_order_t 59*2d1272b8SAndroid Build Coastguard Worker { 60*2d1272b8SAndroid Build Coastguard Worker _HB_SHAPER_ORDER_ORDER_ZERO, 61*2d1272b8SAndroid Build Coastguard Worker #define HB_SHAPER_IMPLEMENT(Shaper) \ 62*2d1272b8SAndroid Build Coastguard Worker HB_SHAPER_ORDER (Shaper), 63*2d1272b8SAndroid Build Coastguard Worker #include "hb-shaper-list.hh" 64*2d1272b8SAndroid Build Coastguard Worker #undef HB_SHAPER_IMPLEMENT 65*2d1272b8SAndroid Build Coastguard Worker _HB_SHAPERS_COUNT_PLUS_ONE, 66*2d1272b8SAndroid Build Coastguard Worker HB_SHAPERS_COUNT = _HB_SHAPERS_COUNT_PLUS_ONE - 1, 67*2d1272b8SAndroid Build Coastguard Worker }; 68*2d1272b8SAndroid Build Coastguard Worker 69*2d1272b8SAndroid Build Coastguard Worker template <enum hb_shaper_order_t order, typename Object> struct hb_shaper_object_data_type_t; 70*2d1272b8SAndroid Build Coastguard Worker 71*2d1272b8SAndroid Build Coastguard Worker #define HB_SHAPER_DATA_SUCCEEDED ((void *) +1) 72*2d1272b8SAndroid Build Coastguard Worker #define HB_SHAPER_DATA_TYPE(shaper, object) hb_##shaper##_##object##_data_t 73*2d1272b8SAndroid Build Coastguard Worker #define HB_SHAPER_DATA_CREATE_FUNC(shaper, object) _hb_##shaper##_shaper_##object##_data_create 74*2d1272b8SAndroid Build Coastguard Worker #define HB_SHAPER_DATA_DESTROY_FUNC(shaper, object) _hb_##shaper##_shaper_##object##_data_destroy 75*2d1272b8SAndroid Build Coastguard Worker 76*2d1272b8SAndroid Build Coastguard Worker #define HB_SHAPER_DATA_INSTANTIATE_SHAPERS(shaper, object) \ 77*2d1272b8SAndroid Build Coastguard Worker \ 78*2d1272b8SAndroid Build Coastguard Worker struct HB_SHAPER_DATA_TYPE (shaper, object); /* Type forward declaration. */ \ 79*2d1272b8SAndroid Build Coastguard Worker extern "C" HB_INTERNAL HB_SHAPER_DATA_TYPE (shaper, object) * \ 80*2d1272b8SAndroid Build Coastguard Worker HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (hb_##object##_t *object); \ 81*2d1272b8SAndroid Build Coastguard Worker extern "C" HB_INTERNAL void \ 82*2d1272b8SAndroid Build Coastguard Worker HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (HB_SHAPER_DATA_TYPE (shaper, object) *shaper##_##object); \ 83*2d1272b8SAndroid Build Coastguard Worker \ 84*2d1272b8SAndroid Build Coastguard Worker template <> \ 85*2d1272b8SAndroid Build Coastguard Worker struct hb_shaper_object_data_type_t<HB_SHAPER_ORDER (shaper), hb_##object##_t> \ 86*2d1272b8SAndroid Build Coastguard Worker { \ 87*2d1272b8SAndroid Build Coastguard Worker typedef HB_SHAPER_DATA_TYPE(shaper, object) value; \ 88*2d1272b8SAndroid Build Coastguard Worker }; \ 89*2d1272b8SAndroid Build Coastguard Worker \ 90*2d1272b8SAndroid Build Coastguard Worker template <unsigned int WheresData> \ 91*2d1272b8SAndroid Build Coastguard Worker struct hb_shaper_lazy_loader_t<hb_##object##_t, WheresData, HB_SHAPER_DATA_TYPE(shaper, object)> \ 92*2d1272b8SAndroid Build Coastguard Worker : hb_lazy_loader_t<HB_SHAPER_DATA_TYPE(shaper, object), \ 93*2d1272b8SAndroid Build Coastguard Worker hb_shaper_lazy_loader_t<hb_##object##_t, \ 94*2d1272b8SAndroid Build Coastguard Worker WheresData, \ 95*2d1272b8SAndroid Build Coastguard Worker HB_SHAPER_DATA_TYPE(shaper, object)>, \ 96*2d1272b8SAndroid Build Coastguard Worker hb_##object##_t, WheresData> \ 97*2d1272b8SAndroid Build Coastguard Worker { \ 98*2d1272b8SAndroid Build Coastguard Worker typedef HB_SHAPER_DATA_TYPE(shaper, object) Type; \ 99*2d1272b8SAndroid Build Coastguard Worker static Type* create (hb_##object##_t *data) \ 100*2d1272b8SAndroid Build Coastguard Worker { return HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (data); } \ 101*2d1272b8SAndroid Build Coastguard Worker static Type *get_null () { return nullptr; } \ 102*2d1272b8SAndroid Build Coastguard Worker static void destroy (Type *p) { HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (p); } \ 103*2d1272b8SAndroid Build Coastguard Worker }; \ 104*2d1272b8SAndroid Build Coastguard Worker \ 105*2d1272b8SAndroid Build Coastguard Worker static_assert (true, "") /* Require semicolon after. */ 106*2d1272b8SAndroid Build Coastguard Worker 107*2d1272b8SAndroid Build Coastguard Worker 108*2d1272b8SAndroid Build Coastguard Worker template <typename Object> 109*2d1272b8SAndroid Build Coastguard Worker struct hb_shaper_object_dataset_t 110*2d1272b8SAndroid Build Coastguard Worker { init0hb_shaper_object_dataset_t111*2d1272b8SAndroid Build Coastguard Worker void init0 (Object *parent_data) 112*2d1272b8SAndroid Build Coastguard Worker { 113*2d1272b8SAndroid Build Coastguard Worker this->parent_data = parent_data; 114*2d1272b8SAndroid Build Coastguard Worker #define HB_SHAPER_IMPLEMENT(shaper) shaper.init0 (); 115*2d1272b8SAndroid Build Coastguard Worker #include "hb-shaper-list.hh" 116*2d1272b8SAndroid Build Coastguard Worker #undef HB_SHAPER_IMPLEMENT 117*2d1272b8SAndroid Build Coastguard Worker } finihb_shaper_object_dataset_t118*2d1272b8SAndroid Build Coastguard Worker void fini () 119*2d1272b8SAndroid Build Coastguard Worker { 120*2d1272b8SAndroid Build Coastguard Worker #define HB_SHAPER_IMPLEMENT(shaper) shaper.fini (); 121*2d1272b8SAndroid Build Coastguard Worker #include "hb-shaper-list.hh" 122*2d1272b8SAndroid Build Coastguard Worker #undef HB_SHAPER_IMPLEMENT 123*2d1272b8SAndroid Build Coastguard Worker } 124*2d1272b8SAndroid Build Coastguard Worker 125*2d1272b8SAndroid Build Coastguard Worker Object *parent_data; /* MUST be JUST before the lazy loaders. */ 126*2d1272b8SAndroid Build Coastguard Worker #define HB_SHAPER_IMPLEMENT(shaper) \ 127*2d1272b8SAndroid Build Coastguard Worker hb_shaper_lazy_loader_t<Object, HB_SHAPER_ORDER(shaper), \ 128*2d1272b8SAndroid Build Coastguard Worker typename hb_shaper_object_data_type_t<HB_SHAPER_ORDER(shaper), Object>::value \ 129*2d1272b8SAndroid Build Coastguard Worker > shaper; 130*2d1272b8SAndroid Build Coastguard Worker #include "hb-shaper-list.hh" 131*2d1272b8SAndroid Build Coastguard Worker #undef HB_SHAPER_IMPLEMENT 132*2d1272b8SAndroid Build Coastguard Worker }; 133*2d1272b8SAndroid Build Coastguard Worker 134*2d1272b8SAndroid Build Coastguard Worker #endif /* HB_SHAPER_HH */ 135