| /* | |
| * Copyright © 2012,2013 Mozilla Foundation. | |
| * Copyright © 2012,2013 Google, Inc. | |
| * | |
| * This is part of HarfBuzz, a text shaping library. | |
| * | |
| * Permission is hereby granted, without written agreement and without | |
| * license or royalty fees, to use, copy, modify, and distribute this | |
| * software and its documentation for any purpose, provided that the | |
| * above copyright notice and the following two paragraphs appear in | |
| * all copies of this software. | |
| * | |
| * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR | |
| * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES | |
| * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN | |
| * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH | |
| * DAMAGE. | |
| * | |
| * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, | |
| * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | |
| * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS | |
| * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO | |
| * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. | |
| * | |
| * Mozilla Author(s): Jonathan Kew | |
| * Google Author(s): Behdad Esfahbod | |
| */ | |
| #ifndef HB_CORETEXT_HH | |
| #define HB_CORETEXT_HH | |
| #include "hb.hh" | |
| #include "hb-coretext.h" | |
| #include "hb-aat-layout.hh" | |
| HB_INTERNAL CGFontRef | |
| create_cg_font (CFArrayRef ct_font_desc_array, unsigned int index); | |
| HB_INTERNAL CGFontRef | |
| create_cg_font (hb_blob_t *blob, unsigned int index); | |
| HB_INTERNAL CGFontRef | |
| create_cg_font (hb_face_t *face); | |
| HB_INTERNAL CTFontRef | |
| create_ct_font (CGFontRef cg_font, CGFloat font_size); | |
| template <typename T> | |
| struct hb_cf_releaser_t | |
| { | |
| static void release (T obj) | |
| { | |
| if (obj) | |
| CFRelease ((CFTypeRef) obj); | |
| } | |
| }; | |
| template <> | |
| struct hb_cf_releaser_t<CGFontRef> | |
| { | |
| static void release (CGFontRef obj) | |
| { | |
| if (obj) | |
| CGFontRelease (obj); | |
| } | |
| }; | |
| template <> | |
| struct hb_cf_releaser_t<CGDataProviderRef> | |
| { | |
| static void release (CGDataProviderRef obj) | |
| { | |
| if (obj) | |
| CGDataProviderRelease (obj); | |
| } | |
| }; | |
| template <> | |
| struct hb_cf_releaser_t<CGPathRef> | |
| { | |
| static void release (CGPathRef obj) | |
| { | |
| if (obj) | |
| CGPathRelease (obj); | |
| } | |
| }; | |
| template <typename T, typename Releaser = hb_cf_releaser_t<T>> | |
| struct hb_cf_ptr_t | |
| { | |
| using element_type = T; | |
| constexpr hb_cf_ptr_t () noexcept : p (nullptr) {} | |
| constexpr hb_cf_ptr_t (std::nullptr_t) noexcept : p (nullptr) {} | |
| explicit hb_cf_ptr_t (T p) noexcept : p (p) {} | |
| hb_cf_ptr_t (const hb_cf_ptr_t &) = delete; | |
| hb_cf_ptr_t &operator = (const hb_cf_ptr_t &) = delete; | |
| hb_cf_ptr_t (hb_cf_ptr_t &&o) noexcept : p (o.release ()) {} | |
| hb_cf_ptr_t &operator = (hb_cf_ptr_t &&o) noexcept | |
| { | |
| reset (o.release ()); | |
| return *this; | |
| } | |
| hb_cf_ptr_t &operator = (std::nullptr_t) noexcept | |
| { | |
| reset (); | |
| return *this; | |
| } | |
| ~hb_cf_ptr_t () | |
| { | |
| Releaser::release (p); | |
| p = nullptr; | |
| } | |
| void reset (T new_p = nullptr) | |
| { | |
| if (p != new_p) | |
| { | |
| T old_p = p; | |
| p = new_p; | |
| Releaser::release (old_p); | |
| } | |
| } | |
| T release () noexcept | |
| { | |
| T old_p = p; | |
| p = nullptr; | |
| return old_p; | |
| } | |
| T get () const noexcept { return p; } | |
| operator T () const noexcept { return p; } | |
| explicit operator bool () const noexcept { return p != nullptr; } | |
| bool operator ! () const noexcept { return !p; } | |
| void swap (hb_cf_ptr_t &o) noexcept | |
| { | |
| T tmp = p; | |
| p = o.p; | |
| o.p = tmp; | |
| } | |
| friend void swap (hb_cf_ptr_t &a, hb_cf_ptr_t &b) noexcept | |
| { | |
| a.swap (b); | |
| } | |
| private: | |
| T p; | |
| }; | |
| #endif /* HB_CORETEXT_HH */ |