src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-private.hh
changeset 48274 51772bf1fb0c
parent 47216 71c04702a3d5
child 50352 25db2c8f3cf8
equal deleted inserted replaced
48273:e2065f7505eb 48274:51772bf1fb0c
    43 #endif
    43 #endif
    44 #ifndef HB_BUFFER_MAX_LEN_DEFAULT
    44 #ifndef HB_BUFFER_MAX_LEN_DEFAULT
    45 #define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
    45 #define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
    46 #endif
    46 #endif
    47 
    47 
    48 ASSERT_STATIC (sizeof (hb_glyph_info_t) == 20);
    48 static_assert ((sizeof (hb_glyph_info_t) == 20), "");
    49 ASSERT_STATIC (sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t));
    49 static_assert ((sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t)), "");
    50 
    50 
    51 HB_MARK_AS_FLAG_T (hb_buffer_flags_t);
    51 HB_MARK_AS_FLAG_T (hb_buffer_flags_t);
    52 HB_MARK_AS_FLAG_T (hb_buffer_serialize_flags_t);
    52 HB_MARK_AS_FLAG_T (hb_buffer_serialize_flags_t);
       
    53 HB_MARK_AS_FLAG_T (hb_buffer_diff_flags_t);
    53 
    54 
    54 enum hb_buffer_scratch_flags_t {
    55 enum hb_buffer_scratch_flags_t {
    55   HB_BUFFER_SCRATCH_FLAG_DEFAULT                        = 0x00000000u,
    56   HB_BUFFER_SCRATCH_FLAG_DEFAULT                        = 0x00000000u,
    56   HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII                  = 0x00000001u,
    57   HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII                  = 0x00000001u,
    57   HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES         = 0x00000002u,
    58   HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES         = 0x00000002u,
    58   HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK             = 0x00000004u,
    59   HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK             = 0x00000004u,
    59   HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT            = 0x00000008u,
    60   HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT            = 0x00000008u,
       
    61   HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK            = 0x00000010u,
       
    62 
    60   /* Reserved for complex shapers' internal use. */
    63   /* Reserved for complex shapers' internal use. */
    61   HB_BUFFER_SCRATCH_FLAG_COMPLEX0                       = 0x01000000u,
    64   HB_BUFFER_SCRATCH_FLAG_COMPLEX0                       = 0x01000000u,
    62   HB_BUFFER_SCRATCH_FLAG_COMPLEX1                       = 0x02000000u,
    65   HB_BUFFER_SCRATCH_FLAG_COMPLEX1                       = 0x02000000u,
    63   HB_BUFFER_SCRATCH_FLAG_COMPLEX2                       = 0x04000000u,
    66   HB_BUFFER_SCRATCH_FLAG_COMPLEX2                       = 0x04000000u,
    64   HB_BUFFER_SCRATCH_FLAG_COMPLEX3                       = 0x08000000u,
    67   HB_BUFFER_SCRATCH_FLAG_COMPLEX3                       = 0x08000000u,
   230   inline void add_masks (hb_mask_t mask)
   233   inline void add_masks (hb_mask_t mask)
   231   {
   234   {
   232     for (unsigned int j = 0; j < len; j++)
   235     for (unsigned int j = 0; j < len; j++)
   233       info[j].mask |= mask;
   236       info[j].mask |= mask;
   234   }
   237   }
   235   HB_INTERNAL void set_masks (hb_mask_t value,
   238   HB_INTERNAL void set_masks (hb_mask_t value, hb_mask_t mask,
   236                               hb_mask_t mask,
   239                               unsigned int cluster_start, unsigned int cluster_end);
   237                               unsigned int cluster_start,
   240 
   238                               unsigned int cluster_end);
   241   inline void merge_clusters (unsigned int start, unsigned int end)
   239 
       
   240   HB_INTERNAL void merge_clusters (unsigned int start,
       
   241                                    unsigned int end)
       
   242   {
   242   {
   243     if (end - start < 2)
   243     if (end - start < 2)
   244       return;
   244       return;
   245     merge_clusters_impl (start, end);
   245     merge_clusters_impl (start, end);
   246   }
   246   }
   247   HB_INTERNAL void merge_clusters_impl (unsigned int start,
   247   HB_INTERNAL void merge_clusters_impl (unsigned int start, unsigned int end);
   248                                         unsigned int end);
   248   HB_INTERNAL void merge_out_clusters (unsigned int start, unsigned int end);
   249   HB_INTERNAL void merge_out_clusters (unsigned int start,
       
   250                                        unsigned int end);
       
   251   /* Merge clusters for deleting current glyph, and skip it. */
   249   /* Merge clusters for deleting current glyph, and skip it. */
   252   HB_INTERNAL void delete_glyph (void);
   250   HB_INTERNAL void delete_glyph (void);
       
   251 
       
   252   inline void unsafe_to_break (unsigned int start,
       
   253                                unsigned int end)
       
   254   {
       
   255     if (end - start < 2)
       
   256       return;
       
   257     unsafe_to_break_impl (start, end);
       
   258   }
       
   259   HB_INTERNAL void unsafe_to_break_impl (unsigned int start, unsigned int end);
       
   260   HB_INTERNAL void unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end);
       
   261 
   253 
   262 
   254   /* Internal methods */
   263   /* Internal methods */
   255   HB_INTERNAL bool enlarge (unsigned int size);
   264   HB_INTERNAL bool enlarge (unsigned int size);
   256 
   265 
   257   inline bool ensure (unsigned int size)
   266   inline bool ensure (unsigned int size)
   280     bool ret = message_impl (font, fmt, ap);
   289     bool ret = message_impl (font, fmt, ap);
   281     va_end (ap);
   290     va_end (ap);
   282     return ret;
   291     return ret;
   283   }
   292   }
   284   HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0);
   293   HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0);
       
   294 
       
   295   static inline void
       
   296   set_cluster (hb_glyph_info_t &info, unsigned int cluster, unsigned int mask = 0)
       
   297   {
       
   298     if (info.cluster != cluster)
       
   299     {
       
   300       if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
       
   301         info.mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
       
   302       else
       
   303         info.mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
       
   304     }
       
   305     info.cluster = cluster;
       
   306   }
       
   307 
       
   308   inline int
       
   309   _unsafe_to_break_find_min_cluster (const hb_glyph_info_t *info,
       
   310                                      unsigned int start, unsigned int end,
       
   311                                      unsigned int cluster) const
       
   312   {
       
   313     for (unsigned int i = start; i < end; i++)
       
   314       cluster = MIN<unsigned int> (cluster, info[i].cluster);
       
   315     return cluster;
       
   316   }
       
   317   inline void
       
   318   _unsafe_to_break_set_mask (hb_glyph_info_t *info,
       
   319                              unsigned int start, unsigned int end,
       
   320                              unsigned int cluster)
       
   321   {
       
   322     for (unsigned int i = start; i < end; i++)
       
   323       if (cluster != info[i].cluster)
       
   324       {
       
   325         scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK;
       
   326         info[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
       
   327       }
       
   328   }
       
   329 
       
   330   inline void
       
   331   unsafe_to_break_all (void)
       
   332   {
       
   333     for (unsigned int i = 0; i < len; i++)
       
   334       info[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
       
   335   }
       
   336   inline void
       
   337   safe_to_break_all (void)
       
   338   {
       
   339     for (unsigned int i = 0; i < len; i++)
       
   340       info[i].mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
       
   341   }
   285 };
   342 };
       
   343 
       
   344 
       
   345 /* Loop over clusters. Duplicated in foreach_syllable(). */
       
   346 #define foreach_cluster(buffer, start, end) \
       
   347   for (unsigned int \
       
   348        _count = buffer->len, \
       
   349        start = 0, end = _count ? _next_cluster (buffer, 0) : 0; \
       
   350        start < _count; \
       
   351        start = end, end = _next_cluster (buffer, start))
       
   352 
       
   353 static inline unsigned int
       
   354 _next_cluster (hb_buffer_t *buffer, unsigned int start)
       
   355 {
       
   356   hb_glyph_info_t *info = buffer->info;
       
   357   unsigned int count = buffer->len;
       
   358 
       
   359   unsigned int cluster = info[start].cluster;
       
   360   while (++start < count && cluster == info[start].cluster)
       
   361     ;
       
   362 
       
   363   return start;
       
   364 }
   286 
   365 
   287 
   366 
   288 #define HB_BUFFER_XALLOCATE_VAR(b, func, var) \
   367 #define HB_BUFFER_XALLOCATE_VAR(b, func, var) \
   289   b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
   368   b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
   290            sizeof (b->info[0].var))
   369            sizeof (b->info[0].var))