summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/theme-format.txt2
-rw-r--r--src/ui/theme-parser.c16
-rw-r--r--src/ui/theme-private.h3
-rw-r--r--src/ui/theme.c413
4 files changed, 9 insertions, 425 deletions
diff --git a/doc/theme-format.txt b/doc/theme-format.txt
index 2a58e3550..0607c6eb7 100644
--- a/doc/theme-format.txt
+++ b/doc/theme-format.txt
@@ -259,8 +259,6 @@ Overview of Theme Format Version 1
<!-- color obtained by a 0.5 alpha composite of the second color onto the first -->
<color value="blend/gtk:bg[SELECTED]/gtk:fg[SELECTED]/0.5"/>
</gradient>
- <!-- image has an optional colorize="#color" attribute to give the
- image a certain color -->
<image filename="foo.png" alpha="0.7"
x="10" y="30" width="width / 3" height="height / 4"/>
<gtk_arrow state="normal" shadow="in" arrow="up"
diff --git a/src/ui/theme-parser.c b/src/ui/theme-parser.c
index 014668c41..b79328077 100644
--- a/src/ui/theme-parser.c
+++ b/src/ui/theme-parser.c
@@ -2149,10 +2149,8 @@ parse_draw_op_element (GMarkupParseContext *context,
const char *y;
const char *width;
const char *height;
- const char *colorize;
const char *fill_type;
GdkPixbuf *pixbuf;
- MetaColorSpec *colorize_spec = NULL;
MetaImageFillType fill_type_val;
int h, w, c;
int pixbuf_width, pixbuf_height, pixbuf_n_channels, pixbuf_rowstride;
@@ -2163,7 +2161,6 @@ parse_draw_op_element (GMarkupParseContext *context,
"!x", &x, "!y", &y,
"!width", &width, "!height", &height,
"!filename", &filename,
- "colorize", &colorize,
"fill_type", &fill_type,
NULL))
return;
@@ -2209,22 +2206,9 @@ parse_draw_op_element (GMarkupParseContext *context,
return;
}
- if (colorize)
- {
- colorize_spec = parse_color (info->theme, colorize, error);
-
- if (colorize_spec == NULL)
- {
- add_context_to_error (error, context);
- g_object_unref (G_OBJECT (pixbuf));
- return;
- }
- }
-
op = meta_draw_op_new (META_DRAW_IMAGE);
op->data.image.pixbuf = pixbuf;
- op->data.image.colorize_spec = colorize_spec;
op->data.image.x = meta_draw_spec_new (info->theme, x, NULL);
op->data.image.y = meta_draw_spec_new (info->theme, y, NULL);
diff --git a/src/ui/theme-private.h b/src/ui/theme-private.h
index 6e7afd0de..be3e227cf 100644
--- a/src/ui/theme-private.h
+++ b/src/ui/theme-private.h
@@ -545,15 +545,12 @@ struct _MetaDrawOp
} gradient;
struct {
- MetaColorSpec *colorize_spec;
GdkPixbuf *pixbuf;
MetaDrawSpec *x;
MetaDrawSpec *y;
MetaDrawSpec *width;
MetaDrawSpec *height;
- guint32 colorize_cache_pixel;
- GdkPixbuf *colorize_cache_pixbuf;
MetaImageFillType fill_type;
unsigned int vertical_stripes : 1;
unsigned int horizontal_stripes : 1;
diff --git a/src/ui/theme.c b/src/ui/theme.c
index eb4fd5c27..85ae04b3b 100644
--- a/src/ui/theme.c
+++ b/src/ui/theme.c
@@ -74,84 +74,6 @@ static void hls_to_rgb (gdouble *h,
*/
static MetaTheme *meta_current_theme = NULL;
-static GdkPixbuf *
-colorize_pixbuf (GdkPixbuf *orig,
- GdkRGBA *new_color)
-{
- GdkPixbuf *pixbuf;
- double intensity;
- int x, y;
- const guchar *src;
- guchar *dest;
- int orig_rowstride;
- int dest_rowstride;
- int width, height;
- gboolean has_alpha;
- const guchar *src_pixels;
- guchar *dest_pixels;
-
- pixbuf = gdk_pixbuf_new (gdk_pixbuf_get_colorspace (orig), gdk_pixbuf_get_has_alpha (orig),
- gdk_pixbuf_get_bits_per_sample (orig),
- gdk_pixbuf_get_width (orig), gdk_pixbuf_get_height (orig));
-
- if (pixbuf == NULL)
- return NULL;
-
- orig_rowstride = gdk_pixbuf_get_rowstride (orig);
- dest_rowstride = gdk_pixbuf_get_rowstride (pixbuf);
- width = gdk_pixbuf_get_width (pixbuf);
- height = gdk_pixbuf_get_height (pixbuf);
- has_alpha = gdk_pixbuf_get_has_alpha (orig);
- src_pixels = gdk_pixbuf_get_pixels (orig);
- dest_pixels = gdk_pixbuf_get_pixels (pixbuf);
-
- for (y = 0; y < height; y++)
- {
- src = src_pixels + y * orig_rowstride;
- dest = dest_pixels + y * dest_rowstride;
-
- for (x = 0; x < width; x++)
- {
- double dr, dg, db;
-
- intensity = INTENSITY (src[0], src[1], src[2]) / 255.0;
-
- if (intensity <= 0.5)
- {
- /* Go from black at intensity = 0.0 to new_color at intensity = 0.5 */
- dr = new_color->red * intensity * 2.0;
- dg = new_color->green * intensity * 2.0;
- db = new_color->blue * intensity * 2.0;
- }
- else
- {
- /* Go from new_color at intensity = 0.5 to white at intensity = 1.0 */
- dr = new_color->red + (1.0 - new_color->red) * (intensity - 0.5) * 2.0;
- dg = new_color->green + (1.0 - new_color->green) * (intensity - 0.5) * 2.0;
- db = new_color->blue + (1.0 - new_color->blue) * (intensity - 0.5) * 2.0;
- }
-
- dest[0] = CLAMP_UCHAR (255 * dr);
- dest[1] = CLAMP_UCHAR (255 * dg);
- dest[2] = CLAMP_UCHAR (255 * db);
-
- if (has_alpha)
- {
- dest[3] = src[3];
- src += 4;
- dest += 4;
- }
- else
- {
- src += 3;
- dest += 3;
- }
- }
- }
-
- return pixbuf;
-}
-
static void
color_composite (const GdkRGBA *bg,
const GdkRGBA *fg,
@@ -3093,12 +3015,6 @@ meta_draw_op_free (MetaDrawOp *op)
if (op->data.image.pixbuf)
g_object_unref (G_OBJECT (op->data.image.pixbuf));
- if (op->data.image.colorize_spec)
- meta_color_spec_free (op->data.image.colorize_spec);
-
- if (op->data.image.colorize_cache_pixbuf)
- g_object_unref (G_OBJECT (op->data.image.colorize_cache_pixbuf));
-
meta_draw_spec_free (op->data.image.x);
meta_draw_spec_free (op->data.image.y);
meta_draw_spec_free (op->data.image.width);
@@ -3170,299 +3086,6 @@ meta_draw_op_free (MetaDrawOp *op)
g_free (op);
}
-static GdkPixbuf*
-pixbuf_tile (GdkPixbuf *tile,
- int width,
- int height)
-{
- GdkPixbuf *pixbuf;
- int tile_width;
- int tile_height;
- int i, j;
-
- tile_width = gdk_pixbuf_get_width (tile);
- tile_height = gdk_pixbuf_get_height (tile);
-
- pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
- gdk_pixbuf_get_has_alpha (tile),
- 8, width, height);
-
- i = 0;
- while (i < width)
- {
- j = 0;
- while (j < height)
- {
- int w, h;
-
- w = MIN (tile_width, width - i);
- h = MIN (tile_height, height - j);
-
- gdk_pixbuf_copy_area (tile,
- 0, 0,
- w, h,
- pixbuf,
- i, j);
-
- j += tile_height;
- }
-
- i += tile_width;
- }
-
- return pixbuf;
-}
-
-static GdkPixbuf *
-replicate_rows (GdkPixbuf *src,
- int src_x,
- int src_y,
- int width,
- int height)
-{
- unsigned int n_channels = gdk_pixbuf_get_n_channels (src);
- unsigned int src_rowstride = gdk_pixbuf_get_rowstride (src);
- unsigned char *pixels = (gdk_pixbuf_get_pixels (src) + src_y * src_rowstride + src_x
- * n_channels);
- unsigned char *dest_pixels;
- GdkPixbuf *result;
- unsigned int dest_rowstride;
- int i;
-
- result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, n_channels == 4, 8,
- width, height);
- dest_rowstride = gdk_pixbuf_get_rowstride (result);
- dest_pixels = gdk_pixbuf_get_pixels (result);
-
- for (i = 0; i < height; i++)
- memcpy (dest_pixels + dest_rowstride * i, pixels, n_channels * width);
-
- return result;
-}
-
-static GdkPixbuf *
-replicate_cols (GdkPixbuf *src,
- int src_x,
- int src_y,
- int width,
- int height)
-{
- unsigned int n_channels = gdk_pixbuf_get_n_channels (src);
- unsigned int src_rowstride = gdk_pixbuf_get_rowstride (src);
- unsigned char *pixels = (gdk_pixbuf_get_pixels (src) + src_y * src_rowstride + src_x
- * n_channels);
- unsigned char *dest_pixels;
- GdkPixbuf *result;
- unsigned int dest_rowstride;
- int i, j;
-
- result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, n_channels == 4, 8,
- width, height);
- dest_rowstride = gdk_pixbuf_get_rowstride (result);
- dest_pixels = gdk_pixbuf_get_pixels (result);
-
- for (i = 0; i < height; i++)
- {
- unsigned char *p = dest_pixels + dest_rowstride * i;
- unsigned char *q = pixels + src_rowstride * i;
-
- unsigned char r = *(q++);
- unsigned char g = *(q++);
- unsigned char b = *(q++);
-
- if (n_channels == 4)
- {
- unsigned char a;
-
- a = *(q++);
-
- for (j = 0; j < width; j++)
- {
- *(p++) = r;
- *(p++) = g;
- *(p++) = b;
- *(p++) = a;
- }
- }
- else
- {
- for (j = 0; j < width; j++)
- {
- *(p++) = r;
- *(p++) = g;
- *(p++) = b;
- }
- }
- }
-
- return result;
-}
-
-static GdkPixbuf*
-scale_and_alpha_pixbuf (GdkPixbuf *src,
- MetaImageFillType fill_type,
- int width,
- int height,
- gboolean vertical_stripes,
- gboolean horizontal_stripes)
-{
- GdkPixbuf *pixbuf;
- GdkPixbuf *temp_pixbuf;
-
- pixbuf = NULL;
-
- pixbuf = src;
-
- if (gdk_pixbuf_get_width (pixbuf) == width &&
- gdk_pixbuf_get_height (pixbuf) == height)
- {
- g_object_ref (G_OBJECT (pixbuf));
- }
- else
- {
- if (fill_type == META_IMAGE_FILL_TILE)
- {
- pixbuf = pixbuf_tile (pixbuf, width, height);
- }
- else
- {
- int src_h, src_w, dest_h, dest_w;
- src_h = gdk_pixbuf_get_height (src);
- src_w = gdk_pixbuf_get_width (src);
-
- /* prefer to replicate_cols if possible, as that
- * is faster (no memory reads)
- */
- if (horizontal_stripes)
- {
- dest_w = gdk_pixbuf_get_width (src);
- dest_h = height;
- }
- else if (vertical_stripes)
- {
- dest_w = width;
- dest_h = gdk_pixbuf_get_height (src);
- }
-
- else
- {
- dest_w = width;
- dest_h = height;
- }
-
- if (dest_w == src_w && dest_h == src_h)
- {
- temp_pixbuf = src;
- g_object_ref (G_OBJECT (temp_pixbuf));
- }
- else
- {
- temp_pixbuf = gdk_pixbuf_scale_simple (src,
- dest_w, dest_h,
- GDK_INTERP_BILINEAR);
- }
-
- /* prefer to replicate_cols if possible, as that
- * is faster (no memory reads)
- */
- if (horizontal_stripes)
- {
- pixbuf = replicate_cols (temp_pixbuf, 0, 0, width, height);
- g_object_unref (G_OBJECT (temp_pixbuf));
- }
- else if (vertical_stripes)
- {
- pixbuf = replicate_rows (temp_pixbuf, 0, 0, width, height);
- g_object_unref (G_OBJECT (temp_pixbuf));
- }
- else
- {
- pixbuf = temp_pixbuf;
- }
- }
- }
-
- return pixbuf;
-}
-
-static GdkPixbuf*
-draw_op_as_pixbuf (const MetaDrawOp *op,
- GtkStyleContext *context,
- const MetaDrawInfo *info,
- int width,
- int height)
-{
- /* Try to get the op as a pixbuf, assuming w/h in the op
- * matches the width/height passed in. return NULL
- * if the op can't be converted to an equivalent pixbuf.
- */
- GdkPixbuf *pixbuf;
-
- pixbuf = NULL;
-
- switch (op->type)
- {
- case META_DRAW_IMAGE:
- {
- if (op->data.image.colorize_spec)
- {
- GdkRGBA color;
-
- meta_color_spec_render (op->data.image.colorize_spec,
- context, &color);
-
- if (op->data.image.colorize_cache_pixbuf == NULL ||
- op->data.image.colorize_cache_pixel != GDK_COLOR_RGB (color))
- {
- if (op->data.image.colorize_cache_pixbuf)
- g_object_unref (G_OBJECT (op->data.image.colorize_cache_pixbuf));
-
- /* const cast here */
- ((MetaDrawOp*)op)->data.image.colorize_cache_pixbuf =
- colorize_pixbuf (op->data.image.pixbuf,
- &color);
- ((MetaDrawOp*)op)->data.image.colorize_cache_pixel =
- GDK_COLOR_RGB (color);
- }
-
- if (op->data.image.colorize_cache_pixbuf)
- {
- pixbuf = scale_and_alpha_pixbuf (op->data.image.colorize_cache_pixbuf,
- op->data.image.fill_type,
- width, height,
- op->data.image.vertical_stripes,
- op->data.image.horizontal_stripes);
- }
- }
- else
- {
- pixbuf = scale_and_alpha_pixbuf (op->data.image.pixbuf,
- op->data.image.fill_type,
- width, height,
- op->data.image.vertical_stripes,
- op->data.image.horizontal_stripes);
- }
- break;
- }
- case META_DRAW_TINT:
- case META_DRAW_ICON:
- case META_DRAW_LINE:
- case META_DRAW_RECTANGLE:
- case META_DRAW_ARC:
- case META_DRAW_CLIP:
- case META_DRAW_GRADIENT:
- case META_DRAW_GTK_ARROW:
- case META_DRAW_GTK_BOX:
- case META_DRAW_GTK_VLINE:
- case META_DRAW_TITLE:
- case META_DRAW_OP_LIST:
- case META_DRAW_TILE:
- break;
- }
-
- return pixbuf;
-}
-
static void
draw_image (cairo_t *cr,
GdkPixbuf *src,
@@ -3762,13 +3385,12 @@ meta_draw_op_draw_with_env (const MetaDrawOp *op,
case META_DRAW_IMAGE:
{
int rx, ry, rwidth, rheight;
- GdkPixbuf *pixbuf;
- if (op->data.image.pixbuf)
- {
- env->object_width = gdk_pixbuf_get_width (op->data.image.pixbuf);
- env->object_height = gdk_pixbuf_get_height (op->data.image.pixbuf);
- }
+ if (op->data.image.pixbuf == NULL)
+ break;
+
+ env->object_width = gdk_pixbuf_get_width (op->data.image.pixbuf);
+ env->object_height = gdk_pixbuf_get_height (op->data.image.pixbuf);
rx = parse_x_position_unchecked (op->data.image.x, env);
ry = parse_y_position_unchecked (op->data.image.y, env);
@@ -3776,27 +3398,10 @@ meta_draw_op_draw_with_env (const MetaDrawOp *op,
rwidth = parse_size_unchecked (op->data.image.width, env);
rheight = parse_size_unchecked (op->data.image.height, env);
- if (op->data.image.pixbuf != NULL &&
- op->data.image.colorize_spec == NULL)
- {
- draw_image (cr,
- op->data.image.pixbuf,
- op->data.image.fill_type,
- rx, ry, rwidth, rheight);
- }
- else if (op->data.image.colorize_spec != NULL)
- {
- pixbuf = draw_op_as_pixbuf (op, style_gtk, info,
- rwidth, rheight);
-
- if (pixbuf)
- {
- gdk_cairo_set_source_pixbuf (cr, pixbuf, rx, ry);
- cairo_paint (cr);
-
- g_object_unref (G_OBJECT (pixbuf));
- }
- }
+ draw_image (cr,
+ op->data.image.pixbuf,
+ op->data.image.fill_type,
+ rwidth, rheight, rx, ry);
}
break;