forked from AuroraMiddleware/gtk
Support tinting in GtkCellRendererPixbuf (#162903, Jorn Baayen):
2005-01-20 Matthias Clasen <mclasen@redhat.com> Support tinting in GtkCellRendererPixbuf (#162903, Jorn Baayen): * gtk/gtkcellrendererpixbuf.c (gtk_cell_renderer_pixbuf_class_init) Add a follow-state property which when TRUE causes the pixbuf to be tinted according to state. * gtk/gtkcellrendererpixbuf.c (gtk_cell_renderer_pixbuf_render): Use follow-state and colorize the pixbuf when appropriate.
This commit is contained in:
parent
889e66decd
commit
9726395dd6
11
ChangeLog
11
ChangeLog
@ -1,3 +1,14 @@
|
|||||||
|
2005-01-20 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
|
Support tinting in GtkCellRendererPixbuf (#162903, Jorn Baayen):
|
||||||
|
|
||||||
|
* gtk/gtkcellrendererpixbuf.c (gtk_cell_renderer_pixbuf_class_init)
|
||||||
|
Add a follow-state property which when TRUE causes the pixbuf
|
||||||
|
to be tinted according to state.
|
||||||
|
|
||||||
|
* gtk/gtkcellrendererpixbuf.c (gtk_cell_renderer_pixbuf_render):
|
||||||
|
Use follow-state and colorize the pixbuf when appropriate.
|
||||||
|
|
||||||
2005-01-20 Matthias Clasen <mclasen@redhat.com>
|
2005-01-20 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
Support wrapping in GtkCellRendererText (#163608):
|
Support wrapping in GtkCellRendererText (#163608):
|
||||||
|
@ -1,3 +1,14 @@
|
|||||||
|
2005-01-20 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
|
Support tinting in GtkCellRendererPixbuf (#162903, Jorn Baayen):
|
||||||
|
|
||||||
|
* gtk/gtkcellrendererpixbuf.c (gtk_cell_renderer_pixbuf_class_init)
|
||||||
|
Add a follow-state property which when TRUE causes the pixbuf
|
||||||
|
to be tinted according to state.
|
||||||
|
|
||||||
|
* gtk/gtkcellrendererpixbuf.c (gtk_cell_renderer_pixbuf_render):
|
||||||
|
Use follow-state and colorize the pixbuf when appropriate.
|
||||||
|
|
||||||
2005-01-20 Matthias Clasen <mclasen@redhat.com>
|
2005-01-20 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
Support wrapping in GtkCellRendererText (#163608):
|
Support wrapping in GtkCellRendererText (#163608):
|
||||||
|
@ -1,3 +1,14 @@
|
|||||||
|
2005-01-20 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
|
Support tinting in GtkCellRendererPixbuf (#162903, Jorn Baayen):
|
||||||
|
|
||||||
|
* gtk/gtkcellrendererpixbuf.c (gtk_cell_renderer_pixbuf_class_init)
|
||||||
|
Add a follow-state property which when TRUE causes the pixbuf
|
||||||
|
to be tinted according to state.
|
||||||
|
|
||||||
|
* gtk/gtkcellrendererpixbuf.c (gtk_cell_renderer_pixbuf_render):
|
||||||
|
Use follow-state and colorize the pixbuf when appropriate.
|
||||||
|
|
||||||
2005-01-20 Matthias Clasen <mclasen@redhat.com>
|
2005-01-20 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
Support wrapping in GtkCellRendererText (#163608):
|
Support wrapping in GtkCellRendererText (#163608):
|
||||||
|
@ -60,7 +60,8 @@ enum {
|
|||||||
PROP_PIXBUF_EXPANDER_CLOSED,
|
PROP_PIXBUF_EXPANDER_CLOSED,
|
||||||
PROP_STOCK_ID,
|
PROP_STOCK_ID,
|
||||||
PROP_STOCK_SIZE,
|
PROP_STOCK_SIZE,
|
||||||
PROP_STOCK_DETAIL
|
PROP_STOCK_DETAIL,
|
||||||
|
PROP_FOLLOW_STATE
|
||||||
};
|
};
|
||||||
|
|
||||||
static gpointer parent_class;
|
static gpointer parent_class;
|
||||||
@ -74,6 +75,7 @@ struct _GtkCellRendererPixbufPrivate
|
|||||||
gchar *stock_id;
|
gchar *stock_id;
|
||||||
GtkIconSize stock_size;
|
GtkIconSize stock_size;
|
||||||
gchar *stock_detail;
|
gchar *stock_detail;
|
||||||
|
gboolean follow_state;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -183,6 +185,24 @@ gtk_cell_renderer_pixbuf_class_init (GtkCellRendererPixbufClass *class)
|
|||||||
NULL,
|
NULL,
|
||||||
G_PARAM_READWRITE));
|
G_PARAM_READWRITE));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GtkCellRendererPixbuf:follow-state:
|
||||||
|
*
|
||||||
|
* Specifies whether the rendered pixbuf should be colorized
|
||||||
|
* according to the #GtkCellRendererState.
|
||||||
|
*
|
||||||
|
* Since: 2.8
|
||||||
|
*/
|
||||||
|
g_object_class_install_property (object_class,
|
||||||
|
PROP_FOLLOW_STATE,
|
||||||
|
g_param_spec_boolean ("follow_state",
|
||||||
|
P_("Follow State"),
|
||||||
|
P_("Whether the rendered pixbuf should be "
|
||||||
|
"colorized according to the state"),
|
||||||
|
FALSE,
|
||||||
|
G_PARAM_READWRITE));
|
||||||
|
|
||||||
|
|
||||||
g_type_class_add_private (object_class, sizeof (GtkCellRendererPixbufPrivate));
|
g_type_class_add_private (object_class, sizeof (GtkCellRendererPixbufPrivate));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -240,6 +260,9 @@ gtk_cell_renderer_pixbuf_get_property (GObject *object,
|
|||||||
case PROP_STOCK_DETAIL:
|
case PROP_STOCK_DETAIL:
|
||||||
g_value_set_string (value, priv->stock_detail);
|
g_value_set_string (value, priv->stock_detail);
|
||||||
break;
|
break;
|
||||||
|
case PROP_FOLLOW_STATE:
|
||||||
|
g_value_set_boolean (value, priv->follow_state);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -305,6 +328,9 @@ gtk_cell_renderer_pixbuf_set_property (GObject *object,
|
|||||||
g_free (priv->stock_detail);
|
g_free (priv->stock_detail);
|
||||||
priv->stock_detail = g_strdup (g_value_get_string (value));
|
priv->stock_detail = g_strdup (g_value_get_string (value));
|
||||||
break;
|
break;
|
||||||
|
case PROP_FOLLOW_STATE:
|
||||||
|
priv->follow_state = g_value_get_boolean (value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -353,6 +379,53 @@ gtk_cell_renderer_pixbuf_create_stock_pixbuf (GtkCellRendererPixbuf *cellpixbuf,
|
|||||||
priv->stock_detail);
|
priv->stock_detail);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GdkPixbuf *
|
||||||
|
create_colorized_pixbuf (GdkPixbuf *src,
|
||||||
|
GdkColor *new_color)
|
||||||
|
{
|
||||||
|
gint i, j;
|
||||||
|
gint width, height, has_alpha, src_row_stride, dst_row_stride;
|
||||||
|
gint red_value, green_value, blue_value;
|
||||||
|
guchar *target_pixels;
|
||||||
|
guchar *original_pixels;
|
||||||
|
guchar *pixsrc;
|
||||||
|
guchar *pixdest;
|
||||||
|
GdkPixbuf *dest;
|
||||||
|
|
||||||
|
red_value = new_color->red / 255.0;
|
||||||
|
green_value = new_color->green / 255.0;
|
||||||
|
blue_value = new_color->blue / 255.0;
|
||||||
|
|
||||||
|
dest = gdk_pixbuf_new (gdk_pixbuf_get_colorspace (src),
|
||||||
|
gdk_pixbuf_get_has_alpha (src),
|
||||||
|
gdk_pixbuf_get_bits_per_sample (src),
|
||||||
|
gdk_pixbuf_get_width (src),
|
||||||
|
gdk_pixbuf_get_height (src));
|
||||||
|
|
||||||
|
has_alpha = gdk_pixbuf_get_has_alpha (src);
|
||||||
|
width = gdk_pixbuf_get_width (src);
|
||||||
|
height = gdk_pixbuf_get_height (src);
|
||||||
|
src_row_stride = gdk_pixbuf_get_rowstride (src);
|
||||||
|
dst_row_stride = gdk_pixbuf_get_rowstride (dest);
|
||||||
|
target_pixels = gdk_pixbuf_get_pixels (dest);
|
||||||
|
original_pixels = gdk_pixbuf_get_pixels (src);
|
||||||
|
|
||||||
|
for (i = 0; i < height; i++) {
|
||||||
|
pixdest = target_pixels + i*dst_row_stride;
|
||||||
|
pixsrc = original_pixels + i*src_row_stride;
|
||||||
|
for (j = 0; j < width; j++) {
|
||||||
|
*pixdest++ = (*pixsrc++ * red_value) >> 8;
|
||||||
|
*pixdest++ = (*pixsrc++ * green_value) >> 8;
|
||||||
|
*pixdest++ = (*pixsrc++ * blue_value) >> 8;
|
||||||
|
if (has_alpha) {
|
||||||
|
*pixdest++ = *pixsrc++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_cell_renderer_pixbuf_get_size (GtkCellRenderer *cell,
|
gtk_cell_renderer_pixbuf_get_size (GtkCellRenderer *cell,
|
||||||
GtkWidget *widget,
|
GtkWidget *widget,
|
||||||
@ -434,6 +507,7 @@ gtk_cell_renderer_pixbuf_render (GtkCellRenderer *cell,
|
|||||||
GtkCellRendererPixbufPrivate *priv;
|
GtkCellRendererPixbufPrivate *priv;
|
||||||
GdkPixbuf *pixbuf;
|
GdkPixbuf *pixbuf;
|
||||||
GdkPixbuf *invisible = NULL;
|
GdkPixbuf *invisible = NULL;
|
||||||
|
GdkPixbuf *colorized = NULL;
|
||||||
GdkRectangle pix_rect;
|
GdkRectangle pix_rect;
|
||||||
GdkRectangle draw_rect;
|
GdkRectangle draw_rect;
|
||||||
gboolean stock_pixbuf = FALSE;
|
gboolean stock_pixbuf = FALSE;
|
||||||
@ -470,6 +544,10 @@ gtk_cell_renderer_pixbuf_render (GtkCellRenderer *cell,
|
|||||||
pix_rect.width -= cell->xpad * 2;
|
pix_rect.width -= cell->xpad * 2;
|
||||||
pix_rect.height -= cell->ypad * 2;
|
pix_rect.height -= cell->ypad * 2;
|
||||||
|
|
||||||
|
if (!gdk_rectangle_intersect (cell_area, &pix_rect, &draw_rect) ||
|
||||||
|
!gdk_rectangle_intersect (expose_area, &draw_rect, &draw_rect))
|
||||||
|
return;
|
||||||
|
|
||||||
if (GTK_WIDGET_STATE (widget) == GTK_STATE_INSENSITIVE || !cell->sensitive)
|
if (GTK_WIDGET_STATE (widget) == GTK_STATE_INSENSITIVE || !cell->sensitive)
|
||||||
{
|
{
|
||||||
GtkIconSource *source;
|
GtkIconSource *source;
|
||||||
@ -496,22 +574,43 @@ gtk_cell_renderer_pixbuf_render (GtkCellRenderer *cell,
|
|||||||
|
|
||||||
pixbuf = invisible;
|
pixbuf = invisible;
|
||||||
}
|
}
|
||||||
|
else if (priv->follow_state &&
|
||||||
|
(flags & (GTK_CELL_RENDERER_SELECTED|GTK_CELL_RENDERER_PRELIT) != 0))
|
||||||
|
{
|
||||||
|
GtkStateType state;
|
||||||
|
|
||||||
if (gdk_rectangle_intersect (cell_area, &pix_rect, &draw_rect) &&
|
if (flags & GTK_CELL_RENDERER_SELECTED != 0)
|
||||||
gdk_rectangle_intersect (expose_area, &draw_rect, &draw_rect))
|
{
|
||||||
gdk_draw_pixbuf (window,
|
if (GTK_WIDGET_HAS_FOCUS (widget))
|
||||||
widget->style->black_gc,
|
state = GTK_STATE_SELECTED;
|
||||||
pixbuf,
|
else
|
||||||
/* pixbuf 0, 0 is at pix_rect.x, pix_rect.y */
|
state = GTK_STATE_ACTIVE;
|
||||||
draw_rect.x - pix_rect.x,
|
}
|
||||||
draw_rect.y - pix_rect.y,
|
else
|
||||||
draw_rect.x,
|
state = GTK_STATE_PRELIGHT;
|
||||||
draw_rect.y,
|
|
||||||
draw_rect.width,
|
colorized = create_colorized_pixbuf (pixbuf,
|
||||||
draw_rect.height,
|
&widget->style->base[state]);
|
||||||
GDK_RGB_DITHER_NORMAL,
|
|
||||||
0, 0);
|
pixbuf = colorized;
|
||||||
|
}
|
||||||
|
|
||||||
|
gdk_draw_pixbuf (window,
|
||||||
|
widget->style->black_gc,
|
||||||
|
pixbuf,
|
||||||
|
/* pixbuf 0, 0 is at pix_rect.x, pix_rect.y */
|
||||||
|
draw_rect.x - pix_rect.x,
|
||||||
|
draw_rect.y - pix_rect.y,
|
||||||
|
draw_rect.x,
|
||||||
|
draw_rect.y,
|
||||||
|
draw_rect.width,
|
||||||
|
draw_rect.height,
|
||||||
|
GDK_RGB_DITHER_NORMAL,
|
||||||
|
0, 0);
|
||||||
|
|
||||||
if (invisible)
|
if (invisible)
|
||||||
g_object_unref (invisible);
|
g_object_unref (invisible);
|
||||||
|
|
||||||
|
if (colorized)
|
||||||
|
g_object_unref (colorized);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user