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