1
/* LIBGIMP - The GIMP Library
2
* Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball
4
* gimpcellrenderercolor.c
5
* Copyright (C) 2004 Sven Neuman <sven1@gimp.org>
7
* This library is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2 of the License, or (at your option) any later version.
12
* This library is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Library General Public License for more details.
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with this library; if not, write to the
19
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20
* Boston, MA 02111-1307, USA.
27
#include "libgimpcolor/gimpcolor.h"
29
#include "gimpwidgetstypes.h"
31
#include "gimpcolorarea.h"
32
#include "gimpcellrenderercolor.h"
35
#define DEFAULT_ICON_SIZE GTK_ICON_SIZE_MENU
47
static void gimp_cell_renderer_color_class_init (GimpCellRendererColorClass *klass);
48
static void gimp_cell_renderer_color_init (GimpCellRendererColor *cell);
50
static void gimp_cell_renderer_color_get_property (GObject *object,
54
static void gimp_cell_renderer_color_set_property (GObject *object,
58
static void gimp_cell_renderer_color_get_size (GtkCellRenderer *cell,
60
GdkRectangle *rectangle,
65
static void gimp_cell_renderer_color_render (GtkCellRenderer *cell,
68
GdkRectangle *background_area,
69
GdkRectangle *cell_area,
70
GdkRectangle *expose_area,
71
GtkCellRendererState flags);
74
static GtkCellRendererClass *parent_class = NULL;
78
gimp_cell_renderer_color_get_type (void)
80
static GType cell_type = 0;
84
static const GTypeInfo cell_info =
86
sizeof (GimpCellRendererColorClass),
88
NULL, /* base_finalize */
89
(GClassInitFunc) gimp_cell_renderer_color_class_init,
90
NULL, /* class_finalize */
91
NULL, /* class_data */
92
sizeof (GimpCellRendererColor),
94
(GInstanceInitFunc) gimp_cell_renderer_color_init,
97
cell_type = g_type_register_static (GTK_TYPE_CELL_RENDERER,
98
"GimpCellRendererColor",
106
gimp_cell_renderer_color_class_init (GimpCellRendererColorClass *klass)
108
GObjectClass *object_class = G_OBJECT_CLASS (klass);
109
GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS (klass);
111
parent_class = g_type_class_peek_parent (klass);
113
object_class->get_property = gimp_cell_renderer_color_get_property;
114
object_class->set_property = gimp_cell_renderer_color_set_property;
116
cell_class->get_size = gimp_cell_renderer_color_get_size;
117
cell_class->render = gimp_cell_renderer_color_render;
119
g_object_class_install_property (object_class,
121
g_param_spec_boxed ("color", NULL, NULL,
124
g_object_class_install_property (object_class,
126
g_param_spec_boolean ("opaque", NULL, NULL,
130
g_object_class_install_property (object_class,
132
g_param_spec_int ("icon_size", NULL, NULL,
140
gimp_cell_renderer_color_init (GimpCellRendererColor *cell)
142
gimp_rgba_set (&cell->color, 0.0, 0.0, 0.0, 1.0);
146
gimp_cell_renderer_color_get_property (GObject *object,
151
GimpCellRendererColor *cell = GIMP_CELL_RENDERER_COLOR (object);
156
g_value_set_boxed (value, &cell->color);
159
g_value_set_boolean (value, cell->opaque);
162
g_value_set_int (value, cell->size);
165
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
171
gimp_cell_renderer_color_set_property (GObject *object,
176
GimpCellRendererColor *cell = GIMP_CELL_RENDERER_COLOR (object);
182
color = g_value_get_boxed (value);
183
cell->color = *color;
186
cell->opaque = g_value_get_boolean (value);
189
cell->size = g_value_get_int (value);
192
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
198
gimp_cell_renderer_color_get_size (GtkCellRenderer *cell,
200
GdkRectangle *cell_area,
206
GimpCellRendererColor *color = GIMP_CELL_RENDERER_COLOR (cell);
207
GtkSettings *settings;
211
settings = gtk_settings_get_for_screen (gtk_widget_get_screen (widget));
213
gtk_icon_size_lookup_for_settings (settings,
214
color->size, &calc_width, &calc_height);
216
if (cell_area && calc_width > 0 && calc_height > 0)
220
*x_offset = (((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) ?
221
1.0 - cell->xalign : cell->xalign) *
222
(cell_area->width - calc_width));
223
*x_offset = MAX (*x_offset, 0) + cell->xpad;
227
*y_offset = (cell->yalign *
228
(cell_area->height - calc_height));
229
*y_offset = MAX (*y_offset, 0) + cell->ypad;
241
*width = calc_width + 2 * cell->xpad;
243
*height = calc_height + 2 * cell->ypad;
247
gimp_cell_renderer_color_render (GtkCellRenderer *cell,
250
GdkRectangle *background_area,
251
GdkRectangle *cell_area,
252
GdkRectangle *expose_area,
253
GtkCellRendererState flags)
255
GimpCellRendererColor *color = GIMP_CELL_RENDERER_COLOR (cell);
258
gimp_cell_renderer_color_get_size (cell, widget, cell_area,
264
rect.x += cell_area->x + cell->xpad;
265
rect.y += cell_area->y + cell->ypad;
266
rect.width -= 2 * cell->xpad;
267
rect.height -= 2 * cell->ypad;
269
if (rect.width > 2 && rect.height > 2)
273
guint rowstride = 3 * (rect.width - 2);
276
rowstride += 4 - (rowstride & 3);
278
buf = g_alloca (rowstride * (rect.height - 2));
280
_gimp_color_area_render_buf ((color->opaque ?
281
GIMP_COLOR_AREA_FLAT :
282
GIMP_COLOR_AREA_SMALL_CHECKS),
284
rect.width - 2, rect.height - 2, rowstride,
287
gdk_draw_rgb_image_dithalign (window,
288
widget->style->black_gc,
289
rect.x + 1, rect.y + 1,
290
rect.width - 2, rect.height - 2,
292
buf, rowstride, rect.x, rect.y);
294
state = (flags & GTK_CELL_RENDERER_SELECTED ?
295
GTK_STATE_SELECTED : GTK_STATE_NORMAL);
297
gdk_draw_rectangle (window,
298
widget->style->fg_gc[state],
300
rect.x, rect.y, rect.width - 1, rect.height - 1);
305
* gimp_cell_renderer_color_new:
307
* Creates a #GtkCellRenderer that displays a color.
309
* Return value: a new #GimpCellRendererColor
314
gimp_cell_renderer_color_new (void)
316
return g_object_new (GIMP_TYPE_CELL_RENDERER_COLOR, NULL);