gl: Decouple cache from scaled-font on context destruction

This commit is contained in:
Chris Wilson 2010-03-22 17:17:08 +00:00
parent 7812d095ab
commit 9ba73bdfc4
5 changed files with 27 additions and 2 deletions

View file

@ -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

View file

@ -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);

View file

@ -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 */

View file

@ -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

View file

@ -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;
}