1c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod/* 2c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * Copyright © 2011 Google, Inc. 3c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * 4c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * This is part of HarfBuzz, a text shaping library. 5c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * 6c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * Permission is hereby granted, without written agreement and without 7c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this 8c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * software and its documentation for any purpose, provided that the 9c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * above copyright notice and the following two paragraphs appear in 10c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * all copies of this software. 11c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * 12c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 13c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 14c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 15c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 16c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * DAMAGE. 17c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * 18c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 19c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 20c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 21c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 22c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 23c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * 24c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod * Google Author(s): Behdad Esfahbod 25c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod */ 26c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod 27c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod#include "hb-private.hh" 28c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod 29c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod/* g++ didn't like older gtype.h gcc-only code path. */ 30c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod#include <glib.h> 31c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod#if !GLIB_CHECK_VERSION(2,29,16) 32c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod#undef __GNUC__ 33c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod#undef __GNUC_MINOR__ 34c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod#define __GNUC__ 2 35c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod#define __GNUC_MINOR__ 6 36c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod#endif 37c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod 38c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod#include "hb-gobject.h" 39c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod 4071439a8c7ae9df25193bc3ad0f203117d2884a19Behdad Esfahbod#define HB_DEFINE_BOXED_TYPE(name,copy_func,free_func) \ 41c214cff55ce539d004d069a484dac3988953cb11Behdad EsfahbodGType \ 4271439a8c7ae9df25193bc3ad0f203117d2884a19Behdad Esfahbodhb_gobject_##name##_get_type (void) \ 43c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod{ \ 4471439a8c7ae9df25193bc3ad0f203117d2884a19Behdad Esfahbod static gsize type_id = 0; \ 4571439a8c7ae9df25193bc3ad0f203117d2884a19Behdad Esfahbod if (g_once_init_enter (&type_id)) { \ 4671439a8c7ae9df25193bc3ad0f203117d2884a19Behdad Esfahbod GType id = g_boxed_type_register_static (g_intern_static_string ("hb_" #name "_t"), \ 4771439a8c7ae9df25193bc3ad0f203117d2884a19Behdad Esfahbod (GBoxedCopyFunc) copy_func, \ 4871439a8c7ae9df25193bc3ad0f203117d2884a19Behdad Esfahbod (GBoxedFreeFunc) free_func); \ 4971439a8c7ae9df25193bc3ad0f203117d2884a19Behdad Esfahbod g_once_init_leave (&type_id, id); \ 50c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod } \ 5171439a8c7ae9df25193bc3ad0f203117d2884a19Behdad Esfahbod return type_id; \ 52c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod} 53c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod 5471439a8c7ae9df25193bc3ad0f203117d2884a19Behdad Esfahbod#define HB_DEFINE_OBJECT_TYPE(name) \ 5571439a8c7ae9df25193bc3ad0f203117d2884a19Behdad Esfahbod HB_DEFINE_BOXED_TYPE (name, hb_##name##_reference, hb_##name##_destroy); 56c214cff55ce539d004d069a484dac3988953cb11Behdad Esfahbod 57ece434fa0fec6754e5164d881c1e967376729ecaBehdad Esfahbod#define HB_DEFINE_VALUE_TYPE(name) \ 58ece434fa0fec6754e5164d881c1e967376729ecaBehdad Esfahbod static hb_##name##_t *_hb_##name##_reference (const hb_##name##_t *l) \ 59ece434fa0fec6754e5164d881c1e967376729ecaBehdad Esfahbod { \ 60ece434fa0fec6754e5164d881c1e967376729ecaBehdad Esfahbod hb_##name##_t *c = (hb_##name##_t *) calloc (1, sizeof (hb_##name##_t)); \ 61dbdbfe3d7b36613d893832dcb1884c756c20bfdaBehdad Esfahbod if (unlikely (!c)) return nullptr; \ 62ece434fa0fec6754e5164d881c1e967376729ecaBehdad Esfahbod *c = *l; \ 63ece434fa0fec6754e5164d881c1e967376729ecaBehdad Esfahbod return c; \ 64ece434fa0fec6754e5164d881c1e967376729ecaBehdad Esfahbod } \ 65ece434fa0fec6754e5164d881c1e967376729ecaBehdad Esfahbod static void _hb_##name##_destroy (hb_##name##_t *l) { free (l); } \ 66ece434fa0fec6754e5164d881c1e967376729ecaBehdad Esfahbod HB_DEFINE_BOXED_TYPE (name, _hb_##name##_reference, _hb_##name##_destroy); 67ece434fa0fec6754e5164d881c1e967376729ecaBehdad Esfahbod 6871439a8c7ae9df25193bc3ad0f203117d2884a19Behdad EsfahbodHB_DEFINE_OBJECT_TYPE (buffer) 6971439a8c7ae9df25193bc3ad0f203117d2884a19Behdad EsfahbodHB_DEFINE_OBJECT_TYPE (blob) 7071439a8c7ae9df25193bc3ad0f203117d2884a19Behdad EsfahbodHB_DEFINE_OBJECT_TYPE (face) 7171439a8c7ae9df25193bc3ad0f203117d2884a19Behdad EsfahbodHB_DEFINE_OBJECT_TYPE (font) 7271439a8c7ae9df25193bc3ad0f203117d2884a19Behdad EsfahbodHB_DEFINE_OBJECT_TYPE (font_funcs) 7371439a8c7ae9df25193bc3ad0f203117d2884a19Behdad EsfahbodHB_DEFINE_OBJECT_TYPE (set) 7471439a8c7ae9df25193bc3ad0f203117d2884a19Behdad EsfahbodHB_DEFINE_OBJECT_TYPE (shape_plan) 7571439a8c7ae9df25193bc3ad0f203117d2884a19Behdad EsfahbodHB_DEFINE_OBJECT_TYPE (unicode_funcs) 76ece434fa0fec6754e5164d881c1e967376729ecaBehdad EsfahbodHB_DEFINE_VALUE_TYPE (feature) 77ece434fa0fec6754e5164d881c1e967376729ecaBehdad EsfahbodHB_DEFINE_VALUE_TYPE (glyph_info) 78ece434fa0fec6754e5164d881c1e967376729ecaBehdad EsfahbodHB_DEFINE_VALUE_TYPE (glyph_position) 79ece434fa0fec6754e5164d881c1e967376729ecaBehdad EsfahbodHB_DEFINE_VALUE_TYPE (segment_properties) 80ece434fa0fec6754e5164d881c1e967376729ecaBehdad EsfahbodHB_DEFINE_VALUE_TYPE (user_data_key) 810e79ebb3ca9b7b6d238a0007e5ca022845ee9afcBehdad Esfahbod 820e79ebb3ca9b7b6d238a0007e5ca022845ee9afcBehdad EsfahbodHB_DEFINE_VALUE_TYPE (ot_math_glyph_variant) 830e79ebb3ca9b7b6d238a0007e5ca022845ee9afcBehdad EsfahbodHB_DEFINE_VALUE_TYPE (ot_math_glyph_part) 84