summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrcombs <rcombs@rcombs.me>2022-07-26 23:55:12 -0500
committerrcombs <rcombs@rcombs.me>2022-11-15 21:14:37 -0600
commitb79678d8434c2d2fec71c7d41f24c2341572df3e (patch)
tree9a25ecfca58c24dbd05c56ecf1e445c9234ab1fe
parent1ff207aada6db91be3af00550518421bd4393492 (diff)
downloadlibass-b79678d8434c2d2fec71c7d41f24c2341572df3e.tar.bz2
libass-b79678d8434c2d2fec71c7d41f24c2341572df3e.tar.xz
ass_shaper: move cache ownership to the renderer
-rw-r--r--libass/ass_render.c6
-rw-r--r--libass/ass_render.h1
-rw-r--r--libass/ass_render_api.c3
-rw-r--r--libass/ass_shaper.c14
-rw-r--r--libass/ass_shaper.h4
5 files changed, 12 insertions, 16 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c
index d6d96f1..dc50b32 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -98,7 +98,8 @@ ASS_Renderer *ass_renderer_init(ASS_Library *library)
priv->cache.bitmap_cache = ass_bitmap_cache_create();
priv->cache.composite_cache = ass_composite_cache_create();
priv->cache.outline_cache = ass_outline_cache_create();
- if (!priv->cache.font_cache || !priv->cache.bitmap_cache || !priv->cache.composite_cache || !priv->cache.outline_cache)
+ priv->cache.metrics_cache = ass_glyph_metrics_cache_create();
+ if (!priv->cache.font_cache || !priv->cache.bitmap_cache || !priv->cache.composite_cache || !priv->cache.outline_cache || !priv->cache.metrics_cache)
goto fail;
priv->cache.glyph_max = GLYPH_CACHE_MAX;
@@ -124,7 +125,7 @@ ASS_Renderer *ass_renderer_init(ASS_Library *library)
priv->settings.font_size_coeff = 1.;
priv->settings.selective_style_overrides = ASS_OVERRIDE_BIT_SELECTIVE_FONT_SCALE;
- if (!(priv->shaper = ass_shaper_new()))
+ if (!(priv->shaper = ass_shaper_new(priv->cache.metrics_cache)))
goto fail;
ass_shaper_info(library);
@@ -152,6 +153,7 @@ void ass_renderer_done(ASS_Renderer *render_priv)
ass_cache_done(render_priv->cache.composite_cache);
ass_cache_done(render_priv->cache.bitmap_cache);
ass_cache_done(render_priv->cache.outline_cache);
+ ass_cache_done(render_priv->cache.metrics_cache);
ass_shaper_free(render_priv->shaper);
ass_cache_done(render_priv->cache.font_cache);
diff --git a/libass/ass_render.h b/libass/ass_render.h
index cf0eb41..cfbd8a3 100644
--- a/libass/ass_render.h
+++ b/libass/ass_render.h
@@ -296,6 +296,7 @@ typedef struct {
Cache *outline_cache;
Cache *bitmap_cache;
Cache *composite_cache;
+ Cache *metrics_cache;
size_t glyph_max;
size_t bitmap_max_size;
size_t composite_max_size;
diff --git a/libass/ass_render_api.c b/libass/ass_render_api.c
index c324395..30268c8 100644
--- a/libass/ass_render_api.c
+++ b/libass/ass_render_api.c
@@ -154,8 +154,7 @@ void ass_set_fonts(ASS_Renderer *priv, const char *default_font,
ass_reconfigure(priv);
ass_cache_empty(priv->cache.font_cache);
- if (priv->shaper)
- ass_shaper_empty_cache(priv->shaper);
+ ass_cache_empty(priv->cache.metrics_cache);
if (priv->fontselect)
ass_fontselect_free(priv->fontselect);
diff --git a/libass/ass_shaper.c b/libass/ass_shaper.c
index c8ffb07..db61963 100644
--- a/libass/ass_shaper.c
+++ b/libass/ass_shaper.c
@@ -125,7 +125,6 @@ static bool check_allocations(ASS_Shaper *shaper, size_t new_size, size_t n_pars
*/
void ass_shaper_free(ASS_Shaper *shaper)
{
- ass_cache_done(shaper->metrics_cache);
free(shaper->features);
free(shaper->ctypes);
#ifdef USE_FRIBIDI_EX_API
@@ -137,11 +136,6 @@ void ass_shaper_free(ASS_Shaper *shaper)
free(shaper);
}
-void ass_shaper_empty_cache(ASS_Shaper *shaper)
-{
- ass_cache_empty(shaper->metrics_cache);
-}
-
void ass_shaper_font_data_free(ASS_ShaperFontData *priv)
{
int i;
@@ -1036,8 +1030,10 @@ bool ass_shaper_shape(ASS_Shaper *shaper, TextInfo *text_info)
/**
* \brief Create a new shaper instance
*/
-ASS_Shaper *ass_shaper_new(void)
+ASS_Shaper *ass_shaper_new(Cache *metrics_cache)
{
+ assert(metrics_cache);
+
ASS_Shaper *shaper = calloc(sizeof(*shaper), 1);
if (!shaper)
return NULL;
@@ -1046,9 +1042,7 @@ ASS_Shaper *ass_shaper_new(void)
if (!init_features(shaper))
goto error;
- shaper->metrics_cache = ass_glyph_metrics_cache_create();
- if (!shaper->metrics_cache)
- goto error;
+ shaper->metrics_cache = metrics_cache;
return shaper;
diff --git a/libass/ass_shaper.h b/libass/ass_shaper.h
index 0c7a11b..819a3fd 100644
--- a/libass/ass_shaper.h
+++ b/libass/ass_shaper.h
@@ -24,15 +24,15 @@ typedef struct ass_shaper ASS_Shaper;
#include <fribidi.h>
#include <stdbool.h>
#include "ass_render.h"
+#include "ass_cache.h"
#if FRIBIDI_MAJOR_VERSION >= 1
#define USE_FRIBIDI_EX_API
#endif
void ass_shaper_info(ASS_Library *lib);
-ASS_Shaper *ass_shaper_new(void);
+ASS_Shaper *ass_shaper_new(Cache *metrics_cache);
void ass_shaper_free(ASS_Shaper *shaper);
-void ass_shaper_empty_cache(ASS_Shaper *shaper);
void ass_shaper_set_kerning(ASS_Shaper *shaper, bool kern);
void ass_shaper_find_runs(ASS_Shaper *shaper, ASS_Renderer *render_priv,
GlyphInfo *glyphs, size_t len);