[Indic] Stop looking for base upon seeing joiners
[framework/uifw/harfbuzz.git] / src / hb-ot-shape-private.hh
1 /*
2  * Copyright © 2010  Google, Inc.
3  *
4  *  This is part of HarfBuzz, a text shaping library.
5  *
6  * Permission is hereby granted, without written agreement and without
7  * license or royalty fees, to use, copy, modify, and distribute this
8  * software and its documentation for any purpose, provided that the
9  * above copyright notice and the following two paragraphs appear in
10  * all copies of this software.
11  *
12  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16  * DAMAGE.
17  *
18  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23  *
24  * Google Author(s): Behdad Esfahbod
25  */
26
27 #ifndef HB_OT_SHAPE_PRIVATE_HH
28 #define HB_OT_SHAPE_PRIVATE_HH
29
30 #include "hb-private.hh"
31
32 #include "hb-ot-shape.h"
33
34 #include "hb-ot-map-private.hh"
35 #include "hb-ot-shape-complex-private.hh"
36
37 HB_BEGIN_DECLS
38
39
40 enum hb_ot_complex_shaper_t;
41
42 struct hb_ot_shape_plan_t
43 {
44   friend struct hb_ot_shape_planner_t;
45
46   hb_ot_map_t map;
47   hb_ot_complex_shaper_t shaper;
48
49   hb_ot_shape_plan_t (void) : map () {}
50   ~hb_ot_shape_plan_t (void) { map.finish (); }
51
52   private:
53   NO_COPY (hb_ot_shape_plan_t);
54 };
55
56 struct hb_ot_shape_planner_t
57 {
58   hb_ot_map_builder_t map;
59   hb_ot_complex_shaper_t shaper;
60
61   hb_ot_shape_planner_t (void) : map () {}
62   ~hb_ot_shape_planner_t (void) { map.finish (); }
63
64   inline void compile (hb_face_t *face,
65                        const hb_segment_properties_t *props,
66                        struct hb_ot_shape_plan_t &plan)
67   {
68     plan.shaper = shaper;
69     map.compile (face, props, plan.map);
70   }
71
72   private:
73   NO_COPY (hb_ot_shape_planner_t);
74 };
75
76
77 struct hb_ot_shape_context_t
78 {
79   /* Input to hb_ot_shape_execute() */
80   hb_ot_shape_plan_t *plan;
81   hb_font_t *font;
82   hb_face_t *face;
83   hb_buffer_t  *buffer;
84   const hb_feature_t *user_features;
85   unsigned int        num_user_features;
86
87   /* Transient stuff */
88   hb_direction_t target_direction;
89   hb_bool_t applied_substitute_complex;
90   hb_bool_t applied_position_complex;
91 };
92
93
94 static inline hb_bool_t
95 is_variation_selector (hb_codepoint_t unicode)
96 {
97   return unlikely ((unicode >=  0x180B && unicode <=  0x180D) || /* MONGOLIAN FREE VARIATION SELECTOR ONE..THREE */
98                    (unicode >=  0xFE00 && unicode <=  0xFE0F) || /* VARIATION SELECTOR-1..16 */
99                    (unicode >= 0xE0100 && unicode <= 0xE01EF));  /* VARIATION SELECTOR-17..256 */
100 }
101
102 static inline void
103 hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_unicode_funcs_t *unicode)
104 {
105   info->general_category() = hb_unicode_general_category (unicode, info->codepoint);
106   info->combining_class() = hb_unicode_combining_class (unicode, info->codepoint);
107 }
108
109 HB_INTERNAL void _hb_set_unicode_props (hb_buffer_t *buffer);
110
111 HB_INTERNAL void _hb_ot_shape_normalize (hb_ot_shape_context_t *c);
112
113 HB_END_DECLS
114
115 #endif /* HB_OT_SHAPE_PRIVATE_HH */