[Cogl] [PATCH 1/2] cogl-pango: Updates to no longer require a default context
Robert Bragg
robert at sixbynine.org
Mon May 14 16:23:09 PDT 2012
From: Robert Bragg <robert at linux.intel.com>
This updates the Cogl Pango api to no longer require a default context
and also cleans up the public api a bit.
The CoglPangoRenderer type has been made private to be
consistent with other pango backends where the renderer is merely an
implementation detail.
The drawing apis such as cogl_pango_render_layout where made more
consistent with other pango backend apis so we now have replacements
like cogl_pango_show_layout().
---
cogl-pango/cogl-pango-display-list.c | 55 ++++---
cogl-pango/cogl-pango-display-list.h | 59 ++++---
cogl-pango/cogl-pango-fontmap.c | 173 +++++++--------------
cogl-pango/cogl-pango-pipeline-cache.c | 18 ++-
cogl-pango/cogl-pango-pipeline-cache.h | 3 +-
cogl-pango/cogl-pango-private.h | 62 +++++++-
cogl-pango/cogl-pango-render.c | 268 +++++++++++++++++++-------------
cogl-pango/cogl-pango.h | 203 +++++++++++++++++++------
examples/cogl-crate.c | 18 ++-
9 files changed, 519 insertions(+), 340 deletions(-)
diff --git a/cogl-pango/cogl-pango-display-list.c b/cogl-pango/cogl-pango-display-list.c
index 28b5351..52b6b25 100644
--- a/cogl-pango/cogl-pango-display-list.c
+++ b/cogl-pango/cogl-pango-display-list.c
@@ -236,17 +236,24 @@ _cogl_pango_display_list_add_trapezoid (CoglPangoDisplayList *dl,
}
static void
-emit_rectangles_through_journal (CoglPangoDisplayListNode *node)
+emit_rectangles_through_journal (CoglFramebuffer *fb,
+ CoglPipeline *pipeline,
+ CoglPangoDisplayListNode *node)
{
- cogl_rectangles_with_texture_coords ((float *)
- node->d.texture.rectangles->data,
- node->d.texture.rectangles->len);
+ const float *rectangles = (const float *)node->d.texture.rectangles->data;
+
+ cogl_framebuffer_draw_textured_rectangles (fb,
+ pipeline,
+ rectangles,
+ node->d.texture.rectangles->len);
}
static void
-emit_vertex_buffer_geometry (CoglPangoDisplayListNode *node)
+emit_vertex_buffer_geometry (CoglFramebuffer *fb,
+ CoglPipeline *pipeline,
+ CoglPangoDisplayListNode *node)
{
- _COGL_GET_CONTEXT (ctx, NO_RETVAL);
+ CoglContext *ctx = fb->context;
/* It's expensive to go through the Cogl journal for large runs
* of text in part because the journal transforms the quads in software
@@ -365,13 +372,15 @@ emit_vertex_buffer_geometry (CoglPangoDisplayListNode *node)
cogl_object_unref (attributes[1]);
}
- cogl_framebuffer_draw_primitive (cogl_get_draw_framebuffer (),
- cogl_get_source (),
+ cogl_framebuffer_draw_primitive (fb,
+ pipeline,
node->d.texture.primitive);
}
static void
-_cogl_pango_display_list_render_texture (CoglPangoDisplayListNode *node)
+_cogl_framebuffer_draw_display_list_texture (CoglFramebuffer *fb,
+ CoglPipeline *pipeline,
+ CoglPangoDisplayListNode *node)
{
/* For small runs of text like icon labels, we can get better performance
* going through the Cogl journal since text may then be batched together
@@ -379,13 +388,14 @@ _cogl_pango_display_list_render_texture (CoglPangoDisplayListNode *node)
/* FIXME: 25 is a number I plucked out of thin air; it would be good
* to determine this empirically! */
if (node->d.texture.rectangles->len < 25)
- emit_rectangles_through_journal (node);
+ emit_rectangles_through_journal (fb, pipeline, node);
else
- emit_vertex_buffer_geometry (node);
+ emit_vertex_buffer_geometry (fb, pipeline, node);
}
void
-_cogl_pango_display_list_render (CoglPangoDisplayList *dl,
+_cogl_pango_display_list_render (CoglFramebuffer *fb,
+ CoglPangoDisplayList *dl,
const CoglColor *color)
{
GSList *l;
@@ -420,28 +430,27 @@ _cogl_pango_display_list_render (CoglPangoDisplayList *dl,
cogl_color_premultiply (&draw_color);
cogl_pipeline_set_color (node->pipeline, &draw_color);
- cogl_push_source (node->pipeline);
switch (node->type)
{
case COGL_PANGO_DISPLAY_LIST_TEXTURE:
- _cogl_pango_display_list_render_texture (node);
+ _cogl_framebuffer_draw_display_list_texture (fb, node->pipeline, node);
break;
case COGL_PANGO_DISPLAY_LIST_RECTANGLE:
- cogl_rectangle (node->d.rectangle.x_1,
- node->d.rectangle.y_1,
- node->d.rectangle.x_2,
- node->d.rectangle.y_2);
+ cogl_framebuffer_draw_rectangle (fb,
+ node->pipeline,
+ node->d.rectangle.x_1,
+ node->d.rectangle.y_1,
+ node->d.rectangle.x_2,
+ node->d.rectangle.y_2);
break;
case COGL_PANGO_DISPLAY_LIST_TRAPEZOID:
{
- CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
float points[8];
CoglPath *path;
-
- _COGL_GET_CONTEXT (ctx, NO_RETVAL);
+ CoglContext *ctx = fb->context;
points[0] = node->d.trapezoid.x_11;
points[1] = node->d.trapezoid.y_1;
@@ -454,13 +463,11 @@ _cogl_pango_display_list_render (CoglPangoDisplayList *dl,
path = cogl_path_new (ctx);
cogl_path_polygon (path, points, 4);
- cogl_framebuffer_fill_path (framebuffer, node->pipeline, path);
+ cogl_framebuffer_fill_path (fb, node->pipeline, path);
cogl_object_unref (path);
}
break;
}
-
- cogl_pop_source ();
}
}
diff --git a/cogl-pango/cogl-pango-display-list.h b/cogl-pango/cogl-pango-display-list.h
index f98dbc8..762fdef 100644
--- a/cogl-pango/cogl-pango-display-list.h
+++ b/cogl-pango/cogl-pango-display-list.h
@@ -32,37 +32,48 @@ G_BEGIN_DECLS
typedef struct _CoglPangoDisplayList CoglPangoDisplayList;
-CoglPangoDisplayList *_cogl_pango_display_list_new (CoglPangoPipelineCache *);
+CoglPangoDisplayList *
+_cogl_pango_display_list_new (CoglPangoPipelineCache *);
-void _cogl_pango_display_list_set_color_override (CoglPangoDisplayList *dl,
- const CoglColor *color);
-void _cogl_pango_display_list_remove_color_override (CoglPangoDisplayList *dl);
+void
+_cogl_pango_display_list_set_color_override (CoglPangoDisplayList *dl,
+ const CoglColor *color);
-void _cogl_pango_display_list_add_texture (CoglPangoDisplayList *dl,
- CoglTexture *texture,
- float x_1, float y_1,
- float x_2, float y_2,
- float tx_1, float ty_1,
- float tx_2, float ty_2);
+void
+_cogl_pango_display_list_remove_color_override (CoglPangoDisplayList *dl);
-void _cogl_pango_display_list_add_rectangle (CoglPangoDisplayList *dl,
- float x_1, float y_1,
- float x_2, float y_2);
+void
+_cogl_pango_display_list_add_texture (CoglPangoDisplayList *dl,
+ CoglTexture *texture,
+ float x_1, float y_1,
+ float x_2, float y_2,
+ float tx_1, float ty_1,
+ float tx_2, float ty_2);
-void _cogl_pango_display_list_add_trapezoid (CoglPangoDisplayList *dl,
- float y_1,
- float x_11,
- float x_21,
- float y_2,
- float x_12,
- float x_22);
+void
+_cogl_pango_display_list_add_rectangle (CoglPangoDisplayList *dl,
+ float x_1, float y_1,
+ float x_2, float y_2);
-void _cogl_pango_display_list_render (CoglPangoDisplayList *dl,
- const CoglColor *color);
+void
+_cogl_pango_display_list_add_trapezoid (CoglPangoDisplayList *dl,
+ float y_1,
+ float x_11,
+ float x_21,
+ float y_2,
+ float x_12,
+ float x_22);
-void _cogl_pango_display_list_clear (CoglPangoDisplayList *dl);
+void
+_cogl_pango_display_list_render (CoglFramebuffer *framebuffer,
+ CoglPangoDisplayList *dl,
+ const CoglColor *color);
-void _cogl_pango_display_list_free (CoglPangoDisplayList *dl);
+void
+_cogl_pango_display_list_clear (CoglPangoDisplayList *dl);
+
+void
+_cogl_pango_display_list_free (CoglPangoDisplayList *dl);
G_END_DECLS
diff --git a/cogl-pango/cogl-pango-fontmap.c b/cogl-pango/cogl-pango-fontmap.c
index f272f80..e544a5d 100644
--- a/cogl-pango/cogl-pango-fontmap.c
+++ b/cogl-pango/cogl-pango-fontmap.c
@@ -45,165 +45,110 @@
#include "cogl-pango.h"
#include "cogl-pango-private.h"
+#include "cogl-util.h"
-static GQuark cogl_pango_font_map_get_renderer_key (void) G_GNUC_CONST;
+static GQuark cogl_pango_font_map_get_priv_key (void) G_GNUC_CONST;
-/**
- * cogl_pango_font_map_new:
- *
- * Creates a new font map.
- *
- * Return value: (transfer full): the newly created #PangoFontMap
- *
- * Since: 1.0
- */
-PangoFontMap *
-cogl_pango_font_map_new (void)
-{
- return pango_cairo_font_map_new ();
-}
+static PangoFontMap *default_font_map = NULL;
-/**
- * cogl_pango_font_map_create_context:
- * @fm: a #CoglPangoFontMap
- *
- * Creates a new #PangoContext from the passed font map.
- *
- * Return value: (transfer full): the newly created #PangoContext
- *
- * Since: 1.0
- */
-PangoContext *
-cogl_pango_font_map_create_context (CoglPangoFontMap *fm)
+static void
+free_priv (gpointer data)
{
- g_return_val_if_fail (COGL_PANGO_IS_FONT_MAP (fm), NULL);
+ CoglPangoFontMapPriv *priv = data;
- /* We can just directly use the pango context from the Cairo font
- map */
- return pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP (fm));
+ cogl_object_unref (priv->ctx);
+
+ g_free (priv);
}
-/**
- * cogl_pango_font_map_get_renderer:
- * @fm: a #CoglPangoFontMap
- *
- * Retrieves the #CoglPangoRenderer for the passed font map.
- *
- * Return value: (transfer none): a #PangoRenderer
- *
- * Since: 1.0
- */
-PangoRenderer *
-cogl_pango_font_map_get_renderer (CoglPangoFontMap *fm)
+PangoFontMap *
+cogl_pango_font_map_new (CoglContext *context)
{
- PangoRenderer *renderer;
+ PangoFontMap *fm = pango_cairo_font_map_new ();
+ CoglPangoFontMapPriv *priv = g_new0 (CoglPangoFontMapPriv, 1);
- g_return_val_if_fail (COGL_PANGO_IS_FONT_MAP (fm), NULL);
+ priv->ctx = cogl_object_ref (context);
- /* We want to keep a cached pointer to the renderer from the font
- map instance but as we don't have a proper subclass we have to
- store it in the object data instead */
+ /* XXX: The public pango api doesn't let us sub-class
+ * PangoCairoFontMap so we attach our own private data using qdata
+ * for now. */
+ g_object_set_qdata_full (G_OBJECT (fm),
+ cogl_pango_font_map_get_priv_key (),
+ priv,
+ free_priv);
- renderer = g_object_get_qdata (G_OBJECT (fm),
- cogl_pango_font_map_get_renderer_key ());
+ return fm;
+}
- if (G_UNLIKELY (renderer == NULL))
- {
- renderer = g_object_new (COGL_PANGO_TYPE_RENDERER, NULL);
- g_object_set_qdata_full (G_OBJECT (fm),
- cogl_pango_font_map_get_renderer_key (),
- renderer,
- g_object_unref);
- }
+PangoFontMap *
+cogl_pango_font_map_get_default (CoglContext *context)
+{
+ if (G_UNLIKELY (!default_font_map))
+ default_font_map = cogl_pango_font_map_new (context);
- return renderer;
+ return default_font_map;
+}
+
+CoglPangoFontMapPriv *
+_cogl_pango_font_map_get_priv (CoglPangoFontMap *fm)
+{
+ return g_object_get_qdata (G_OBJECT (fm),
+ cogl_pango_font_map_get_priv_key ());
+}
+
+CoglContext *
+_cogl_pango_font_map_get_cogl_context (CoglPangoFontMap *fm)
+{
+ CoglPangoFontMapPriv *priv = _cogl_pango_font_map_get_priv (fm);
+ return priv->ctx;
}
-/**
- * cogl_pango_font_map_set_resolution:
- * @font_map: a #CoglPangoFontMap
- * @dpi: DPI to set
- *
- * Sets the resolution to be used by @font_map at @dpi.
- *
- * Since: 1.0
- */
void
cogl_pango_font_map_set_resolution (CoglPangoFontMap *font_map,
double dpi)
{
- g_return_if_fail (COGL_PANGO_IS_FONT_MAP (font_map));
+ _COGL_RETURN_IF_FAIL (COGL_PANGO_IS_FONT_MAP (font_map));
pango_cairo_font_map_set_resolution (PANGO_CAIRO_FONT_MAP (font_map), dpi);
}
-/**
- * cogl_pango_font_map_clear_glyph_cache:
- * @fm: a #CoglPangoFontMap
- *
- * Clears the glyph cache for @fm.
- *
- * Since: 1.0
- */
void
cogl_pango_font_map_clear_glyph_cache (CoglPangoFontMap *fm)
{
- PangoRenderer *renderer;
-
- renderer = cogl_pango_font_map_get_renderer (fm);
+ CoglPangoFontMapPriv *priv = _cogl_pango_font_map_get_priv (fm);
+ PangoRenderer *renderer = _cogl_pango_renderer_get_default (priv->ctx);
_cogl_pango_renderer_clear_glyph_cache (COGL_PANGO_RENDERER (renderer));
}
-/**
- * cogl_pango_font_map_set_use_mipmapping:
- * @fm: a #CoglPangoFontMap
- * @value: %TRUE to enable the use of mipmapping
- *
- * Sets whether the renderer for the passed font map should use
- * mipmapping when rendering a #PangoLayout.
- *
- * Since: 1.0
- */
void
cogl_pango_font_map_set_use_mipmapping (CoglPangoFontMap *fm,
CoglBool value)
{
- CoglPangoRenderer *renderer;
-
- renderer = COGL_PANGO_RENDERER (cogl_pango_font_map_get_renderer (fm));
+ CoglPangoFontMapPriv *priv = _cogl_pango_font_map_get_priv (fm);
+ PangoRenderer *renderer = _cogl_pango_renderer_get_default (priv->ctx);
- _cogl_pango_renderer_set_use_mipmapping (renderer, value);
+ _cogl_pango_renderer_set_use_mipmapping (COGL_PANGO_RENDERER (renderer),
+ value);
}
-/**
- * cogl_pango_font_map_get_use_mipmapping:
- * @fm: a #CoglPangoFontMap
- *
- * Retrieves whether the #CoglPangoRenderer used by @fm will
- * use mipmapping when rendering the glyphs.
- *
- * Return value: %TRUE if mipmapping is used, %FALSE otherwise.
- *
- * Since: 1.0
- */
CoglBool
cogl_pango_font_map_get_use_mipmapping (CoglPangoFontMap *fm)
{
- CoglPangoRenderer *renderer;
-
- renderer = COGL_PANGO_RENDERER (cogl_pango_font_map_get_renderer (fm));
+ CoglPangoFontMapPriv *priv = _cogl_pango_font_map_get_priv (fm);
+ PangoRenderer *renderer = _cogl_pango_renderer_get_default (priv->ctx);
- return _cogl_pango_renderer_get_use_mipmapping (renderer);
+ return
+ _cogl_pango_renderer_get_use_mipmapping (COGL_PANGO_RENDERER (renderer));
}
static GQuark
-cogl_pango_font_map_get_renderer_key (void)
+cogl_pango_font_map_get_priv_key (void)
{
- static GQuark renderer_key = 0;
+ static GQuark priv_key = 0;
- if (G_UNLIKELY (renderer_key == 0))
- renderer_key = g_quark_from_static_string ("CoglPangoFontMap");
+ if (G_UNLIKELY (priv_key == 0))
+ priv_key = g_quark_from_static_string ("CoglPangoFontMap");
- return renderer_key;
+ return priv_key;
}
diff --git a/cogl-pango/cogl-pango-pipeline-cache.c b/cogl-pango/cogl-pango-pipeline-cache.c
index 13f1e2a..11cbb64 100644
--- a/cogl-pango/cogl-pango-pipeline-cache.c
+++ b/cogl-pango/cogl-pango-pipeline-cache.c
@@ -39,6 +39,8 @@ typedef struct _CoglPangoPipelineCacheEntry CoglPangoPipelineCacheEntry;
struct _CoglPangoPipelineCache
{
+ CoglContext *ctx;
+
GHashTable *hash_table;
CoglPipeline *base_texture_alpha_pipeline;
@@ -79,10 +81,13 @@ _cogl_pango_pipeline_cache_value_destroy (void *data)
}
CoglPangoPipelineCache *
-_cogl_pango_pipeline_cache_new (CoglBool use_mipmapping)
+_cogl_pango_pipeline_cache_new (CoglContext *ctx,
+ CoglBool use_mipmapping)
{
CoglPangoPipelineCache *cache = g_new (CoglPangoPipelineCache, 1);
+ cache->ctx = cogl_object_ref (ctx);
+
/* The key is the pipeline pointer. A reference is taken when the
pipeline is used as a key so we should unref it again in the
destroy function */
@@ -107,9 +112,8 @@ get_base_texture_rgba_pipeline (CoglPangoPipelineCache *cache)
{
CoglPipeline *pipeline;
- _COGL_GET_CONTEXT (ctx, NULL);
-
- pipeline = cache->base_texture_rgba_pipeline = cogl_pipeline_new (ctx);
+ pipeline = cache->base_texture_rgba_pipeline =
+ cogl_pipeline_new (cache->ctx);
cogl_pipeline_set_layer_wrap_mode (pipeline, 0,
COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE);
@@ -205,10 +209,8 @@ _cogl_pango_pipeline_cache_get (CoglPangoPipelineCache *cache,
}
else
{
- _COGL_GET_CONTEXT (ctx, NULL);
-
entry->texture = NULL;
- entry->pipeline = cogl_pipeline_new (ctx);
+ entry->pipeline = cogl_pipeline_new (cache->ctx);
}
/* Add a weak reference to the pipeline so we can remove it from the
@@ -240,5 +242,7 @@ _cogl_pango_pipeline_cache_free (CoglPangoPipelineCache *cache)
g_hash_table_destroy (cache->hash_table);
+ cogl_object_unref (cache->ctx);
+
g_free (cache);
}
diff --git a/cogl-pango/cogl-pango-pipeline-cache.h b/cogl-pango/cogl-pango-pipeline-cache.h
index 23a7771..da30c75 100644
--- a/cogl-pango/cogl-pango-pipeline-cache.h
+++ b/cogl-pango/cogl-pango-pipeline-cache.h
@@ -36,7 +36,8 @@ G_BEGIN_DECLS
typedef struct _CoglPangoPipelineCache CoglPangoPipelineCache;
CoglPangoPipelineCache *
-_cogl_pango_pipeline_cache_new (CoglBool use_mipmapping);
+_cogl_pango_pipeline_cache_new (CoglContext *ctx,
+ CoglBool use_mipmapping);
/* Returns a pipeline that can be used to render glyphs in the given
texture. The pipeline has a new reference so it is up to the caller
diff --git a/cogl-pango/cogl-pango-private.h b/cogl-pango/cogl-pango-private.h
index 0c20129..4bf75ef 100644
--- a/cogl-pango/cogl-pango-private.h
+++ b/cogl-pango/cogl-pango-private.h
@@ -1,11 +1,10 @@
/*
- * Clutter.
+ * Cogl
*
- * An OpenGL based 'interactive canvas' library.
- *
- * Authored By Matthew Allum <mallum at openedhand.com>
+ * An object oriented GL/GLES Abstraction/Utility Layer
*
* Copyright (C) 2008 OpenedHand
+ * Copyright (C) 2012 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -18,7 +17,14 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ *
+ * Authors:
+ * Neil Roberts <neil at linux.intel.com>
+ * Robert Bragg <robert at linux.intel.com>
+ * Matthew Allum <mallum at openedhand.com>
*/
#ifndef __COGL_PANGO_PRIVATE_H__
@@ -28,10 +34,48 @@
G_BEGIN_DECLS
-void _cogl_pango_renderer_clear_glyph_cache (CoglPangoRenderer *renderer);
-void _cogl_pango_renderer_set_use_mipmapping (CoglPangoRenderer *renderer,
- CoglBool value);
-CoglBool _cogl_pango_renderer_get_use_mipmapping (CoglPangoRenderer *renderer);
+#define COGL_PANGO_TYPE_RENDERER (_cogl_pango_renderer_get_type ())
+#define COGL_PANGO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COGL_PANGO_TYPE_RENDERER, CoglPangoRenderer))
+#define COGL_PANGO_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), COGL_PANGO_TYPE_RENDERER, CoglPangoRendererClass))
+#define COGL_PANGO_IS_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), COGL_PANGO_TYPE_RENDERER))
+#define COGL_PANGO_IS_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), COGL_PANGO_TYPE_RENDERER))
+#define COGL_PANGO_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), COGL_PANGO_TYPE_RENDERER, CoglPangoRendererClass))
+
+/* opaque types */
+typedef struct _CoglPangoRenderer CoglPangoRenderer;
+typedef struct _CoglPangoRendererClass CoglPangoRendererClass;
+
+GType
+_cogl_pango_renderer_get_type (void) G_GNUC_CONST;
+
+PangoRenderer *
+_cogl_pango_renderer_get_default (CoglContext *context);
+
+PangoRenderer *
+_cogl_pango_renderer_new (CoglContext *context);
+
+void
+_cogl_pango_renderer_clear_glyph_cache (CoglPangoRenderer *renderer);
+
+void
+_cogl_pango_renderer_set_use_mipmapping (CoglPangoRenderer *renderer,
+ CoglBool value);
+CoglBool
+_cogl_pango_renderer_get_use_mipmapping (CoglPangoRenderer *renderer);
+
+
+
+typedef struct _CoglPangoFontMapPriv
+{
+ CoglContext *ctx;
+} CoglPangoFontMapPriv;
+
+
+CoglPangoFontMapPriv *
+_cogl_pango_font_map_get_priv (CoglPangoFontMap *fb);
+
+CoglContext *
+_cogl_pango_font_map_get_cogl_context (CoglPangoFontMap *fm);
G_END_DECLS
diff --git a/cogl-pango/cogl-pango-render.c b/cogl-pango/cogl-pango-render.c
index b1f1f6e..a9d545d 100644
--- a/cogl-pango/cogl-pango-render.c
+++ b/cogl-pango/cogl-pango-render.c
@@ -1,11 +1,10 @@
/*
- * Clutter.
+ * Cogl
*
- * An OpenGL based 'interactive canvas' library.
- *
- * Authored By Matthew Allum <mallum at openedhand.com>
+ * An object oriented GL/GLES Abstraction/Utility Layer
*
* Copyright (C) 2008 OpenedHand
+ * Copyright (C) 2012 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -18,7 +17,14 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ *
+ * Authors:
+ * Neil Roberts <neil at linux.intel.com>
+ * Robert Bragg <robert at linux.intel.com>
+ * Matthew Allum <mallum at openedhand.com>
*/
#ifdef HAVE_CONFIG_H
@@ -41,6 +47,14 @@
#include "cogl-pango-glyph-cache.h"
#include "cogl-pango-display-list.h"
+enum
+{
+ PROP_0,
+
+ PROP_COGL_CONTEXT,
+ PROP_LAST
+};
+
typedef struct
{
CoglPangoGlyphCache *glyph_cache;
@@ -51,6 +65,8 @@ struct _CoglPangoRenderer
{
PangoRenderer parent_instance;
+ CoglContext *ctx;
+
/* Two caches of glyphs as textures and their corresponding pipeline
caches, one with mipmapped textures and one without */
CoglPangoRendererCaches no_mipmap_caches;
@@ -67,11 +83,11 @@ struct _CoglPangoRendererClass
PangoRendererClass class_instance;
};
-typedef struct _CoglPangoRendererQdata CoglPangoRendererQdata;
+typedef struct _CoglPangoLayoutQdata CoglPangoLayoutQdata;
/* An instance of this struct gets attached to each PangoLayout to
cache the VBO and to detect changes to the layout */
-struct _CoglPangoRendererQdata
+struct _CoglPangoLayoutQdata
{
CoglPangoRenderer *renderer;
/* The cache of the geometry for the layout */
@@ -94,6 +110,24 @@ typedef struct
float x1, y1, x2, y2;
} CoglPangoRendererSliceCbData;
+PangoRenderer *
+_cogl_pango_renderer_new (CoglContext *context)
+{
+ return PANGO_RENDERER (g_object_new (COGL_PANGO_TYPE_RENDERER,
+ "context", context, NULL));
+}
+
+static PangoRenderer *default_renderer = NULL;
+
+PangoRenderer *
+_cogl_pango_renderer_get_default (CoglContext *context)
+{
+ if (G_UNLIKELY (!default_renderer))
+ default_renderer = _cogl_pango_renderer_new (context);
+
+ return default_renderer;
+}
+
static void
cogl_pango_renderer_slice_cb (CoglTexture *texture,
const float *slice_coords,
@@ -126,7 +160,7 @@ cogl_pango_renderer_draw_glyph (CoglPangoRenderer *priv,
{
CoglPangoRendererSliceCbData data;
- g_return_if_fail (priv->display_list != NULL);
+ _COGL_RETURN_IF_FAIL (priv->display_list != NULL);
data.display_list = priv->display_list;
data.x1 = x1;
@@ -151,6 +185,7 @@ cogl_pango_renderer_draw_glyph (CoglPangoRenderer *priv,
&data);
}
+static void cogl_pango_renderer_dispose (GObject *object);
static void cogl_pango_renderer_finalize (GObject *object);
static void cogl_pango_renderer_draw_glyphs (PangoRenderer *renderer,
PangoFont *font,
@@ -172,36 +207,92 @@ static void cogl_pango_renderer_draw_trapezoid (PangoRenderer *renderer,
double x12,
double x22);
-G_DEFINE_TYPE (CoglPangoRenderer, cogl_pango_renderer, PANGO_TYPE_RENDERER);
+G_DEFINE_TYPE (CoglPangoRenderer, _cogl_pango_renderer, PANGO_TYPE_RENDERER);
static void
-cogl_pango_renderer_init (CoglPangoRenderer *priv)
+_cogl_pango_renderer_init (CoglPangoRenderer *priv)
{
- priv->no_mipmap_caches.pipeline_cache =
- _cogl_pango_pipeline_cache_new (FALSE);
- priv->mipmap_caches.pipeline_cache =
- _cogl_pango_pipeline_cache_new (TRUE);
+}
+
+static void
+_cogl_pango_renderer_constructed (GObject *gobject)
+{
+ CoglPangoRenderer *renderer = COGL_PANGO_RENDERER (gobject);
+ CoglContext *ctx = renderer->ctx;
+
+ renderer->no_mipmap_caches.pipeline_cache =
+ _cogl_pango_pipeline_cache_new (ctx, FALSE);
+ renderer->mipmap_caches.pipeline_cache =
+ _cogl_pango_pipeline_cache_new (ctx, TRUE);
+
+ renderer->no_mipmap_caches.glyph_cache = cogl_pango_glyph_cache_new (FALSE);
+ renderer->mipmap_caches.glyph_cache = cogl_pango_glyph_cache_new (TRUE);
- priv->no_mipmap_caches.glyph_cache = cogl_pango_glyph_cache_new (FALSE);
- priv->mipmap_caches.glyph_cache = cogl_pango_glyph_cache_new (TRUE);
+ _cogl_pango_renderer_set_use_mipmapping (renderer, FALSE);
- _cogl_pango_renderer_set_use_mipmapping (priv, FALSE);
+ if (G_OBJECT_CLASS (_cogl_pango_renderer_parent_class)->constructed)
+ G_OBJECT_CLASS (_cogl_pango_renderer_parent_class)->constructed (gobject);
+}
+
+static void
+cogl_pango_renderer_set_property (GObject *object,
+ unsigned int prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ CoglPangoRenderer *renderer = COGL_PANGO_RENDERER (object);
+
+ switch (prop_id)
+ {
+ case PROP_COGL_CONTEXT:
+ renderer->ctx = g_value_get_pointer (value);
+ cogl_object_ref (renderer->ctx);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
}
static void
-cogl_pango_renderer_class_init (CoglPangoRendererClass *klass)
+_cogl_pango_renderer_class_init (CoglPangoRendererClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
PangoRendererClass *renderer_class = PANGO_RENDERER_CLASS (klass);
+ GParamSpec *pspec;
+ object_class->set_property = cogl_pango_renderer_set_property;
+ object_class->constructed = _cogl_pango_renderer_constructed;
+ object_class->dispose = cogl_pango_renderer_dispose;
object_class->finalize = cogl_pango_renderer_finalize;
+ pspec = g_param_spec_pointer ("context",
+ "Context",
+ "The Cogl Context",
+ G_PARAM_WRITABLE |
+ G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT_ONLY);
+
+ g_object_class_install_property (object_class, PROP_COGL_CONTEXT, pspec);
+
renderer_class->draw_glyphs = cogl_pango_renderer_draw_glyphs;
renderer_class->draw_rectangle = cogl_pango_renderer_draw_rectangle;
renderer_class->draw_trapezoid = cogl_pango_renderer_draw_trapezoid;
}
static void
+cogl_pango_renderer_dispose (GObject *object)
+{
+ CoglPangoRenderer *priv = COGL_PANGO_RENDERER (object);
+
+ if (priv->ctx)
+ {
+ cogl_object_unref (priv->ctx);
+ priv->ctx = NULL;
+ }
+}
+
+static void
cogl_pango_renderer_finalize (GObject *object)
{
CoglPangoRenderer *priv = COGL_PANGO_RENDERER (object);
@@ -212,28 +303,32 @@ cogl_pango_renderer_finalize (GObject *object)
_cogl_pango_pipeline_cache_free (priv->no_mipmap_caches.pipeline_cache);
_cogl_pango_pipeline_cache_free (priv->mipmap_caches.pipeline_cache);
- G_OBJECT_CLASS (cogl_pango_renderer_parent_class)->finalize (object);
+ G_OBJECT_CLASS (_cogl_pango_renderer_parent_class)->finalize (object);
}
static CoglPangoRenderer *
cogl_pango_get_renderer_from_context (PangoContext *context)
{
- PangoFontMap *font_map;
- PangoRenderer *renderer;
- CoglPangoFontMap *font_map_priv;
+ PangoFontMap *font_map;
+ CoglPangoFontMap *cogl_font_map;
+ CoglContext *cogl_context;
+ PangoRenderer *renderer;
font_map = pango_context_get_font_map (context);
g_return_val_if_fail (COGL_PANGO_IS_FONT_MAP (font_map), NULL);
- font_map_priv = COGL_PANGO_FONT_MAP (font_map);
- renderer = cogl_pango_font_map_get_renderer (font_map_priv);
+ cogl_font_map = COGL_PANGO_FONT_MAP (font_map);
+
+ cogl_context = _cogl_pango_font_map_get_cogl_context (cogl_font_map);
+ renderer = _cogl_pango_renderer_get_default (cogl_context);
+
g_return_val_if_fail (COGL_PANGO_IS_RENDERER (renderer), NULL);
return COGL_PANGO_RENDERER (renderer);
}
static GQuark
-cogl_pango_render_get_qdata_key (void)
+cogl_pango_layout_get_qdata_key (void)
{
static GQuark key = 0;
@@ -244,7 +339,7 @@ cogl_pango_render_get_qdata_key (void)
}
static void
-cogl_pango_render_qdata_forget_display_list (CoglPangoRendererQdata *qdata)
+cogl_pango_layout_qdata_forget_display_list (CoglPangoLayoutQdata *qdata)
{
if (qdata->display_list)
{
@@ -254,7 +349,7 @@ cogl_pango_render_qdata_forget_display_list (CoglPangoRendererQdata *qdata)
_cogl_pango_glyph_cache_remove_reorganize_callback
(caches->glyph_cache,
- (GHookFunc) cogl_pango_render_qdata_forget_display_list,
+ (GHookFunc) cogl_pango_layout_qdata_forget_display_list,
qdata);
_cogl_pango_display_list_free (qdata->display_list);
@@ -264,36 +359,24 @@ cogl_pango_render_qdata_forget_display_list (CoglPangoRendererQdata *qdata)
}
static void
-cogl_pango_render_qdata_destroy (CoglPangoRendererQdata *qdata)
+cogl_pango_render_qdata_destroy (CoglPangoLayoutQdata *qdata)
{
- cogl_pango_render_qdata_forget_display_list (qdata);
+ cogl_pango_layout_qdata_forget_display_list (qdata);
if (qdata->first_line)
pango_layout_line_unref (qdata->first_line);
- g_slice_free (CoglPangoRendererQdata, qdata);
+ g_slice_free (CoglPangoLayoutQdata, qdata);
}
-/**
- * cogl_pango_render_layout_subpixel:
- * @layout: a #PangoLayout
- * @x: FIXME
- * @y: FIXME
- * @color: color to use when rendering the layout
- * @flags: flags to pass to the renderer
- *
- * FIXME
- *
- * Since: 1.0
- */
void
-cogl_pango_render_layout_subpixel (PangoLayout *layout,
- int x,
- int y,
- const CoglColor *color,
- int flags)
+cogl_pango_show_layout (CoglFramebuffer *fb,
+ PangoLayout *layout,
+ float x,
+ float y,
+ const CoglColor *color)
{
- PangoContext *context;
- CoglPangoRenderer *priv;
- CoglPangoRendererQdata *qdata;
+ PangoContext *context;
+ CoglPangoRenderer *priv;
+ CoglPangoLayoutQdata *qdata;
context = pango_layout_get_context (layout);
priv = cogl_pango_get_renderer_from_context (context);
@@ -301,14 +384,14 @@ cogl_pango_render_layout_subpixel (PangoLayout *layout,
return;
qdata = g_object_get_qdata (G_OBJECT (layout),
- cogl_pango_render_get_qdata_key ());
+ cogl_pango_layout_get_qdata_key ());
if (qdata == NULL)
{
- qdata = g_slice_new0 (CoglPangoRendererQdata);
+ qdata = g_slice_new0 (CoglPangoLayoutQdata);
qdata->renderer = priv;
g_object_set_qdata_full (G_OBJECT (layout),
- cogl_pango_render_get_qdata_key (),
+ cogl_pango_layout_get_qdata_key (),
qdata,
(GDestroyNotify)
cogl_pango_render_qdata_destroy);
@@ -321,7 +404,7 @@ cogl_pango_render_layout_subpixel (PangoLayout *layout,
((qdata->first_line &&
qdata->first_line->layout != layout) ||
qdata->mipmapping_used != priv->use_mipmapping))
- cogl_pango_render_qdata_forget_display_list (qdata);
+ cogl_pango_layout_qdata_forget_display_list (qdata);
if (qdata->display_list == NULL)
{
@@ -338,7 +421,7 @@ cogl_pango_render_layout_subpixel (PangoLayout *layout,
we can rebuild the display list */
_cogl_pango_glyph_cache_add_reorganize_callback
(caches->glyph_cache,
- (GHookFunc) cogl_pango_render_qdata_forget_display_list,
+ (GHookFunc) cogl_pango_layout_qdata_forget_display_list,
qdata);
priv->display_list = qdata->display_list;
@@ -348,11 +431,14 @@ cogl_pango_render_layout_subpixel (PangoLayout *layout,
qdata->mipmapping_used = priv->use_mipmapping;
}
- cogl_push_matrix ();
- cogl_translate (x / (gfloat) PANGO_SCALE, y / (gfloat) PANGO_SCALE, 0);
- _cogl_pango_display_list_render (qdata->display_list,
+ cogl_framebuffer_push_matrix (fb);
+ cogl_framebuffer_translate (fb, x, y, 0);
+
+ _cogl_pango_display_list_render (fb,
+ qdata->display_list,
color);
- cogl_pop_matrix ();
+
+ cogl_framebuffer_pop_matrix (fb);
/* Keep a reference to the first line of the layout so we can detect
changes */
@@ -368,52 +454,18 @@ cogl_pango_render_layout_subpixel (PangoLayout *layout,
}
}
-/**
- * cogl_pango_render_layout:
- * @layout: a #PangoLayout
- * @x: X coordinate to render the layout at
- * @y: Y coordinate to render the layout at
- * @color: color to use when rendering the layout
- * @flags: flags to pass to the renderer
- *
- * Renders @layout.
- *
- * Since: 1.0
- */
-void
-cogl_pango_render_layout (PangoLayout *layout,
- int x,
- int y,
- const CoglColor *color,
- int flags)
-{
- cogl_pango_render_layout_subpixel (layout,
- x * PANGO_SCALE,
- y * PANGO_SCALE,
- color,
- flags);
-}
-
-/**
- * cogl_pango_render_layout_line:
- * @line: a #PangoLayoutLine
- * @x: X coordinate to render the line at
- * @y: Y coordinate to render the line at
- * @color: color to use when rendering the line
- *
- * Renders @line at the given coordinates using the given color.
- *
- * Since: 1.0
- */
void
-cogl_pango_render_layout_line (PangoLayoutLine *line,
- int x,
- int y,
- const CoglColor *color)
+cogl_pango_show_layout_line (CoglFramebuffer *fb,
+ PangoLayoutLine *line,
+ float x,
+ float y,
+ const CoglColor *color)
{
PangoContext *context;
CoglPangoRenderer *priv;
CoglPangoRendererCaches *caches;
+ int pango_x = x * PANGO_SCALE;
+ int pango_y = y * PANGO_SCALE;
context = pango_layout_get_context (line->layout);
priv = cogl_pango_get_renderer_from_context (context);
@@ -428,9 +480,11 @@ cogl_pango_render_layout_line (PangoLayoutLine *line,
_cogl_pango_ensure_glyph_cache_for_layout_line (line);
- pango_renderer_draw_layout_line (PANGO_RENDERER (priv), line, x, y);
+ pango_renderer_draw_layout_line (PANGO_RENDERER (priv), line,
+ pango_x, pango_y);
- _cogl_pango_display_list_render (priv->display_list,
+ _cogl_pango_display_list_render (fb,
+ priv->display_list,
color);
_cogl_pango_display_list_free (priv->display_list);
@@ -489,7 +543,7 @@ cogl_pango_renderer_set_dirty_glyph (PangoFont *font,
/* Glyphs that don't take up any space will end up without a
texture. These should never become dirty so they shouldn't end up
here */
- g_return_if_fail (value->texture != NULL);
+ _COGL_RETURN_IF_FAIL (value->texture != NULL);
if (cogl_texture_get_format (value->texture) == COGL_PIXEL_FORMAT_A_8)
{
@@ -617,7 +671,7 @@ cogl_pango_ensure_glyph_cache_for_layout (PangoLayout *layout)
context = pango_layout_get_context (layout);
priv = cogl_pango_get_renderer_from_context (context);
- g_return_if_fail (PANGO_IS_LAYOUT (layout));
+ _COGL_RETURN_IF_FAIL (PANGO_IS_LAYOUT (layout));
if ((iter = pango_layout_get_iter (layout)) == NULL)
return;
@@ -671,7 +725,7 @@ cogl_pango_renderer_draw_box (PangoRenderer *renderer,
{
CoglPangoRenderer *priv = COGL_PANGO_RENDERER (renderer);
- g_return_if_fail (priv->display_list != NULL);
+ _COGL_RETURN_IF_FAIL (priv->display_list != NULL);
_cogl_pango_display_list_add_rectangle (priv->display_list,
x,
@@ -715,7 +769,7 @@ cogl_pango_renderer_draw_rectangle (PangoRenderer *renderer,
CoglPangoRenderer *priv = COGL_PANGO_RENDERER (renderer);
float x1, x2, y1, y2;
- g_return_if_fail (priv->display_list != NULL);
+ _COGL_RETURN_IF_FAIL (priv->display_list != NULL);
cogl_pango_renderer_set_color_for_part (renderer, part);
@@ -743,7 +797,7 @@ cogl_pango_renderer_draw_trapezoid (PangoRenderer *renderer,
CoglPangoRenderer *priv = COGL_PANGO_RENDERER (renderer);
float points[8];
- g_return_if_fail (priv->display_list != NULL);
+ _COGL_RETURN_IF_FAIL (priv->display_list != NULL);
points[0] = (x11);
points[1] = (y1);
diff --git a/cogl-pango/cogl-pango.h b/cogl-pango/cogl-pango.h
index d237eb7..5b6ca09 100644
--- a/cogl-pango/cogl-pango.h
+++ b/cogl-pango/cogl-pango.h
@@ -1,11 +1,10 @@
/*
- * Clutter.
+ * Cogl
*
- * An OpenGL based 'interactive canvas' library.
- *
- * Authored By Matthew Allum <mallum at openedhand.com>
+ * An object oriented GL/GLES Abstraction/Utility Layer
*
* Copyright (C) 2008 OpenedHand
+ * Copyright (C) 2012 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -18,11 +17,17 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Authors:
+ * Neil Roberts <neil at linux.intel.com>
+ * Robert Bragg <robert at linux.intel.com>
+ * Matthew Allum <mallum at openedhand.com>
*/
-#ifndef __PANGO_CLUTTER_H__
-#define __PANGO_CLUTTER_H__
+#ifndef __COGL_PANGO_H__
+#define __COGL_PANGO_H__
#include <glib-object.h>
#include <pango/pango.h>
@@ -41,45 +46,151 @@ G_BEGIN_DECLS
typedef PangoCairoFontMap CoglPangoFontMap;
-PangoFontMap * cogl_pango_font_map_new (void);
-PangoContext * cogl_pango_font_map_create_context (CoglPangoFontMap *fm);
-void cogl_pango_font_map_set_resolution (CoglPangoFontMap *font_map,
- double dpi);
-void cogl_pango_font_map_clear_glyph_cache (CoglPangoFontMap *fm);
-void cogl_pango_ensure_glyph_cache_for_layout (PangoLayout *layout);
-void cogl_pango_font_map_set_use_mipmapping (CoglPangoFontMap *fm,
- CoglBool value);
-CoglBool cogl_pango_font_map_get_use_mipmapping (CoglPangoFontMap *fm);
-PangoRenderer *cogl_pango_font_map_get_renderer (CoglPangoFontMap *fm);
-
-#define COGL_PANGO_TYPE_RENDERER (cogl_pango_renderer_get_type ())
-#define COGL_PANGO_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COGL_PANGO_TYPE_RENDERER, CoglPangoRenderer))
-#define COGL_PANGO_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), COGL_PANGO_TYPE_RENDERER, CoglPangoRendererClass))
-#define COGL_PANGO_IS_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), COGL_PANGO_TYPE_RENDERER))
-#define COGL_PANGO_IS_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), COGL_PANGO_TYPE_RENDERER))
-#define COGL_PANGO_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), COGL_PANGO_TYPE_RENDERER, CoglPangoRendererClass))
-
-/* opaque types */
-typedef struct _CoglPangoRenderer CoglPangoRenderer;
-typedef struct _CoglPangoRendererClass CoglPangoRendererClass;
-
-GType cogl_pango_renderer_get_type (void) G_GNUC_CONST;
-
-void cogl_pango_render_layout_subpixel (PangoLayout *layout,
- int x,
- int y,
- const CoglColor *color,
- int flags);
-void cogl_pango_render_layout (PangoLayout *layout,
- int x,
- int y,
- const CoglColor *color,
- int flags);
-void cogl_pango_render_layout_line (PangoLayoutLine *line,
- int x,
- int y,
- const CoglColor *color);
+/**
+ * cogl_pango_font_map_get_default:
+ * @context: A #CoglContext
+ *
+ * Gets a default #CoglPangoFontMap to use with Cogl.
+ *
+ * Note that the type of the returned object will depend
+ * on the particular font backend Cairo was compiled to use;
+ * You generally should only use the #PangoFontMap and
+ * #CoglPangoFontMap interfaces on the returned object.
+ *
+ * Return value: (transfer none): the default Cogl fontmap
+ * for Pango. This object is owned by Pango and must not be freed.
+ *
+ * Since: 2.0
+ */
+PangoFontMap *
+cogl_pango_font_map_get_default (CoglContext *context);
+
+/**
+ * cogl_pango_font_map_new:
+ * @context: A #CoglContext
+ *
+ * Creates a new font map.
+ *
+ * Return value: (transfer full): the newly created #PangoFontMap
+ *
+ * Since: 2.0
+ */
+PangoFontMap *
+cogl_pango_font_map_new (CoglContext *context);
+
+/**
+ * cogl_pango_font_map_set_resolution:
+ * @font_map: a #CoglPangoFontMap
+ * @dpi: The resolution in "dots per inch". (Physical inches aren't
+ * actually involved; the terminology is conventional.)
+ *
+ * Sets the resolution for the @font_map. This is a scale factor
+ * between points specified in a #PangoFontDescription and Cogl units.
+ * The default value is %96, meaning that a 10 point font will be 13
+ * units high. (10 * 96. / 72. = 13.3).
+ *
+ * Since: 2.0
+ */
+void
+cogl_pango_font_map_set_resolution (CoglPangoFontMap *font_map,
+ double dpi);
+
+/**
+ * cogl_pango_font_map_clear_glyph_cache:
+ * @font_map: a #CoglPangoFontMap
+ *
+ * Clears the glyph cache for @font_map.
+ *
+ * Since: 1.0
+ */
+void
+cogl_pango_font_map_clear_glyph_cache (CoglPangoFontMap *font_map);
+
+/**
+ * cogl_pango_ensure_glyph_cache_for_layout:
+ * @layout: A #PangoLayout
+ *
+ * This updates any internal glyph cache textures as necessary to be
+ * able to render the given @layout.
+ *
+ * This api should be used to avoid mid-scene modifications of
+ * glyph-cache textures which can lead to undefined rendering results.
+ *
+ * Since: 1.0
+ */
+void
+cogl_pango_ensure_glyph_cache_for_layout (PangoLayout *layout);
+
+/**
+ * cogl_pango_font_map_set_use_mipmapping:
+ * @font_map: a #CoglPangoFontMap
+ * @value: %TRUE to enable the use of mipmapping
+ *
+ * Sets whether the renderer for the passed font map should use
+ * mipmapping when rendering a #PangoLayout.
+ *
+ * Since: 1.0
+ */
+void
+cogl_pango_font_map_set_use_mipmapping (CoglPangoFontMap *font_map,
+ CoglBool value);
+
+/**
+ * cogl_pango_font_map_get_use_mipmapping:
+ * @font_map: a #CoglPangoFontMap
+ *
+ * Retrieves whether the #CoglPangoRenderer used by @font_map will use
+ * mipmapping when rendering the glyphs.
+ *
+ * Return value: %TRUE if mipmapping is used, %FALSE otherwise.
+ *
+ * Since: 1.0
+ */
+CoglBool
+cogl_pango_font_map_get_use_mipmapping (CoglPangoFontMap *font_map);
+
+/**
+ * cogl_pango_show_layout:
+ * @framebuffer: A #CoglFramebuffer to draw too.
+ * @layout: a #PangoLayout
+ * @x: X coordinate to render the layout at
+ * @y: Y coordinate to render the layout at
+ * @color: color to use when rendering the layout
+ *
+ * Draws a solidly coloured @layout on the given @framebuffer at (@x,
+ * @y) within the @framebuffer<!-- -->'s current model-view coordinate
+ * space.
+ *
+ * Since: 2.0
+ */
+void
+cogl_pango_show_layout (CoglFramebuffer *framebuffer,
+ PangoLayout *layout,
+ float x,
+ float y,
+ const CoglColor *color);
+
+/**
+ * cogl_pango_render_layout_line:
+ * @framebuffer: A #CoglFramebuffer to draw too.
+ * @line: a #PangoLayoutLine
+ * @x: X coordinate to render the line at
+ * @y: Y coordinate to render the line at
+ * @color: color to use when rendering the line
+ *
+ * Draws a solidly coloured @line on the given @framebuffer at (@x,
+ * @y) within the @framebuffer<!-- -->'s current model-view coordinate
+ * space.
+ *
+ * Since: 2.0
+ */
+void
+cogl_pango_show_layout_line (CoglFramebuffer *framebuffer,
+ PangoLayoutLine *line,
+ float x,
+ float y,
+ const CoglColor *color);
G_END_DECLS
-#endif /* __PANGO_CLUTTER_H__ */
+#endif /* __COGL_PANGO_H__ */
diff --git a/examples/cogl-crate.c b/examples/cogl-crate.c
index 9c7c20f..f6b67f3 100644
--- a/examples/cogl-crate.c
+++ b/examples/cogl-crate.c
@@ -121,12 +121,13 @@ paint (Data *data)
/* And finally render our Pango layouts... */
- cogl_pango_render_layout (data->hello_label,
- (data->framebuffer_width / 2) -
- (data->hello_label_width / 2),
- (data->framebuffer_height / 2) -
- (data->hello_label_height / 2),
- &white, 0);
+ cogl_pango_show_layout (fb,
+ data->hello_label,
+ (data->framebuffer_width / 2) -
+ (data->hello_label_width / 2),
+ (data->framebuffer_height / 2) -
+ (data->hello_label_height / 2),
+ &white);
}
static void
@@ -243,11 +244,12 @@ main (int argc, char **argv)
/* Setup a Pango font map and context */
- data.pango_font_map = COGL_PANGO_FONT_MAP (cogl_pango_font_map_new());
+ data.pango_font_map = COGL_PANGO_FONT_MAP (cogl_pango_font_map_new (ctx));
cogl_pango_font_map_set_use_mipmapping (data.pango_font_map, TRUE);
- data.pango_context = cogl_pango_font_map_create_context (data.pango_font_map);
+ data.pango_context =
+ pango_font_map_create_context (PANGO_FONT_MAP (data.pango_font_map));
data.pango_font_desc = pango_font_description_new ();
pango_font_description_set_family (data.pango_font_desc, "Sans");
--
1.7.7.6
More information about the Cogl
mailing list