[gimp] Bug 631934 - Interaction between Old text parameters and new region specific text attributes
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Bug 631934 - Interaction between Old text parameters and new region specific text attributes
- Date: Fri, 29 Oct 2010 02:46:34 +0000 (UTC)
commit dcdc09872dcdec71c24b8204bfa9ff41238eefb8
Author: Michael Natterer <mitch gimp org>
Date: Fri Oct 29 04:45:12 2010 +0200
Bug 631934 - Interaction between Old text parameters and new region specific text attributes
This patch inserts GimpText's property values as attributes into the
rendered markup and work transparently for both the tool options and
the text PDB API.
app/text/gimptextlayout.c | 129 ++++++++++++++++++++++++++++++++++----------
1 files changed, 99 insertions(+), 30 deletions(-)
---
diff --git a/app/text/gimptextlayout.c b/app/text/gimptextlayout.c
index ad30ee9..38faf72 100644
--- a/app/text/gimptextlayout.c
+++ b/app/text/gimptextlayout.c
@@ -20,10 +20,13 @@
#include "config.h"
+#include <string.h>
+
#include <gegl.h>
#include <pango/pangocairo.h>
#include "libgimpbase/gimpbase.h"
+#include "libgimpcolor/gimpcolor.h"
#include "libgimpmath/gimpmath.h"
#include "text-types.h"
@@ -49,7 +52,7 @@ struct _GimpTextLayout
static void gimp_text_layout_finalize (GObject *object);
static void gimp_text_layout_position (GimpTextLayout *layout);
-static void gimp_text_layout_set_attrs (GimpTextLayout *layout);
+static void gimp_text_layout_set_markup (GimpTextLayout *layout);
static PangoContext * gimp_text_get_pango_context (GimpText *text,
gdouble xres,
@@ -144,14 +147,7 @@ gimp_text_layout_new (GimpText *text,
pango_layout_set_font_description (layout->layout, font_desc);
pango_font_description_free (font_desc);
- gimp_text_layout_set_attrs (layout);
-
- if (text->markup)
- pango_layout_set_markup (layout->layout, text->markup, -1);
- else if (text->text)
- pango_layout_set_text (layout->layout, text->text, -1);
- else
- pango_layout_set_text (layout->layout, NULL, 0);
+ gimp_text_layout_set_markup (layout);
switch (text->justify)
{
@@ -458,40 +454,113 @@ gimp_text_layout_untransform_distance (GimpTextLayout *layout,
}
}
-static void
-gimp_text_layout_set_attrs (GimpTextLayout *layout)
+static gboolean
+gimp_text_layout_split_markup (const gchar *markup,
+ gchar **open_tag,
+ gchar **content,
+ gchar **close_tag)
{
- GimpText *text = layout->text;
- PangoAttrList *attrs;
- PangoAttribute *attr;
+ gchar *p_open;
+ gchar *p_close;
+
+ p_open = strstr (markup, "<markup>");
+ if (! p_open)
+ return FALSE;
+
+ *open_tag = g_strndup (markup, p_open - markup + strlen ("<markup>"));
+
+ p_close = g_strrstr (markup, "</markup>");
+ if (! p_close)
+ {
+ g_free (*open_tag);
+ return FALSE;
+ }
+
+ *close_tag = g_strdup (p_close);
- attrs = pango_layout_get_attributes (layout->layout);
- if (attrs)
- pango_attr_list_ref (attrs);
+ if (p_open + strlen ("<markup>") < p_close)
+ {
+ *content = g_strndup (p_open + strlen ("<markup>"),
+ p_close - p_open - strlen ("<markup>"));
+ }
else
- attrs = pango_attr_list_new ();
+ {
+ *content = g_strdup ("");
+ }
+
+ return TRUE;
+}
+
+static gchar *
+gimp_text_layout_apply_tags (GimpTextLayout *layout,
+ const gchar *markup)
+{
+ GimpText *text = layout->text;
+ gchar *result;
- attr = pango_attr_foreground_new (text->color.r * 65535,
- text->color.g * 65535,
- text->color.b * 65535);
+ {
+ guchar r, g, b;
- attr->start_index = 0;
- attr->end_index = -1;
+ gimp_rgb_get_uchar (&text->color, &r, &g, &b);
- pango_attr_list_insert (attrs, attr);
+ result = g_strdup_printf ("<span color=\"#%02x%02x%02x\">%s</span>",
+ r, g, b, markup);
+ }
if (fabs (text->letter_spacing) > 0.1)
{
- attr = pango_attr_letter_spacing_new (text->letter_spacing * PANGO_SCALE);
+ gchar *tmp = g_strdup_printf ("<span letter_spacing=\"%d\">%s</span>",
+ (gint) (text->letter_spacing * PANGO_SCALE),
+ result);
+ g_free (result);
+ result = tmp;
+ }
- attr->start_index = 0;
- attr->end_index = -1;
+ return result;
+}
+
+static void
+gimp_text_layout_set_markup (GimpTextLayout *layout)
+{
+ GimpText *text = layout->text;
+ gchar *open_tag = NULL;
+ gchar *content = NULL;
+ gchar *close_tag = NULL;
+ gchar *tagged;
+ gchar *markup;
+
+ if (text->markup)
+ {
+ if (! gimp_text_layout_split_markup (text->markup,
+ &open_tag, &content, &close_tag))
+ {
+ open_tag = g_strdup ("<markup>");
+ content = g_strdup ("");
+ close_tag = g_strdup ("</markup>");
+ }
+ }
+ else
+ {
+ open_tag = g_strdup ("<markup>");
+ close_tag = g_strdup ("</markup>");
- pango_attr_list_insert (attrs, attr);
+ if (text->text)
+ content = g_markup_escape_text (text->text, -1);
+ else
+ content = g_strdup ("");
}
- pango_layout_set_attributes (layout->layout, attrs);
- pango_attr_list_unref (attrs);
+ tagged = gimp_text_layout_apply_tags (layout, content);
+
+ g_free (content);
+
+ markup = g_strconcat (open_tag, tagged, close_tag, NULL);
+
+ g_free (open_tag);
+ g_free (tagged);
+ g_free (close_tag);
+
+ pango_layout_set_markup (layout->layout, markup, -1);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]