// C99 port from c++ is protected by a GNU Lesser GPLv3 // Copyright © 2013 Sylvain BERTRAND <sylvain.bertrand@gmail.com> // <sylware@legeek.net> #include <stdlib.h> #include <ft2build.h> #include FT_FREETYPE_H #include FT_TRUETYPE_IDS_H #include "hb.h" #include "hb-private.h" #include "hb-atomic-private.h" #include "hb-shaper-private.h" #include "hb-face-private.h" #include "hb-blob-private.h" #include "hb-open-file-private.h" void hb_face_make_immutable(hb_face_t *face) { if (hb_atomic_int32_get(&face->ref_cnt) == REF_CNT_INVALID_VAL) return; face->immutable = TRUE; } hb_face_t * hb_face_reference(hb_face_t *face) { if (hb_atomic_int32_get(&face->ref_cnt) != REF_CNT_INVALID_VAL) hb_atomic_int32_add(&face->ref_cnt, 1); return face; } static hb_face_t hb_face_nil = { REF_CNT_INVALID_VAL,//ref_cnt TRUE,//immutable NULL,//ft_face NULL,//user_data NULL,//destroy { #ifdef HAVE_GRAPHITE2 HB_SHAPER_DATA_INVALID, #endif #ifdef HAVE_OT HB_SHAPER_DATA_INVALID, #endif HB_SHAPER_DATA_INVALID//fallback }, NULL,//shape_plans 0,//upem 0,//num_glyphs 0,//index NULL//reference_table_func }; hb_face_t * hb_face_get_empty(void) { return &hb_face_nil; } void hb_face_set_index(hb_face_t *face, unsigned index) { if (hb_atomic_int32_get(&face->ref_cnt) == REF_CNT_INVALID_VAL) return; face->index = index; } void hb_face_set_upem(hb_face_t *face, unsigned upem) { if (hb_atomic_int32_get(&face->ref_cnt) == REF_CNT_INVALID_VAL) return; face->upem = upem; } hb_face_t * hb_face_create_for_tables(hb_reference_table_func_t reference_table_func, void *user_data, hb_destroy_func_t destroy) { hb_face_t *face = calloc(1, sizeof(*face)); if (!reference_table_func || !face) { if (face) free(face); if (destroy) destroy(user_data); return hb_face_get_empty(); } hb_atomic_int32_set(&face->ref_cnt, 1); face->reference_table_func = reference_table_func; face->user_data = user_data; face->destroy = destroy; face->upem = 0; face->num_glyphs = (unsigned)-1; return face; } typedef struct hb_face_for_data_closure_t { hb_blob_t *blob; unsigned index; } hb_face_for_data_closure_t; static hb_face_for_data_closure_t * hb_face_for_data_closure_create(hb_blob_t *blob, unsigned index) { hb_face_for_data_closure_t *closure; closure = malloc(sizeof(*closure)); if (!closure) return NULL; closure->blob = blob; closure->index = index; return closure; } static void hb_face_for_data_closure_destroy(hb_face_for_data_closure_t *closure) { hb_blob_destroy(closure->blob); free(closure); } static hb_blob_t * hb_face_for_data_reference_table(hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) { hb_face_for_data_closure_t *data = (hb_face_for_data_closure_t *)user_data; if (tag == HB_TAG_NONE) return hb_blob_reference(data->blob); //XXX:carefull, we don't use a "null" object like original code //be NULL pointers struct ot_fnt_file *ot_fnt_file = hb_blob_lock_instance(data->blob); struct ot_fnt_face *ot_fnt_face = ot_fnt_file_get_face(ot_fnt_file, data->index); struct ot_tbl *ot_tbl = ot_fnt_face_get_tbl_by_tag(ot_fnt_face, tag); //XXX:without "null" object return the empty blob if (!ot_tbl) return hb_blob_get_empty(); hb_blob_t *blob = hb_blob_create_sub_blob(data->blob, ot_tbl->of, ot_tbl->len); return blob; } hb_face_t * hb_face_create(hb_blob_t *blob, unsigned index) { hb_face_t *face; if (!blob || !hb_blob_get_length(blob)) return hb_face_get_empty(); hb_face_for_data_closure_t *closure = hb_face_for_data_closure_create( hb_blob_reference(blob), index); if (!closure) return hb_face_get_empty(); face = hb_face_create_for_tables( hb_face_for_data_reference_table, closure, (hb_destroy_func_t)hb_face_for_data_closure_destroy); hb_face_set_index(face, index); return face; } void hb_face_destroy(hb_face_t *face) { if (!face) return; if (hb_atomic_int32_get(&face->ref_cnt) == REF_CNT_INVALID_VAL) return; hb_atomic_int32_add(&face->ref_cnt, -1); if (hb_atomic_int32_get(&face->ref_cnt) > 0) return; hb_atomic_int32_set(&face->ref_cnt, REF_CNT_INVALID_VAL); #ifdef HAVE_GRAPHITE2 if (face->shaper_data.graphite2 && face->shaper_data.graphite2 != HB_SHAPER_DATA_INVALID && face->shaper_data.graphite2 != HB_SHAPER_DATA_SUCCEEDED) hb_graphite2_shaper_face_data_destroy(face->shaper_data.graphite2); #endif #ifdef HAVE_OT if (face->shaper_data.ot && face->shaper_data.ot != HB_SHAPER_DATA_INVALID && face->shaper_data.ot != HB_SHAPER_DATA_SUCCEEDED) hb_ot_shaper_face_data_destroy(face->shaper_data.ot); #endif if (face->shaper_data.fallback && face->shaper_data.fallback != HB_SHAPER_DATA_INVALID && face->shaper_data.fallback != HB_SHAPER_DATA_SUCCEEDED) hb_fallback_shaper_face_data_destroy(face->shaper_data.fallback); if (face->destroy) face->destroy(face->user_data); free(face); }
Mode | Type | Size | Ref | File |
---|---|---|---|---|
100644 | blob | 200 | 1a0b33b52f3f0b8f3567e0fb7b411e88c4b3c2c9 | ABBREVIATIONS |
100644 | blob | 119 | 8bbabe4337eabadd3f5ed07192b85e02d50f5bad | FIXME |
100644 | blob | 100 | 8a85692a2fc36a478ef9662ba2db214375a79254 | README |
100644 | blob | 223 | 7f27bbbdef02188df78858a31e0c38bda3fe4443 | harfbuzz.pc.in |
100644 | blob | 1478 | 2931ccaca651b04a927605232dd3500f7a661dce | hb-atomic-private.h |
100644 | blob | 120 | ee630543fb4ef3e9fa49f7362026407c0fd0a858 | hb-blob-private.h |
100644 | blob | 4983 | 607f12b39c30bbe160c4e3a6781b5a58b64de2fc | hb-blob.c |
100644 | blob | 3467 | d3d0f41b11c3b100cdee91525924c23226acd0cf | hb-blob.h |
100644 | blob | 1299 | 045519300e0994a11484696fa5c533663e4338db | hb-buffer-private.h |
100644 | blob | 11835 | a3b6deceb732205dfeb4b3798227732f4632ed8b | hb-buffer.c |
100644 | blob | 8424 | 87c4ce58e83744e68765567e4107533dae9d5b7f | hb-buffer.h |
100644 | blob | 3363 | f5141f528597232bb1a0214b7f1469cc9af008b8 | hb-common.c |
100644 | blob | 12423 | 40c1887296421c6d63f32e479cd318d4c4d79d19 | hb-common.h |
100644 | blob | 1407 | c4954fa1b2cadb133a419584de60fe16263f148b | hb-coretext.h |
100644 | blob | 1584 | 30ae4b1caf76dd03cc682eda7458728b5380ad6c | hb-deprecated.h |
100644 | blob | 1226 | 3ea9861f08c6fcc0422092c8bb38dd808b5c8757 | hb-face-private.h |
100644 | blob | 5452 | 4489a99ae3f4ebded37dab45f8cde0bf32cc43f1 | hb-face.c |
100644 | blob | 2815 | f682c468de58095fb0a7c4cdd577b34a9cb78077 | hb-face.h |
100644 | blob | 3705 | f027e1e59453b39ecb722e2c7ffd9126b579b1a5 | hb-fallback-shape.c |
100644 | blob | 3222 | 172e69a09927c17f177947f2d5f18318dd3f4545 | hb-font-private.h |
100644 | blob | 30726 | ba271fab87b5d9d6534bf971604b6079eabfc9f5 | hb-font.c |
100644 | blob | 12957 | 7273db43edaf542ef9d6e969fa2d8408e7d5100e | hb-font.h |
100644 | blob | 2570 | bb44c035ff48e7655a397e5b95872d75b92945ad | hb-ft.c |
100644 | blob | 1756 | 696251e143f31987eb599f8cb16db4f12ff8d901 | hb-ft.h |
100644 | blob | 4016 | 91eaa7075c5f9fe797de93912301d2e03d6b7248 | hb-glib.c |
100644 | blob | 1496 | 63a9d3366c58a0110881ad00d971830924b73a2a | hb-glib.h |
100644 | blob | 3185 | 4a88d569e8d3be4daa2eaf39192891426da46514 | hb-gobject-structs.h |
100644 | blob | 1334 | ea1bd25df82d46a222436a1ad078d0fc95d5c303 | hb-gobject.h |
100644 | blob | 1441 | 3eae54acbd81dbf3e534c4ad2e42d57611f7024e | hb-graphite2.h |
100644 | blob | 1495 | f2f35f0f2ce13b6b5c46453128e452ea9380eabf | hb-icu.h |
100644 | blob | 2180 | 7172c280ad7dbb708d6818d386bdbb6e852d80c8 | hb-open-file-private.h |
100644 | blob | 2659 | c4079cec956598ccf9521c874408a618fe7c29dc | hb-open-file.c |
100644 | blob | 65 | 642c3d3d45fdc42619d000cc9f7b3c890bdc0190 | hb-ot-face-private.h |
100644 | blob | 2806 | ecfd5b109b43f549366a61efff16daa92db87349 | hb-ot-layout.c |
100644 | blob | 9212 | d2a314cad6cbf94ba04ff9eaf513a74714eec732 | hb-ot-layout.h |
100644 | blob | 753 | 42faaca3f7ebdafc1232c6810b5ea2124896a95b | hb-ot-tag.c |
100644 | blob | 1688 | 1bf12ab3c09b9aef612515871e587c7c9ca7e62b | hb-ot-tag.h |
100644 | blob | 1526 | 80739063991cf14c4b65cc9247f751226f7f7277 | hb-ot.h |
100644 | blob | 1528 | ae4bc85a37900c9f54cb91986dadc216f620a358 | hb-private.h |
100644 | blob | 3544 | bafdae96333f9c81a4b20a4435e6eadaa31a7d32 | hb-set.h |
100644 | blob | 1647 | 1a90aed635a86f8e1d7002ffa8c7d300a3dd8acf | hb-shape-plan-private.h |
100644 | blob | 15942 | 929804aae7b6e5271cef5e9f1d654dcce7a8ca95 | hb-shape-plan.c |
100644 | blob | 2747 | 8f54552f90ba504f6ba2e9cf01459621fc73f9b2 | hb-shape-plan.h |
100644 | blob | 1370 | 1ff445b5de783fb0aa041f34d75919614b21ad34 | hb-shape.c |
100644 | blob | 2232 | 10a35cb517e14c96670d71bbcff266fce23cad91 | hb-shape.h |
100644 | blob | 1129 | 78e3fe4e3529b39789c0763b7f8e1019b3d5a725 | hb-shaper-private.h |
100644 | blob | 2184 | d1c8f9740fec1b4d19e0967f60391f1c5b17d155 | hb-shaper.c |
100644 | blob | 1261 | 86293900edd4d5fab1013bd0c32eeaad2abef41e | hb-unicode-private.h |
100644 | blob | 8084 | 462ddc1b9bcad35a3d4b3babb64772c93650e75c | hb-unicode.c |
100644 | blob | 14218 | 1c4e097b92d5ba628455fefe25b6f4697cc16f11 | hb-unicode.h |
100644 | blob | 1427 | 51887c8794bce4e37b35c4bb9c675baf55b63052 | hb-uniscribe.h |
100644 | blob | 5070 | 97eb7798f1dc725aad02cc651ffe859044647582 | hb-utf-private.c |
100644 | blob | 1423 | 636ce353798d395c780be99bb68350c3352f40a3 | hb-utf-private.h |
100644 | blob | 1849 | 43634f91ce8a10250c8279b19a1993843feb0f38 | hb-version.h.in |
100644 | blob | 1470 | c5a938a3818c9aca6de00a961c1c8f73bb2c47db | hb.h |
100644 | blob | 7651 | 65c5ca88a67c30becee01c5a8816d964b03862f9 | license.md |
100755 | blob | 5264 | 01bff5ed2957a061fb9cc148058a73e2ab87b350 | make |