diff --git a/src/hb-font-private.hh b/src/hb-font-private.hh index f60ce975b..8821ac141 100644 --- a/src/hb-font-private.hh +++ b/src/hb-font-private.hh @@ -81,6 +81,8 @@ struct _hb_font_funcs_t { struct _hb_face_t { hb_object_header_t header; + hb_bool_t immutable; + hb_get_table_func_t get_table; void *user_data; hb_destroy_func_t destroy; diff --git a/src/hb-font.cc b/src/hb-font.cc index 65f634f42..cff852706 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -320,6 +320,8 @@ hb_font_get_kerning (hb_font_t *font, static hb_face_t _hb_face_nil = { HB_OBJECT_HEADER_STATIC, + TRUE, /* immutable */ + NULL, /* get_table */ NULL, /* user_data */ NULL, /* destroy */ @@ -456,6 +458,21 @@ hb_face_get_user_data (hb_face_t *face, return hb_object_get_user_data (face, key); } +void +hb_face_make_immutable (hb_face_t *face) +{ + if (hb_object_is_inert (face)) + return; + + face->immutable = true; +} + +hb_bool_t +hb_face_is_immutable (hb_face_t *face) +{ + return face->immutable; +} + hb_blob_t * hb_face_reference_table (hb_face_t *face, @@ -515,6 +532,7 @@ hb_font_create (hb_face_t *face) if (!(font = hb_object_create ())) return &_hb_font_nil; + hb_face_make_immutable (face); font->face = hb_face_reference (face); font->klass = &_hb_font_funcs_nil; diff --git a/src/hb-font.h b/src/hb-font.h index e38d3a789..34a8f7d14 100644 --- a/src/hb-font.h +++ b/src/hb-font.h @@ -72,6 +72,12 @@ void * hb_face_get_user_data (hb_face_t *face, hb_user_data_key_t *key); +void +hb_face_make_immutable (hb_face_t *face); + +hb_bool_t +hb_face_is_immutable (hb_face_t *face); + hb_blob_t * hb_face_reference_table (hb_face_t *face, diff --git a/test/test-font.c b/test/test-font.c index 9c7d3e42f..1b688343b 100644 --- a/test/test-font.c +++ b/test/test-font.c @@ -156,7 +156,9 @@ _test_fontfuncs_nil (hb_font_funcs_t *ffuncs) blob = hb_blob_create (test_data, sizeof (test_data), HB_MEMORY_MODE_READONLY, NULL, NULL); face = hb_face_create (blob, 0); hb_blob_destroy (blob); + g_assert (!hb_face_is_immutable (face)); font = hb_font_create (face); + g_assert (hb_face_is_immutable (face)); hb_face_destroy (face); diff --git a/test/test-object.c b/test/test-object.c index ccd0cabb8..bac6d1ac3 100644 --- a/test/test-object.c +++ b/test/test-object.c @@ -163,8 +163,8 @@ typedef struct { static const object_t objects[] = { OBJECT_WITHOUT_IMMUTABILITY (buffer), - OBJECT_WITHOUT_IMMUTABILITY (face), OBJECT_WITH_IMMUTABILITY (blob), + OBJECT_WITH_IMMUTABILITY (face), OBJECT_WITH_IMMUTABILITY (font), OBJECT_WITH_IMMUTABILITY (font_funcs), OBJECT_WITH_IMMUTABILITY (unicode_funcs)