/* 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; } /*XXX:should go in lib "global init"*/ 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; 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; struct ot_fnt_file *ot_fnt_file; struct ot_fnt_face *ot_fnt_face; struct ot_tbl *ot_tbl; hb_blob_t *blob; 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 */ ot_fnt_file = hb_blob_lock_instance(data->blob); ot_fnt_face = ot_fnt_file_get_face(ot_fnt_file, data->index); 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(); 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; hb_face_for_data_closure_t *closure; if (!blob || !hb_blob_get_length(blob)) return hb_face_get_empty(); 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 | 215 | 9381999f3aeff23f92475e7aef7a141e7b31c938 | ABBREVIATIONS |
100644 | blob | 120 | b5b8344f6c0ab2a879570909dfc67753d036ea10 | FIXME |
100644 | blob | 241 | 9c28271a27b1d0acd9a2a8f412a4f107767e4df2 | README |
100644 | blob | 219 | bc171ca45d9157358b008496850fe8f73dd0c66b | harfbuzz.pc.in |
100644 | blob | 1192 | 833e0c5e348c3c7663711b84cd05baf7f2ec4b6b | hb-atomic-private.h |
100644 | blob | 119 | 154fbbb0957b9a8247993436984ab9cda943720c | hb-blob-private.h |
100644 | blob | 4603 | 6cc79394dfa9884d604a6e958268d841c370f3f1 | hb-blob.c |
100644 | blob | 3534 | ef3fc98c05de6d2fa43f6303d6419f6620d474bf | hb-blob.h |
100644 | blob | 1326 | 3b93b65480793ced5bdd1c6e2587d3c2a66f3a53 | hb-buffer-private.h |
100644 | blob | 11355 | 24118c098a5412ec39226fe2a18b7e192dd902b2 | hb-buffer.c |
100644 | blob | 10513 | d3a2512d800fde857f72764b150aaa392fd8b15d | hb-buffer.h |
100644 | blob | 3302 | 92b54dbaf82493e6f281bb20231df3e1ecb9d63c | hb-common.c |
100644 | blob | 13612 | af17d780c27fc757441d5ce0fce1db120bd87c9b | hb-common.h |
100644 | blob | 1746 | 82066e4e0dc0b2770a8800f9a9fb417e14d9d7d0 | hb-coretext.h |
100644 | blob | 1584 | 30ae4b1caf76dd03cc682eda7458728b5380ad6c | hb-deprecated.h |
100644 | blob | 1175 | 5e43e30983efc3b0936efbdaf3921eecbfc1635a | hb-face-private.h |
100644 | blob | 5222 | 770d81b8c6b9bafd4c9eb018f1420e369ba09647 | hb-face.c |
100644 | blob | 2985 | 91237b70850bc9750516c73aca7051228e5c22c1 | hb-face.h |
100644 | blob | 3268 | cdc0ae9a6a50a1b444db3a148db08f01bececa7c | hb-fallback-shape.c |
100644 | blob | 2875 | dce2474d44b59f5349528718422dd9af7975cf52 | hb-font-private.h |
100644 | blob | 24805 | 80df40b5a885a7e2ae668ef1fc01020247a4e155 | hb-font.c |
100644 | blob | 13844 | c3165e1d74c123fc1aa289ce503e38f870b43611 | hb-font.h |
100644 | blob | 2502 | 551d6e47f67a13ce27d21f4bfadc86a8091507ce | hb-ft.c |
100644 | blob | 3790 | dc8ef8558484cb4faaa3cbe6906a84d8005a3a10 | hb-ft.h |
100644 | blob | 3637 | 1468f247a5f2d3c48a0de2a9a9156e17fe4521dc | hb-glib.c |
100644 | blob | 1627 | a6b6ff82026f3a0016eab1f5201e13afbde93feb | hb-glib.h |
100644 | blob | 3140 | 0ea3b12cf1676dc6a2da8e546d9d6b7cbc60ed41 | hb-gobject-structs.h |
100644 | blob | 1334 | ea1bd25df82d46a222436a1ad078d0fc95d5c303 | hb-gobject.h |
100644 | blob | 1461 | 122c3e476366b341bc74ced282f424d863255ca7 | hb-graphite2.h |
100644 | blob | 1525 | 2db6a7b6797bddc46688f7b583de991a956a2e2a | hb-icu.h |
100644 | blob | 2133 | 3e4514517efb14434d2ac3a08b82a06eedf8ffaa | hb-open-file-private.h |
100644 | blob | 2674 | 18b89705a885521c6d8d08448eac1f65395a3a0d | hb-open-file.c |
100644 | blob | 65 | 642c3d3d45fdc42619d000cc9f7b3c890bdc0190 | hb-ot-face-private.h |
100644 | blob | 1365 | 80eaa54b1add7333d975fbee27c00bc777f3e046 | hb-ot-font.h |
100644 | blob | 2784 | 91122b51fbb221aeb52634439405e47e700a1e80 | hb-ot-layout.c |
100644 | blob | 9658 | eb23d45b68aabd24538b46bb482ac187c5f61d73 | hb-ot-layout.h |
100644 | blob | 1712 | 7b1bcc0637808bbbceda020409b61d947237d925 | hb-ot-shape.h |
100644 | blob | 730 | bfa3d45093e12bf9aa7a0a8920d6a573145e1f99 | hb-ot-tag.c |
100644 | blob | 1728 | 54fb747f582301c6d46bbe33ede8a2ef127dc999 | hb-ot-tag.h |
100644 | blob | 1348 | 47c92a58e4b7ddc3225e7cb65ce20aafceb3b81a | hb-ot.h |
100644 | blob | 2541 | 827e6c9b4e8f90ba02b24a259ddd10fa8b7f34cb | hb-private.h |
100644 | blob | 3828 | 2164c1a6549afc39d9f3c6e82bb6ca8f0b8f732d | hb-set.h |
100644 | blob | 1417 | 62ff962974ac05946c099ea7d4fb3473bd95f6ba | hb-shape-plan-private.h |
100644 | blob | 14266 | 11f405cdb548fd9ac6aaebda60059202512d5831 | hb-shape-plan.c |
100644 | blob | 2837 | aa5e0c7d6f519b841c4519811f18845cdf92ee77 | hb-shape-plan.h |
100644 | blob | 5057 | 00628cd3079786a1cf9c2534458ceeac98bcc9b6 | hb-shape.c |
100644 | blob | 2170 | 53bb845bf48f40758c69ae31a399054b43690413 | hb-shape.h |
100644 | blob | 1015 | ee80e4526b63481a48b348fe279c15e757363776 | hb-shaper-private.h |
100644 | blob | 2250 | 8073a7cc168f5624424250b6a81f0440243fc015 | hb-shaper.c |
100644 | blob | 1210 | 276c97e391a35215a71ad538b77696c69dd16eb1 | hb-unicode-private.h |
100644 | blob | 7644 | 53862e6db7e90afb058efbc0f0bad27cd25b28c1 | hb-unicode.c |
100644 | blob | 14695 | 33b68aa0d85b666090c2820e46c7a5242992b228 | hb-unicode.h |
100644 | blob | 1391 | 4e4ef9986a62e3df91d1d4ea048ec89d3526498d | hb-uniscribe.h |
100644 | blob | 4990 | 319e112fe2de8d3ccb9249fec39a96971d13f1fc | hb-utf-private.c |
100644 | blob | 1246 | dca4a18b95114b239706d6917a6c74eac87b3279 | hb-utf-private.h |
100644 | blob | 1887 | 0ffd889b278962a33f2b8882e1dba4b41af6b672 | hb-version.h.in |
100644 | blob | 1521 | 7402034f4379372b3a7d0529142e4c87e4b4599d | hb.h |
100644 | blob | 7651 | 65c5ca88a67c30becee01c5a8816d964b03862f9 | license.md |
100755 | blob | 6112 | 017403a7717449e9a432c10a911340b211c5d974 | make |