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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.