xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-shaper.hh (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
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