[cairo] Document get_glyphs() arguments as inout
This commit is contained in:
parent
3be9fa07f6
commit
b1de87b7f1
|
@ -763,16 +763,39 @@ hb_cairo_font_face_get_scale_factor (cairo_font_face_t *font_face)
|
||||||
* @utf8: (nullable): the text that was shaped in @buffer
|
* @utf8: (nullable): the text that was shaped in @buffer
|
||||||
* @utf8_len: the length of @utf8 in bytes
|
* @utf8_len: the length of @utf8 in bytes
|
||||||
* @glyphs: (out): return location for an array of #cairo_glyph_t
|
* @glyphs: (out): return location for an array of #cairo_glyph_t
|
||||||
* @num_glyphs: (out): return location for the length of @glyphs
|
* @num_glyphs: (inout): return location for the length of @glyphs
|
||||||
* @clusters: (out) (nullable): return location for an array of cluster positions
|
* @clusters: (out) (nullable): return location for an array of cluster positions
|
||||||
* @num_clusters: (out) (nullable): return location for the length of @clusters
|
* @num_clusters: (inout) (nullable): return location for the length of @clusters
|
||||||
* @cluster_flags: (out) (nullable): return location for cluster flags
|
* @cluster_flags: (out) (nullable): return location for cluster flags
|
||||||
*
|
*
|
||||||
* Extracts information from @buffer in a form that can be
|
* Extracts information from @buffer in a form that can be
|
||||||
* passed to cairo_show_text_glyphs() or cairo_show_glyphs().
|
* passed to cairo_show_text_glyphs() or cairo_show_glyphs().
|
||||||
* This API is modeled after cairo_scaled_font_text_to_glyphs().
|
* This API is modeled after cairo_scaled_font_text_to_glyphs() and
|
||||||
|
* cairo_user_scaled_font_text_to_glyphs_func_t.
|
||||||
*
|
*
|
||||||
* If cluster information is requested, @utf8 must be provided.
|
* The @num_glyphs argument should be preset to the number of glyph entries available
|
||||||
|
* in the @glyphs buffer. If the @glyphs buffer is %NULL, the value of
|
||||||
|
* @num_glyphs must be zero. If the provided glyph array is too short for
|
||||||
|
* the conversion (or for convenience), a new glyph array may be allocated
|
||||||
|
* using cairo_glyph_allocate() and placed in @glyphs. Upon return,
|
||||||
|
* @num_glyphs should contain the number of generated glyphs. If the value
|
||||||
|
* @glyphs points at has changed after the call, the caller will free the
|
||||||
|
* allocated glyph array using cairo_glyph_free(). The caller will also free
|
||||||
|
* the original value of @glyphs, so this function shouldn't do so.
|
||||||
|
*
|
||||||
|
* If @clusters is not %NULL, then @num_clusters and @cluster_flags
|
||||||
|
* should not be either, and @utf8 must be provided, and cluster
|
||||||
|
* mapping will be computed. The semantics of how
|
||||||
|
* cluster array allocation works is similar to the glyph array. That is,
|
||||||
|
* if @clusters initially points to a non-%NULL value, that array may be used
|
||||||
|
* as a cluster buffer, and @num_clusters points to the number of cluster
|
||||||
|
* entries available there. If the provided cluster array is too short for
|
||||||
|
* the conversion (or for convenience), a new cluster array may be allocated
|
||||||
|
* using cairo_text_cluster_allocate() and placed in @clusters. In this case,
|
||||||
|
* the original value of @clusters will still be freed by the caller. Upon
|
||||||
|
* return, @num_clusters will contain the number of generated clusters.
|
||||||
|
* If the value @clusters points at has changed after the call, the caller
|
||||||
|
* will free the allocated cluster array using cairo_text_cluster_free().
|
||||||
*
|
*
|
||||||
* See hb_cairo_font_face_set_scale_factor() for the details of
|
* See hb_cairo_font_face_set_scale_factor() for the details of
|
||||||
* the @scale_factor argument.
|
* the @scale_factor argument.
|
||||||
|
@ -801,18 +824,22 @@ hb_cairo_glyphs_from_buffer (hb_buffer_t *buffer,
|
||||||
if (utf8 && utf8_len < 0)
|
if (utf8 && utf8_len < 0)
|
||||||
utf8_len = strlen (utf8);
|
utf8_len = strlen (utf8);
|
||||||
|
|
||||||
|
unsigned orig_num_glyphs = *num_glyphs;
|
||||||
*num_glyphs = hb_buffer_get_length (buffer);
|
*num_glyphs = hb_buffer_get_length (buffer);
|
||||||
hb_glyph_info_t *hb_glyph = hb_buffer_get_glyph_infos (buffer, nullptr);
|
hb_glyph_info_t *hb_glyph = hb_buffer_get_glyph_infos (buffer, nullptr);
|
||||||
hb_glyph_position_t *hb_position = hb_buffer_get_glyph_positions (buffer, nullptr);
|
hb_glyph_position_t *hb_position = hb_buffer_get_glyph_positions (buffer, nullptr);
|
||||||
*glyphs = cairo_glyph_allocate (*num_glyphs + 1);
|
if (orig_num_glyphs < *num_glyphs + 1)
|
||||||
|
*glyphs = cairo_glyph_allocate (*num_glyphs + 1);
|
||||||
|
|
||||||
if (clusters)
|
if (clusters)
|
||||||
{
|
{
|
||||||
|
unsigned orig_num_clusters = *num_clusters;
|
||||||
*num_clusters = *num_glyphs ? 1 : 0;
|
*num_clusters = *num_glyphs ? 1 : 0;
|
||||||
for (unsigned int i = 1; i < *num_glyphs; i++)
|
for (unsigned int i = 1; i < *num_glyphs; i++)
|
||||||
if (hb_glyph[i].cluster != hb_glyph[i-1].cluster)
|
if (hb_glyph[i].cluster != hb_glyph[i-1].cluster)
|
||||||
(*num_clusters)++;
|
(*num_clusters)++;
|
||||||
*clusters = cairo_text_cluster_allocate (*num_clusters);
|
if (orig_num_clusters < *num_clusters)
|
||||||
|
*clusters = cairo_text_cluster_allocate (*num_clusters);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*num_glyphs && !*glyphs) ||
|
if ((*num_glyphs && !*glyphs) ||
|
||||||
|
|
|
@ -604,6 +604,8 @@ helper_cairo_line_from_buffer (helper_cairo_line_t *l,
|
||||||
int scale_bits,
|
int scale_bits,
|
||||||
hb_bool_t utf8_clusters)
|
hb_bool_t utf8_clusters)
|
||||||
{
|
{
|
||||||
|
memset (l, 0, sizeof (*l));
|
||||||
|
|
||||||
l->utf8 = text ? g_strndup (text, text_len) : nullptr;
|
l->utf8 = text ? g_strndup (text, text_len) : nullptr;
|
||||||
l->utf8_len = text ? text_len : 0;
|
l->utf8_len = text ? text_len : 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue