< prev index next >

src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.hh

Print this page

        

*** 25,40 **** * * Red Hat Author(s): Owen Taylor, Behdad Esfahbod * Google Author(s): Behdad Esfahbod */ ! #ifndef HB_BUFFER_PRIVATE_HH ! #define HB_BUFFER_PRIVATE_HH ! #include "hb-private.hh" ! #include "hb-object-private.hh" ! #include "hb-unicode-private.hh" #ifndef HB_BUFFER_MAX_LEN_FACTOR #define HB_BUFFER_MAX_LEN_FACTOR 32 #endif --- 25,39 ---- * * Red Hat Author(s): Owen Taylor, Behdad Esfahbod * Google Author(s): Behdad Esfahbod */ ! #ifndef HB_BUFFER_HH ! #define HB_BUFFER_HH ! #include "hb.hh" ! #include "hb-unicode.hh" #ifndef HB_BUFFER_MAX_LEN_FACTOR #define HB_BUFFER_MAX_LEN_FACTOR 32 #endif
*** 82,100 **** /* * hb_buffer_t */ ! struct hb_buffer_t { hb_object_header_t header; - ASSERT_POD (); /* Information about how the text in the buffer should be treated */ hb_unicode_funcs_t *unicode; /* Unicode functions */ hb_buffer_flags_t flags; /* BOT / EOT / etc. */ hb_buffer_cluster_level_t cluster_level; hb_codepoint_t replacement; /* U+FFFD or something else. */ hb_buffer_scratch_flags_t scratch_flags; /* Have space-fallback, etc. */ unsigned int max_len; /* Maximum allowed len. */ int max_ops; /* Maximum allowed operations. */ /* Buffer contents */ --- 81,100 ---- /* * hb_buffer_t */ ! struct hb_buffer_t ! { hb_object_header_t header; /* Information about how the text in the buffer should be treated */ hb_unicode_funcs_t *unicode; /* Unicode functions */ hb_buffer_flags_t flags; /* BOT / EOT / etc. */ hb_buffer_cluster_level_t cluster_level; hb_codepoint_t replacement; /* U+FFFD or something else. */ + hb_codepoint_t invisible; /* 0 or something else. */ hb_buffer_scratch_flags_t scratch_flags; /* Have space-fallback, etc. */ unsigned int max_len; /* Maximum allowed len. */ int max_ops; /* Maximum allowed operations. */ /* Buffer contents */
*** 117,127 **** unsigned int serial; /* Text before / after the main buffer contents. * Always in Unicode, and ordered outward. * Index 0 is for "pre-context", 1 for "post-context". */ ! static const unsigned int CONTEXT_LENGTH = 5; hb_codepoint_t context[2][CONTEXT_LENGTH]; unsigned int context_len[2]; /* Debugging API */ hb_buffer_message_func_t message_func; --- 117,127 ---- unsigned int serial; /* Text before / after the main buffer contents. * Always in Unicode, and ordered outward. * Index 0 is for "pre-context", 1 for "post-context". */ ! static constexpr unsigned CONTEXT_LENGTH = 5u; hb_codepoint_t context[2][CONTEXT_LENGTH]; unsigned int context_len[2]; /* Debugging API */ hb_buffer_message_func_t message_func;
*** 135,271 **** #endif /* Methods */ ! inline void allocate_var (unsigned int start, unsigned int count) { #ifndef HB_NDEBUG unsigned int end = start + count; assert (end <= 8); unsigned int bits = (1u<<end) - (1u<<start); assert (0 == (allocated_var_bits & bits)); allocated_var_bits |= bits; #endif } ! inline void deallocate_var (unsigned int start, unsigned int count) { #ifndef HB_NDEBUG unsigned int end = start + count; assert (end <= 8); unsigned int bits = (1u<<end) - (1u<<start); assert (bits == (allocated_var_bits & bits)); allocated_var_bits &= ~bits; #endif } ! inline void assert_var (unsigned int start, unsigned int count) { #ifndef HB_NDEBUG unsigned int end = start + count; assert (end <= 8); unsigned int bits = (1u<<end) - (1u<<start); assert (bits == (allocated_var_bits & bits)); #endif } ! inline void deallocate_var_all (void) { #ifndef HB_NDEBUG allocated_var_bits = 0; #endif } ! inline hb_glyph_info_t &cur (unsigned int i = 0) { return info[idx + i]; } ! inline hb_glyph_info_t cur (unsigned int i = 0) const { return info[idx + i]; } ! inline hb_glyph_position_t &cur_pos (unsigned int i = 0) { return pos[idx + i]; } ! inline hb_glyph_position_t cur_pos (unsigned int i = 0) const { return pos[idx + i]; } ! inline hb_glyph_info_t &prev (void) { return out_info[out_len ? out_len - 1 : 0]; } ! inline hb_glyph_info_t prev (void) const { return out_info[out_len ? out_len - 1 : 0]; } ! inline bool has_separate_output (void) const { return info != out_info; } ! HB_INTERNAL void reset (void); ! HB_INTERNAL void clear (void); ! inline unsigned int backtrack_len (void) const ! { return have_output? out_len : idx; } ! inline unsigned int lookahead_len (void) const ! { return len - idx; } ! inline unsigned int next_serial (void) { return serial++; } HB_INTERNAL void add (hb_codepoint_t codepoint, unsigned int cluster); HB_INTERNAL void add_info (const hb_glyph_info_t &glyph_info); HB_INTERNAL void reverse_range (unsigned int start, unsigned int end); ! HB_INTERNAL void reverse (void); ! HB_INTERNAL void reverse_clusters (void); ! HB_INTERNAL void guess_segment_properties (void); ! ! HB_INTERNAL void swap_buffers (void); ! HB_INTERNAL void remove_output (void); ! HB_INTERNAL void clear_output (void); ! HB_INTERNAL void clear_positions (void); HB_INTERNAL void replace_glyphs (unsigned int num_in, unsigned int num_out, const hb_codepoint_t *glyph_data); ! HB_INTERNAL void replace_glyph (hb_codepoint_t glyph_index); /* Makes a copy of the glyph at idx to output and replace glyph_index */ ! HB_INTERNAL void output_glyph (hb_codepoint_t glyph_index); ! HB_INTERNAL void output_info (const hb_glyph_info_t &glyph_info); /* Copies glyph at idx to output but doesn't advance idx */ ! HB_INTERNAL void copy_glyph (void); ! HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */ /* Copies glyph at idx to output and advance idx. * If there's no output, just advance idx. */ ! inline void ! next_glyph (void) { if (have_output) { ! if (unlikely (out_info != info || out_len != idx)) { if (unlikely (!make_room_for (1, 1))) return; out_info[out_len] = info[idx]; } out_len++; } idx++; } /* Advance idx without copying to output. */ ! inline void skip_glyph (void) { idx++; } ! ! inline void reset_masks (hb_mask_t mask) { for (unsigned int j = 0; j < len; j++) info[j].mask = mask; } ! inline void add_masks (hb_mask_t mask) { for (unsigned int j = 0; j < len; j++) info[j].mask |= mask; } HB_INTERNAL void set_masks (hb_mask_t value, hb_mask_t mask, unsigned int cluster_start, unsigned int cluster_end); ! inline void merge_clusters (unsigned int start, unsigned int end) { if (end - start < 2) return; merge_clusters_impl (start, end); } HB_INTERNAL void merge_clusters_impl (unsigned int start, unsigned int end); HB_INTERNAL void merge_out_clusters (unsigned int start, unsigned int end); /* Merge clusters for deleting current glyph, and skip it. */ ! HB_INTERNAL void delete_glyph (void); ! inline void unsafe_to_break (unsigned int start, unsigned int end) { if (end - start < 2) return; unsafe_to_break_impl (start, end); --- 135,323 ---- #endif /* Methods */ ! bool in_error () const { return !successful; } ! ! void allocate_var (unsigned int start, unsigned int count) { #ifndef HB_NDEBUG unsigned int end = start + count; assert (end <= 8); unsigned int bits = (1u<<end) - (1u<<start); assert (0 == (allocated_var_bits & bits)); allocated_var_bits |= bits; #endif } ! void deallocate_var (unsigned int start, unsigned int count) { #ifndef HB_NDEBUG unsigned int end = start + count; assert (end <= 8); unsigned int bits = (1u<<end) - (1u<<start); assert (bits == (allocated_var_bits & bits)); allocated_var_bits &= ~bits; #endif } ! void assert_var (unsigned int start, unsigned int count) { #ifndef HB_NDEBUG unsigned int end = start + count; assert (end <= 8); unsigned int bits = (1u<<end) - (1u<<start); assert (bits == (allocated_var_bits & bits)); #endif } ! void deallocate_var_all () { #ifndef HB_NDEBUG allocated_var_bits = 0; #endif } ! hb_glyph_info_t &cur (unsigned int i = 0) { return info[idx + i]; } ! hb_glyph_info_t cur (unsigned int i = 0) const { return info[idx + i]; } ! hb_glyph_position_t &cur_pos (unsigned int i = 0) { return pos[idx + i]; } ! hb_glyph_position_t cur_pos (unsigned int i = 0) const { return pos[idx + i]; } ! hb_glyph_info_t &prev () { return out_info[out_len ? out_len - 1 : 0]; } ! hb_glyph_info_t prev () const { return out_info[out_len ? out_len - 1 : 0]; } ! bool has_separate_output () const { return info != out_info; } ! HB_INTERNAL void reset (); ! HB_INTERNAL void clear (); ! unsigned int backtrack_len () const { return have_output? out_len : idx; } ! unsigned int lookahead_len () const { return len - idx; } ! unsigned int next_serial () { return serial++; } HB_INTERNAL void add (hb_codepoint_t codepoint, unsigned int cluster); HB_INTERNAL void add_info (const hb_glyph_info_t &glyph_info); HB_INTERNAL void reverse_range (unsigned int start, unsigned int end); ! HB_INTERNAL void reverse (); ! HB_INTERNAL void reverse_clusters (); ! HB_INTERNAL void guess_segment_properties (); ! ! HB_INTERNAL void swap_buffers (); ! HB_INTERNAL void remove_output (); ! HB_INTERNAL void clear_output (); ! HB_INTERNAL void clear_positions (); HB_INTERNAL void replace_glyphs (unsigned int num_in, unsigned int num_out, const hb_codepoint_t *glyph_data); ! void replace_glyph (hb_codepoint_t glyph_index) ! { ! if (unlikely (out_info != info || out_len != idx)) { ! if (unlikely (!make_room_for (1, 1))) return; ! out_info[out_len] = info[idx]; ! } ! out_info[out_len].codepoint = glyph_index; ! ! idx++; ! out_len++; ! } /* Makes a copy of the glyph at idx to output and replace glyph_index */ ! hb_glyph_info_t & output_glyph (hb_codepoint_t glyph_index) ! { ! if (unlikely (!make_room_for (0, 1))) return Crap(hb_glyph_info_t); ! ! if (unlikely (idx == len && !out_len)) ! return Crap(hb_glyph_info_t); ! ! out_info[out_len] = idx < len ? info[idx] : out_info[out_len - 1]; ! out_info[out_len].codepoint = glyph_index; ! ! out_len++; ! ! return out_info[out_len - 1]; ! } ! void output_info (const hb_glyph_info_t &glyph_info) ! { ! if (unlikely (!make_room_for (0, 1))) return; ! ! out_info[out_len] = glyph_info; ! ! out_len++; ! } /* Copies glyph at idx to output but doesn't advance idx */ ! void copy_glyph () ! { ! if (unlikely (!make_room_for (0, 1))) return; ! ! out_info[out_len] = info[idx]; ! ! out_len++; ! } /* Copies glyph at idx to output and advance idx. * If there's no output, just advance idx. */ ! void ! next_glyph () { if (have_output) { ! if (out_info != info || out_len != idx) ! { if (unlikely (!make_room_for (1, 1))) return; out_info[out_len] = info[idx]; } out_len++; } idx++; } + /* Copies n glyphs at idx to output and advance idx. + * If there's no output, just advance idx. */ + void + next_glyphs (unsigned int n) + { + if (have_output) + { + if (out_info != info || out_len != idx) + { + if (unlikely (!make_room_for (n, n))) return; + memmove (out_info + out_len, info + idx, n * sizeof (out_info[0])); + } + out_len += n; + } + idx += n; + } /* Advance idx without copying to output. */ ! void skip_glyph () { idx++; } ! void reset_masks (hb_mask_t mask) { for (unsigned int j = 0; j < len; j++) info[j].mask = mask; } ! void add_masks (hb_mask_t mask) { for (unsigned int j = 0; j < len; j++) info[j].mask |= mask; } HB_INTERNAL void set_masks (hb_mask_t value, hb_mask_t mask, unsigned int cluster_start, unsigned int cluster_end); ! void merge_clusters (unsigned int start, unsigned int end) { if (end - start < 2) return; merge_clusters_impl (start, end); } HB_INTERNAL void merge_clusters_impl (unsigned int start, unsigned int end); HB_INTERNAL void merge_out_clusters (unsigned int start, unsigned int end); /* Merge clusters for deleting current glyph, and skip it. */ ! HB_INTERNAL void delete_glyph (); ! void unsafe_to_break (unsigned int start, unsigned int end) { if (end - start < 2) return; unsafe_to_break_impl (start, end);
*** 273,302 **** HB_INTERNAL void unsafe_to_break_impl (unsigned int start, unsigned int end); HB_INTERNAL void unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end); /* Internal methods */ HB_INTERNAL bool enlarge (unsigned int size); ! inline bool ensure (unsigned int size) { return likely (!size || size < allocated) ? true : enlarge (size); } ! inline bool ensure_inplace (unsigned int size) { return likely (!size || size < allocated); } HB_INTERNAL bool make_room_for (unsigned int num_in, unsigned int num_out); HB_INTERNAL bool shift_forward (unsigned int count); typedef long scratch_buffer_t; HB_INTERNAL scratch_buffer_t *get_scratch_buffer (unsigned int *size); ! inline void clear_context (unsigned int side) { context_len[side] = 0; } HB_INTERNAL void sort (unsigned int start, unsigned int end, int(*compar)(const hb_glyph_info_t *, const hb_glyph_info_t *)); ! inline bool messaging (void) { return unlikely (message_func); } ! inline bool message (hb_font_t *font, const char *fmt, ...) HB_PRINTF_FUNC(3, 4) { if (!messaging ()) return true; va_list ap; va_start (ap, fmt); --- 325,356 ---- HB_INTERNAL void unsafe_to_break_impl (unsigned int start, unsigned int end); HB_INTERNAL void unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end); /* Internal methods */ + HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */ + HB_INTERNAL bool enlarge (unsigned int size); ! bool ensure (unsigned int size) { return likely (!size || size < allocated) ? true : enlarge (size); } ! bool ensure_inplace (unsigned int size) { return likely (!size || size < allocated); } HB_INTERNAL bool make_room_for (unsigned int num_in, unsigned int num_out); HB_INTERNAL bool shift_forward (unsigned int count); typedef long scratch_buffer_t; HB_INTERNAL scratch_buffer_t *get_scratch_buffer (unsigned int *size); ! void clear_context (unsigned int side) { context_len[side] = 0; } HB_INTERNAL void sort (unsigned int start, unsigned int end, int(*compar)(const hb_glyph_info_t *, const hb_glyph_info_t *)); ! bool messaging () { return unlikely (message_func); } ! bool message (hb_font_t *font, const char *fmt, ...) HB_PRINTF_FUNC(3, 4) { if (!messaging ()) return true; va_list ap; va_start (ap, fmt);
*** 304,314 **** va_end (ap); return ret; } HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0); ! static inline void set_cluster (hb_glyph_info_t &inf, unsigned int cluster, unsigned int mask = 0) { if (inf.cluster != cluster) { if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK) --- 358,368 ---- va_end (ap); return ret; } HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0); ! static void set_cluster (hb_glyph_info_t &inf, unsigned int cluster, unsigned int mask = 0) { if (inf.cluster != cluster) { if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
*** 317,336 **** inf.mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK; } inf.cluster = cluster; } ! inline int _unsafe_to_break_find_min_cluster (const hb_glyph_info_t *infos, unsigned int start, unsigned int end, unsigned int cluster) const { for (unsigned int i = start; i < end; i++) cluster = MIN<unsigned int> (cluster, infos[i].cluster); return cluster; } ! inline void _unsafe_to_break_set_mask (hb_glyph_info_t *infos, unsigned int start, unsigned int end, unsigned int cluster) { for (unsigned int i = start; i < end; i++) --- 371,390 ---- inf.mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK; } inf.cluster = cluster; } ! int _unsafe_to_break_find_min_cluster (const hb_glyph_info_t *infos, unsigned int start, unsigned int end, unsigned int cluster) const { for (unsigned int i = start; i < end; i++) cluster = MIN<unsigned int> (cluster, infos[i].cluster); return cluster; } ! void _unsafe_to_break_set_mask (hb_glyph_info_t *infos, unsigned int start, unsigned int end, unsigned int cluster) { for (unsigned int i = start; i < end; i++)
*** 339,360 **** scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK; infos[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK; } } ! inline void ! unsafe_to_break_all (void) ! { ! unsafe_to_break_impl (0, len); ! } ! inline void ! safe_to_break_all (void) { for (unsigned int i = 0; i < len; i++) info[i].mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK; } }; /* Loop over clusters. Duplicated in foreach_syllable(). */ #define foreach_cluster(buffer, start, end) \ for (unsigned int \ --- 393,411 ---- scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK; infos[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK; } } ! void unsafe_to_break_all () ! { unsafe_to_break_impl (0, len); } ! void safe_to_break_all () { for (unsigned int i = 0; i < len; i++) info[i].mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK; } }; + DECLARE_NULL_INSTANCE (hb_buffer_t); /* Loop over clusters. Duplicated in foreach_syllable(). */ #define foreach_cluster(buffer, start, end) \ for (unsigned int \
*** 383,388 **** #define HB_BUFFER_ALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, allocate_var, var ()) #define HB_BUFFER_DEALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var ()) #define HB_BUFFER_ASSERT_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, assert_var, var ()) ! #endif /* HB_BUFFER_PRIVATE_HH */ --- 434,439 ---- #define HB_BUFFER_ALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, allocate_var, var ()) #define HB_BUFFER_DEALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var ()) #define HB_BUFFER_ASSERT_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, assert_var, var ()) ! #endif /* HB_BUFFER_HH */
< prev index next >