mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-05 07:38:22 +02:00
gl: Decouple cache from scaled-font on context destruction
This commit is contained in:
parent
7812d095ab
commit
9ba73bdfc4
5 changed files with 27 additions and 2 deletions
|
|
@ -225,6 +225,12 @@ _cairo_gl_surface_owns_font (cairo_gl_surface_t *surface,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
_cairo_gl_surface_scaled_font_fini (cairo_scaled_font_t *scaled_font)
|
||||
{
|
||||
cairo_list_del (&scaled_font->link);
|
||||
}
|
||||
|
||||
void
|
||||
_cairo_gl_surface_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph,
|
||||
cairo_scaled_font_t *scaled_font)
|
||||
|
|
@ -493,9 +499,9 @@ _render_glyphs (cairo_gl_surface_t *dst,
|
|||
}
|
||||
|
||||
if (scaled_font->surface_private == NULL) {
|
||||
/* XXX couple into list to remove on context destruction */
|
||||
scaled_font->surface_private = ctx;
|
||||
scaled_font->surface_backend = &_cairo_gl_surface_backend;
|
||||
cairo_list_add (&scaled_font->link, &ctx->fonts);
|
||||
}
|
||||
|
||||
/* Create our VBO so that we can accumulate a bunch of glyph primitives
|
||||
|
|
|
|||
|
|
@ -134,6 +134,7 @@ typedef struct _cairo_gl_context {
|
|||
cairo_gl_surface_t *current_target;
|
||||
cairo_gl_surface_t *glyphs_temporary_mask;
|
||||
cairo_gl_glyph_cache_t glyph_cache[2];
|
||||
cairo_list_t fonts;
|
||||
|
||||
void (*make_current)(void *ctx, cairo_gl_surface_t *surface);
|
||||
void (*swap_buffers)(void *ctx, cairo_gl_surface_t *surface);
|
||||
|
|
@ -269,6 +270,9 @@ _cairo_gl_get_image_format_and_type (pixman_format_code_t pixman_format,
|
|||
GLenum *internal_format, GLenum *format,
|
||||
GLenum *type, cairo_bool_t *has_alpha);
|
||||
|
||||
cairo_private void
|
||||
_cairo_gl_surface_scaled_font_fini ( cairo_scaled_font_t *scaled_font);
|
||||
|
||||
cairo_private void
|
||||
_cairo_gl_surface_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph,
|
||||
cairo_scaled_font_t *scaled_font);
|
||||
|
|
|
|||
|
|
@ -71,8 +71,19 @@ static void
|
|||
_gl_destroy (void *device)
|
||||
{
|
||||
cairo_gl_context_t *ctx = device;
|
||||
cairo_scaled_font_t *scaled_font, *next_scaled_font;
|
||||
|
||||
ctx->destroy (ctx);
|
||||
|
||||
cairo_list_foreach_entry_safe (scaled_font,
|
||||
next_scaled_font,
|
||||
cairo_scaled_font_t,
|
||||
&ctx->fonts,
|
||||
link)
|
||||
{
|
||||
_cairo_scaled_font_revoke_ownership (scaled_font);
|
||||
}
|
||||
|
||||
free (ctx);
|
||||
}
|
||||
|
||||
|
|
@ -94,6 +105,7 @@ _cairo_gl_context_init (cairo_gl_context_t *ctx)
|
|||
_cairo_device_init (&ctx->base, &_cairo_gl_device_backend);
|
||||
|
||||
memset (ctx->glyph_cache, 0, sizeof (ctx->glyph_cache));
|
||||
cairo_list_init (&ctx->fonts);
|
||||
|
||||
if (glewInit () != GLEW_OK)
|
||||
return _cairo_error (CAIRO_STATUS_INVALID_FORMAT); /* XXX */
|
||||
|
|
@ -3023,7 +3035,7 @@ const cairo_surface_backend_t _cairo_gl_surface_backend = {
|
|||
_cairo_gl_surface_get_font_options,
|
||||
NULL, /* flush */
|
||||
NULL, /* mark_dirty_rectangle */
|
||||
NULL, /* scaled_font_fini */
|
||||
_cairo_gl_surface_scaled_font_fini,
|
||||
_cairo_gl_surface_scaled_glyph_fini,
|
||||
_cairo_gl_surface_paint,
|
||||
NULL, /* mask */
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@
|
|||
#include "cairo.h"
|
||||
|
||||
#include "cairo-types-private.h"
|
||||
#include "cairo-list-private.h"
|
||||
#include "cairo-mutex-type-private.h"
|
||||
#include "cairo-reference-count-private.h"
|
||||
|
||||
|
|
@ -121,6 +122,7 @@ struct _cairo_scaled_font {
|
|||
|
||||
/* font backend managing this scaled font */
|
||||
const cairo_scaled_font_backend_t *backend;
|
||||
cairo_list_t link;
|
||||
};
|
||||
|
||||
cairo_private void
|
||||
|
|
|
|||
|
|
@ -742,6 +742,7 @@ _cairo_scaled_font_init (cairo_scaled_font_t *scaled_font,
|
|||
scaled_font->surface_private = NULL;
|
||||
|
||||
scaled_font->backend = backend;
|
||||
cairo_list_init (&scaled_font->link);
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue