| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright © 2012 Google, Inc. | 2 * Copyright © 2012 Google, Inc. |
| 3 * | 3 * |
| 4 * This is part of HarfBuzz, a text shaping library. | 4 * This is part of HarfBuzz, a text shaping library. |
| 5 * | 5 * |
| 6 * Permission is hereby granted, without written agreement and without | 6 * Permission is hereby granted, without written agreement and without |
| 7 * license or royalty fees, to use, copy, modify, and distribute this | 7 * license or royalty fees, to use, copy, modify, and distribute this |
| 8 * software and its documentation for any purpose, provided that the | 8 * software and its documentation for any purpose, provided that the |
| 9 * above copyright notice and the following two paragraphs appear in | 9 * above copyright notice and the following two paragraphs appear in |
| 10 * all copies of this software. | 10 * all copies of this software. |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 #define HB_SHAPER_DATA_DESTROY_FUNC(shaper, object) _hb_##shaper##_shaper_##
object##_data_destroy | 72 #define HB_SHAPER_DATA_DESTROY_FUNC(shaper, object) _hb_##shaper##_shaper_##
object##_data_destroy |
| 73 | 73 |
| 74 #define HB_SHAPER_DATA_PROTOTYPE(shaper, object) \ | 74 #define HB_SHAPER_DATA_PROTOTYPE(shaper, object) \ |
| 75 HB_SHAPER_DATA_TYPE (shaper, object); /* Type forward declaration. */ \ | 75 HB_SHAPER_DATA_TYPE (shaper, object); /* Type forward declaration. */ \ |
| 76 extern "C" HB_INTERNAL HB_SHAPER_DATA_TYPE (shaper, object) * \ | 76 extern "C" HB_INTERNAL HB_SHAPER_DATA_TYPE (shaper, object) * \ |
| 77 HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (hb_##object##_t *object HB_
SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS); \ | 77 HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (hb_##object##_t *object HB_
SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS); \ |
| 78 extern "C" HB_INTERNAL void \ | 78 extern "C" HB_INTERNAL void \ |
| 79 HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (HB_SHAPER_DATA_TYPE (shape
r, object) *data) | 79 HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (HB_SHAPER_DATA_TYPE (shape
r, object) *data) |
| 80 | 80 |
| 81 #define HB_SHAPER_DATA_DESTROY(shaper, object) \ | 81 #define HB_SHAPER_DATA_DESTROY(shaper, object) \ |
| 82 » if (object->shaper_data.shaper && \ | 82 if (HB_SHAPER_DATA_TYPE (shaper, object) *data = HB_SHAPER_DATA (shaper, obj
ect)) \ |
| 83 » object->shaper_data.shaper != HB_SHAPER_DATA_INVALID && \ | 83 if (data != HB_SHAPER_DATA_INVALID && data != HB_SHAPER_DATA_SUCCEEDED) \ |
| 84 » object->shaper_data.shaper != HB_SHAPER_DATA_SUCCEEDED) \ | 84 HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (data); |
| 85 » HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (HB_SHAPER_DATA (shaper,
object)); | |
| 86 | 85 |
| 87 #define HB_SHAPER_DATA_ENSURE_DECLARE(shaper, object) \ | 86 #define HB_SHAPER_DATA_ENSURE_DECLARE(shaper, object) \ |
| 88 static inline bool \ | 87 static inline bool \ |
| 89 hb_##shaper##_shaper_##object##_data_ensure (hb_##object##_t *object) \ | 88 hb_##shaper##_shaper_##object##_data_ensure (hb_##object##_t *object) \ |
| 90 {\ | 89 {\ |
| 91 retry: \ | 90 retry: \ |
| 92 HB_SHAPER_DATA_TYPE (shaper, object) *data = (HB_SHAPER_DATA_TYPE (shaper, obj
ect) *) hb_atomic_ptr_get (&HB_SHAPER_DATA (shaper, object)); \ | 91 HB_SHAPER_DATA_TYPE (shaper, object) *data = (HB_SHAPER_DATA_TYPE (shaper, obj
ect) *) hb_atomic_ptr_get (&HB_SHAPER_DATA (shaper, object)); \ |
| 93 if (unlikely (!data)) { \ | 92 if (unlikely (!data)) { \ |
| 94 data = HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (object); \ | 93 data = HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (object); \ |
| 95 if (unlikely (!data)) \ | 94 if (unlikely (!data)) \ |
| 96 data = (HB_SHAPER_DATA_TYPE (shaper, object) *) HB_SHAPER_DATA_INVALID; \ | 95 data = (HB_SHAPER_DATA_TYPE (shaper, object) *) HB_SHAPER_DATA_INVALID; \ |
| 97 if (!hb_atomic_ptr_cmpexch (&HB_SHAPER_DATA (shaper, object), NULL, data)) {
\ | 96 if (!hb_atomic_ptr_cmpexch (&HB_SHAPER_DATA (shaper, object), NULL, data)) {
\ |
| 98 if (data && \ | 97 if (data && \ |
| 99 data != HB_SHAPER_DATA_INVALID && \ | 98 data != HB_SHAPER_DATA_INVALID && \ |
| 100 data != HB_SHAPER_DATA_SUCCEEDED) \ | 99 data != HB_SHAPER_DATA_SUCCEEDED) \ |
| 101 HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (data); \ | 100 HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (data); \ |
| 102 goto retry; \ | 101 goto retry; \ |
| 103 } \ | 102 } \ |
| 104 } \ | 103 } \ |
| 105 return data != NULL && !HB_SHAPER_DATA_IS_INVALID (data); \ | 104 return data != NULL && !HB_SHAPER_DATA_IS_INVALID (data); \ |
| 106 } | 105 } |
| 107 | 106 |
| 108 | 107 |
| 109 #endif /* HB_SHAPER_PRIVATE_HH */ | 108 #endif /* HB_SHAPER_PRIVATE_HH */ |
| OLD | NEW |