|
1 /* |
|
2 * Copyright © 1998-2004 David Turner and Werner Lemberg |
|
3 * Copyright © 2004,2007,2009,2010 Red Hat, Inc. |
|
4 * Copyright © 2011,2012 Google, Inc. |
|
5 * |
|
6 * This is part of HarfBuzz, a text shaping library. |
|
7 * |
|
8 * Permission is hereby granted, without written agreement and without |
|
9 * license or royalty fees, to use, copy, modify, and distribute this |
|
10 * software and its documentation for any purpose, provided that the |
|
11 * above copyright notice and the following two paragraphs appear in |
|
12 * all copies of this software. |
|
13 * |
|
14 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR |
|
15 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES |
|
16 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN |
|
17 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH |
|
18 * DAMAGE. |
|
19 * |
|
20 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, |
|
21 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
|
22 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS |
|
23 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO |
|
24 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
|
25 * |
|
26 * Red Hat Author(s): Owen Taylor, Behdad Esfahbod |
|
27 * Google Author(s): Behdad Esfahbod |
|
28 */ |
|
29 |
|
30 #ifndef HB_BUFFER_PRIVATE_HH |
|
31 #define HB_BUFFER_PRIVATE_HH |
|
32 |
|
33 #include "hb-private.hh" |
|
34 #include "hb-object-private.hh" |
|
35 #include "hb-unicode-private.hh" |
|
36 |
|
37 |
|
38 ASSERT_STATIC (sizeof (hb_glyph_info_t) == 20); |
|
39 ASSERT_STATIC (sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t)); |
|
40 |
|
41 |
|
42 /* |
|
43 * hb_buffer_t |
|
44 */ |
|
45 |
|
46 struct hb_buffer_t { |
|
47 hb_object_header_t header; |
|
48 ASSERT_POD (); |
|
49 |
|
50 /* Information about how the text in the buffer should be treated */ |
|
51 |
|
52 hb_unicode_funcs_t *unicode; /* Unicode functions */ |
|
53 hb_segment_properties_t props; /* Script, language, direction */ |
|
54 hb_buffer_flags_t flags; /* BOT / EOT / etc. */ |
|
55 |
|
56 /* Buffer contents */ |
|
57 |
|
58 hb_buffer_content_type_t content_type; |
|
59 |
|
60 bool in_error; /* Allocation failed */ |
|
61 bool have_output; /* Whether we have an output buffer going on */ |
|
62 bool have_positions; /* Whether we have positions */ |
|
63 |
|
64 unsigned int idx; /* Cursor into ->info and ->pos arrays */ |
|
65 unsigned int len; /* Length of ->info and ->pos arrays */ |
|
66 unsigned int out_len; /* Length of ->out array if have_output */ |
|
67 |
|
68 unsigned int allocated; /* Length of allocated arrays */ |
|
69 hb_glyph_info_t *info; |
|
70 hb_glyph_info_t *out_info; |
|
71 hb_glyph_position_t *pos; |
|
72 |
|
73 inline hb_glyph_info_t &cur (unsigned int i = 0) { return info[idx + i]; } |
|
74 inline hb_glyph_info_t cur (unsigned int i = 0) const { return info[idx + i]; } |
|
75 |
|
76 inline hb_glyph_position_t &cur_pos (unsigned int i = 0) { return pos[idx + i]; } |
|
77 inline hb_glyph_position_t cur_pos (unsigned int i = 0) const { return pos[idx + i]; } |
|
78 |
|
79 inline hb_glyph_info_t &prev (void) { return out_info[out_len - 1]; } |
|
80 inline hb_glyph_info_t prev (void) const { return info[out_len - 1]; } |
|
81 |
|
82 inline bool has_separate_output (void) const { return info != out_info; } |
|
83 |
|
84 unsigned int serial; |
|
85 |
|
86 /* These reflect current allocations of the bytes in glyph_info_t's var1 and var2. */ |
|
87 uint8_t allocated_var_bytes[8]; |
|
88 const char *allocated_var_owner[8]; |
|
89 |
|
90 /* Text before / after the main buffer contents. |
|
91 * Always in Unicode, and ordered outward. |
|
92 * Index 0 is for "pre-context", 1 for "post-context". */ |
|
93 static const unsigned int CONTEXT_LENGTH = 5; |
|
94 hb_codepoint_t context[2][CONTEXT_LENGTH]; |
|
95 unsigned int context_len[2]; |
|
96 |
|
97 |
|
98 /* Methods */ |
|
99 |
|
100 HB_INTERNAL void reset (void); |
|
101 HB_INTERNAL void clear (void); |
|
102 |
|
103 inline unsigned int backtrack_len (void) const |
|
104 { return have_output? out_len : idx; } |
|
105 inline unsigned int lookahead_len (void) const |
|
106 { return len - idx; } |
|
107 inline unsigned int next_serial (void) { return serial++; } |
|
108 |
|
109 HB_INTERNAL void allocate_var (unsigned int byte_i, unsigned int count, const char *owner); |
|
110 HB_INTERNAL void deallocate_var (unsigned int byte_i, unsigned int count, const char *owner); |
|
111 HB_INTERNAL void assert_var (unsigned int byte_i, unsigned int count, const char *owner); |
|
112 HB_INTERNAL void deallocate_var_all (void); |
|
113 |
|
114 HB_INTERNAL void add (hb_codepoint_t codepoint, |
|
115 unsigned int cluster); |
|
116 HB_INTERNAL void add_info (const hb_glyph_info_t &glyph_info); |
|
117 |
|
118 HB_INTERNAL void reverse_range (unsigned int start, unsigned int end); |
|
119 HB_INTERNAL void reverse (void); |
|
120 HB_INTERNAL void reverse_clusters (void); |
|
121 HB_INTERNAL void guess_segment_properties (void); |
|
122 |
|
123 HB_INTERNAL void swap_buffers (void); |
|
124 HB_INTERNAL void remove_output (void); |
|
125 HB_INTERNAL void clear_output (void); |
|
126 HB_INTERNAL void clear_positions (void); |
|
127 |
|
128 HB_INTERNAL void replace_glyphs (unsigned int num_in, |
|
129 unsigned int num_out, |
|
130 const hb_codepoint_t *glyph_data); |
|
131 |
|
132 HB_INTERNAL void replace_glyph (hb_codepoint_t glyph_index); |
|
133 /* Makes a copy of the glyph at idx to output and replace glyph_index */ |
|
134 HB_INTERNAL void output_glyph (hb_codepoint_t glyph_index); |
|
135 HB_INTERNAL void output_info (const hb_glyph_info_t &glyph_info); |
|
136 /* Copies glyph at idx to output but doesn't advance idx */ |
|
137 HB_INTERNAL void copy_glyph (void); |
|
138 HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */ |
|
139 /* Copies glyph at idx to output and advance idx. |
|
140 * If there's no output, just advance idx. */ |
|
141 inline void |
|
142 next_glyph (void) |
|
143 { |
|
144 if (have_output) |
|
145 { |
|
146 if (unlikely (out_info != info || out_len != idx)) { |
|
147 if (unlikely (!make_room_for (1, 1))) return; |
|
148 out_info[out_len] = info[idx]; |
|
149 } |
|
150 out_len++; |
|
151 } |
|
152 |
|
153 idx++; |
|
154 } |
|
155 |
|
156 /* Advance idx without copying to output. */ |
|
157 inline void skip_glyph (void) { idx++; } |
|
158 |
|
159 inline void reset_masks (hb_mask_t mask) |
|
160 { |
|
161 for (unsigned int j = 0; j < len; j++) |
|
162 info[j].mask = mask; |
|
163 } |
|
164 inline void add_masks (hb_mask_t mask) |
|
165 { |
|
166 for (unsigned int j = 0; j < len; j++) |
|
167 info[j].mask |= mask; |
|
168 } |
|
169 HB_INTERNAL void set_masks (hb_mask_t value, |
|
170 hb_mask_t mask, |
|
171 unsigned int cluster_start, |
|
172 unsigned int cluster_end); |
|
173 |
|
174 HB_INTERNAL void merge_clusters (unsigned int start, |
|
175 unsigned int end); |
|
176 HB_INTERNAL void merge_out_clusters (unsigned int start, |
|
177 unsigned int end); |
|
178 |
|
179 /* Internal methods */ |
|
180 HB_INTERNAL bool enlarge (unsigned int size); |
|
181 |
|
182 inline bool ensure (unsigned int size) |
|
183 { return likely (!size || size < allocated) ? true : enlarge (size); } |
|
184 |
|
185 HB_INTERNAL bool make_room_for (unsigned int num_in, unsigned int num_out); |
|
186 HB_INTERNAL bool shift_forward (unsigned int count); |
|
187 |
|
188 typedef long scratch_buffer_t; |
|
189 HB_INTERNAL scratch_buffer_t *get_scratch_buffer (unsigned int *size); |
|
190 |
|
191 inline void clear_context (unsigned int side) { context_len[side] = 0; } |
|
192 }; |
|
193 |
|
194 |
|
195 #define HB_BUFFER_XALLOCATE_VAR(b, func, var, owner) \ |
|
196 b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \ |
|
197 sizeof (b->info[0].var), owner) |
|
198 #define HB_BUFFER_ALLOCATE_VAR(b, var) \ |
|
199 HB_BUFFER_XALLOCATE_VAR (b, allocate_var, var (), #var) |
|
200 #define HB_BUFFER_DEALLOCATE_VAR(b, var) \ |
|
201 HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var (), #var) |
|
202 #define HB_BUFFER_ASSERT_VAR(b, var) \ |
|
203 HB_BUFFER_XALLOCATE_VAR (b, assert_var, var (), #var) |
|
204 |
|
205 |
|
206 #endif /* HB_BUFFER_PRIVATE_HH */ |