Implement nil font functions
This commit is contained in:
parent
8fb3d1aa4e
commit
7951279b4a
1
TODO
1
TODO
|
@ -1,6 +1,7 @@
|
||||||
- cmap14 support in get_glyph callback
|
- cmap14 support in get_glyph callback
|
||||||
- Use size_t in sanitize?
|
- Use size_t in sanitize?
|
||||||
- Buffer error handling?
|
- Buffer error handling?
|
||||||
|
- Better define HB_INTERNAL
|
||||||
|
|
||||||
hb-ot:
|
hb-ot:
|
||||||
- Fix ot query APIs
|
- Fix ot query APIs
|
||||||
|
|
|
@ -44,10 +44,10 @@ struct _hb_font_funcs_t {
|
||||||
|
|
||||||
hb_bool_t immutable;
|
hb_bool_t immutable;
|
||||||
|
|
||||||
hb_font_get_glyph_func_t glyph_func;
|
hb_font_get_glyph_func_t get_glyph;
|
||||||
hb_font_get_contour_point_func_t contour_point_func;
|
hb_font_get_contour_point_func_t get_contour_point;
|
||||||
hb_font_get_glyph_metrics_func_t glyph_metrics_func;
|
hb_font_get_glyph_metrics_func_t get_glyph_metrics;
|
||||||
hb_font_get_kerning_func_t kerning_func;
|
hb_font_get_kerning_func_t get_kerning;
|
||||||
};
|
};
|
||||||
|
|
||||||
HB_INTERNAL hb_font_funcs_t
|
HB_INTERNAL hb_font_funcs_t
|
||||||
|
|
|
@ -32,19 +32,43 @@
|
||||||
|
|
||||||
#include "hb-ot-layout-private.h"
|
#include "hb-ot-layout-private.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hb_font_funcs_t
|
* hb_font_funcs_t
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static hb_codepoint_t
|
||||||
|
hb_font_get_glyph_nil (hb_font_t *font, hb_face_t *face, const void *user_data,
|
||||||
|
hb_codepoint_t unicode, hb_codepoint_t variant_selector)
|
||||||
|
{ return unicode; }
|
||||||
|
|
||||||
|
static hb_bool_t
|
||||||
|
hb_font_get_contour_point_nil (hb_font_t *font, hb_face_t *face, const void *user_data,
|
||||||
|
unsigned int point_index,
|
||||||
|
hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y)
|
||||||
|
{ return false; }
|
||||||
|
|
||||||
|
static void
|
||||||
|
hb_font_get_glyph_metrics_nil (hb_font_t *font, hb_face_t *face, const void *user_data,
|
||||||
|
hb_codepoint_t glyph, hb_glyph_metrics_t *metrics)
|
||||||
|
{ memset (metrics, 0, sizeof (*metrics)); }
|
||||||
|
|
||||||
|
static hb_position_t
|
||||||
|
hb_font_get_kerning_nil (hb_font_t *font, hb_face_t *face, const void *user_data,
|
||||||
|
hb_codepoint_t first_glyph, hb_codepoint_t second_glyph)
|
||||||
|
{ return 0; }
|
||||||
|
|
||||||
hb_font_funcs_t _hb_font_funcs_nil = {
|
hb_font_funcs_t _hb_font_funcs_nil = {
|
||||||
HB_REFERENCE_COUNT_INVALID, /* ref_count */
|
HB_REFERENCE_COUNT_INVALID, /* ref_count */
|
||||||
|
|
||||||
TRUE, /* immutable */
|
TRUE, /* immutable */
|
||||||
|
|
||||||
NULL, /* glyph_func */
|
hb_font_get_glyph_nil,
|
||||||
NULL, /* contour_point_func */
|
hb_font_get_contour_point_nil,
|
||||||
NULL, /* glyph_metrics_func */
|
hb_font_get_glyph_metrics_nil,
|
||||||
NULL /* kerning_func */
|
hb_font_get_kerning_nil
|
||||||
};
|
};
|
||||||
|
|
||||||
hb_font_funcs_t *
|
hb_font_funcs_t *
|
||||||
|
@ -105,6 +129,46 @@ hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
|
||||||
|
hb_font_get_glyph_func_t glyph_func)
|
||||||
|
{
|
||||||
|
if (ffuncs->immutable)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ffuncs->get_glyph = glyph_func ? glyph_func : hb_font_get_glyph_nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hb_font_funcs_set_contour_point_func (hb_font_funcs_t *ffuncs,
|
||||||
|
hb_font_get_contour_point_func_t contour_point_func)
|
||||||
|
{
|
||||||
|
if (ffuncs->immutable)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ffuncs->get_contour_point = contour_point_func ? contour_point_func : hb_font_get_contour_point_nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hb_font_funcs_set_glyph_metrics_func (hb_font_funcs_t *ffuncs,
|
||||||
|
hb_font_get_glyph_metrics_func_t glyph_metrics_func)
|
||||||
|
{
|
||||||
|
if (ffuncs->immutable)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ffuncs->get_glyph_metrics = glyph_metrics_func ? glyph_metrics_func : hb_font_get_glyph_metrics_nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hb_font_funcs_set_kerning_func (hb_font_funcs_t *ffuncs,
|
||||||
|
hb_font_get_kerning_func_t kerning_func)
|
||||||
|
{
|
||||||
|
if (ffuncs->immutable)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ffuncs->get_kerning = kerning_func ? kerning_func : hb_font_get_kerning_nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hb_face_t
|
* hb_face_t
|
||||||
|
|
|
@ -92,16 +92,15 @@ hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs);
|
||||||
|
|
||||||
/* funcs */
|
/* funcs */
|
||||||
|
|
||||||
typedef struct _hb_glyph_metrics_t hb_glyph_metrics_t;
|
typedef struct _hb_glyph_metrics_t
|
||||||
struct _hb_glyph_metrics_t
|
|
||||||
{
|
{
|
||||||
|
hb_position_t x_pos;
|
||||||
|
hb_position_t y_pos;
|
||||||
hb_position_t x_advance;
|
hb_position_t x_advance;
|
||||||
hb_position_t y_advance;
|
hb_position_t y_advance;
|
||||||
hb_position_t x_offset;
|
|
||||||
hb_position_t y_offset;
|
|
||||||
hb_position_t width;
|
hb_position_t width;
|
||||||
hb_position_t height;
|
hb_position_t height;
|
||||||
};
|
} hb_glyph_metrics_t;
|
||||||
|
|
||||||
typedef hb_codepoint_t (*hb_font_get_glyph_func_t) (hb_font_t *font, hb_face_t *face, const void *user_data,
|
typedef hb_codepoint_t (*hb_font_get_glyph_func_t) (hb_font_t *font, hb_face_t *face, const void *user_data,
|
||||||
hb_codepoint_t unicode, hb_codepoint_t variant_selector);
|
hb_codepoint_t unicode, hb_codepoint_t variant_selector);
|
||||||
|
|
|
@ -176,7 +176,8 @@ struct AnchorFormat2
|
||||||
inline void get_anchor (hb_ot_layout_context_t *context, hb_codepoint_t glyph_id,
|
inline void get_anchor (hb_ot_layout_context_t *context, hb_codepoint_t glyph_id,
|
||||||
hb_position_t *x, hb_position_t *y) const
|
hb_position_t *x, hb_position_t *y) const
|
||||||
{
|
{
|
||||||
/* TODO Contour */
|
/* TODO Contour
|
||||||
|
* NOTE only adjust directions with nonzero ppem */
|
||||||
*x = _hb_16dot16_mul_trunc (context->font->x_scale, xCoordinate);
|
*x = _hb_16dot16_mul_trunc (context->font->x_scale, xCoordinate);
|
||||||
*y = _hb_16dot16_mul_trunc (context->font->y_scale, yCoordinate);
|
*y = _hb_16dot16_mul_trunc (context->font->y_scale, yCoordinate);
|
||||||
}
|
}
|
||||||
|
@ -856,12 +857,12 @@ struct CursivePosFormat1
|
||||||
if (buffer->direction == HB_DIRECTION_RTL)
|
if (buffer->direction == HB_DIRECTION_RTL)
|
||||||
{
|
{
|
||||||
POSITION (buffer->in_pos)->x_advance = entry_x - gpi->anchor_x;
|
POSITION (buffer->in_pos)->x_advance = entry_x - gpi->anchor_x;
|
||||||
POSITION (buffer->in_pos)->new_advance = TRUE;
|
POSITION (buffer->in_pos)->new_advance = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
POSITION (last_pos)->x_advance = gpi->anchor_x - entry_x;
|
POSITION (last_pos)->x_advance = gpi->anchor_x - entry_x;
|
||||||
POSITION (last_pos)->new_advance = TRUE;
|
POSITION (last_pos)->new_advance = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lookup_flag & LookupFlag::RightToLeft)
|
if (lookup_flag & LookupFlag::RightToLeft)
|
||||||
|
|
|
@ -372,7 +372,7 @@ struct Ligature
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(property & HB_OT_LAYOUT_GLYPH_CLASS_MARK))
|
if (!(property & HB_OT_LAYOUT_GLYPH_CLASS_MARK))
|
||||||
is_mark = FALSE;
|
is_mark = false;
|
||||||
|
|
||||||
if (HB_LIKELY (IN_GLYPH (j) != component[i]))
|
if (HB_LIKELY (IN_GLYPH (j) != component[i]))
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -151,15 +151,15 @@ typedef int hb_mutex_t;
|
||||||
ASSERT_STATIC (sizeof (_type) == (_size) + VAR * sizeof (_var_type1) + VAR * sizeof (_var_type2))
|
ASSERT_STATIC (sizeof (_type) == (_size) + VAR * sizeof (_var_type1) + VAR * sizeof (_var_type2))
|
||||||
|
|
||||||
#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
|
#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
|
||||||
#define _HB_BOOLEAN_EXPR(expr) \
|
#define _HB_BOOLEAN_EXPR(expr) \
|
||||||
__extension__ ({ \
|
__extension__ ({ \
|
||||||
int _cairo_boolean_var_; \
|
int _hb_boolean_var_; \
|
||||||
if (expr) \
|
if (expr) \
|
||||||
_cairo_boolean_var_ = 1; \
|
_hb_boolean_var_ = 1; \
|
||||||
else \
|
else \
|
||||||
_cairo_boolean_var_ = 0; \
|
_hb_boolean_var_ = 0; \
|
||||||
_cairo_boolean_var_; \
|
_hb_boolean_var_; \
|
||||||
})
|
})
|
||||||
#define HB_LIKELY(expr) (__builtin_expect (_HB_BOOLEAN_EXPR(expr), 1))
|
#define HB_LIKELY(expr) (__builtin_expect (_HB_BOOLEAN_EXPR(expr), 1))
|
||||||
#define HB_UNLIKELY(expr) (__builtin_expect (_HB_BOOLEAN_EXPR(expr), 0))
|
#define HB_UNLIKELY(expr) (__builtin_expect (_HB_BOOLEAN_EXPR(expr), 0))
|
||||||
#else
|
#else
|
||||||
|
|
Loading…
Reference in New Issue