parent
1abd427acf
commit
3506672ce9
|
@ -76,6 +76,7 @@ struct hb_blob_t
|
|||
void *user_data;
|
||||
hb_destroy_func_t destroy;
|
||||
};
|
||||
DECLARE_NULL_INSTANCE (hb_blob_t);
|
||||
|
||||
|
||||
#endif /* HB_BLOB_PRIVATE_HH */
|
||||
|
|
|
@ -45,6 +45,20 @@
|
|||
#include <stdlib.h>
|
||||
|
||||
|
||||
DEFINE_NULL_INSTANCE (hb_blob_t) =
|
||||
{
|
||||
HB_OBJECT_HEADER_STATIC,
|
||||
|
||||
true, /* immutable */
|
||||
|
||||
nullptr, /* data */
|
||||
0, /* length */
|
||||
HB_MEMORY_MODE_READONLY, /* mode */
|
||||
|
||||
nullptr, /* user_data */
|
||||
nullptr /* destroy */
|
||||
};
|
||||
|
||||
/**
|
||||
* hb_blob_create: (skip)
|
||||
* @data: Pointer to blob data.
|
||||
|
@ -182,20 +196,7 @@ hb_blob_copy_writable_or_fail (hb_blob_t *blob)
|
|||
hb_blob_t *
|
||||
hb_blob_get_empty (void)
|
||||
{
|
||||
static const hb_blob_t _hb_blob_nil = {
|
||||
HB_OBJECT_HEADER_STATIC,
|
||||
|
||||
true, /* immutable */
|
||||
|
||||
nullptr, /* data */
|
||||
0, /* length */
|
||||
HB_MEMORY_MODE_READONLY, /* mode */
|
||||
|
||||
nullptr, /* user_data */
|
||||
nullptr /* destroy */
|
||||
};
|
||||
|
||||
return const_cast<hb_blob_t *> (&_hb_blob_nil);
|
||||
return const_cast<hb_blob_t *> (&Null(hb_blob_t));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -83,7 +83,8 @@ HB_MARK_AS_FLAG_T (hb_buffer_scratch_flags_t);
|
|||
* hb_buffer_t
|
||||
*/
|
||||
|
||||
struct hb_buffer_t {
|
||||
struct hb_buffer_t
|
||||
{
|
||||
hb_object_header_t header;
|
||||
ASSERT_POD ();
|
||||
|
||||
|
@ -352,6 +353,7 @@ struct hb_buffer_t {
|
|||
info[i].mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
|
||||
}
|
||||
};
|
||||
DECLARE_NULL_INSTANCE (hb_buffer_t);
|
||||
|
||||
|
||||
/* Loop over clusters. Duplicated in foreach_syllable(). */
|
||||
|
|
|
@ -701,6 +701,28 @@ hb_buffer_t::guess_segment_properties (void)
|
|||
|
||||
/* Public API */
|
||||
|
||||
DEFINE_NULL_INSTANCE (hb_buffer_t) =
|
||||
{
|
||||
HB_OBJECT_HEADER_STATIC,
|
||||
|
||||
const_cast<hb_unicode_funcs_t *> (&_hb_Null_hb_unicode_funcs_t),
|
||||
HB_BUFFER_FLAG_DEFAULT,
|
||||
HB_BUFFER_CLUSTER_LEVEL_DEFAULT,
|
||||
HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT,
|
||||
HB_BUFFER_SCRATCH_FLAG_DEFAULT,
|
||||
HB_BUFFER_MAX_LEN_DEFAULT,
|
||||
HB_BUFFER_MAX_OPS_DEFAULT,
|
||||
|
||||
HB_BUFFER_CONTENT_TYPE_INVALID,
|
||||
HB_SEGMENT_PROPERTIES_DEFAULT,
|
||||
false, /* successful */
|
||||
true, /* have_output */
|
||||
true /* have_positions */
|
||||
|
||||
/* Zero is good enough for everything else. */
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* hb_buffer_create: (Xconstructor)
|
||||
*
|
||||
|
@ -743,27 +765,7 @@ hb_buffer_create (void)
|
|||
hb_buffer_t *
|
||||
hb_buffer_get_empty (void)
|
||||
{
|
||||
static const hb_buffer_t _hb_buffer_nil = {
|
||||
HB_OBJECT_HEADER_STATIC,
|
||||
|
||||
const_cast<hb_unicode_funcs_t *> (&_hb_unicode_funcs_nil),
|
||||
HB_BUFFER_FLAG_DEFAULT,
|
||||
HB_BUFFER_CLUSTER_LEVEL_DEFAULT,
|
||||
HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT,
|
||||
HB_BUFFER_SCRATCH_FLAG_DEFAULT,
|
||||
HB_BUFFER_MAX_LEN_DEFAULT,
|
||||
HB_BUFFER_MAX_OPS_DEFAULT,
|
||||
|
||||
HB_BUFFER_CONTENT_TYPE_INVALID,
|
||||
HB_SEGMENT_PROPERTIES_DEFAULT,
|
||||
false, /* successful */
|
||||
true, /* have_output */
|
||||
true /* have_positions */
|
||||
|
||||
/* Zero is good enough for everything else. */
|
||||
};
|
||||
|
||||
return const_cast<hb_buffer_t *> (&_hb_buffer_nil);
|
||||
return const_cast<hb_buffer_t *> (&Null(hb_buffer_t));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -39,7 +39,8 @@
|
|||
* hb_face_t
|
||||
*/
|
||||
|
||||
struct hb_face_t {
|
||||
struct hb_face_t
|
||||
{
|
||||
hb_object_header_t header;
|
||||
ASSERT_POD ();
|
||||
|
||||
|
@ -94,8 +95,7 @@ struct hb_face_t {
|
|||
HB_INTERNAL void load_upem (void) const;
|
||||
HB_INTERNAL void load_num_glyphs (void) const;
|
||||
};
|
||||
|
||||
extern HB_INTERNAL const hb_face_t _hb_face_nil;
|
||||
DECLARE_NULL_INSTANCE (hb_face_t);
|
||||
|
||||
#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
|
||||
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, face);
|
||||
|
|
|
@ -63,7 +63,8 @@ hb_face_count (hb_blob_t *blob)
|
|||
* hb_face_t
|
||||
*/
|
||||
|
||||
const hb_face_t _hb_face_nil = {
|
||||
DEFINE_NULL_INSTANCE (hb_face_t) =
|
||||
{
|
||||
HB_OBJECT_HEADER_STATIC,
|
||||
|
||||
true, /* immutable */
|
||||
|
@ -215,7 +216,7 @@ hb_face_create (hb_blob_t *blob,
|
|||
hb_face_t *
|
||||
hb_face_get_empty (void)
|
||||
{
|
||||
return const_cast<hb_face_t *> (&_hb_face_nil);
|
||||
return const_cast<hb_face_t *> (&Null(hb_face_t));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
#include "hb-shaper-private.hh"
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* hb_font_funcs_t
|
||||
*/
|
||||
|
@ -57,7 +56,8 @@
|
|||
HB_FONT_FUNC_IMPLEMENT (glyph_from_name) \
|
||||
/* ^--- Add new callbacks here */
|
||||
|
||||
struct hb_font_funcs_t {
|
||||
struct hb_font_funcs_t
|
||||
{
|
||||
hb_object_header_t header;
|
||||
ASSERT_POD ();
|
||||
|
||||
|
@ -89,14 +89,15 @@ struct hb_font_funcs_t {
|
|||
]) (void);
|
||||
} get;
|
||||
};
|
||||
|
||||
DECLARE_NULL_INSTANCE (hb_font_funcs_t);
|
||||
|
||||
|
||||
/*
|
||||
* hb_font_t
|
||||
*/
|
||||
|
||||
struct hb_font_t {
|
||||
struct hb_font_t
|
||||
{
|
||||
hb_object_header_t header;
|
||||
ASSERT_POD ();
|
||||
|
||||
|
@ -553,6 +554,7 @@ struct hb_font_t {
|
|||
return (float) v * scale / face->get_upem ();
|
||||
}
|
||||
};
|
||||
DECLARE_NULL_INSTANCE (hb_font_t);
|
||||
|
||||
#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
|
||||
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, font);
|
||||
|
|
|
@ -341,7 +341,8 @@ hb_font_get_glyph_from_name_parent (hb_font_t *font,
|
|||
return font->parent->get_glyph_from_name (name, len, glyph);
|
||||
}
|
||||
|
||||
static const hb_font_funcs_t _hb_font_funcs_nil = {
|
||||
DEFINE_NULL_INSTANCE (hb_font_funcs_t) =
|
||||
{
|
||||
HB_OBJECT_HEADER_STATIC,
|
||||
|
||||
true, /* immutable */
|
||||
|
@ -364,6 +365,7 @@ static const hb_font_funcs_t _hb_font_funcs_nil = {
|
|||
}
|
||||
}
|
||||
};
|
||||
|
||||
static const hb_font_funcs_t _hb_font_funcs_parent = {
|
||||
HB_OBJECT_HEADER_STATIC,
|
||||
|
||||
|
@ -1100,6 +1102,37 @@ hb_font_glyph_from_string (hb_font_t *font,
|
|||
* hb_font_t
|
||||
*/
|
||||
|
||||
DEFINE_NULL_INSTANCE (hb_font_t) =
|
||||
{
|
||||
HB_OBJECT_HEADER_STATIC,
|
||||
|
||||
true, /* immutable */
|
||||
|
||||
nullptr, /* parent */
|
||||
const_cast<hb_face_t *> (&_hb_Null_hb_face_t),
|
||||
|
||||
1000, /* x_scale */
|
||||
1000, /* y_scale */
|
||||
|
||||
0, /* x_ppem */
|
||||
0, /* y_ppem */
|
||||
0, /* ptem */
|
||||
|
||||
0, /* num_coords */
|
||||
nullptr, /* coords */
|
||||
|
||||
const_cast<hb_font_funcs_t *> (&_hb_Null_hb_font_funcs_t), /* klass */
|
||||
nullptr, /* user_data */
|
||||
nullptr, /* destroy */
|
||||
|
||||
{
|
||||
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
|
||||
#include "hb-shaper-list.hh"
|
||||
#undef HB_SHAPER_IMPLEMENT
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* hb_font_create: (Xconstructor)
|
||||
* @face: a face.
|
||||
|
@ -1187,36 +1220,7 @@ hb_font_create_sub_font (hb_font_t *parent)
|
|||
hb_font_t *
|
||||
hb_font_get_empty (void)
|
||||
{
|
||||
static const hb_font_t _hb_font_nil = {
|
||||
HB_OBJECT_HEADER_STATIC,
|
||||
|
||||
true, /* immutable */
|
||||
|
||||
nullptr, /* parent */
|
||||
const_cast<hb_face_t *> (&_hb_face_nil),
|
||||
|
||||
1000, /* x_scale */
|
||||
1000, /* y_scale */
|
||||
|
||||
0, /* x_ppem */
|
||||
0, /* y_ppem */
|
||||
0, /* ptem */
|
||||
|
||||
0, /* num_coords */
|
||||
nullptr, /* coords */
|
||||
|
||||
const_cast<hb_font_funcs_t *> (&_hb_font_funcs_nil), /* klass */
|
||||
nullptr, /* user_data */
|
||||
nullptr, /* destroy */
|
||||
|
||||
{
|
||||
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
|
||||
#include "hb-shaper-list.hh"
|
||||
#undef HB_SHAPER_IMPLEMENT
|
||||
}
|
||||
};
|
||||
|
||||
return const_cast<hb_font_t *> (&_hb_font_nil);
|
||||
return const_cast<hb_font_t *> (&Null(hb_font_t));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -59,10 +59,19 @@ template <> \
|
|||
} \
|
||||
namespace Namespace { \
|
||||
static_assert (true, "Just so we take semicolon after.")
|
||||
|
||||
#define DEFINE_NULL_NAMESPACE_BYTES(Namespace, Type) \
|
||||
const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::min_size]
|
||||
|
||||
/* Specializaitons for arbitrary-content Null objects expressed as struct initializer. */
|
||||
#define DECLARE_NULL_INSTANCE(Type) \
|
||||
extern HB_INTERNAL const Type _hb_Null_##Type; \
|
||||
template <> \
|
||||
/*static*/ inline const Type& Null<Type> (void) { \
|
||||
return _hb_Null_##Type; \
|
||||
} \
|
||||
static_assert (true, "Just so we take semicolon after.")
|
||||
#define DEFINE_NULL_INSTANCE(Type) \
|
||||
const Type _hb_Null_##Type
|
||||
|
||||
/* Global writable pool. Enlarge as necessary. */
|
||||
|
||||
|
|
|
@ -205,8 +205,6 @@ struct arabic_fallback_plan_t
|
|||
hb_ot_layout_lookup_accelerator_t accel_array[ARABIC_FALLBACK_MAX_LOOKUPS];
|
||||
};
|
||||
|
||||
static const arabic_fallback_plan_t arabic_fallback_plan_nil = {};
|
||||
|
||||
#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(HB_NO_WIN1256)
|
||||
#define HB_WITH_WIN1256
|
||||
#endif
|
||||
|
@ -215,7 +213,8 @@ static const arabic_fallback_plan_t arabic_fallback_plan_nil = {};
|
|||
#include "hb-ot-shape-complex-arabic-win1256.hh"
|
||||
#endif
|
||||
|
||||
struct ManifestLookup {
|
||||
struct ManifestLookup
|
||||
{
|
||||
OT::Tag tag;
|
||||
OT::OffsetTo<OT::SubstLookup> lookupOffset;
|
||||
};
|
||||
|
@ -299,7 +298,7 @@ arabic_fallback_plan_create (const hb_ot_shape_plan_t *plan,
|
|||
{
|
||||
arabic_fallback_plan_t *fallback_plan = (arabic_fallback_plan_t *) calloc (1, sizeof (arabic_fallback_plan_t));
|
||||
if (unlikely (!fallback_plan))
|
||||
return const_cast<arabic_fallback_plan_t *> (&arabic_fallback_plan_nil);
|
||||
return const_cast<arabic_fallback_plan_t *> (&Null(arabic_fallback_plan_t));
|
||||
|
||||
fallback_plan->num_lookups = 0;
|
||||
fallback_plan->free_lookups = false;
|
||||
|
@ -315,13 +314,13 @@ arabic_fallback_plan_create (const hb_ot_shape_plan_t *plan,
|
|||
return fallback_plan;
|
||||
|
||||
free (fallback_plan);
|
||||
return const_cast<arabic_fallback_plan_t *> (&arabic_fallback_plan_nil);
|
||||
return const_cast<arabic_fallback_plan_t *> (&Null(arabic_fallback_plan_t));
|
||||
}
|
||||
|
||||
static void
|
||||
arabic_fallback_plan_destroy (arabic_fallback_plan_t *fallback_plan)
|
||||
{
|
||||
if (!fallback_plan || fallback_plan == &arabic_fallback_plan_nil)
|
||||
if (!fallback_plan || fallback_plan == &Null(arabic_fallback_plan_t))
|
||||
return;
|
||||
|
||||
for (unsigned int i = 0; i < fallback_plan->num_lookups; i++)
|
||||
|
|
|
@ -51,6 +51,7 @@ struct hb_shape_plan_t
|
|||
|
||||
struct hb_shaper_data_t shaper_data;
|
||||
};
|
||||
DECLARE_NULL_INSTANCE (hb_shape_plan_t);
|
||||
|
||||
#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS \
|
||||
, const hb_feature_t *user_features \
|
||||
|
|
|
@ -88,6 +88,31 @@ hb_shape_plan_plan (hb_shape_plan_t *shape_plan,
|
|||
* hb_shape_plan_t
|
||||
*/
|
||||
|
||||
DEFINE_NULL_INSTANCE (hb_shape_plan_t) =
|
||||
{
|
||||
HB_OBJECT_HEADER_STATIC,
|
||||
|
||||
true, /* default_shaper_list */
|
||||
nullptr, /* face */
|
||||
HB_SEGMENT_PROPERTIES_DEFAULT, /* props */
|
||||
|
||||
nullptr, /* shaper_func */
|
||||
nullptr, /* shaper_name */
|
||||
|
||||
nullptr, /* user_features */
|
||||
0, /* num_user_featurs */
|
||||
|
||||
nullptr, /* coords */
|
||||
0, /* num_coords */
|
||||
|
||||
{
|
||||
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
|
||||
#include "hb-shaper-list.hh"
|
||||
#undef HB_SHAPER_IMPLEMENT
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* hb_shape_plan_create: (Xconstructor)
|
||||
* @face:
|
||||
|
@ -188,30 +213,7 @@ hb_shape_plan_create2 (hb_face_t *face,
|
|||
hb_shape_plan_t *
|
||||
hb_shape_plan_get_empty (void)
|
||||
{
|
||||
static const hb_shape_plan_t _hb_shape_plan_nil = {
|
||||
HB_OBJECT_HEADER_STATIC,
|
||||
|
||||
true, /* default_shaper_list */
|
||||
nullptr, /* face */
|
||||
HB_SEGMENT_PROPERTIES_DEFAULT, /* props */
|
||||
|
||||
nullptr, /* shaper_func */
|
||||
nullptr, /* shaper_name */
|
||||
|
||||
nullptr, /* user_features */
|
||||
0, /* num_user_featurs */
|
||||
|
||||
nullptr, /* coords */
|
||||
0, /* num_coords */
|
||||
|
||||
{
|
||||
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
|
||||
#include "hb-shaper-list.hh"
|
||||
#undef HB_SHAPER_IMPLEMENT
|
||||
}
|
||||
};
|
||||
|
||||
return const_cast<hb_shape_plan_t *> (&_hb_shape_plan_nil);
|
||||
return const_cast<hb_shape_plan_t *> (&Null(hb_shape_plan_t));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -60,7 +60,8 @@ extern HB_INTERNAL const uint8_t _hb_modified_combining_class[256];
|
|||
HB_UNICODE_FUNC_IMPLEMENT (hb_script_t, script) \
|
||||
/* ^--- Add new simple callbacks here */
|
||||
|
||||
struct hb_unicode_funcs_t {
|
||||
struct hb_unicode_funcs_t
|
||||
{
|
||||
hb_object_header_t header;
|
||||
ASSERT_POD ();
|
||||
|
||||
|
@ -263,9 +264,7 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
|
|||
#undef HB_UNICODE_FUNC_IMPLEMENT
|
||||
} destroy;
|
||||
};
|
||||
|
||||
|
||||
extern HB_INTERNAL const hb_unicode_funcs_t _hb_unicode_funcs_nil;
|
||||
DECLARE_NULL_INSTANCE (hb_unicode_funcs_t);
|
||||
|
||||
|
||||
/* Modified combining marks */
|
||||
|
|
|
@ -185,7 +185,8 @@ hb_unicode_funcs_create (hb_unicode_funcs_t *parent)
|
|||
}
|
||||
|
||||
|
||||
const hb_unicode_funcs_t _hb_unicode_funcs_nil = {
|
||||
DEFINE_NULL_INSTANCE (hb_unicode_funcs_t) =
|
||||
{
|
||||
HB_OBJECT_HEADER_STATIC,
|
||||
|
||||
nullptr, /* parent */
|
||||
|
@ -209,7 +210,7 @@ const hb_unicode_funcs_t _hb_unicode_funcs_nil = {
|
|||
hb_unicode_funcs_t *
|
||||
hb_unicode_funcs_get_empty (void)
|
||||
{
|
||||
return const_cast<hb_unicode_funcs_t *> (&_hb_unicode_funcs_nil);
|
||||
return const_cast<hb_unicode_funcs_t *> (&Null(hb_unicode_funcs_t));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue