access the grid structure directly instead of using g_object_get() and

2003-09-05  Sven Neumann  <sven@gimp.org>

	* app/display/gimpdisplayshell.c (gimp_display_shell_draw_grid):
	access the grid structure directly instead of using g_object_get()
	and leaking the returned values. Release the GC object instead of
	leaking it (the GC should probably become part of the display).

	* app/gui/grid-dialog.c (grid_dialog_new): removed an extraneous
	reference count from grid_backup.
This commit is contained in:
Sven Neumann 2003-09-05 18:22:03 +00:00 committed by Sven Neumann
parent aaf84a73d2
commit a7f00f06e8
5 changed files with 139 additions and 115 deletions

View File

@ -1,3 +1,13 @@
2003-09-05 Sven Neumann <sven@gimp.org>
* app/display/gimpdisplayshell.c (gimp_display_shell_draw_grid):
access the grid structure directly instead of using g_object_get()
and leaking the returned values. Release the GC object instead of
leaking it (the GC should probably become part of the display).
* app/gui/grid-dialog.c (grid_dialog_new): removed an extraneous
reference count from grid_backup.
2003-09-05 Michael Natterer <mitch@gimp.org> 2003-09-05 Michael Natterer <mitch@gimp.org>
* app/paint-funcs/paint-funcs.[ch]: removed function map_to_color() * app/paint-funcs/paint-funcs.[ch]: removed function map_to_color()
@ -34,7 +44,7 @@
moving the "cropped" variable to a local scope. moving the "cropped" variable to a local scope.
* app/core/gimpimage-mask.c: calling gimp_image_update() followed * app/core/gimpimage-mask.c: calling gimp_image_update() followed
by gimp_viewable_imvalidate_preview(drawable) is equal to calling by gimp_viewable_invalidate_preview(drawable) is equal to calling
gimp_drawable_update() directly. gimp_drawable_update() directly.
2003-09-05 Sven Neumann <sven@gimp.org> 2003-09-05 Sven Neumann <sven@gimp.org>

View File

@ -101,7 +101,6 @@ grid_dialog_new (GimpDisplay *gdisp)
grid_backup = g_object_new (GIMP_TYPE_GRID, NULL); grid_backup = g_object_new (GIMP_TYPE_GRID, NULL);
gimp_config_copy_properties (G_OBJECT (grid), gimp_config_copy_properties (G_OBJECT (grid),
G_OBJECT (grid_backup)); G_OBJECT (grid_backup));
g_object_ref (grid_backup);
} }
else else
{ {
@ -381,7 +380,7 @@ remove_callback (GtkWidget *widget,
gimp_image_undo_push_image_grid (GIMP_IMAGE (gimage), gimp_image_undo_push_image_grid (GIMP_IMAGE (gimage),
_("Remove Grid"), _("Remove Grid"),
GIMP_GRID (grid_backup)); grid_backup);
gimp_image_set_grid (GIMP_IMAGE (gimage), NULL, FALSE); gimp_image_set_grid (GIMP_IMAGE (gimage), NULL, FALSE);
gtk_widget_destroy (dialog); gtk_widget_destroy (dialog);

View File

@ -1347,14 +1347,13 @@ gimp_display_shell_draw_guides (GimpDisplayShell *shell)
if (gimp_display_shell_get_show_guides (shell)) if (gimp_display_shell_get_show_guides (shell))
{ {
GList *list; GList *list;
GimpGuide *guide;
for (list = shell->gdisp->gimage->guides; list; list = list->next) for (list = shell->gdisp->gimage->guides; list; list = list->next)
{ {
guide = (GimpGuide *) list->data; gimp_display_shell_draw_guide (shell,
(GimpGuide *) list->data,
gimp_display_shell_draw_guide (shell, guide, FALSE); FALSE);
} }
} }
} }
@ -1362,21 +1361,18 @@ gimp_display_shell_draw_guides (GimpDisplayShell *shell)
void void
gimp_display_shell_draw_grid (GimpDisplayShell *shell) gimp_display_shell_draw_grid (GimpDisplayShell *shell)
{ {
GdkGC *gc; GdkGC *gc;
GdkGCValues values; GdkGCValues values;
GdkColor fg, bg; GdkColor fg, bg;
GimpGrid *grid; GimpGrid *grid;
gdouble xspacing, yspacing;
gdouble xoffset, yoffset;
GimpRGB *fgcolor, *bgcolor;
GimpGridType type;
gint x1, x2; gint x1, x2;
gint y1, y2; gint y1, y2;
gint x, y; gint x, y;
gint x_real, y_real; gint x_real, y_real;
const gint length = 2; gint width, height;
const gint length = 2;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
@ -1387,17 +1383,7 @@ gimp_display_shell_draw_grid (GimpDisplayShell *shell)
if (gimp_display_shell_get_show_grid (shell)) if (gimp_display_shell_get_show_grid (shell))
{ {
g_object_get (grid, switch (grid->type)
"xspacing", &xspacing,
"yspacing", &yspacing,
"xoffset", &xoffset,
"yoffset", &yoffset,
"fgcolor", &fgcolor,
"bgcolor", &bgcolor,
"type", &type,
NULL);
switch (type)
{ {
case GIMP_GRID_TYPE_ON_OFF_DASH: case GIMP_GRID_TYPE_ON_OFF_DASH:
values.line_style = GDK_LINE_ON_OFF_DASH; values.line_style = GDK_LINE_ON_OFF_DASH;
@ -1412,18 +1398,19 @@ gimp_display_shell_draw_grid (GimpDisplayShell *shell)
case GIMP_GRID_TYPE_SOLID: case GIMP_GRID_TYPE_SOLID:
values.line_style = GDK_LINE_SOLID; values.line_style = GDK_LINE_SOLID;
break; break;
default:
g_assert_not_reached ();
} }
values.join_style = GDK_JOIN_MITER; values.join_style = GDK_JOIN_MITER;
/* FIXME: This GC should be part of the display and should
be changed only when one of the relevant grid properties
changes (on notify)
*/
gc = gdk_gc_new_with_values (shell->canvas->window, &values, gc = gdk_gc_new_with_values (shell->canvas->window, &values,
GDK_GC_LINE_STYLE | GDK_GC_JOIN_STYLE); GDK_GC_LINE_STYLE | GDK_GC_JOIN_STYLE);
gimp_rgb_get_gdk_color (fgcolor, &fg); gimp_rgb_get_gdk_color (&grid->fgcolor, &fg);
gimp_rgb_get_gdk_color (bgcolor, &bg); gimp_rgb_get_gdk_color (&grid->bgcolor, &bg);
gdk_gc_set_rgb_fg_color (gc, &fg); gdk_gc_set_rgb_fg_color (gc, &fg);
gdk_gc_set_rgb_bg_color (gc, &bg); gdk_gc_set_rgb_bg_color (gc, &bg);
@ -1434,15 +1421,22 @@ gimp_display_shell_draw_grid (GimpDisplayShell *shell)
shell->gdisp->gimage->height, shell->gdisp->gimage->height,
&x2, &y2, FALSE); &x2, &y2, FALSE);
switch (type) width = shell->gdisp->gimage->width;
height = shell->gdisp->gimage->height;
switch (grid->type)
{ {
case GIMP_GRID_TYPE_DOTS: case GIMP_GRID_TYPE_DOTS:
for (x = xoffset; x <= shell->gdisp->gimage->width; x += xspacing) for (x = grid->xoffset; x <= width; x += grid->xspacing)
{ {
for (y = yoffset; y <= shell->gdisp->gimage->height; y += yspacing) for (y = grid->yoffset; y <= height; y += grid->yspacing)
{ {
gimp_display_shell_transform_xy (shell, x, y, &x_real, &y_real, FALSE); gimp_display_shell_transform_xy (shell,
if (x_real >= x1 && x_real < x2 && y_real >= y1 && y_real < y2) x, y, &x_real, &y_real,
FALSE);
if (x_real >= x1 && x_real < x2 &&
y_real >= y1 && y_real < y2)
{ {
gdk_draw_point (shell->canvas->window, gc, gdk_draw_point (shell->canvas->window, gc,
x_real, y_real); x_real, y_real);
@ -1452,22 +1446,29 @@ gimp_display_shell_draw_grid (GimpDisplayShell *shell)
break; break;
case GIMP_GRID_TYPE_INTERSECTIONS: case GIMP_GRID_TYPE_INTERSECTIONS:
for (x = xoffset; x <= shell->gdisp->gimage->width; x += xspacing) for (x = grid->xoffset; x <= width; x += grid->xspacing)
{ {
for (y = yoffset; y <= shell->gdisp->gimage->height; y += yspacing) for (y = grid->yoffset; y <= height; y += grid->yspacing)
{ {
gimp_display_shell_transform_xy (shell, x, y, &x_real, &y_real, FALSE); gimp_display_shell_transform_xy (shell,
x, y, &x_real, &y_real,
FALSE);
if (x_real >= x1 && x_real < x2) if (x_real >= x1 && x_real < x2)
{ {
gdk_draw_line (shell->canvas->window, gc, gdk_draw_line (shell->canvas->window, gc,
x_real, CLAMP (y_real - length, y1, y2 - 1), x_real,
x_real, CLAMP (y_real + length, y1, y2 - 1)); CLAMP (y_real - length, y1, y2 - 1),
x_real,
CLAMP (y_real + length, y1, y2 - 1));
} }
if (y_real >= y1 && y_real < y2) if (y_real >= y1 && y_real < y2)
{ {
gdk_draw_line (shell->canvas->window, gc, gdk_draw_line (shell->canvas->window, gc,
CLAMP (x_real - length, x1, x2 - 1), y_real, CLAMP (x_real - length, x1, x2 - 1),
CLAMP (x_real + length, x1, x2 - 1), y_real); y_real,
CLAMP (x_real + length, x1, x2 - 1),
y_real);
} }
} }
} }
@ -1476,24 +1477,31 @@ gimp_display_shell_draw_grid (GimpDisplayShell *shell)
case GIMP_GRID_TYPE_ON_OFF_DASH: case GIMP_GRID_TYPE_ON_OFF_DASH:
case GIMP_GRID_TYPE_DOUBLE_DASH: case GIMP_GRID_TYPE_DOUBLE_DASH:
case GIMP_GRID_TYPE_SOLID: case GIMP_GRID_TYPE_SOLID:
for (x = xoffset; x < shell->gdisp->gimage->width; x += xspacing) for (x = grid->xoffset; x < width; x += grid->xspacing)
{ {
gimp_display_shell_transform_xy (shell, x, 0, &x_real, &y_real, FALSE); gimp_display_shell_transform_xy (shell,
x, 0, &x_real, &y_real,
FALSE);
if (x_real > x1) if (x_real > x1)
gdk_draw_line (shell->canvas->window, gc, x_real, y1, x_real, y2 - 1); gdk_draw_line (shell->canvas->window, gc,
x_real, y1, x_real, y2 - 1);
} }
for (y = yoffset; y < shell->gdisp->gimage->height; y += yspacing) for (y = grid->yoffset; y < height; y += grid->yspacing)
{ {
gimp_display_shell_transform_xy (shell, 0, y, &x_real, &y_real, FALSE); gimp_display_shell_transform_xy (shell,
0, y, &x_real, &y_real,
FALSE);
if (y_real > y1) if (y_real > y1)
gdk_draw_line (shell->canvas->window, gc, x1, y_real, x2 - 1, y_real); gdk_draw_line (shell->canvas->window, gc,
x1, y_real, x2 - 1, y_real);
} }
break; break;
default:
g_assert_not_reached ();
} }
g_object_unref (gc);
} }
} }

View File

@ -1347,14 +1347,13 @@ gimp_display_shell_draw_guides (GimpDisplayShell *shell)
if (gimp_display_shell_get_show_guides (shell)) if (gimp_display_shell_get_show_guides (shell))
{ {
GList *list; GList *list;
GimpGuide *guide;
for (list = shell->gdisp->gimage->guides; list; list = list->next) for (list = shell->gdisp->gimage->guides; list; list = list->next)
{ {
guide = (GimpGuide *) list->data; gimp_display_shell_draw_guide (shell,
(GimpGuide *) list->data,
gimp_display_shell_draw_guide (shell, guide, FALSE); FALSE);
} }
} }
} }
@ -1362,21 +1361,18 @@ gimp_display_shell_draw_guides (GimpDisplayShell *shell)
void void
gimp_display_shell_draw_grid (GimpDisplayShell *shell) gimp_display_shell_draw_grid (GimpDisplayShell *shell)
{ {
GdkGC *gc; GdkGC *gc;
GdkGCValues values; GdkGCValues values;
GdkColor fg, bg; GdkColor fg, bg;
GimpGrid *grid; GimpGrid *grid;
gdouble xspacing, yspacing;
gdouble xoffset, yoffset;
GimpRGB *fgcolor, *bgcolor;
GimpGridType type;
gint x1, x2; gint x1, x2;
gint y1, y2; gint y1, y2;
gint x, y; gint x, y;
gint x_real, y_real; gint x_real, y_real;
const gint length = 2; gint width, height;
const gint length = 2;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
@ -1387,17 +1383,7 @@ gimp_display_shell_draw_grid (GimpDisplayShell *shell)
if (gimp_display_shell_get_show_grid (shell)) if (gimp_display_shell_get_show_grid (shell))
{ {
g_object_get (grid, switch (grid->type)
"xspacing", &xspacing,
"yspacing", &yspacing,
"xoffset", &xoffset,
"yoffset", &yoffset,
"fgcolor", &fgcolor,
"bgcolor", &bgcolor,
"type", &type,
NULL);
switch (type)
{ {
case GIMP_GRID_TYPE_ON_OFF_DASH: case GIMP_GRID_TYPE_ON_OFF_DASH:
values.line_style = GDK_LINE_ON_OFF_DASH; values.line_style = GDK_LINE_ON_OFF_DASH;
@ -1412,18 +1398,19 @@ gimp_display_shell_draw_grid (GimpDisplayShell *shell)
case GIMP_GRID_TYPE_SOLID: case GIMP_GRID_TYPE_SOLID:
values.line_style = GDK_LINE_SOLID; values.line_style = GDK_LINE_SOLID;
break; break;
default:
g_assert_not_reached ();
} }
values.join_style = GDK_JOIN_MITER; values.join_style = GDK_JOIN_MITER;
/* FIXME: This GC should be part of the display and should
be changed only when one of the relevant grid properties
changes (on notify)
*/
gc = gdk_gc_new_with_values (shell->canvas->window, &values, gc = gdk_gc_new_with_values (shell->canvas->window, &values,
GDK_GC_LINE_STYLE | GDK_GC_JOIN_STYLE); GDK_GC_LINE_STYLE | GDK_GC_JOIN_STYLE);
gimp_rgb_get_gdk_color (fgcolor, &fg); gimp_rgb_get_gdk_color (&grid->fgcolor, &fg);
gimp_rgb_get_gdk_color (bgcolor, &bg); gimp_rgb_get_gdk_color (&grid->bgcolor, &bg);
gdk_gc_set_rgb_fg_color (gc, &fg); gdk_gc_set_rgb_fg_color (gc, &fg);
gdk_gc_set_rgb_bg_color (gc, &bg); gdk_gc_set_rgb_bg_color (gc, &bg);
@ -1434,15 +1421,22 @@ gimp_display_shell_draw_grid (GimpDisplayShell *shell)
shell->gdisp->gimage->height, shell->gdisp->gimage->height,
&x2, &y2, FALSE); &x2, &y2, FALSE);
switch (type) width = shell->gdisp->gimage->width;
height = shell->gdisp->gimage->height;
switch (grid->type)
{ {
case GIMP_GRID_TYPE_DOTS: case GIMP_GRID_TYPE_DOTS:
for (x = xoffset; x <= shell->gdisp->gimage->width; x += xspacing) for (x = grid->xoffset; x <= width; x += grid->xspacing)
{ {
for (y = yoffset; y <= shell->gdisp->gimage->height; y += yspacing) for (y = grid->yoffset; y <= height; y += grid->yspacing)
{ {
gimp_display_shell_transform_xy (shell, x, y, &x_real, &y_real, FALSE); gimp_display_shell_transform_xy (shell,
if (x_real >= x1 && x_real < x2 && y_real >= y1 && y_real < y2) x, y, &x_real, &y_real,
FALSE);
if (x_real >= x1 && x_real < x2 &&
y_real >= y1 && y_real < y2)
{ {
gdk_draw_point (shell->canvas->window, gc, gdk_draw_point (shell->canvas->window, gc,
x_real, y_real); x_real, y_real);
@ -1452,22 +1446,29 @@ gimp_display_shell_draw_grid (GimpDisplayShell *shell)
break; break;
case GIMP_GRID_TYPE_INTERSECTIONS: case GIMP_GRID_TYPE_INTERSECTIONS:
for (x = xoffset; x <= shell->gdisp->gimage->width; x += xspacing) for (x = grid->xoffset; x <= width; x += grid->xspacing)
{ {
for (y = yoffset; y <= shell->gdisp->gimage->height; y += yspacing) for (y = grid->yoffset; y <= height; y += grid->yspacing)
{ {
gimp_display_shell_transform_xy (shell, x, y, &x_real, &y_real, FALSE); gimp_display_shell_transform_xy (shell,
x, y, &x_real, &y_real,
FALSE);
if (x_real >= x1 && x_real < x2) if (x_real >= x1 && x_real < x2)
{ {
gdk_draw_line (shell->canvas->window, gc, gdk_draw_line (shell->canvas->window, gc,
x_real, CLAMP (y_real - length, y1, y2 - 1), x_real,
x_real, CLAMP (y_real + length, y1, y2 - 1)); CLAMP (y_real - length, y1, y2 - 1),
x_real,
CLAMP (y_real + length, y1, y2 - 1));
} }
if (y_real >= y1 && y_real < y2) if (y_real >= y1 && y_real < y2)
{ {
gdk_draw_line (shell->canvas->window, gc, gdk_draw_line (shell->canvas->window, gc,
CLAMP (x_real - length, x1, x2 - 1), y_real, CLAMP (x_real - length, x1, x2 - 1),
CLAMP (x_real + length, x1, x2 - 1), y_real); y_real,
CLAMP (x_real + length, x1, x2 - 1),
y_real);
} }
} }
} }
@ -1476,24 +1477,31 @@ gimp_display_shell_draw_grid (GimpDisplayShell *shell)
case GIMP_GRID_TYPE_ON_OFF_DASH: case GIMP_GRID_TYPE_ON_OFF_DASH:
case GIMP_GRID_TYPE_DOUBLE_DASH: case GIMP_GRID_TYPE_DOUBLE_DASH:
case GIMP_GRID_TYPE_SOLID: case GIMP_GRID_TYPE_SOLID:
for (x = xoffset; x < shell->gdisp->gimage->width; x += xspacing) for (x = grid->xoffset; x < width; x += grid->xspacing)
{ {
gimp_display_shell_transform_xy (shell, x, 0, &x_real, &y_real, FALSE); gimp_display_shell_transform_xy (shell,
x, 0, &x_real, &y_real,
FALSE);
if (x_real > x1) if (x_real > x1)
gdk_draw_line (shell->canvas->window, gc, x_real, y1, x_real, y2 - 1); gdk_draw_line (shell->canvas->window, gc,
x_real, y1, x_real, y2 - 1);
} }
for (y = yoffset; y < shell->gdisp->gimage->height; y += yspacing) for (y = grid->yoffset; y < height; y += grid->yspacing)
{ {
gimp_display_shell_transform_xy (shell, 0, y, &x_real, &y_real, FALSE); gimp_display_shell_transform_xy (shell,
0, y, &x_real, &y_real,
FALSE);
if (y_real > y1) if (y_real > y1)
gdk_draw_line (shell->canvas->window, gc, x1, y_real, x2 - 1, y_real); gdk_draw_line (shell->canvas->window, gc,
x1, y_real, x2 - 1, y_real);
} }
break; break;
default:
g_assert_not_reached ();
} }
g_object_unref (gc);
} }
} }

View File

@ -101,7 +101,6 @@ grid_dialog_new (GimpDisplay *gdisp)
grid_backup = g_object_new (GIMP_TYPE_GRID, NULL); grid_backup = g_object_new (GIMP_TYPE_GRID, NULL);
gimp_config_copy_properties (G_OBJECT (grid), gimp_config_copy_properties (G_OBJECT (grid),
G_OBJECT (grid_backup)); G_OBJECT (grid_backup));
g_object_ref (grid_backup);
} }
else else
{ {
@ -381,7 +380,7 @@ remove_callback (GtkWidget *widget,
gimp_image_undo_push_image_grid (GIMP_IMAGE (gimage), gimp_image_undo_push_image_grid (GIMP_IMAGE (gimage),
_("Remove Grid"), _("Remove Grid"),
GIMP_GRID (grid_backup)); grid_backup);
gimp_image_set_grid (GIMP_IMAGE (gimage), NULL, FALSE); gimp_image_set_grid (GIMP_IMAGE (gimage), NULL, FALSE);
gtk_widget_destroy (dialog); gtk_widget_destroy (dialog);