1
1
mirror of https://github.com/Kozea/WeasyPrint.git synced 2024-10-05 00:21:15 +03:00

Get fonts data

This commit is contained in:
Guillaume Ayoub 2020-04-26 00:48:38 +02:00
parent bbc1355df6
commit 67b104d8ab

View File

@ -19,6 +19,15 @@ CAIRO_DUMMY_CONTEXT = cairo.Context(cairo.PDFSurface(None, 1, 1))
ffi = cffi.FFI()
ffi.cdef('''
// HarfBuzz
typedef ... hb_font_t;
typedef ... hb_face_t;
typedef ... hb_blob_t;
hb_face_t * hb_font_get_face (hb_font_t *font);
hb_blob_t * hb_face_reference_blob (hb_face_t *face);
const char * hb_blob_get_data (hb_blob_t *blob, unsigned int *length);
// Cairo
typedef enum {
@ -48,6 +57,9 @@ ffi.cdef('''
typedef ... PangoLayoutIter;
typedef ... PangoAttrList;
typedef ... PangoAttrClass;
typedef ... PangoFont;
typedef guint PangoGlyph;
typedef guint PangoGlyphUnit;
typedef enum {
PANGO_STYLE_NORMAL,
@ -98,6 +110,11 @@ ffi.cdef('''
PANGO_ELLIPSIZE_END
} PangoEllipsizeMode;
typedef struct GSList {
gpointer data;
struct GSList *next;
} GSList;
typedef struct {
const PangoAttrClass *klass;
guint start_index;
@ -108,6 +125,7 @@ ffi.cdef('''
PangoLayout *layout;
gint start_index;
gint length;
GSList *runs;
/* ... */
} PangoLayoutLine;
@ -134,6 +152,48 @@ ffi.cdef('''
guint is_word_boundary : 1;
} PangoLogAttr;
typedef struct {
void *shape_engine;
void *lang_engine;
PangoFont *font;
guint level;
guint gravity;
guint flags;
guint script;
PangoLanguage *language;
GSList *extra_attrs;
} PangoAnalysis;
typedef struct {
gint offset;
gint length;
gint num_chars;
PangoAnalysis analysis;
} PangoItem;
typedef struct {
PangoGlyphUnit width;
PangoGlyphUnit x_offset;
PangoGlyphUnit y_offset;
} PangoGlyphGeometry;
typedef struct {
PangoGlyph glyph;
PangoGlyphGeometry geometry;
/* ... */
} PangoGlyphInfo;
typedef struct {
gint num_glyphs;
PangoGlyphInfo *glyphs;
gint *log_clusters;
} PangoGlyphString;
typedef struct {
PangoItem *item;
PangoGlyphString *glyphs;
} PangoGlyphItem;
int pango_version (void);
double pango_units_to_double (int i);
@ -141,6 +201,7 @@ ffi.cdef('''
void g_object_unref (gpointer object);
void g_type_init (void);
PangoLayout * pango_layout_new (PangoContext *context);
void pango_layout_set_width (PangoLayout *layout, int width);
PangoAttrList * pango_layout_get_attributes(PangoLayout *layout);
void pango_layout_set_attributes (
@ -157,6 +218,8 @@ ffi.cdef('''
PangoLayout *layout, gboolean setting);
int pango_layout_get_baseline (PangoLayout *layout);
hb_font_t * pango_font_get_hb_font (PangoFont *font);
PangoLayoutIter * pango_layout_get_iter (PangoLayout *layout);
void pango_layout_iter_free (PangoLayoutIter *iter);
gboolean pango_layout_iter_next_line (PangoLayoutIter *iter);
@ -259,6 +322,8 @@ pango = dlopen(ffi, 'pango-1.0', 'libpango-1.0-0', 'libpango-1.0.so',
'libpango-1.0.dylib')
pangocairo = dlopen(ffi, 'pangocairo-1.0', 'libpangocairo-1.0-0',
'libpangocairo-1.0.so', 'libpangocairo-1.0.dylib')
harfbuzz = dlopen(ffi, 'harfbuzz', 'libharfbuzz',
'libharfbuzz.so', 'libharfbuzz.dylib')
gobject.g_type_init()
@ -1229,6 +1294,20 @@ def show_first_line(context, textbox, text_overflow):
textbox.pango_layout.layout, pango.PANGO_ELLIPSIZE_END)
first_line, _ = textbox.pango_layout.get_first_line()
length = ffi.new('unsigned int *')
run = first_line.runs[0]
while True:
glyph_item = ffi.cast('PangoGlyphItem *', run.data)
hb_font = pango.pango_font_get_hb_font(glyph_item.item.analysis.font)
data = harfbuzz.hb_blob_get_data(harfbuzz.hb_face_reference_blob(
harfbuzz.hb_font_get_face(hb_font)), length)
font = ffi.unpack(data, int(length[0]))
if run.next == ffi.NULL:
break
else:
run = run.next
ffi.release(length)
# context = ffi.cast('cairo_t *', context._pointer)
# pangocairo.pango_cairo_show_layout_line(context, first_line)