15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2012 Google, Inc. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is part of HarfBuzz, a text shaping library. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, without written agreement and without 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * license or royalty fees, to use, copy, modify, and distribute this 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * software and its documentation for any purpose, provided that the 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * above copyright notice and the following two paragraphs appear in 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * all copies of this software. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DAMAGE. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Google Author(s): Behdad Esfahbod 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef HB_SHAPER_PRIVATE_HH 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_PRIVATE_HH 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-private.hh" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef hb_bool_t hb_shape_func_t (hb_shape_plan_t *shape_plan, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_font_t *font, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_buffer_t *buffer, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const hb_feature_t *features, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int num_features); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_IMPLEMENT(name) \ 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern "C" HB_INTERNAL hb_shape_func_t _hb_##name##_shape; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-shaper-list.hh" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef HB_SHAPER_IMPLEMENT 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct hb_shaper_pair_t { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char name[16]; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_shape_func_t *func; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HB_INTERNAL const hb_shaper_pair_t * 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_hb_shapers_get (void); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* For embedding in face / font / ... */ 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct hb_shaper_data_t { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_IMPLEMENT(shaper) void *shaper; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-shaper-list.hh" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef HB_SHAPER_IMPLEMENT 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPERS_COUNT (sizeof (hb_shaper_data_t) / sizeof (void *)) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Means: succeeded, but don't need to keep any data. */ 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_DATA_SUCCEEDED ((void *) +1) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Means: tried but failed to create. */ 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_DATA_INVALID ((void *) -1) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_DATA_IS_INVALID(data) ((void *) (data) == HB_SHAPER_DATA_INVALID) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_DATA_TYPE(shaper, object) struct hb_##shaper##_shaper_##object##_data_t 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_DATA_INSTANCE(shaper, object, instance) (* (HB_SHAPER_DATA_TYPE(shaper, object) **) &(instance)->shaper_data.shaper) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_DATA(shaper, object) HB_SHAPER_DATA_INSTANCE (shaper, object, object) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_DATA_CREATE_FUNC(shaper, object) _hb_##shaper##_shaper_##object##_data_create 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_DATA_DESTROY_FUNC(shaper, object) _hb_##shaper##_shaper_##object##_data_destroy 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_DATA_PROTOTYPE(shaper, object) \ 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_SHAPER_DATA_TYPE (shaper, object); /* Type forward declaration. */ \ 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern "C" HB_INTERNAL HB_SHAPER_DATA_TYPE (shaper, object) * \ 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (hb_##object##_t *object HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS); \ 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern "C" HB_INTERNAL void \ 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (HB_SHAPER_DATA_TYPE (shaper, object) *data) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_DATA_DESTROY(shaper, object) \ 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (object->shaper_data.shaper && \ 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) object->shaper_data.shaper != HB_SHAPER_DATA_INVALID && \ 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) object->shaper_data.shaper != HB_SHAPER_DATA_SUCCEEDED) \ 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (HB_SHAPER_DATA (shaper, object)); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_DATA_ENSURE_DECLARE(shaper, object) \ 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline bool \ 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_##shaper##_shaper_##object##_data_ensure (hb_##object##_t *object) \ 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){\ 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retry: \ 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_SHAPER_DATA_TYPE (shaper, object) *data = (HB_SHAPER_DATA_TYPE (shaper, object) *) hb_atomic_ptr_get (&HB_SHAPER_DATA (shaper, object)); \ 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unlikely (!data)) { \ 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data = HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (object); \ 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unlikely (!data)) \ 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data = (HB_SHAPER_DATA_TYPE (shaper, object) *) HB_SHAPER_DATA_INVALID; \ 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hb_atomic_ptr_cmpexch (&HB_SHAPER_DATA (shaper, object), NULL, data)) { \ 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (data && \ 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data != HB_SHAPER_DATA_INVALID && \ 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data != HB_SHAPER_DATA_SUCCEEDED) \ 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (data); \ 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto retry; \ 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return data != NULL && !HB_SHAPER_DATA_IS_INVALID (data); \ 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HB_SHAPER_PRIVATE_HH */ 110