mirror of https://github.com/GNOME/gimp.git
no need to include gimpdisplayshell-render.h here.
2004-10-01 Sven Neumann <sven@gimp.org> * app/display/gimpdisplayshell-callbacks.c: no need to include gimpdisplayshell-render.h here. * app/display/gimpdisplayshell-draw.c * app/display/gimpdisplayshell-render.[ch] * app/display/gimpdisplayshell.[ch]: added an API to highlight a rectangle (specified in image coordinates). Actually it doesn't highlight but dims the area outside the rectangle. * app/tools/gimpcroptool.c: use the new functionality to show the area to be cropped. Fixes bug #93360.
This commit is contained in:
parent
efc2187e80
commit
297b53a466
15
ChangeLog
15
ChangeLog
|
@ -1,3 +1,18 @@
|
||||||
|
2004-10-01 Sven Neumann <sven@gimp.org>
|
||||||
|
|
||||||
|
* app/display/gimpdisplayshell-callbacks.c: no need to include
|
||||||
|
gimpdisplayshell-render.h here.
|
||||||
|
|
||||||
|
* app/display/gimpdisplayshell-draw.c
|
||||||
|
* app/display/gimpdisplayshell-render.[ch]
|
||||||
|
|
||||||
|
* app/display/gimpdisplayshell.[ch]: added an API to highlight a
|
||||||
|
rectangle (specified in image coordinates). Actually it doesn't
|
||||||
|
highlight but dims the area outside the rectangle.
|
||||||
|
|
||||||
|
* app/tools/gimpcroptool.c: use the new functionality to show the
|
||||||
|
area to be cropped. Fixes bug #93360.
|
||||||
|
|
||||||
2004-09-30 Michael Natterer <mitch@gimp.org>
|
2004-09-30 Michael Natterer <mitch@gimp.org>
|
||||||
|
|
||||||
* plug-ins/script-fu/script-fu-types.h (struct SFScript): renamed
|
* plug-ins/script-fu/script-fu-types.h (struct SFScript): renamed
|
||||||
|
|
|
@ -65,7 +65,6 @@
|
||||||
#include "gimpdisplayshell-draw.h"
|
#include "gimpdisplayshell-draw.h"
|
||||||
#include "gimpdisplayshell-layer-select.h"
|
#include "gimpdisplayshell-layer-select.h"
|
||||||
#include "gimpdisplayshell-preview.h"
|
#include "gimpdisplayshell-preview.h"
|
||||||
#include "gimpdisplayshell-render.h"
|
|
||||||
#include "gimpdisplayshell-scale.h"
|
#include "gimpdisplayshell-scale.h"
|
||||||
#include "gimpdisplayshell-scroll.h"
|
#include "gimpdisplayshell-scroll.h"
|
||||||
#include "gimpdisplayshell-selection.h"
|
#include "gimpdisplayshell-selection.h"
|
||||||
|
|
|
@ -399,12 +399,21 @@ gimp_display_shell_draw_area (GimpDisplayShell *shell,
|
||||||
sx, sy, sw, sh,
|
sx, sy, sw, sh,
|
||||||
&x, &y, &w, &h))
|
&x, &y, &w, &h))
|
||||||
{
|
{
|
||||||
gint x2, y2;
|
GdkRectangle rect;
|
||||||
gint i, j;
|
gint x2, y2;
|
||||||
|
gint i, j;
|
||||||
|
|
||||||
x2 = x + w;
|
x2 = x + w;
|
||||||
y2 = y + h;
|
y2 = y + h;
|
||||||
|
|
||||||
|
if (shell->highlight)
|
||||||
|
{
|
||||||
|
rect.x = SCALEX (shell, shell->highlight->x);
|
||||||
|
rect.y = SCALEY (shell, shell->highlight->y);
|
||||||
|
rect.width = SCALEX (shell, shell->highlight->width);
|
||||||
|
rect.height = SCALEY (shell, shell->highlight->height);
|
||||||
|
}
|
||||||
|
|
||||||
/* display the image in RENDER_BUF_WIDTH x RENDER_BUF_HEIGHT
|
/* display the image in RENDER_BUF_WIDTH x RENDER_BUF_HEIGHT
|
||||||
* sized chunks
|
* sized chunks
|
||||||
*/
|
*/
|
||||||
|
@ -420,7 +429,8 @@ gimp_display_shell_draw_area (GimpDisplayShell *shell,
|
||||||
gimp_display_shell_render (shell,
|
gimp_display_shell_render (shell,
|
||||||
j - shell->disp_xoffset,
|
j - shell->disp_xoffset,
|
||||||
i - shell->disp_yoffset,
|
i - shell->disp_yoffset,
|
||||||
dx, dy);
|
dx, dy,
|
||||||
|
shell->highlight ? &rect : NULL);
|
||||||
|
|
||||||
#ifdef STRESS_TEST
|
#ifdef STRESS_TEST
|
||||||
/* Invalidate the projection just after we render it! */
|
/* Invalidate the projection just after we render it! */
|
||||||
|
|
|
@ -297,6 +297,14 @@ static RenderFunc render_funcs[6] =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static void gimp_display_shell_render_highlight (GimpDisplayShell *shell,
|
||||||
|
gint x,
|
||||||
|
gint y,
|
||||||
|
gint w,
|
||||||
|
gint h,
|
||||||
|
GdkRectangle *highlight);
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************/
|
/*****************************************************************/
|
||||||
/* This function is the core of the display--it offsets and */
|
/* This function is the core of the display--it offsets and */
|
||||||
/* scales the image according to the current parameters in the */
|
/* scales the image according to the current parameters in the */
|
||||||
|
@ -309,7 +317,8 @@ gimp_display_shell_render (GimpDisplayShell *shell,
|
||||||
gint x,
|
gint x,
|
||||||
gint y,
|
gint y,
|
||||||
gint w,
|
gint w,
|
||||||
gint h)
|
gint h,
|
||||||
|
GdkRectangle *highlight)
|
||||||
{
|
{
|
||||||
RenderInfo info;
|
RenderInfo info;
|
||||||
GimpImageType image_type;
|
GimpImageType image_type;
|
||||||
|
@ -346,6 +355,10 @@ gimp_display_shell_render (GimpDisplayShell *shell,
|
||||||
3,
|
3,
|
||||||
3 * GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH);
|
3 * GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH);
|
||||||
|
|
||||||
|
/* dim pixels outside the highlighted rectangle */
|
||||||
|
if (highlight)
|
||||||
|
gimp_display_shell_render_highlight (shell, x, y, w, h, highlight);
|
||||||
|
|
||||||
/* put it to the screen */
|
/* put it to the screen */
|
||||||
gimp_canvas_draw_rgb (GIMP_CANVAS (shell->canvas), GIMP_CANVAS_STYLE_RENDER,
|
gimp_canvas_draw_rgb (GIMP_CANVAS (shell->canvas), GIMP_CANVAS_STYLE_RENDER,
|
||||||
x + shell->disp_xoffset, y + shell->disp_yoffset,
|
x + shell->disp_xoffset, y + shell->disp_yoffset,
|
||||||
|
@ -356,6 +369,76 @@ gimp_display_shell_render (GimpDisplayShell *shell,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define GIMP_DISPLAY_SHELL_DIM_PIXEL(buf,x) \
|
||||||
|
{ \
|
||||||
|
buf[3 * (x) + 0] >>= 1; \
|
||||||
|
buf[3 * (x) + 1] >>= 1; \
|
||||||
|
buf[3 * (x) + 2] >>= 1; \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function highlights the given area by dimming all pixels outside. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
gimp_display_shell_render_highlight (GimpDisplayShell *shell,
|
||||||
|
gint x,
|
||||||
|
gint y,
|
||||||
|
gint w,
|
||||||
|
gint h,
|
||||||
|
GdkRectangle *highlight)
|
||||||
|
{
|
||||||
|
guchar *buf = shell->render_buf;
|
||||||
|
GdkRectangle rect;
|
||||||
|
|
||||||
|
rect.x = shell->offset_x + x;
|
||||||
|
rect.y = shell->offset_y + y;
|
||||||
|
rect.width = w;
|
||||||
|
rect.height = h;
|
||||||
|
|
||||||
|
if (gdk_rectangle_intersect (highlight, &rect, &rect))
|
||||||
|
{
|
||||||
|
rect.x -= shell->offset_x + x;
|
||||||
|
rect.y -= shell->offset_y + y;
|
||||||
|
|
||||||
|
for (y = 0; y < rect.y; y++)
|
||||||
|
{
|
||||||
|
for (x = 0; x < w; x++)
|
||||||
|
GIMP_DISPLAY_SHELL_DIM_PIXEL (buf, x)
|
||||||
|
|
||||||
|
buf += 3 * GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( ; y < rect.y + rect.height; y++)
|
||||||
|
{
|
||||||
|
for (x = 0; x < rect.x; x++)
|
||||||
|
GIMP_DISPLAY_SHELL_DIM_PIXEL (buf, x)
|
||||||
|
|
||||||
|
for (x += rect.width; x < w; x++)
|
||||||
|
GIMP_DISPLAY_SHELL_DIM_PIXEL (buf, x)
|
||||||
|
|
||||||
|
buf += 3 * GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( ; y < h; y++)
|
||||||
|
{
|
||||||
|
for (x = 0; x < w; x++)
|
||||||
|
GIMP_DISPLAY_SHELL_DIM_PIXEL (buf, x)
|
||||||
|
|
||||||
|
buf += 3 * GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (y = 0; y < h; y++)
|
||||||
|
{
|
||||||
|
for (x = 0; x < w; x++)
|
||||||
|
GIMP_DISPLAY_SHELL_DIM_PIXEL (buf, x)
|
||||||
|
|
||||||
|
buf += 3 * GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************/
|
/*************************/
|
||||||
/* 8 Bit functions */
|
/* 8 Bit functions */
|
||||||
/*************************/
|
/*************************/
|
||||||
|
|
|
@ -31,7 +31,8 @@ void gimp_display_shell_render (GimpDisplayShell *shell,
|
||||||
gint x,
|
gint x,
|
||||||
gint y,
|
gint y,
|
||||||
gint w,
|
gint w,
|
||||||
gint h);
|
gint h,
|
||||||
|
GdkRectangle *highlight);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Extern variables
|
* Extern variables
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
#include "libgimpwidgets/gimpwidgets.h"
|
#include "libgimpwidgets/gimpwidgets.h"
|
||||||
|
@ -311,6 +313,8 @@ gimp_display_shell_init (GimpDisplayShell *shell)
|
||||||
shell->scroll_start_y = 0;
|
shell->scroll_start_y = 0;
|
||||||
shell->button_press_before_focus = FALSE;
|
shell->button_press_before_focus = FALSE;
|
||||||
|
|
||||||
|
shell->highlight = NULL;
|
||||||
|
|
||||||
gtk_window_set_role (GTK_WINDOW (shell), "gimp-image-window");
|
gtk_window_set_role (GTK_WINDOW (shell), "gimp-image-window");
|
||||||
gtk_window_set_resizable (GTK_WINDOW (shell), TRUE);
|
gtk_window_set_resizable (GTK_WINDOW (shell), TRUE);
|
||||||
|
|
||||||
|
@ -420,6 +424,12 @@ gimp_display_shell_destroy (GtkObject *object)
|
||||||
shell->render_buf = NULL;
|
shell->render_buf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (shell->highlight)
|
||||||
|
{
|
||||||
|
g_free (shell->highlight);
|
||||||
|
shell->highlight = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (shell->title_idle_id)
|
if (shell->title_idle_id)
|
||||||
{
|
{
|
||||||
g_source_remove (shell->title_idle_id);
|
g_source_remove (shell->title_idle_id);
|
||||||
|
@ -1418,3 +1428,64 @@ gimp_display_shell_selection_visibility (GimpDisplayShell *shell,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gimp_display_shell_set_highlight:
|
||||||
|
* @shell: a #GimpDisplayShell
|
||||||
|
* @highlight: a rectangle in image coordinates that should be brought out
|
||||||
|
*
|
||||||
|
* This function allows to set an area of the image that should be
|
||||||
|
* accentuated. The actual implementation is to dim all pixels outside
|
||||||
|
* this rectangle. Passing %NULL for @highlight unsets the rectangle.
|
||||||
|
**/
|
||||||
|
void
|
||||||
|
gimp_display_shell_set_highlight (GimpDisplayShell *shell,
|
||||||
|
const GdkRectangle *highlight)
|
||||||
|
{
|
||||||
|
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
|
||||||
|
|
||||||
|
if (shell->highlight)
|
||||||
|
{
|
||||||
|
if (highlight)
|
||||||
|
{
|
||||||
|
GdkRectangle *rects;
|
||||||
|
GdkRegion *old;
|
||||||
|
GdkRegion *new;
|
||||||
|
gint num_rects, i;
|
||||||
|
|
||||||
|
if (memcmp (shell->highlight, highlight, sizeof (GdkRectangle)) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
old = gdk_region_rectangle (shell->highlight);
|
||||||
|
|
||||||
|
*shell->highlight = *highlight;
|
||||||
|
|
||||||
|
new = gdk_region_rectangle (shell->highlight);
|
||||||
|
|
||||||
|
gdk_region_xor (old, new);
|
||||||
|
|
||||||
|
gdk_region_get_rectangles (old, &rects, &num_rects);
|
||||||
|
|
||||||
|
for (i = 0; i < num_rects; i++)
|
||||||
|
gimp_display_update_area (shell->gdisp, TRUE,
|
||||||
|
rects[i].x,
|
||||||
|
rects[i].y,
|
||||||
|
rects[i].width,
|
||||||
|
rects[i].height);
|
||||||
|
g_free (rects);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_free (shell->highlight);
|
||||||
|
shell->highlight = NULL;
|
||||||
|
|
||||||
|
gimp_display_shell_expose_full (shell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (highlight)
|
||||||
|
{
|
||||||
|
shell->highlight = g_memdup (highlight, sizeof (GdkRectangle));
|
||||||
|
|
||||||
|
gimp_display_shell_expose_full (shell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -166,6 +166,8 @@ struct _GimpDisplayShell
|
||||||
gint scroll_start_y;
|
gint scroll_start_y;
|
||||||
gboolean button_press_before_focus;
|
gboolean button_press_before_focus;
|
||||||
guint32 last_motion_time;
|
guint32 last_motion_time;
|
||||||
|
|
||||||
|
GdkRectangle *highlight; /* in image coordinates, can be NULL */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GimpDisplayShellClass
|
struct _GimpDisplayShellClass
|
||||||
|
@ -229,6 +231,8 @@ void gimp_display_shell_shrink_wrap (GimpDisplayShell *shell);
|
||||||
|
|
||||||
void gimp_display_shell_selection_visibility (GimpDisplayShell *shell,
|
void gimp_display_shell_selection_visibility (GimpDisplayShell *shell,
|
||||||
GimpSelectionControl control);
|
GimpSelectionControl control);
|
||||||
|
void gimp_display_shell_set_highlight (GimpDisplayShell *shell,
|
||||||
|
const GdkRectangle *highlight);
|
||||||
|
|
||||||
|
|
||||||
#endif /* __GIMP_DISPLAY_SHELL_H__ */
|
#endif /* __GIMP_DISPLAY_SHELL_H__ */
|
||||||
|
|
|
@ -247,19 +247,18 @@ gimp_crop_tool_control (GimpTool *tool,
|
||||||
GimpToolAction action,
|
GimpToolAction action,
|
||||||
GimpDisplay *gdisp)
|
GimpDisplay *gdisp)
|
||||||
{
|
{
|
||||||
GimpCropTool *crop = GIMP_CROP_TOOL (tool);
|
|
||||||
|
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case PAUSE:
|
case PAUSE:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RESUME:
|
case RESUME:
|
||||||
crop_recalc (crop);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HALT:
|
case HALT:
|
||||||
crop_response (NULL, GTK_RESPONSE_CANCEL, crop);
|
gimp_display_shell_set_highlight (GIMP_DISPLAY_SHELL (gdisp->shell),
|
||||||
|
NULL);
|
||||||
|
crop_response (NULL, GTK_RESPONSE_CANCEL, GIMP_CROP_TOOL (tool));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -854,16 +853,25 @@ crop_tool_crop_image (GimpImage *gimage,
|
||||||
static void
|
static void
|
||||||
crop_recalc (GimpCropTool *crop)
|
crop_recalc (GimpCropTool *crop)
|
||||||
{
|
{
|
||||||
GimpTool *tool = GIMP_TOOL (crop);
|
GimpTool *tool = GIMP_TOOL (crop);
|
||||||
|
GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (tool->gdisp->shell);
|
||||||
|
GdkRectangle rect;
|
||||||
|
|
||||||
if (! tool->gdisp)
|
if (! tool->gdisp)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
gimp_display_shell_transform_xy (GIMP_DISPLAY_SHELL (tool->gdisp->shell),
|
rect.x = crop->x1;
|
||||||
|
rect.y = crop->y1;
|
||||||
|
rect.width = crop->x2 - crop->x1;
|
||||||
|
rect.height = crop->y2 - crop->y1;
|
||||||
|
|
||||||
|
gimp_display_shell_set_highlight (shell, &rect);
|
||||||
|
|
||||||
|
gimp_display_shell_transform_xy (shell,
|
||||||
crop->x1, crop->y1,
|
crop->x1, crop->y1,
|
||||||
&crop->dx1, &crop->dy1,
|
&crop->dx1, &crop->dy1,
|
||||||
FALSE);
|
FALSE);
|
||||||
gimp_display_shell_transform_xy (GIMP_DISPLAY_SHELL (tool->gdisp->shell),
|
gimp_display_shell_transform_xy (shell,
|
||||||
crop->x2, crop->y2,
|
crop->x2, crop->y2,
|
||||||
&crop->dx2, &crop->dy2,
|
&crop->dx2, &crop->dy2,
|
||||||
FALSE);
|
FALSE);
|
||||||
|
@ -1116,12 +1124,16 @@ crop_response (GtkWidget *widget,
|
||||||
GIMP_CROP_MODE_RESIZE, FALSE);
|
GIMP_CROP_MODE_RESIZE, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gimp_display_shell_set_highlight (GIMP_DISPLAY_SHELL (tool->gdisp->shell),
|
||||||
|
NULL);
|
||||||
|
|
||||||
crop_tool_crop_image (tool->gdisp->gimage,
|
crop_tool_crop_image (tool->gdisp->gimage,
|
||||||
GIMP_CONTEXT (options),
|
GIMP_CONTEXT (options),
|
||||||
crop->x1, crop->y1,
|
crop->x1, crop->y1,
|
||||||
crop->x2, crop->y2,
|
crop->x2, crop->y2,
|
||||||
options->layer_only,
|
options->layer_only,
|
||||||
(GimpCropMode) response_id);
|
(GimpCropMode) response_id);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue