summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorRyan Lortie <desrt@desrt.ca>2006-09-19 16:37:41 +0000
committerRyan Lortie <ryanl@src.gnome.org>2006-09-19 16:37:41 +0000
commit6893f3ef08e5dfd9d4cec0e405f9a30cdc83344f (patch)
treedc8414c36b3e7c1cda7fc2d14837aafd919bcdf3 /gdk
parentfb12bbcebbf5fe614ef9660f28505a31c9cd997d (diff)
downloadgtk+-6893f3ef08e5dfd9d4cec0e405f9a30cdc83344f.tar.gz
Bug 355343. Add a GdkPangoAttrEmbossColor.
2006-09-19 Ryan Lortie <desrt@desrt.ca> * docs/reference/gdk/gdk-sections.txt: * gdk/gdk.symbols: * gdk/gdkpango.h: * gdk/gdkpango.c: Bug 355343. Add a GdkPangoAttrEmbossColor. (gdk_pango_layout_get_clip_region): Remove an unused variable. (gdk_pango_attr_embossed_new): Fix documentation.
Diffstat (limited to 'gdk')
-rw-r--r--gdk/gdk.symbols1
-rw-r--r--gdk/gdkpango.c124
-rw-r--r--gdk/gdkpango.h8
3 files changed, 117 insertions, 16 deletions
diff --git a/gdk/gdk.symbols b/gdk/gdk.symbols
index b84fef78d6..34047da837 100644
--- a/gdk/gdk.symbols
+++ b/gdk/gdk.symbols
@@ -859,6 +859,7 @@ gdk_net_wm_supports
#if IN_HEADER(__GDK_PANGO_H__)
#if IN_FILE(__GDK_PANGO_C__)
+gdk_pango_attr_emboss_color_new
gdk_pango_attr_embossed_new
gdk_pango_attr_stipple_new
gdk_pango_context_get
diff --git a/gdk/gdkpango.c b/gdk/gdkpango.c
index a5c971dbcd..af01abe2c3 100644
--- a/gdk/gdkpango.c
+++ b/gdk/gdkpango.c
@@ -48,6 +48,7 @@ struct _GdkPangoRendererPrivate
gboolean override_color_set[MAX_RENDER_PART + 1];
GdkBitmap *stipple[MAX_RENDER_PART + 1];
+ PangoColor emboss_color;
gboolean embossed;
cairo_t *cr;
@@ -62,6 +63,7 @@ struct _GdkPangoRendererPrivate
static PangoAttrType gdk_pango_attr_stipple_type;
static PangoAttrType gdk_pango_attr_embossed_type;
+static PangoAttrType gdk_pango_attr_emboss_color_type;
enum {
PROP_0,
@@ -115,9 +117,11 @@ gdk_pango_renderer_constructor (GType type,
/* Adjusts matrix and color for the renderer to draw the secondary
* "shadow" copy for embossed text */
static void
-emboss_context (cairo_t *cr)
+emboss_context (GdkPangoRenderer *renderer, cairo_t *cr)
{
+ GdkPangoRendererPrivate *priv = renderer->priv;
cairo_matrix_t tmp_matrix;
+ double red, green, blue;
/* The gymnastics here to adjust the matrix are because we want
* to offset by +1,+1 in device-space, not in user-space,
@@ -128,11 +132,15 @@ emboss_context (cairo_t *cr)
tmp_matrix.y0 += 1.0;
cairo_set_matrix (cr, &tmp_matrix);
- cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
+ red = (double) priv->emboss_color.red / 65535.;
+ green = (double) priv->emboss_color.green / 65535.;
+ blue = (double) priv->emboss_color.blue / 65535.;
+
+ cairo_set_source_rgb (cr, red, green, blue);
}
static inline gboolean
-color_equal (PangoColor *c1, PangoColor *c2)
+color_equal (const PangoColor *c1, const PangoColor *c2)
{
if (!c1 && !c2)
return TRUE;
@@ -233,12 +241,12 @@ gdk_pango_renderer_draw_glyphs (PangoRenderer *renderer,
if (priv->embossed)
{
cairo_save (cr);
- emboss_context (cr);
+ emboss_context (gdk_renderer, cr);
cairo_move_to (cr, (double)x / PANGO_SCALE, (double)y / PANGO_SCALE);
pango_cairo_show_glyph_string (cr, font, glyphs);
cairo_restore (cr);
}
-
+
cairo_move_to (cr, (double)x / PANGO_SCALE, (double)y / PANGO_SCALE);
pango_cairo_show_glyph_string (cr, font, glyphs);
}
@@ -339,7 +347,7 @@ gdk_pango_renderer_draw_rectangle (PangoRenderer *renderer,
if (priv->embossed && part != PANGO_RENDER_PART_BACKGROUND)
{
cairo_save (cr);
- emboss_context (cr);
+ emboss_context (gdk_renderer, cr);
cairo_rectangle (cr,
(double)x / PANGO_SCALE, (double)y / PANGO_SCALE,
(double)width / PANGO_SCALE, (double)height / PANGO_SCALE);
@@ -370,7 +378,7 @@ gdk_pango_renderer_draw_error_underline (PangoRenderer *renderer,
if (priv->embossed)
{
cairo_save (cr);
- emboss_context (cr);
+ emboss_context (gdk_renderer, cr);
draw_error_underline (cr,
(double)x / PANGO_SCALE, (double)y / PANGO_SCALE,
(double)width / PANGO_SCALE, (double)height / PANGO_SCALE);
@@ -426,12 +434,15 @@ gdk_pango_renderer_prepare_run (PangoRenderer *renderer,
GdkPangoRenderer *gdk_renderer = GDK_PANGO_RENDERER (renderer);
gboolean embossed = FALSE;
GdkBitmap *stipple = NULL;
+ gboolean changed = FALSE;
+ PangoColor emboss_color;
GSList *l;
int i;
-
- embossed = FALSE;
- stipple = NULL;
-
+
+ emboss_color.red = 0xffff;
+ emboss_color.green = 0xffff;
+ emboss_color.blue = 0xffff;
+
for (l = run->item->analysis.extra_attrs; l; l = l->next)
{
PangoAttribute *attr = l->data;
@@ -448,6 +459,10 @@ gdk_pango_renderer_prepare_run (PangoRenderer *renderer,
{
embossed = ((GdkPangoAttrEmbossed*)attr)->embossed;
}
+ else if (attr->klass->type == gdk_pango_attr_emboss_color_type)
+ {
+ emboss_color = ((GdkPangoAttrEmbossColor*)attr)->color;
+ }
}
gdk_pango_renderer_set_stipple (gdk_renderer, PANGO_RENDER_PART_FOREGROUND, stipple);
@@ -458,9 +473,18 @@ gdk_pango_renderer_prepare_run (PangoRenderer *renderer,
if (embossed != gdk_renderer->priv->embossed)
{
gdk_renderer->priv->embossed = embossed;
- pango_renderer_part_changed (renderer, PANGO_RENDER_PART_FOREGROUND);
+ changed = TRUE;
+ }
+
+ if (!color_equal (&gdk_renderer->priv->emboss_color, &emboss_color))
+ {
+ gdk_renderer->priv->emboss_color = emboss_color;
+ changed = TRUE;
}
+ if (changed)
+ pango_renderer_part_changed (renderer, PANGO_RENDER_PART_FOREGROUND);
+
PANGO_RENDERER_CLASS (gdk_pango_renderer_parent_class)->prepare_run (renderer, run);
for (i = 0; i <= MAX_RENDER_PART; i++)
@@ -1091,6 +1115,8 @@ gdk_draw_layout (GdkDrawable *drawable,
gdk_draw_layout_with_colors (drawable, gc, x, y, layout, NULL, NULL);
}
+/* GdkPangoAttrStipple */
+
static PangoAttribute *
gdk_pango_attr_stipple_copy (const PangoAttribute *attr)
{
@@ -1157,6 +1183,8 @@ gdk_pango_attr_stipple_new (GdkBitmap *stipple)
return (PangoAttribute *)result;
}
+/* GdkPangoAttrEmbossed */
+
static PangoAttribute *
gdk_pango_attr_embossed_copy (const PangoAttribute *attr)
{
@@ -1183,10 +1211,9 @@ gdk_pango_attr_embossed_compare (const PangoAttribute *attr1,
/**
* gdk_pango_attr_embossed_new:
- * @embossed: a bitmap to be set as embossed
+ * @embossed: if the region should be embossed
*
- * Creates a new attribute containing a embossed bitmap to be used when
- * rendering the text.
+ * Creates a new attribute flagging a region as embossed or not.
*
* Return value: new #PangoAttribute
**/
@@ -1214,6 +1241,72 @@ gdk_pango_attr_embossed_new (gboolean embossed)
return (PangoAttribute *)result;
}
+/* GdkPangoAttrEmbossColor */
+
+static PangoAttribute *
+gdk_pango_attr_emboss_color_copy (const PangoAttribute *attr)
+{
+ const GdkPangoAttrEmbossColor *old = (const GdkPangoAttrEmbossColor*) attr;
+ GdkPangoAttrEmbossColor *copy;
+
+ copy = g_new (GdkPangoAttrEmbossColor, 1);
+ copy->attr.klass = old->attr.klass;
+ copy->color = old->color;
+
+ return (PangoAttribute *) copy;
+}
+
+static void
+gdk_pango_attr_emboss_color_destroy (PangoAttribute *attr)
+{
+ g_free (attr);
+}
+
+static gboolean
+gdk_pango_attr_emboss_color_compare (const PangoAttribute *attr1,
+ const PangoAttribute *attr2)
+{
+ const GdkPangoAttrEmbossColor *c1 = (const GdkPangoAttrEmbossColor*) attr1;
+ const GdkPangoAttrEmbossColor *c2 = (const GdkPangoAttrEmbossColor*) attr2;
+
+ return color_equal (&c1->color, &c2->color);
+}
+
+/**
+ * gdk_pango_attr_emboss_color_new:
+ * @color: a GdkColor representing the color to emboss with
+ *
+ * Creates a new attribute specifying the color to emboss text with.
+ *
+ * Return value: new #PangoAttribute
+ *
+ * Since: 2.12
+ **/
+PangoAttribute *
+gdk_pango_attr_emboss_color_new (const GdkColor *color)
+{
+ GdkPangoAttrEmbossColor *result;
+
+ static PangoAttrClass klass = {
+ 0,
+ gdk_pango_attr_emboss_color_copy,
+ gdk_pango_attr_emboss_color_destroy,
+ gdk_pango_attr_emboss_color_compare
+ };
+
+ if (!klass.type)
+ klass.type = gdk_pango_attr_emboss_color_type =
+ pango_attr_type_register ("GdkPangoAttrEmbossColor");
+
+ result = g_new (GdkPangoAttrEmbossColor, 1);
+ result->attr.klass = &klass;
+ result->color.red = color->red;
+ result->color.green = color->green;
+ result->color.blue = color->blue;
+
+ return (PangoAttribute *) result;
+}
+
/* Get a clip region to draw only part of a layout. index_ranges
* contains alternating range starts/stops. The region is the
* region which contains the given ranges, i.e. if you draw with the
@@ -1366,7 +1459,6 @@ gdk_pango_layout_get_clip_region (PangoLayout *layout,
do
{
PangoRectangle logical_rect;
- PangoLayoutLine *line;
GdkRegion *line_region;
gint baseline;
diff --git a/gdk/gdkpango.h b/gdk/gdkpango.h
index 496faf01fb..b2fef357ca 100644
--- a/gdk/gdkpango.h
+++ b/gdk/gdkpango.h
@@ -133,6 +133,7 @@ GdkRegion *gdk_pango_layout_get_clip_region (PangoLayout *layout,
typedef struct _GdkPangoAttrStipple GdkPangoAttrStipple;
typedef struct _GdkPangoAttrEmbossed GdkPangoAttrEmbossed;
+typedef struct _GdkPangoAttrEmbossColor GdkPangoAttrEmbossColor;
struct _GdkPangoAttrStipple
{
@@ -146,8 +147,15 @@ struct _GdkPangoAttrEmbossed
gboolean embossed;
};
+struct _GdkPangoAttrEmbossColor
+{
+ PangoAttribute attr;
+ PangoColor color;
+};
+
PangoAttribute *gdk_pango_attr_stipple_new (GdkBitmap *stipple);
PangoAttribute *gdk_pango_attr_embossed_new (gboolean embossed);
+PangoAttribute *gdk_pango_attr_emboss_color_new (const GdkColor *color);
G_END_DECLS