Commit cafb7c43 authored by Sven Neumann's avatar Sven Neumann Committed by Sven Neumann

plug-ins/common/gauss_iir.c plug-ins/common/gauss_rle.c

2004-05-19  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/gauss_iir.c
	* plug-ins/common/gauss_rle.c
	* plug-ins/common/gbr.c
	* plug-ins/common/gee.c
	* plug-ins/common/gee_zoom.c
	* plug-ins/common/gif.c
	* plug-ins/common/gih.c
	* plug-ins/common/glasstile.c
	* plug-ins/common/gtm.c: HIG-ified.
parent 116f269f
2004-05-19 Sven Neumann <sven@gimp.org>
* plug-ins/common/gauss_iir.c
* plug-ins/common/gauss_rle.c
* plug-ins/common/gbr.c
* plug-ins/common/gee.c
* plug-ins/common/gee_zoom.c
* plug-ins/common/gif.c
* plug-ins/common/gih.c
* plug-ins/common/glasstile.c
* plug-ins/common/gtm.c: HIG-ified.
2004-05-19 Sven Neumann <sven@gimp.org>
* plug-ins/common/exchange.c: fixed minor dialog layout issues.
......
......@@ -18,8 +18,6 @@
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
......@@ -60,8 +58,8 @@ static void gauss_iir (GimpDrawable *drawable,
/*
* Gaussian blur interface
*/
static gint gauss_iir_dialog (void);
static gint gauss_iir2_dialog (gint32 image_ID,
static gboolean gauss_iir_dialog (void);
static gboolean gauss_iir2_dialog (gint32 image_ID,
GimpDrawable *drawable);
/*
......@@ -328,7 +326,7 @@ run (const gchar *name,
values[0].data.d_status = status;
}
static gint
static gboolean
gauss_iir_dialog (void)
{
GtkWidget *dlg;
......@@ -336,7 +334,6 @@ gauss_iir_dialog (void)
GtkWidget *spinbutton;
GtkObject *adj;
GtkWidget *toggle;
GtkWidget *frame;
GtkWidget *vbox;
GtkWidget *hbox;
gboolean run;
......@@ -352,15 +349,9 @@ gauss_iir_dialog (void)
NULL);
/* parameter settings */
frame = gtk_frame_new (_("Parameter Settings"));
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
gtk_widget_show (frame);
vbox = gtk_vbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
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, TRUE, TRUE, 0);
gtk_widget_show (vbox);
toggle = gtk_check_button_new_with_label (_("Blur Horizontally"));
......@@ -381,8 +372,9 @@ gauss_iir_dialog (void)
(GtkSignalFunc) gimp_toggle_button_update,
&bvals.vertical);
hbox = gtk_hbox_new (FALSE, 4);
hbox = gtk_hbox_new (FALSE, 6);
gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
gtk_widget_show (hbox);
label = gtk_label_new (_("Blur Radius:"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
......@@ -398,7 +390,6 @@ gauss_iir_dialog (void)
G_CALLBACK (gimp_double_adjustment_update),
&bvals.radius);
gtk_widget_show (hbox);
gtk_widget_show (dlg);
run = (gimp_dialog_run (GIMP_DIALOG (dlg)) == GTK_RESPONSE_OK);
......@@ -409,7 +400,7 @@ gauss_iir_dialog (void)
}
static gint
static gboolean
gauss_iir2_dialog (gint32 image_ID,
GimpDrawable *drawable)
{
......@@ -433,9 +424,10 @@ gauss_iir2_dialog (gint32 image_ID,
NULL);
/* parameter settings */
frame = gtk_frame_new (_("Blur Radius"));
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
frame = gimp_frame_new (_("Blur Radius"));
gtk_container_set_border_width (GTK_CONTAINER (frame), 12);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
gtk_widget_show (frame);
/* Get the image resolution and unit */
gimp_image_get_resolution (image_ID, &xres, &yres);
......@@ -454,13 +446,11 @@ gauss_iir2_dialog (gint32 image_ID,
_("_Vertical:"), b2vals.vertical, yres,
0, 8 * MAX (drawable->width, drawable->height),
0, 0);
gtk_container_set_border_width (GTK_CONTAINER (size), 4);
gtk_container_add (GTK_CONTAINER (frame), size);
gtk_widget_show (size);
gimp_size_entry_set_pixel_digits (GIMP_SIZE_ENTRY (size), 1);
gtk_widget_show (size);
gtk_widget_show (frame);
gtk_widget_show (dlg);
run = (gimp_dialog_run (GIMP_DIALOG (dlg)) == GTK_RESPONSE_OK);
......
......@@ -18,8 +18,6 @@
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
......@@ -60,8 +58,8 @@ static void gauss_rle (GimpDrawable *drawable,
/*
* Gaussian blur interface
*/
static gint gauss_rle_dialog (void);
static gint gauss_rle2_dialog (gint32 image_ID,
static gboolean gauss_rle_dialog (void);
static gboolean gauss_rle2_dialog (gint32 image_ID,
GimpDrawable *drawable);
/*
......@@ -322,7 +320,7 @@ run (const gchar *name,
values[0].data.d_status = status;
}
static gint
static gboolean
gauss_rle_dialog (void)
{
GtkWidget *dlg;
......@@ -330,7 +328,6 @@ gauss_rle_dialog (void)
GtkWidget *spinbutton;
GtkObject *adj;
GtkWidget *toggle;
GtkWidget *frame;
GtkWidget *vbox;
GtkWidget *hbox;
gboolean run;
......@@ -346,15 +343,9 @@ gauss_rle_dialog (void)
NULL);
/* parameter settings */
frame = gtk_frame_new (_("Parameter Settings"));
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
gtk_widget_show (frame);
vbox = gtk_vbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
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, TRUE, TRUE, 0);
gtk_widget_show (vbox);
toggle = gtk_check_button_new_with_label (_("Blur Horizontally"));
......@@ -375,8 +366,9 @@ gauss_rle_dialog (void)
G_CALLBACK (gimp_toggle_button_update),
&bvals.vertical);
hbox = gtk_hbox_new (FALSE, 4);
hbox = gtk_hbox_new (FALSE, 6);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
label = gtk_label_new (_("Blur Radius:"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
......@@ -392,7 +384,6 @@ gauss_rle_dialog (void)
G_CALLBACK (gimp_double_adjustment_update),
&bvals.radius);
gtk_widget_show (hbox);
gtk_widget_show (dlg);
run = (gimp_dialog_run (GIMP_DIALOG (dlg)) == GTK_RESPONSE_OK);
......@@ -403,7 +394,7 @@ gauss_rle_dialog (void)
}
static gint
static gboolean
gauss_rle2_dialog (gint32 image_ID,
GimpDrawable *drawable)
{
......@@ -427,9 +418,10 @@ gauss_rle2_dialog (gint32 image_ID,
NULL);
/* parameter settings */
frame = gtk_frame_new (_("Blur Radius"));
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
frame = gimp_frame_new (_("Blur Radius"));
gtk_container_set_border_width (GTK_CONTAINER (frame), 12);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
gtk_widget_show (frame);
/* Get the image resolution and unit */
gimp_image_get_resolution (image_ID, &xres, &yres);
......@@ -448,13 +440,11 @@ gauss_rle2_dialog (gint32 image_ID,
_("_Vertical:"), b2vals.vertical, yres,
0, 8 * MAX (drawable->width, drawable->height),
0, 0);
gtk_container_set_border_width (GTK_CONTAINER (size), 4);
gtk_container_add (GTK_CONTAINER (frame), size);
gtk_widget_show (size);
gimp_size_entry_set_pixel_digits (GIMP_SIZE_ENTRY (size), 1);
gtk_widget_show (size);
gtk_widget_show (frame);
gtk_widget_show (dlg);
run = (gimp_dialog_run (GIMP_DIALOG (dlg)) == GTK_RESPONSE_OK);
......
......@@ -671,9 +671,9 @@ save_dialog (void)
/* The main table */
table = gtk_table_new (2, 2, FALSE);
gtk_container_set_border_width (GTK_CONTAINER (table), 6);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_container_set_border_width (GTK_CONTAINER (table), 12);
gtk_table_set_row_spacings (GTK_TABLE (table), 6);
gtk_table_set_col_spacings (GTK_TABLE (table), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), table, TRUE, TRUE, 0);
gtk_widget_show (table);
......
......@@ -21,21 +21,19 @@
/* Declare local functions. */
static void query (void);
static void run (const gchar *name,
gint nparams,
const GimpParam *param,
gint *nreturn_vals,
GimpParam **return_vals);
static void query (void);
static void run (const gchar *name,
gint nparams,
const GimpParam *param,
gint *nreturn_vals,
GimpParam **return_vals);
static void do_fun (void);
static void window_response_callback (GtkWidget *widget,
gint response_id,
gpointer data);
static gboolean iteration_callback (gpointer data);
static void toggle_feedbacktype (GtkWidget *widget,
gpointer data);
static gboolean do_iteration (void);
static void render_frame (void);
static void init_preview_misc (void);
......@@ -51,7 +49,7 @@ GimpPlugInInfo PLUG_IN_INFO =
/* These aren't really redefinable, easily. */
#define IWIDTH 256
#define IWIDTH 256
#define IHEIGHT 256
......@@ -66,7 +64,6 @@ static guchar *srcbump;
static guchar *destbump;
static guint idle_tag;
static GtkWidget *eventbox;
static GtkWidget *drawing_area;
static gint32 image_id;
......@@ -133,17 +130,8 @@ run (const gchar *name,
image_id = param[1].data.d_image;
drawable = gimp_drawable_get (param[2].data.d_drawable);
#if 0
fprintf(stderr, "Got these: %d, %d, %d(%p)\n",
(int)param[0].data.d_int32,
(int)param[1].data.d_image,
(int)param[2].data.d_drawable,
drawable
);
#endif
if (drawable)
do_fun();
do_fun ();
else
status = GIMP_PDB_CALLING_ERROR;
}
......@@ -159,10 +147,6 @@ build_dialog (void)
GtkWidget *dlg;
GtkWidget *button;
GtkWidget *frame;
GtkWidget *frame2;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *hbox2;
gimp_ui_init ("gee", TRUE);
......@@ -172,7 +156,7 @@ build_dialog (void)
NULL);
button = gtk_dialog_add_button (GTK_DIALOG (dlg),
_("** Thank you for choosing GIMP **"),
_("Thank you for choosing GIMP"),
GTK_RESPONSE_OK);
g_signal_connect (dlg, "response",
......@@ -184,60 +168,24 @@ build_dialog (void)
"adam@gimp.org / adam@foxbox.org / 1998-2000"),
NULL);
/* The 'fun' half of the dialog */
frame = gtk_frame_new (NULL);
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
hbox = gtk_hbox_new (FALSE, 5);
gtk_container_set_border_width (GTK_CONTAINER (hbox), 3);
gtk_container_add (GTK_CONTAINER (frame), hbox);
vbox = gtk_vbox_new (FALSE, 5);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 3);
gtk_container_add (GTK_CONTAINER (hbox), vbox);
hbox2 = gtk_hbox_new (TRUE, 0);
gtk_container_set_border_width (GTK_CONTAINER (hbox2), 0);
gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
frame2 = gtk_frame_new (NULL);
gtk_box_pack_start (GTK_BOX (hbox2), frame2, FALSE, FALSE, 0);
eventbox = gtk_event_box_new ();
gtk_container_add (GTK_CONTAINER (frame2), GTK_WIDGET (eventbox));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_container_set_border_width (GTK_CONTAINER (frame), 12);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox),
frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
drawing_area = gtk_drawing_area_new ();
gtk_widget_set_size_request (drawing_area, IWIDTH, IHEIGHT);
gtk_container_add (GTK_CONTAINER (eventbox), drawing_area);
gtk_container_add (GTK_CONTAINER (frame), drawing_area);
gtk_widget_show (drawing_area);
gtk_widget_show (eventbox);
gtk_widget_set_events (eventbox,
gtk_widget_get_events (eventbox)
| GDK_BUTTON_RELEASE_MASK);
gtk_widget_show (frame2);
gtk_widget_show (hbox2);
gtk_widget_show (vbox);
gtk_widget_show (hbox);
gtk_widget_show (frame);
gtk_widget_show (dlg);
idle_tag = g_idle_add_full (G_PRIORITY_LOW,
(GSourceFunc) iteration_callback,
(GSourceFunc) do_iteration,
NULL,
NULL);
g_signal_connect (eventbox, "button_release_event",
G_CALLBACK (toggle_feedbacktype),
NULL);
}
......@@ -246,8 +194,9 @@ build_dialog (void)
#define LIGHT 0x21 */
#define LIGHT 0x0d
static guchar llut[256];
static void
gen_llut(void)
gen_llut (void)
{
int i,k;
......@@ -272,7 +221,7 @@ do_fun (void)
imagetype = gimp_image_base_type(image_id);
if (imagetype == GIMP_INDEXED)
palette = gimp_image_get_cmap(image_id, &ncolours);
palette = gimp_image_get_cmap (image_id, &ncolours);
else
if (imagetype == GIMP_GRAY)
{
......@@ -301,13 +250,14 @@ do_fun (void)
static void
show(void)
show (void)
{
gdk_draw_rgb_32_image (drawing_area->window,
drawing_area->style->white_gc,
0, 0, IWIDTH, IHEIGHT,
GDK_RGB_DITHER_NORMAL,
(guchar*)disp, IWIDTH * 4);
if (GTK_WIDGET_DRAWABLE (drawing_area))
gdk_draw_rgb_32_image (drawing_area->window,
drawing_area->style->white_gc,
0, 0, IWIDTH, IHEIGHT,
GDK_RGB_DITHER_NORMAL,
(guchar *) disp, IWIDTH * 4);
}
......@@ -315,7 +265,7 @@ show(void)
static void
bumpbob(int x, int y, int size)
bumpbob (int x, int y, int size)
{
int o;
......@@ -553,7 +503,7 @@ iterate (void)
GdkModifierType mask;
gint size, i;
gdk_window_get_pointer (eventbox->window, &rxp, &ryp, &mask);
gdk_window_get_pointer (drawing_area->window, &rxp, &ryp, &mask);
for (i = 0; i < BOBS_PER_FRAME; i++)
{
......@@ -595,9 +545,8 @@ render_frame (void)
}
#endif
iterate();
show();
iterate ();
show ();
frame++;
}
......@@ -607,10 +556,10 @@ static void
init_preview_misc (void)
{
GimpPixelRgn pixel_rgn;
gint i;
gboolean has_alpha;
gint i;
gboolean has_alpha;
has_alpha = gimp_drawable_has_alpha(drawable->drawable_id);
has_alpha = gimp_drawable_has_alpha (drawable->drawable_id);
env = g_malloc (4 * IWIDTH * IHEIGHT * 2);
disp = g_malloc ((IWIDTH + 2 + IWIDTH * IHEIGHT) * 4);
......@@ -762,23 +711,15 @@ init_preview_misc (void)
}
}
/* Util. */
static int
static gboolean
do_iteration (void)
{
render_frame ();
show ();
return 1;
return TRUE;
}
/* Callbacks */
static void
window_response_callback (GtkWidget *widget,
gint response_id,
......@@ -789,18 +730,3 @@ window_response_callback (GtkWidget *widget,
gtk_widget_destroy (widget);
}
static void
toggle_feedbacktype (GtkWidget *widget,
gpointer event)
{
}
static gboolean
iteration_callback (gpointer data)
{
do_iteration ();
return TRUE;
}
......@@ -40,32 +40,24 @@
#include "libgimp/stdplugins-intl.h"
/* Test for GTK1.2-style gdkrgb code, else use old 'preview' code. */
#ifdef __GDK_RGB_H__
#define RAPH_IS_HOME yep
#endif
/* Declare local functions. */
static void query (void);
static void run (const gchar *name,
gint nparams,
const GimpParam *param,
gint *nreturn_vals,
GimpParam **return_vals);
static void query (void);
static void run (const gchar *name,
gint nparams,
const GimpParam *param,
gint *nreturn_vals,
GimpParam **return_vals);
static void do_fun (void);
static void window_response_callback (GtkWidget *widget,
gint response_id,
gpointer data);
static gboolean iteration_callback (gpointer data);
static void toggle_feedbacktype (GtkWidget *widget,
gpointer data);
static void window_response_callback (GtkWidget *widget,
gint response_id,
gpointer data);
static gboolean do_iteration (void);
static gboolean toggle_feedbacktype (GtkWidget *widget,
GdkEventButton *bevent);
static void render_frame (void);
static void show_frame (void);
static void init_preview_misc (void);
......@@ -96,11 +88,9 @@ static gint wiggleamp = LOWAMP;
static guchar *seed_data;
static guchar *preview_data1;
static guchar *preview_data2;
#ifdef RAPH_IS_HOME
static GtkWidget *drawing_area;
#else
static GtkPreview *preview = NULL;
#endif
static gint32 image_id;
static GimpDrawable *drawable;
static GimpImageBaseType imagetype;
......@@ -108,9 +98,8 @@ static guchar *palette;
static gint ncolours;
static guint idle_tag;
static GtkWidget *eventbox;
static gboolean feedbacktype = FALSE;
static gboolean wiggly = TRUE;
static gboolean wiggly = TRUE;
static gboolean rgb_mode;
......@@ -191,22 +180,16 @@ build_dialog (void)
GtkWidget *dlg;
GtkWidget *button;
GtkWidget *frame;
GtkWidget *frame2;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *hbox2;
gimp_ui_init ("gee_zoom", TRUE);
dlg = gimp_dialog_new (_("GEE-ZOOM: The Plug-In Formerly Known As "
"\"The GIMP E'er Egg\""),
"gee_zoom",
dlg = gimp_dialog_new (_("GEE-ZOOM"), "gee_zoom",
NULL, 0,
gimp_standard_help_func, "plug-in-the-old-egg",
NULL);
button = gtk_dialog_add_button (GTK_DIALOG (dlg),
_("** Thank you for choosing GIMP **"),
_("Thank you for choosing GIMP"),
GTK_RESPONSE_OK);
g_signal_connect (dlg, "response",
......@@ -221,66 +204,30 @@ build_dialog (void)
/* The 'fun' half of the dialog */
frame = gtk_frame_new (NULL);
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
hbox = gtk_hbox_new (FALSE, 5);
gtk_container_set_border_width (GTK_CONTAINER (hbox), 3);
gtk_container_add (GTK_CONTAINER (frame), hbox);
vbox = gtk_vbox_new (FALSE, 5);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 3);
gtk_container_add (GTK_CONTAINER (hbox), vbox);
hbox2 = gtk_hbox_new (TRUE, 0);
gtk_container_set_border_width (GTK_CONTAINER (hbox2), 0);
gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
frame2 = gtk_frame_new (NULL);
gtk_box_pack_start (GTK_BOX (hbox2), frame2, FALSE, FALSE, 0);
eventbox = gtk_event_box_new();
gtk_container_add (GTK_CONTAINER (frame2), GTK_WIDGET (eventbox));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_container_set_border_width (GTK_CONTAINER (frame), 12);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox),
frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
#ifdef RAPH_IS_HOME
drawing_area = gtk_drawing_area_new ();
gtk_widget_set_size_request (drawing_area, width, height);
gtk_container_add (GTK_CONTAINER (eventbox), drawing_area);
gtk_container_add (GTK_CONTAINER (frame), drawing_area);
gtk_widget_show (drawing_area);
#else
preview = GTK_PREVIEW (gtk_preview_new (rgb_mode ?
GTK_PREVIEW_COLOR :
GTK_PREVIEW_GRAYSCALE));
gtk_preview_size (preview, width, height);
gtk_container_add (GTK_CONTAINER (eventbox), GTK_WIDGET (preview));
gtk_widget_show (GTK_WIDGET (preview));
#endif /* RAPH_IS_HOME */
gtk_widget_show (eventbox);
gtk_widget_set_events (eventbox,
gtk_widget_get_events (eventbox)
| GDK_BUTTON_RELEASE_MASK);
gtk_widget_add_events (drawing_area,
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
gtk_widget_show (frame2);
gtk_widget_show (hbox2);
gtk_widget_show (vbox);
gtk_widget_show (hbox);
gtk_widget_show (frame);
g_signal_connect (drawing_area, "button_release_event",
G_CALLBACK (toggle_feedbacktype),
NULL);
gtk_widget_show (dlg);
idle_tag = g_idle_add_full (G_PRIORITY_LOW,
(GSourceFunc) iteration_callback,
(GSourceFunc) do_iteration,
NULL,
NULL);
g_signal_connect (eventbox, "button_release_event",
G_CALLBACK (toggle_feedbacktype),
NULL);
}
......@@ -304,7 +251,7 @@ do_fun (void)
imagetype = gimp_image_base_type(image_id);
if (imagetype == GIMP_INDEXED)
palette = gimp_image_get_cmap(image_id, &ncolours);
palette = gimp_image_get_cmap (image_id, &ncolours);
/* cache hint */