Add Harfbuzz GC

This commit is contained in:
Joshua Granick
2018-07-06 10:15:03 -07:00
parent 6876a0a9c3
commit ae95a8d934

View File

@@ -1,21 +1,80 @@
#include <hx/CFFIPrime.h>
#include <math/Vector2.h> #include <math/Vector2.h>
#include <system/CFFI.h>
#include <system/CFFIPointer.h> #include <system/CFFIPointer.h>
#include <system/Mutex.h>
#include <text/Font.h>
#include <ft2build.h> #include <ft2build.h>
#include FT_FREETYPE_H #include FT_FREETYPE_H
#include <hb.h> #include <hb.h>
#include <hb-ft.h> #include <hb-ft.h>
#include <map> #include <map>
#include <text/Font.h>
namespace lime { namespace lime {
struct HBGlyphInfo {
int codepoint;
int mask;
int cluster;
};
struct HBGlyphPosition {
int xAdvance;
int yAdvance;
int xOffset;
int yOffset;
};
void gc_hb_blob (value handle) {
hb_blob_destroy ((hb_blob_t*)val_data (handle));
val_gc (handle, 0);
}
void gc_hb_buffer (value handle) {
hb_buffer_destroy ((hb_buffer_t*)val_data (handle));
val_gc (handle, 0);
}
void gc_hb_face (value handle) {
hb_face_destroy ((hb_face_t*)val_data (handle));
val_gc (handle, 0);
}
void gc_hb_font (value handle) {
hb_font_destroy ((hb_font_t*)val_data (handle));
val_gc (handle, 0);
}
void gc_hb_set (value handle) {
hb_set_destroy ((hb_set_t*)val_data (handle));
val_gc (handle, 0);
}
value lime_hb_blob_create (double data, int length, int memoryMode) { value lime_hb_blob_create (double data, int length, int memoryMode) {
hb_blob_t* blob = hb_blob_create ((const char*)(uintptr_t)data, length, (hb_memory_mode_t)memoryMode, 0, 0); hb_blob_t* blob = hb_blob_create ((const char*)(uintptr_t)data, length, (hb_memory_mode_t)memoryMode, 0, 0);
return CFFIPointer (blob); return CFFIPointer (blob, gc_hb_blob);
} }
@@ -23,7 +82,7 @@ namespace lime {
value lime_hb_blob_create_sub_blob (value parent, int offset, int length) { value lime_hb_blob_create_sub_blob (value parent, int offset, int length) {
hb_blob_t* blob = hb_blob_create_sub_blob ((hb_blob_t*)val_data (parent), offset, length); hb_blob_t* blob = hb_blob_create_sub_blob ((hb_blob_t*)val_data (parent), offset, length);
return CFFIPointer (blob); return CFFIPointer (blob, gc_hb_blob);
} }
@@ -47,7 +106,7 @@ namespace lime {
value lime_hb_blob_get_empty () { value lime_hb_blob_get_empty () {
hb_blob_t* blob = hb_blob_get_empty (); hb_blob_t* blob = hb_blob_get_empty ();
return CFFIPointer (blob); return CFFIPointer (blob, gc_hb_blob);
} }
@@ -125,7 +184,7 @@ namespace lime {
value lime_hb_buffer_create () { value lime_hb_buffer_create () {
hb_buffer_t* buffer = hb_buffer_create (); hb_buffer_t* buffer = hb_buffer_create ();
return CFFIPointer (buffer); return CFFIPointer (buffer, gc_hb_buffer);
} }
@@ -154,7 +213,7 @@ namespace lime {
value lime_hb_buffer_get_empty () { value lime_hb_buffer_get_empty () {
hb_buffer_t* buffer = hb_buffer_get_empty (); hb_buffer_t* buffer = hb_buffer_get_empty ();
return CFFIPointer (buffer); return CFFIPointer (buffer, gc_hb_buffer);
} }
@@ -166,15 +225,6 @@ namespace lime {
} }
struct HBGlyphInfo {
int codepoint;
int mask;
int cluster;
};
value lime_hb_buffer_get_glyph_infos (value buffer, value bytes) { value lime_hb_buffer_get_glyph_infos (value buffer, value bytes) {
unsigned int length = 0; unsigned int length = 0;
@@ -206,16 +256,6 @@ namespace lime {
} }
struct HBGlyphPosition {
int xAdvance;
int yAdvance;
int xOffset;
int yOffset;
};
value lime_hb_buffer_get_glyph_positions (value buffer, value bytes) { value lime_hb_buffer_get_glyph_positions (value buffer, value bytes) {
unsigned int length = 0; unsigned int length = 0;
@@ -439,7 +479,7 @@ namespace lime {
value lime_hb_face_create (value blob, int index) { value lime_hb_face_create (value blob, int index) {
hb_face_t* face = hb_face_create ((hb_blob_t*)val_data (blob), index); hb_face_t* face = hb_face_create ((hb_blob_t*)val_data (blob), index);
return CFFIPointer (face); return CFFIPointer (face, gc_hb_face);
} }
@@ -447,7 +487,7 @@ namespace lime {
value lime_hb_face_get_empty () { value lime_hb_face_get_empty () {
hb_face_t* face = hb_face_get_empty (); hb_face_t* face = hb_face_get_empty ();
return CFFIPointer (face); return CFFIPointer (face, gc_hb_face);
} }
@@ -490,7 +530,9 @@ namespace lime {
value lime_hb_face_reference_blob (value face) { value lime_hb_face_reference_blob (value face) {
hb_blob_t* blob = hb_face_reference_blob ((hb_face_t*)val_data (face)); hb_blob_t* blob = hb_face_reference_blob ((hb_face_t*)val_data (face));
return CFFIPointer (blob);
// TODO: Should this be managed differently?
return CFFIPointer (blob, gc_hb_blob);
} }
@@ -498,7 +540,7 @@ namespace lime {
value lime_hb_face_reference_table (value face, int tag) { value lime_hb_face_reference_table (value face, int tag) {
hb_blob_t* blob = hb_face_reference_table ((hb_face_t*)val_data (face), (hb_tag_t)tag); hb_blob_t* blob = hb_face_reference_table ((hb_face_t*)val_data (face), (hb_tag_t)tag);
return CFFIPointer (blob); return CFFIPointer (blob, gc_hb_blob);
} }
@@ -562,7 +604,7 @@ namespace lime {
value lime_hb_font_create (value face) { value lime_hb_font_create (value face) {
hb_font_t* font = hb_font_create ((hb_face_t*)val_data (face)); hb_font_t* font = hb_font_create ((hb_face_t*)val_data (face));
return CFFIPointer (font); return CFFIPointer (font, gc_hb_font);
} }
@@ -570,7 +612,7 @@ namespace lime {
value lime_hb_font_create_sub_font (value parent) { value lime_hb_font_create_sub_font (value parent) {
hb_font_t* font = hb_font_create_sub_font ((hb_font_t*)val_data (parent)); hb_font_t* font = hb_font_create_sub_font ((hb_font_t*)val_data (parent));
return CFFIPointer (font); return CFFIPointer (font, gc_hb_font);
} }
@@ -578,7 +620,7 @@ namespace lime {
value lime_hb_font_get_empty () { value lime_hb_font_get_empty () {
hb_font_t* font = hb_font_get_empty (); hb_font_t* font = hb_font_get_empty ();
return CFFIPointer (font); return CFFIPointer (font, gc_hb_font);
} }
@@ -586,7 +628,7 @@ namespace lime {
value lime_hb_font_get_face (value font) { value lime_hb_font_get_face (value font) {
hb_face_t* face = hb_font_get_face ((hb_font_t*)val_data (font)); hb_face_t* face = hb_font_get_face ((hb_font_t*)val_data (font));
return CFFIPointer (face); return CFFIPointer (face, gc_hb_face);
} }
@@ -627,7 +669,7 @@ namespace lime {
value lime_hb_font_get_parent (value font) { value lime_hb_font_get_parent (value font) {
hb_font_t* parent = hb_font_get_parent ((hb_font_t*)val_data (font)); hb_font_t* parent = hb_font_get_parent ((hb_font_t*)val_data (font));
return CFFIPointer (parent); return CFFIPointer (parent, gc_hb_font);
} }
@@ -719,7 +761,7 @@ namespace lime {
Font* _font = (Font*)val_data (font); Font* _font = (Font*)val_data (font);
hb_font_t* __font = hb_ft_font_create ((FT_Face)_font->face, NULL); hb_font_t* __font = hb_ft_font_create ((FT_Face)_font->face, NULL);
return CFFIPointer (__font); return CFFIPointer (__font, gc_hb_font);
} }
@@ -728,7 +770,7 @@ namespace lime {
Font* _font = (Font*)val_data (font); Font* _font = (Font*)val_data (font);
hb_font_t* __font = hb_ft_font_create_referenced ((FT_Face)_font->face); hb_font_t* __font = hb_ft_font_create_referenced ((FT_Face)_font->face);
return CFFIPointer (__font); return CFFIPointer (__font, gc_hb_font);
} }
@@ -817,7 +859,7 @@ namespace lime {
value lime_hb_set_create () { value lime_hb_set_create () {
hb_set_t* set = hb_set_create (); hb_set_t* set = hb_set_create ();
return CFFIPointer (set); return CFFIPointer (set, gc_hb_set);
} }
@@ -839,7 +881,7 @@ namespace lime {
value lime_hb_set_get_empty () { value lime_hb_set_get_empty () {
hb_set_t* set = hb_set_get_empty (); hb_set_t* set = hb_set_get_empty ();
return CFFIPointer (set); return CFFIPointer (set, gc_hb_set);
} }