[lazy] Port more to it
This commit is contained in:
parent
6901090945
commit
a3b97db910
|
@ -32,6 +32,7 @@
|
||||||
#include "hb-shape-plan-private.hh"
|
#include "hb-shape-plan-private.hh"
|
||||||
#include "hb-buffer-private.hh"
|
#include "hb-buffer-private.hh"
|
||||||
#include "hb-font-private.hh"
|
#include "hb-font-private.hh"
|
||||||
|
#include "hb-machinery-private.hh"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SECTION:hb-shape
|
* SECTION:hb-shape
|
||||||
|
@ -45,21 +46,50 @@
|
||||||
* contains the output glyphs and their positions.
|
* contains the output glyphs and their positions.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
static hb_atomic_ptr_t <const char **> static_shaper_list;
|
|
||||||
|
static void free_static_shaper_list (void);
|
||||||
|
|
||||||
|
static struct hb_shaper_list_lazy_loader_t : hb_lazy_loader_t<const char *,
|
||||||
|
hb_shaper_list_lazy_loader_t>
|
||||||
|
{
|
||||||
|
static inline const char ** create (void)
|
||||||
|
{
|
||||||
|
const char **shaper_list = (const char **) calloc (1 + HB_SHAPERS_COUNT, sizeof (const char *));
|
||||||
|
if (unlikely (!shaper_list))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
const hb_shaper_pair_t *shapers = _hb_shapers_get ();
|
||||||
|
unsigned int i;
|
||||||
|
for (i = 0; i < HB_SHAPERS_COUNT; i++)
|
||||||
|
shaper_list[i] = shapers[i].name;
|
||||||
|
shaper_list[i] = nullptr;
|
||||||
|
|
||||||
|
#ifdef HB_USE_ATEXIT
|
||||||
|
atexit (free_static_shaper_list);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return shaper_list;
|
||||||
|
}
|
||||||
|
static inline void destroy (const char **l)
|
||||||
|
{
|
||||||
|
::free (l);
|
||||||
|
}
|
||||||
|
static inline const char ** get_null (void)
|
||||||
|
{
|
||||||
|
static const char *nil_shaper_list[] = {nullptr};
|
||||||
|
return nil_shaper_list;
|
||||||
|
}
|
||||||
|
} static_shaper_list;
|
||||||
|
|
||||||
#ifdef HB_USE_ATEXIT
|
#ifdef HB_USE_ATEXIT
|
||||||
static
|
static
|
||||||
void free_static_shaper_list (void)
|
void free_static_shaper_list (void)
|
||||||
{
|
{
|
||||||
retry:
|
static_shaper_list.free ();
|
||||||
const char **shaper_list = static_shaper_list.get ();
|
|
||||||
if (unlikely (!static_shaper_list.cmpexch (shaper_list, nullptr)))
|
|
||||||
goto retry;
|
|
||||||
|
|
||||||
free (shaper_list);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* hb_shape_list_shapers:
|
* hb_shape_list_shapers:
|
||||||
*
|
*
|
||||||
|
@ -73,36 +103,7 @@ retry:
|
||||||
const char **
|
const char **
|
||||||
hb_shape_list_shapers (void)
|
hb_shape_list_shapers (void)
|
||||||
{
|
{
|
||||||
retry:
|
return static_shaper_list.get_unconst ();
|
||||||
const char **shaper_list = static_shaper_list.get ();
|
|
||||||
|
|
||||||
if (unlikely (!shaper_list))
|
|
||||||
{
|
|
||||||
/* Not found; allocate one. */
|
|
||||||
shaper_list = (const char **) calloc (1 + HB_SHAPERS_COUNT, sizeof (const char *));
|
|
||||||
if (unlikely (!shaper_list)) {
|
|
||||||
static const char *nil_shaper_list[] = {nullptr};
|
|
||||||
return nil_shaper_list;
|
|
||||||
}
|
|
||||||
|
|
||||||
const hb_shaper_pair_t *shapers = _hb_shapers_get ();
|
|
||||||
unsigned int i;
|
|
||||||
for (i = 0; i < HB_SHAPERS_COUNT; i++)
|
|
||||||
shaper_list[i] = shapers[i].name;
|
|
||||||
shaper_list[i] = nullptr;
|
|
||||||
|
|
||||||
if (unlikely (!static_shaper_list.cmpexch (nullptr, shaper_list)))
|
|
||||||
{
|
|
||||||
free (shaper_list);
|
|
||||||
goto retry;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HB_USE_ATEXIT
|
|
||||||
atexit (free_static_shaper_list); /* First person registers atexit() callback. */
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return shaper_list;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue