Re: How scaled_font private structures work ?
"Enrico Weigelt, metux IT consult" <[email protected]>
| Newsgroups | gmane.comp.lib.cairo |
|---|---|
| Message-ID | <[email protected]> |
On 11.12.2015 10:40, Enrico Weigelt, metux IT consult wrote: > Should I introduce a new structure, derived from > cairo_scaled_font_private_t, which holds that pointer ? This is my current try (see attachment) ... what do you think about it ? Could it work ? --mtx -- Enrico Weigelt, metux IT consulting +49-151-27565287 -- cairo mailing list [email protected] http://lists.cairographics.org/mailman/listinfo/cairo
0001-drm-i915-fixed-handling-of-private-pointers-in-scale.patch
(text/x-patch, 3.5 KB)
From 3e0270f6960f9d55835bfcb0761187156a9a6245 Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" <[email protected]> Date: Fri, 11 Dec 2015 12:04:36 +0100 Subject: [PATCH] drm/i915: fixed handling of private pointers in scaled_font objects --- src/drm/cairo-drm-i915-glyphs.c | 33 +++++++++++++++++++++++++++++---- src/drm/cairo-drm-i915-private.h | 7 +++++++ src/drm/cairo-drm-intel-private.h | 4 ++++ 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/drm/cairo-drm-i915-glyphs.c b/src/drm/cairo-drm-i915-glyphs.c index 287eb87..01534ca 100644 --- a/src/drm/cairo-drm-i915-glyphs.c +++ b/src/drm/cairo-drm-i915-glyphs.c @@ -273,6 +273,22 @@ CLEANUP_SHADER: return status; } +/* this is just a dummy to produce an unique address */ +static const char *_i915_scaled_font_key = "i915_scaled_font_t"; + +/* destructor for the i915_scaled_font object */ +static void _i915_scaled_font_fini( + cairo_scaled_font_private_t *abstract_priv, + cairo_scaled_font_t* scaled_font) +{ + i915_scaled_font_private_t *i915_priv = cairo_container_of(abstract_priv, i915_scaled_font_private_t, base); + + // FIXME: do we need to do something more ? + + cairo_list_del(&i915_priv->base.link); + free(i915_priv); +} + cairo_int_status_t i915_surface_glyphs (void *abstract_surface, cairo_operator_t op, @@ -414,10 +430,19 @@ i915_surface_glyphs (void *abstract_surface, device = i915_device (surface); _cairo_scaled_font_freeze_cache (scaled_font); - if (scaled_font->surface_private == NULL) { - scaled_font->surface_private = device; - scaled_font->surface_backend = surface->intel.drm.base.backend; - cairo_list_add (&scaled_font->link, &device->intel.fonts); + + if (_cairo_scaled_font_find_private(scaled_font, _i915_scaled_font_key) == NULL) { + i915_scaled_font_private_t *priv = (i915_scaled_font_private_t*)malloc(sizeof(i915_scaled_font_private_t)); + + priv->device = device; + priv->backend = surface->intel.drm.base.backend; + + _cairo_scaled_font_attach_private( + scaled_font, + &(priv->base), + _i915_scaled_font_key, + _i915_scaled_font_fini + ); } memset (glyph_cache, 0, sizeof (glyph_cache)); diff --git a/src/drm/cairo-drm-i915-private.h b/src/drm/cairo-drm-i915-private.h index 2e39b9b..5c13619 100644 --- a/src/drm/cairo-drm-i915-private.h +++ b/src/drm/cairo-drm-i915-private.h @@ -620,6 +620,7 @@ i915_fs_operand_pure_alpha (int pure) typedef struct i915_surface i915_surface_t; typedef struct i915_device i915_device_t; typedef struct i915_shader i915_shader_t; +typedef struct i915_scaled_font_private i915_scaled_font_private_t; typedef void (*i915_add_rectangle_func_t) (const i915_shader_t *shader, int x, int y, @@ -713,6 +714,12 @@ struct i915_device { uint8_t vbo_base[I915_VBO_SIZE]; }; +struct i915_scaled_font_private { + cairo_scaled_font_private_t base; + i915_device_t *device; + const cairo_surface_backend_t *backend; +}; + enum { CURRENT_SOURCE = 0x1, CURRENT_MASK = 0x2, diff --git a/src/drm/cairo-drm-intel-private.h b/src/drm/cairo-drm-intel-private.h index 4fd1b70..0fd0e10 100644 --- a/src/drm/cairo-drm-intel-private.h +++ b/src/drm/cairo-drm-intel-private.h @@ -168,6 +168,10 @@ typedef struct _intel_glyph { int width, height; } intel_glyph_t; +typedef struct _intel_scaled_font { + cairo_scaled_font_private_t base; +} intel_scaled_font_t; + typedef struct _intel_gradient_cache { cairo_pattern_union_t pattern; intel_buffer_t buffer; -- 1.9.1