allow to set a maximum size and center the preview area if its allocation

2004-09-09  Sven Neumann  <sven@gimp.org>

	* libgimpwidgets/gimppreviewarea.[ch]: allow to set a maximum size
	and center the preview area if its allocation extends the maximum.

	* libgimpwidgets/gimppreview.[ch]: derive from GtkVBox, moved the
	toggle button out of the table and put the table into an aspect
	frame. Added an API to set the preview boundaries. Set the maximum
	size of the GimpPreviewArea from that function.

	* libgimpwidgets/gimpwidgets.def: added new entries.

	* libgimp/gimpdrawablepreview.c: use gimp_preview_set_bounds().

	* plug-ins/common/gauss.c: pack the preview widget so that it
	resizes with the dialog.
This commit is contained in:
Sven Neumann 2004-09-09 14:47:39 +00:00 committed by Sven Neumann
parent 824b5289db
commit a514ce7db1
8 changed files with 230 additions and 114 deletions

View file

@ -1,3 +1,20 @@
2004-09-09 Sven Neumann <sven@gimp.org>
* libgimpwidgets/gimppreviewarea.[ch]: allow to set a maximum size
and center the preview area if its allocation extends the maximum.
* libgimpwidgets/gimppreview.[ch]: derive from GtkVBox, moved the
toggle button out of the table and put the table into an aspect
frame. Added an API to set the preview boundaries. Set the maximum
size of the GimpPreviewArea from that function.
* libgimpwidgets/gimpwidgets.def: added new entries.
* libgimp/gimpdrawablepreview.c: use gimp_preview_set_bounds().
* plug-ins/common/gauss.c: pack the preview widget so that it
resizes with the dialog.
2004-09-09 DindinX <david@dindinx.org>
* libgimpwidgets/gimppreviewarea.c (gimp_preview_area_blend)

View file

