Hi,
On Fri, 2008-05-09 at 11:45 +0200, Nicolás Serrano Martínez Santos
wrote:
> Please find attached a simple plugin which consist in a dialog showing
> a drawable. Where you can specify the width and height that will be
> shown.
>
>
> This dialog does not refresh the GimpPreviewArea every time you click
> the spin. am I missing something??
You need to redraw the preview-area everytime it's size changes. It
doesn't keep the buffer across size changes. I have attached a modified
version of your test code that does the right thing.
Sven
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
typedef struct{
gint x1,y1,width,height;
GimpDrawable *drawable; GtkWidget *preview, *frame;
} redraw_info;
gboolean dialog (GimpDrawable *drawable);
void change_width(GtkSpinButton *p, gpointer data);
void change_height(GtkSpinButton *p, gpointer data);
static void size_changed (GimpPreviewArea *preview,
GtkAllocation *allocation,
redraw_info *info);
/*****************************************/
static void query (void);
static void run (const gchar *name,
gint nparams,
const GimpParam *param,
gint *nreturn_vals,
GimpParam **return_vals);
GimpPlugInInfo PLUG_IN_INFO =
{
NULL,
NULL,
query,
run
};
MAIN()
static void query (void){
static GimpParamDef args[] = {
{ GIMP_PDB_INT32,"run-mode","Run mode"},
{ GIMP_PDB_IMAGE,"image","Input image"},
{ GIMP_PDB_DRAWABLE,"drawable","Input drawable" },
};
gimp_install_procedure (
"test",
"test",
"Help:",
"test-author",
"Copyright test-author",
"2008",
"test",
"GRAY",
GIMP_PLUGIN,
G_N_ELEMENTS (args), 0,
args, NULL);
gimp_plugin_menu_register ("test","<Image>/test");
}
static void
run (const gchar *name,
gint nparams,
const GimpParam *param,
gint *nreturn_vals,
GimpParam **return_vals)
{
static GimpParam values[1];
GimpPDBStatusType status = GIMP_PDB_SUCCESS;
GimpRunMode run_mode;
gint32 image; GimpDrawable *drawable;
/* Setting mandatory output values */
*nreturn_vals = 1;
*return_vals = values;
values[0].type = GIMP_PDB_STATUS;
values[0].data.d_status = status;
/* Getting run_mode - we won't display a dialog if
* we are in NONINTERACTIVE mode
*/
run_mode = param[0].data.d_int32;
image = param[1].data.d_image;
drawable = gimp_drawable_get(param[2].data.d_drawable);
gimp_tile_cache_ntiles (2 * (drawable->width /
gimp_tile_width () + 1));
switch (run_mode){
case GIMP_RUN_NONINTERACTIVE:
status = GIMP_PDB_CALLING_ERROR;
break;
case GIMP_RUN_INTERACTIVE:
dialog(drawable);
break;
case GIMP_RUN_WITH_LAST_VALS:
/* Possibly retrieve data */
//gimp_get_data (GIDOC_TRANSCRIPTIONS_KEY_VALS, &vals);
break;
default:
break;
}
/******************** RUN SECTION ************************/
if (status == GIMP_PDB_SUCCESS)
values[0].type = GIMP_PDB_STATUS;
values[0].data.d_status = status;
}
gboolean dialog (GimpDrawable *drawable) {
/* widget variables */
GtkWidget *dlg;
GtkWidget *main_vbox;
GtkWidget *frame;
GtkWidget *hbox;
GtkWidget *label;
GtkWidget *spin_width, *spin_height;
GtkWidget *preview;
gboolean run = FALSE;
redraw_info info;
gimp_ui_init ("test", TRUE);
dlg = gimp_dialog_new ("test", "test",
NULL, 0,
gimp_standard_help_func, "test",
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OK, GTK_RESPONSE_OK,
NULL);
/* FIXME The window doesn't fit the scrowable zone... */
main_vbox = gtk_vbox_new (FALSE, 12);
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 12);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dlg)->vbox), main_vbox);
frame = gimp_frame_new("Preview");
gtk_box_pack_start (GTK_BOX (main_vbox), frame,FALSE,FALSE, 0);
hbox = gtk_hbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (frame), hbox);
preview = gimp_preview_area_new();
gtk_box_pack_start (GTK_BOX (hbox), preview, FALSE, FALSE, 0);
g_signal_connect (preview, "size-allocate", G_CALLBACK (size_changed), &info);
info.x1 = 0; info.y1 = 0;
info.height = 100; info.width = 100;
info.drawable = drawable; info.preview = preview; info.frame = frame;
gtk_widget_set_size_request (GTK_WIDGET (preview),
info.width, info.height);
gtk_widget_show_all (frame);
hbox = gtk_hbox_new (FALSE, 12);
gtk_box_pack_start (GTK_BOX (main_vbox), hbox,FALSE,FALSE, 0);
label = gtk_label_new("width");
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE,FALSE, 0);
spin_width = gtk_spin_button_new_with_range(100,
gimp_drawable_width(drawable->drawable_id),1);
g_signal_connect(G_OBJECT(spin_width),"value-changed",
G_CALLBACK(change_width),&info);
gtk_box_pack_start (GTK_BOX (hbox), spin_width, FALSE,FALSE, 0);
label = gtk_label_new("height");
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE,FALSE, 0);
spin_height = gtk_spin_button_new_with_range(100,
gimp_drawable_height(drawable->drawable_id),1);
g_signal_connect(G_OBJECT(spin_height),"value-changed",
G_CALLBACK(change_height),&info);
gtk_box_pack_start (GTK_BOX (hbox), spin_height, FALSE,FALSE, 0);
gtk_widget_show_all(hbox);
gtk_widget_show (main_vbox);
gtk_widget_show (dlg);
/* put an initial preview */
run = (gimp_dialog_run (GIMP_DIALOG (dlg)) == GTK_RESPONSE_OK);
gimp_displays_flush ();
gtk_widget_destroy (dlg);
return run;
}
void change_width(GtkSpinButton *p, gpointer data){
redraw_info *info = data;
info->width = gtk_spin_button_get_value(p);
gtk_widget_set_size_request((GtkWidget *) info->preview,
info->width,info->height);
}
void change_height(GtkSpinButton *p, gpointer data){
redraw_info *info = data;
info->height = gtk_spin_button_get_value(p);
gtk_widget_set_size_request (GTK_WIDGET (info->preview),
info->width, info->height);
}
static void
size_changed (GimpPreviewArea *preview,
GtkAllocation *allocation,
redraw_info *info)
{
GimpPixelRgn rgn_input; guchar *buf; gint i;
buf = g_newa (guchar, info->width);
gimp_pixel_rgn_init (&rgn_input,
info->drawable,
0,0,
info->width, info->height,
FALSE, FALSE);
for (i=0; i<info->height; i++)
{
gimp_pixel_rgn_get_row (&rgn_input,buf,0,i,info->width);
gimp_preview_area_draw (GIMP_PREVIEW_AREA(info->preview),
0, i,
info->width, 1,
GIMP_GRAY_IMAGE, buf, info->width);
}
}
_______________________________________________
Gimp-developer mailing list
Gimp-developer@???
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer