[ft/draw] Implement hb-draw for hb-ft
This commit is contained in:
parent
370bec938b
commit
6d5b998f25
82
src/hb-ft.cc
82
src/hb-ft.cc
|
@ -33,12 +33,14 @@
|
||||||
|
|
||||||
#include "hb-ft.h"
|
#include "hb-ft.h"
|
||||||
|
|
||||||
|
#include "hb-draw.hh"
|
||||||
#include "hb-font.hh"
|
#include "hb-font.hh"
|
||||||
#include "hb-machinery.hh"
|
#include "hb-machinery.hh"
|
||||||
#include "hb-cache.hh"
|
#include "hb-cache.hh"
|
||||||
|
|
||||||
#include FT_ADVANCES_H
|
#include FT_ADVANCES_H
|
||||||
#include FT_MULTIPLE_MASTERS_H
|
#include FT_MULTIPLE_MASTERS_H
|
||||||
|
#include FT_OUTLINE_H
|
||||||
#include FT_TRUETYPE_TABLES_H
|
#include FT_TRUETYPE_TABLES_H
|
||||||
|
|
||||||
|
|
||||||
|
@ -565,6 +567,82 @@ hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef HB_NO_DRAW
|
||||||
|
|
||||||
|
static int
|
||||||
|
_hb_ft_move_to (const FT_Vector *to,
|
||||||
|
hb_draw_session_t *drawing)
|
||||||
|
{
|
||||||
|
drawing->move_to (to->x, to->y);
|
||||||
|
return FT_Err_Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
_hb_ft_line_to (const FT_Vector *to,
|
||||||
|
hb_draw_session_t *drawing)
|
||||||
|
{
|
||||||
|
drawing->line_to (to->x, to->y);
|
||||||
|
return FT_Err_Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
_hb_ft_conic_to (const FT_Vector *control,
|
||||||
|
const FT_Vector *to,
|
||||||
|
hb_draw_session_t *drawing)
|
||||||
|
{
|
||||||
|
drawing->quadratic_to (control->x, control->y,
|
||||||
|
to->x, to->y);
|
||||||
|
return FT_Err_Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
_hb_ft_cubic_to (const FT_Vector *control1,
|
||||||
|
const FT_Vector *control2,
|
||||||
|
const FT_Vector *to,
|
||||||
|
hb_draw_session_t *drawing)
|
||||||
|
{
|
||||||
|
drawing->cubic_to (control1->x, control1->y,
|
||||||
|
control2->x, control2->y,
|
||||||
|
to->x, to->y);
|
||||||
|
return FT_Err_Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
hb_ft_get_glyph_shape (hb_font_t *font HB_UNUSED,
|
||||||
|
void *font_data,
|
||||||
|
hb_codepoint_t glyph,
|
||||||
|
hb_draw_funcs_t *draw_funcs, void *draw_data,
|
||||||
|
void *user_data HB_UNUSED)
|
||||||
|
{
|
||||||
|
const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
|
||||||
|
hb_lock_t lock (ft_font->lock);
|
||||||
|
FT_Face ft_face = ft_font->ft_face;
|
||||||
|
|
||||||
|
if (unlikely (FT_Load_Glyph (ft_face, glyph,
|
||||||
|
FT_LOAD_NO_BITMAP | ft_font->load_flags)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ft_face->glyph->format != FT_GLYPH_FORMAT_OUTLINE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const FT_Outline_Funcs outline_funcs = {
|
||||||
|
(FT_Outline_MoveToFunc) _hb_ft_move_to,
|
||||||
|
(FT_Outline_LineToFunc) _hb_ft_line_to,
|
||||||
|
(FT_Outline_ConicToFunc) _hb_ft_conic_to,
|
||||||
|
(FT_Outline_CubicToFunc) _hb_ft_cubic_to,
|
||||||
|
0, /* shift */
|
||||||
|
0, /* delta */
|
||||||
|
};
|
||||||
|
|
||||||
|
hb_draw_session_t draw_session (draw_funcs, draw_data);
|
||||||
|
|
||||||
|
FT_Outline_Decompose (&ft_face->glyph->outline,
|
||||||
|
&outline_funcs,
|
||||||
|
&draw_session);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static inline void free_static_ft_funcs ();
|
static inline void free_static_ft_funcs ();
|
||||||
|
|
||||||
static struct hb_ft_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t<hb_ft_font_funcs_lazy_loader_t>
|
static struct hb_ft_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t<hb_ft_font_funcs_lazy_loader_t>
|
||||||
|
@ -596,6 +674,10 @@ static struct hb_ft_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t<hb_ft
|
||||||
hb_font_funcs_set_glyph_name_func (funcs, hb_ft_get_glyph_name, nullptr, nullptr);
|
hb_font_funcs_set_glyph_name_func (funcs, hb_ft_get_glyph_name, nullptr, nullptr);
|
||||||
hb_font_funcs_set_glyph_from_name_func (funcs, hb_ft_get_glyph_from_name, nullptr, nullptr);
|
hb_font_funcs_set_glyph_from_name_func (funcs, hb_ft_get_glyph_from_name, nullptr, nullptr);
|
||||||
|
|
||||||
|
#ifndef HB_NO_DRAW
|
||||||
|
hb_font_funcs_set_glyph_shape_func (funcs, hb_ft_get_glyph_shape, nullptr, nullptr);
|
||||||
|
#endif
|
||||||
|
|
||||||
hb_font_funcs_make_immutable (funcs);
|
hb_font_funcs_make_immutable (funcs);
|
||||||
|
|
||||||
hb_atexit (free_static_ft_funcs);
|
hb_atexit (free_static_ft_funcs);
|
||||||
|
|
Loading…
Reference in New Issue