@ -169,10 +169,11 @@ gimp_drawable_preview_set_drawable (GimpDrawablePreview *drawable_preview,
gimp_drawable_mask_bounds (drawable->drawable_id, &x1, &y1, &x2, &y2);
preview->xmin = MAX (x1 - SELECTION_BORDER, 0);
preview->ymin = MAX (y1 - SELECTION_BORDER, 0);
preview->xmax = MIN (x2 + SELECTION_BORDER, width);
preview->ymax = MIN (y2 + SELECTION_BORDER, height);
gimp_preview_set_bounds (preview,
MAX (x1 - SELECTION_BORDER, 0),
MAX (y1 - SELECTION_BORDER, 0),
MIN (x2 + SELECTION_BORDER, width),
MIN (y2 + SELECTION_BORDER, height));
if (gimp_drawable_is_indexed (drawable->drawable_id))
{

View file

@ -83,7 +83,7 @@ static gboolean gimp_preview_invalidate_now (GimpPreview *preview);
static guint preview_signals[LAST_SIGNAL] = { 0 };
static GtkTableClass *parent_class = NULL;
static GtkVBoxClass *parent_class = NULL;
GType
@ -106,7 +106,7 @@ gimp_preview_get_type (void)
(GInstanceInitFunc) gimp_preview_init,
};
preview_type = g_type_register_static (GTK_TYPE_TABLE,
preview_type = g_type_register_static (GTK_TYPE_VBOX,
"GimpPreview",
&preview_info,
G_TYPE_FLAG_ABSTRACT);
@ -159,12 +159,21 @@ gimp_preview_class_init (GimpPreviewClass *klass)
static void
gimp_preview_init (GimpPreview *preview)
{
GtkTable *table = GTK_TABLE (preview);
GtkWidget *table;
GtkWidget *frame;
GtkObject *adj;
gtk_table_resize (table, 3, 2);
gtk_table_set_homogeneous (table, FALSE);
gtk_box_set_homogeneous (GTK_BOX (preview), FALSE);
gtk_box_set_spacing (GTK_BOX (preview), 6);
frame = gtk_aspect_frame_new (NULL, 0.0, 0.0, 1.0, TRUE);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
gtk_box_pack_start (GTK_BOX (preview), frame, TRUE, TRUE, 0);
gtk_widget_show (frame);
table = gtk_table_new (3, 2, FALSE);
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_widget_show (table);
preview->xoff = 0;
preview->yoff = 0;
@ -187,7 +196,7 @@ gimp_preview_init (GimpPreview *preview)
preview->hscr = gtk_hscrollbar_new (GTK_ADJUSTMENT (adj));
gtk_range_set_update_policy (GTK_RANGE (preview->hscr),
GTK_UPDATE_CONTINUOUS);
gtk_table_attach (table, preview->hscr, 0,1, 1,2,
gtk_table_attach (GTK_TABLE (table), preview->hscr, 0,1, 1,2,
GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0);
adj = gtk_adjustment_new (0, 0, preview->height - 1, 1.0,
@ -200,13 +209,14 @@ gimp_preview_init (GimpPreview *preview)
preview->vscr = gtk_vscrollbar_new (GTK_ADJUSTMENT (adj));
gtk_range_set_update_policy (GTK_RANGE (preview->vscr),
GTK_UPDATE_CONTINUOUS);
gtk_table_attach (table, preview->vscr, 1,2, 0,1,
gtk_table_attach (GTK_TABLE (table), preview->vscr, 1,2, 0,1,
GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
/* the area itself */
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_table_attach (table, frame, 0,1, 0,1, 0, 0, 0,0);
gtk_table_attach (GTK_TABLE (table), frame, 0,1, 0,1,
GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0,0);
gtk_widget_show (frame);
preview->area = gimp_preview_area_new ();
@ -246,10 +256,7 @@ gimp_preview_init (GimpPreview *preview)
preview->toggle = gtk_check_button_new_with_mnemonic (_("_Preview"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (preview->toggle),
preview->update_preview);
gtk_table_set_row_spacing (GTK_TABLE (preview), 1, 6);
gtk_table_attach (table, preview->toggle,
0, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0);
gtk_box_pack_start (GTK_BOX (preview), preview->toggle, FALSE, FALSE, 0);
gtk_widget_show (preview->toggle);
g_signal_connect (preview->toggle, "toggled",
@ -370,8 +377,8 @@ gimp_preview_area_size_allocate (GtkWidget *widget,
gint width = preview->xmax - preview->xmin;
gint height = preview->ymax - preview->ymin;
preview->width = allocation->width;
preview->height = allocation->height;
preview->width = MIN (width, allocation->width);
preview->height = MIN (height, allocation->height);
if (width > preview->width)
{
@ -632,6 +639,37 @@ gimp_preview_get_update (GimpPreview *preview)
return preview->update_preview;
}
/**
* gimp_preview_set_bounds:
* @preview: a #GimpPreview widget
* @xmin:
* @ymin:
* @xmax:
* @ymax:
*
* Since: GIMP 2.2
**/
void
gimp_preview_set_bounds (GimpPreview *preview,
gint xmin,
gint ymin,
gint xmax,
gint ymax)
{
g_return_if_fail (GIMP_IS_PREVIEW (preview));
g_return_if_fail (xmax > xmin);
g_return_if_fail (ymax > ymin);
preview->xmin = xmin;
preview->ymin = ymin;
preview->xmax = xmax;
preview->ymax = ymax;
gimp_preview_area_set_max_size (GIMP_PREVIEW_AREA (preview->area),
xmax - xmin,
ymax - ymin);
}
/**
* gimp_preview_get_size:
* @preview: a #GimpPreview widget

View file

@ -22,7 +22,7 @@
#ifndef __GIMP_PREVIEW_H__
#define __GIMP_PREVIEW_H__
#include <gtk/gtktable.h>
#include <gtk/gtkvbox.h>
G_BEGIN_DECLS
@ -42,7 +42,7 @@ typedef struct _GimpPreviewClass GimpPreviewClass;
struct _GimpPreview
{
GtkTable parent_instance;
GtkVBox parent_instance;
gboolean update_preview;
@ -66,10 +66,10 @@ struct _GimpPreview
};
struct _GimpPreviewClass
{
GtkTableClass parent_class;
GtkVBoxClass parent_class;
/* virtuals */
void (* draw) (GimpPreview *preview);
void (* draw) (GimpPreview *preview);
/* signal */
void (* invalidated) (GimpPreview *preview);
@ -82,6 +82,12 @@ void gimp_preview_set_update (GimpPreview *preview,
gboolean update);
gboolean gimp_preview_get_update (GimpPreview *preview);
void gimp_preview_set_bounds (GimpPreview *preview,
gint xmin,
gint ymin,
gint xmax,
gint ymax);
void gimp_preview_get_size (GimpPreview *preview,
gint *width,
gint *height);

View file

@ -141,6 +141,8 @@ gimp_preview_area_init (GimpPreviewArea *area)
area->width = 0;
area->height = 0;
area->rowstride = 0;
area->max_width = -1;
area->max_height = -1;
}
static void
@ -213,12 +215,18 @@ gimp_preview_area_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
GimpPreviewArea *area = GIMP_PREVIEW_AREA (widget);
gint width;
gint height;
if (GTK_WIDGET_CLASS (parent_class)->size_allocate)
GTK_WIDGET_CLASS (parent_class)->size_allocate (widget, allocation);
if (widget->allocation.width != area->width ||
widget->allocation.height != area->height)
width = (area->max_width > 0 ?
MIN (allocation->width, area->max_width) : allocation->width);
height = (area->max_height > 0 ?
MIN (allocation->height, area->max_height) : allocation->height);
if (width != area->width || height != area->height)
{
if (area->buf)
{
@ -228,8 +236,8 @@ gimp_preview_area_size_allocate (GtkWidget *widget,
area->rowstride = 0;
}
area->width = widget->allocation.width;
area->height = widget->allocation.height;
area->width = width;
area->height = height;
}
}
@ -238,7 +246,8 @@ gimp_preview_area_expose (GtkWidget *widget,
GdkEventExpose *event)
{
GimpPreviewArea *area;
guchar *buf;
GdkRectangle rect;
GdkRectangle render;
g_return_val_if_fail (GIMP_IS_PREVIEW_AREA (widget), FALSE);
@ -247,19 +256,29 @@ gimp_preview_area_expose (GtkWidget *widget,
if (! area->buf)
return FALSE;
buf = area->buf + event->area.x * 3 + event->area.y * area->rowstride;
rect.x = (widget->allocation.width - area->width) / 2;
rect.y = (widget->allocation.height - area->height) / 2;
rect.width = area->width;
rect.height = area->height;
gdk_draw_rgb_image_dithalign (widget->window,
widget->style->fg_gc[widget->state],
event->area.x,
event->area.y,
event->area.width,
event->area.height,
GDK_RGB_DITHER_MAX,
buf,
area->rowstride,
area->offset_x - event->area.x,
area->offset_y - event->area.y);
if (gdk_rectangle_intersect (&rect, &event->area, &render))
{
gint x = render.x - rect.x;
gint y = render.y - rect.y;
guchar *buf = area->buf + x * 3 + y * area->rowstride;
gdk_draw_rgb_image_dithalign (widget->window,
widget->style->fg_gc[widget->state],
render.x,
render.y,
render.width,
render.height,
GDK_RGB_DITHER_MAX,
buf,
area->rowstride,
area->offset_x - render.x,
area->offset_y - render.y);
}
return FALSE;
}
@ -697,10 +716,10 @@ gimp_preview_area_blend (GimpPreviewArea *area,
if (s1[3] == s2[3])
{
inter[3] = s1[3];
inter[0] = ((s1[0] << 8) + (s2[0] - s1[0]) * opacity) >> 8;
inter[1] = ((s1[1] << 8) + (s2[1] - s1[1]) * opacity) >> 8;
inter[2] = ((s1[2] << 8) + (s2[2] - s1[2]) * opacity) >> 8;
inter[3] = s1[3];
}
else
{
@ -708,7 +727,7 @@ gimp_preview_area_blend (GimpPreviewArea *area,
if (inter[3])
{
for (i=0 ; i<3 ; i++)
for (i = 0; i < 3; i++)
{
gushort a = s1[i] * s1[3];
gushort b = s2[i] * s2[3];
@ -782,8 +801,8 @@ gimp_preview_area_blend (GimpPreviewArea *area,
if (s1[1] == s2[1])
{
inter[1] = s1[1];
inter[0] = ((s1[0] << 8) + (s2[0] - s1[0]) * opacity) >> 8;
inter[1] = s1[1];
}
else
{
@ -794,7 +813,8 @@ gimp_preview_area_blend (GimpPreviewArea *area,
gushort a = s1[0] * s1[1];
gushort b = s2[0] * s2[1];
inter[0] = (((a << 8) + (b - a) * opacity) >> 8) / inter[1];
inter[0] =
(((a << 8) + (b - a) * opacity) >> 8) / inter[1];
}
}
@ -866,10 +886,13 @@ gimp_preview_area_blend (GimpPreviewArea *area,
if (s1[1] == s2[1])
{
inter[0] = (((cmap1[0] << 8) +
(cmap2[0] - cmap1[0]) * opacity) >> 8);
inter[1] = (((cmap1[1] << 8) +
(cmap2[1] - cmap1[1]) * opacity) >> 8);
inter[2] = (((cmap1[2] << 8) +
(cmap2[2] - cmap1[2]) * opacity) >> 8);
inter[3] = s1[1];
inter[0] = ((cmap1[0] << 8) + (cmap2[0] - cmap1[0]) * opacity) >> 8;
inter[1] = ((cmap1[1] << 8) + (cmap2[1] - cmap1[1]) * opacity) >> 8;
inter[2] = ((cmap1[2] << 8) + (cmap2[2] - cmap1[2]) * opacity) >> 8;
}
else
{
@ -877,7 +900,7 @@ gimp_preview_area_blend (GimpPreviewArea *area,
if (inter[3])
{
for (i = 0 ; i < 3 ; i++)
for (i = 0; i < 3; i++)
{
gushort a = cmap1[i] * s1[1];
gushort b = cmap2[i] * s2[1];
@ -1121,18 +1144,18 @@ gimp_preview_area_mask (GimpPreviewArea *area,
if (s1[3] == s2[3])
{
inter[3] = s1[3];
inter[0] = ((s1[0] << 8) + (s2[0] - s1[0]) * m[0]) >> 8;
inter[1] = ((s1[1] << 8) + (s2[1] - s1[1]) * m[0]) >> 8;
inter[2] = ((s1[2] << 8) + (s2[2] - s1[2]) * m[0]) >> 8;
}
inter[3] = s1[3];
}
else
{
inter[3] = ((s1[3] << 8) + (s2[3] - s1[3]) * m[0]) >> 8;
if (inter[3])
{
for (i=0 ; i<3 ; i++)
for (i = 0; i < 3; i++)
{
gushort a = s1[i] * s1[3];
gushort b = s2[i] * s2[3];
@ -1160,9 +1183,12 @@ gimp_preview_area_mask (GimpPreviewArea *area,
register guint alpha = inter[3] + 1;
register guint check = CHECK_COLOR (area, row, col);
d[0] = ((check << 8) + (inter[0] - check) * alpha) >> 8;
d[1] = ((check << 8) + (inter[1] - check) * alpha) >> 8;
d[2] = ((check << 8) + (inter[2] - check) * alpha) >> 8;
d[0] = (((check << 8) +
(inter[0] - check) * alpha) >> 8);
d[1] = (((check << 8) +
(inter[1] - check) * alpha) >> 8);
d[2] = (((check << 8) +
(inter[2] - check) * alpha) >> 8);
}
break;
}
@ -1262,8 +1288,8 @@ gimp_preview_area_mask (GimpPreviewArea *area,
if (s1[1] == s2[1])
{
inter[1] = s1[1];
inter[0] = ((s1[0] << 8) + (s2[0] - s1[0]) * m[0]) >> 8;
inter[1] = s1[1];
}
else
{
@ -1411,10 +1437,13 @@ gimp_preview_area_mask (GimpPreviewArea *area,
if (s1[1] == s2[1])
{
inter[0] = (((cmap1[0] << 8) +
(cmap2[0] - cmap1[0]) * m[0]) >> 8);
inter[1] = (((cmap1[1] << 8) +
(cmap2[1] - cmap1[1]) * m[0]) >> 8);
inter[2] = (((cmap1[2] << 8) +
(cmap2[2] - cmap1[2]) * m[0]) >> 8);
inter[3] = s1[1];
inter[0] = ((cmap1[0] << 8) + (cmap2[0] - cmap1[0]) * m[0]) >> 8;
inter[1] = ((cmap1[1] << 8) + (cmap2[1] - cmap1[1]) * m[0]) >> 8;
inter[2] = ((cmap1[2] << 8) + (cmap2[2] - cmap1[2]) * m[0]) >> 8;
}
else
{
@ -1613,6 +1642,26 @@ gimp_preview_area_set_cmap (GimpPreviewArea *area,
}
}
/**
* gimp_preview_area_set_max_size:
* @area: a #GimpPreviewArea widget
* @width:
* @height:
*
* Since: GIMP 2.2
**/
void
gimp_preview_area_set_max_size (GimpPreviewArea *area,
gint width,
gint height)
{
g_return_if_fail (GIMP_IS_PREVIEW_AREA (area));
area->max_width = width;
area->max_height = height;
}
/* popup menu */

View file

@ -44,6 +44,8 @@ struct _GimpPreviewArea
gint rowstride;
gint offset_x;
gint offset_y;
gint max_width;
gint max_height;
guchar *buf;
guchar *cmap;
};
@ -54,59 +56,64 @@ struct _GimpPreviewAreaClass
};
GType gimp_preview_area_get_type (void) G_GNUC_CONST;
GType gimp_preview_area_get_type (void) G_GNUC_CONST;
GtkWidget * gimp_preview_area_new (void);
GtkWidget * gimp_preview_area_new (void);
void gimp_preview_area_draw (GimpPreviewArea *area,
gint x,
gint y,
gint width,
gint height,
GimpImageType type,
const guchar *buf,
gint rowstride);
void gimp_preview_area_blend (GimpPreviewArea *area,
gint x,
gint y,
gint width,
gint height,
GimpImageType type,
const guchar *buf1,
gint rowstride1,
const guchar *buf2,
gint rowstride2,
guchar opacity);
void gimp_preview_area_mask (GimpPreviewArea *area,
gint x,
gint y,
gint width,
gint height,
GimpImageType type,
const guchar *buf1,
gint rowstride1,
const guchar *buf2,
gint rowstride2,
guchar *mask,
gint rowstride_mask);
void gimp_preview_area_draw (GimpPreviewArea *area,
gint x,
gint y,
gint width,
gint height,
GimpImageType type,
const guchar *buf,
gint rowstride);
void gimp_preview_area_blend (GimpPreviewArea *area,
gint x,
gint y,
gint width,
gint height,
GimpImageType type,
const guchar *buf1,
gint rowstride1,
const guchar *buf2,
gint rowstride2,
guchar opacity);
void gimp_preview_area_mask (GimpPreviewArea *area,
gint x,
gint y,
gint width,
gint height,
GimpImageType type,
const guchar *buf1,
gint rowstride1,
const guchar *buf2,
gint rowstride2,
guchar *mask,
gint rowstride_mask);
void gimp_preview_area_fill (GimpPreviewArea *area,
gint x,
gint y,
gint width,
gint height,
guchar red,
guchar green,
guchar blue);
void gimp_preview_area_fill (GimpPreviewArea *area,
gint x,
gint y,
gint width,
gint height,
guchar red,
guchar green,
guchar blue);
void gimp_preview_area_set_offsets (GimpPreviewArea *area,
gint x,
gint y);
void gimp_preview_area_set_cmap (GimpPreviewArea *area,
const guchar *cmap,
gint num_colors);
void gimp_preview_area_set_offsets (GimpPreviewArea *area,
gint x,
gint y);
void gimp_preview_area_menu_popup (GimpPreviewArea *area,
GdkEventButton *event);
void gimp_preview_area_set_cmap (GimpPreviewArea *area,
const guchar *cmap,
gint num_colors);
void gimp_preview_area_set_max_size (GimpPreviewArea *area,
gint width,
gint height);
void gimp_preview_area_menu_popup (GimpPreviewArea *area,
GdkEventButton *event);
#endif /* __GIMP_PREVIEW_AREA_H__ */

View file

@ -157,12 +157,14 @@ EXPORTS
gimp_preview_area_menu_popup
gimp_preview_area_new
gimp_preview_area_set_cmap
gimp_preview_area_set_max_size
gimp_preview_draw
gimp_preview_get_position
gimp_preview_get_size
gimp_preview_get_type
gimp_preview_get_update
gimp_preview_invalidate
gimp_preview_set_bounds
gimp_preview_set_update
gimp_query_boolean_box
gimp_query_double_box

View file

@ -469,15 +469,11 @@ gauss_dialog (gint32 image_ID,
vbox = gtk_vbox_new (FALSE, 12);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), vbox, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), vbox, TRUE, TRUE, 0);
gtk_widget_show (vbox);
hbox = gtk_hbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
preview = gimp_drawable_preview_new (drawable, NULL);
gtk_box_pack_start (GTK_BOX (hbox), preview, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (vbox), preview, TRUE, TRUE, 0);
gtk_widget_show (preview);
hbox = gtk_hbox_new (FALSE, 12);
@ -496,7 +492,7 @@ gauss_dialog (gint32 image_ID,
size = gimp_coordinates_new (unit, "%a", TRUE, FALSE, -1,
GIMP_SIZE_ENTRY_UPDATE_SIZE,
bvals.horizontal == bvals.vertical,
(bvals.horizontal == bvals.vertical),
FALSE,
_("_Horizontal:"), bvals.horizontal, xres,
@ -651,7 +647,7 @@ gauss (GimpDrawable *drawable,
if (horz <= 0.0 && vert <= 0.0)
{
if (preview)
gimp_preview_draw (preview);
gimp_preview_draw (GIMP_PREVIEW (preview));
return;
}