gfx/harfbuzz/src/hb-buffer-private.hh

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

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 */

mercurial