diff --git a/ChangeLog b/ChangeLog index 3e5d7bf87f..c57177e638 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2004-07-31 DindinX + + * plug-ins/common/gqbist.c: ported to GimpPreviewArea. + 2004-07-31 DindinX * plug-ins/common/fractaltrace.c: ported to GimpPreviewArea. diff --git a/plug-ins/common/gqbist.c b/plug-ins/common/gqbist.c index c1a11a54a9..e9346a86a8 100644 --- a/plug-ins/common/gqbist.c +++ b/plug-ins/common/gqbist.c @@ -36,11 +36,6 @@ #include #include -#ifdef __GNUC__ -#warning GTK_DISABLE_DEPRECATED -#endif -#undef GTK_DISABLE_DEPRECATED - #include #include @@ -54,8 +49,8 @@ /** qbist renderer ***********************************************************/ -#define MAX_TRANSFORMS 36 -#define NUM_REGISTERS 6 +#define MAX_TRANSFORMS 36 +#define NUM_REGISTERS 6 #define PREVIEW_SIZE 64 #define PLUG_IN_NAME "plug_in_qbist" @@ -105,10 +100,10 @@ QbistInfo; static void query (void); static void run (const gchar *name, - gint nparams, - const GimpParam *param, - gint *nreturn_vals, - GimpParam **return_vals); + gint nparams, + const GimpParam *param, + gint *nreturn_vals, + GimpParam **return_vals); static gboolean dialog_run (void); static void dialog_new_variations (GtkWidget *widget, @@ -143,7 +138,7 @@ create_info (ExpInfo *info) static void modify_info (ExpInfo *o_info, - ExpInfo *n_info) + ExpInfo *n_info) { gint k, n; GRand *gr; @@ -154,27 +149,27 @@ modify_info (ExpInfo *o_info, for (k = 0; k < n; k++) { switch (g_rand_int_range (gr, 0, 4)) - { - case 0: - n_info->transformSequence[g_rand_int_range (gr, 0, MAX_TRANSFORMS)] = - g_rand_int_range (gr, 0, NUM_TRANSFORMS); - break; + { + case 0: + n_info->transformSequence[g_rand_int_range (gr, 0, MAX_TRANSFORMS)] = + g_rand_int_range (gr, 0, NUM_TRANSFORMS); + break; - case 1: - n_info->source[g_rand_int_range (gr, 0, MAX_TRANSFORMS)] = + case 1: + n_info->source[g_rand_int_range (gr, 0, MAX_TRANSFORMS)] = g_rand_int_range (gr, 0, NUM_REGISTERS); - break; + break; - case 2: - n_info->control[g_rand_int_range (gr, 0, MAX_TRANSFORMS)] = + case 2: + n_info->control[g_rand_int_range (gr, 0, MAX_TRANSFORMS)] = g_rand_int_range (gr, 0, NUM_REGISTERS); - break; + break; - case 3: - n_info->dest[g_rand_int_range (gr, 0, MAX_TRANSFORMS)] = + case 3: + n_info->dest[g_rand_int_range (gr, 0, MAX_TRANSFORMS)] = g_rand_int_range (gr, 0, NUM_REGISTERS); - break; - } + break; + } } g_rand_free (gr); } @@ -187,8 +182,8 @@ static gint used_reg_flag[NUM_REGISTERS]; static void check_last_modified (ExpInfo *info, - gint p, - gint n) + gint p, + gint n) { p--; while ((p >= 0) && (info->dest[p] != n)) @@ -213,19 +208,19 @@ optimize (ExpInfo *info) { used_trans_flag[i] = 0; if (i < NUM_REGISTERS) - used_reg_flag[i] = 0; + used_reg_flag[i] = 0; /* double-arg fix: */ switch (info->transformSequence[i]) - { - case ROTATE: - case ROTATE2: - case COMPLEMENT: - info->control[i] = info->dest[i]; - break; + { + case ROTATE: + case ROTATE2: + case COMPLEMENT: + info->control[i] = info->dest[i]; + break; - default: - break; - } + default: + break; + } } /* check for last modified item */ check_last_modified (info, MAX_TRANSFORMS, 0); @@ -251,139 +246,139 @@ qbist (ExpInfo *info, gint accum[3], yy, i; for (i = 0; i < 3; i++) - { - accum[i] = 0; - } + { + accum[i] = 0; + } for (yy = 0; yy < oversampling; yy++) - { - gint xx; + { + gint xx; - for (xx = 0; xx < oversampling; xx++) - { - for (i = 0; i < NUM_REGISTERS; i++) - { - if (used_reg_flag[i]) - { - reg[i][0] = ((gfloat) ((gx + xp) * oversampling + xx)) / ((gfloat) (width * oversampling)); - reg[i][1] = ((gfloat) (yp * oversampling + yy)) / ((gfloat) (height * oversampling)); - reg[i][2] = ((gfloat) i) / ((gfloat) NUM_REGISTERS); - } - } + for (xx = 0; xx < oversampling; xx++) + { + for (i = 0; i < NUM_REGISTERS; i++) + { + if (used_reg_flag[i]) + { + reg[i][0] = ((gfloat) ((gx + xp) * oversampling + xx)) / ((gfloat) (width * oversampling)); + reg[i][1] = ((gfloat) (yp * oversampling + yy)) / ((gfloat) (height * oversampling)); + reg[i][2] = ((gfloat) i) / ((gfloat) NUM_REGISTERS); + } + } - for (i = 0; i < MAX_TRANSFORMS; i++) - { - gushort sr, cr, dr; + for (i = 0; i < MAX_TRANSFORMS; i++) + { + gushort sr, cr, dr; - sr = info->source[i]; - cr = info->control[i]; - dr = info->dest[i]; + sr = info->source[i]; + cr = info->control[i]; + dr = info->dest[i]; - if (used_trans_flag[i]) - switch (info->transformSequence[i]) - { - case PROJECTION: - { - gfloat scalarProd; + if (used_trans_flag[i]) + switch (info->transformSequence[i]) + { + case PROJECTION: + { + gfloat scalarProd; - scalarProd = (reg[sr][0] * reg[cr][0]) + - (reg[sr][1] * reg[cr][1]) + (reg[sr][2] * reg[cr][2]); + scalarProd = (reg[sr][0] * reg[cr][0]) + + (reg[sr][1] * reg[cr][1]) + (reg[sr][2] * reg[cr][2]); - reg[dr][0] = scalarProd * reg[sr][0]; - reg[dr][1] = scalarProd * reg[sr][1]; - reg[dr][2] = scalarProd * reg[sr][2]; - break; - } + reg[dr][0] = scalarProd * reg[sr][0]; + reg[dr][1] = scalarProd * reg[sr][1]; + reg[dr][2] = scalarProd * reg[sr][2]; + break; + } - case SHIFT: - reg[dr][0] = reg[sr][0] + reg[cr][0]; - if (reg[dr][0] >= 1.0) - reg[dr][0] -= 1.0; - reg[dr][1] = reg[sr][1] + reg[cr][1]; - if (reg[dr][1] >= 1.0) - reg[dr][1] -= 1.0; - reg[dr][2] = reg[sr][2] + reg[cr][2]; - if (reg[dr][2] >= 1.0) - reg[dr][2] -= 1.0; - break; + case SHIFT: + reg[dr][0] = reg[sr][0] + reg[cr][0]; + if (reg[dr][0] >= 1.0) + reg[dr][0] -= 1.0; + reg[dr][1] = reg[sr][1] + reg[cr][1]; + if (reg[dr][1] >= 1.0) + reg[dr][1] -= 1.0; + reg[dr][2] = reg[sr][2] + reg[cr][2]; + if (reg[dr][2] >= 1.0) + reg[dr][2] -= 1.0; + break; - case SHIFTBACK: - reg[dr][0] = reg[sr][0] - reg[cr][0]; - if (reg[dr][0] <= 0.0) - reg[dr][0] += 1.0; - reg[dr][1] = reg[sr][1] - reg[cr][1]; - if (reg[dr][1] <= 0.0) - reg[dr][1] += 1.0; - reg[dr][2] = reg[sr][2] - reg[cr][2]; - if (reg[dr][2] <= 0.0) - reg[dr][2] += 1.0; - break; + case SHIFTBACK: + reg[dr][0] = reg[sr][0] - reg[cr][0]; + if (reg[dr][0] <= 0.0) + reg[dr][0] += 1.0; + reg[dr][1] = reg[sr][1] - reg[cr][1]; + if (reg[dr][1] <= 0.0) + reg[dr][1] += 1.0; + reg[dr][2] = reg[sr][2] - reg[cr][2]; + if (reg[dr][2] <= 0.0) + reg[dr][2] += 1.0; + break; - case ROTATE: - reg[dr][0] = reg[sr][1]; - reg[dr][1] = reg[sr][2]; - reg[dr][2] = reg[sr][0]; - break; + case ROTATE: + reg[dr][0] = reg[sr][1]; + reg[dr][1] = reg[sr][2]; + reg[dr][2] = reg[sr][0]; + break; - case ROTATE2: - reg[dr][0] = reg[sr][2]; - reg[dr][1] = reg[sr][0]; - reg[dr][2] = reg[sr][1]; - break; + case ROTATE2: + reg[dr][0] = reg[sr][2]; + reg[dr][1] = reg[sr][0]; + reg[dr][2] = reg[sr][1]; + break; - case MULTIPLY: - reg[dr][0] = reg[sr][0] * reg[cr][0]; - reg[dr][1] = reg[sr][1] * reg[cr][1]; - reg[dr][2] = reg[sr][2] * reg[cr][2]; - break; + case MULTIPLY: + reg[dr][0] = reg[sr][0] * reg[cr][0]; + reg[dr][1] = reg[sr][1] * reg[cr][1]; + reg[dr][2] = reg[sr][2] * reg[cr][2]; + break; - case SINE: - reg[dr][0] = 0.5 + (0.5 * sin (20.0 * reg[sr][0] * reg[cr][0])); - reg[dr][1] = 0.5 + (0.5 * sin (20.0 * reg[sr][1] * reg[cr][1])); - reg[dr][2] = 0.5 + (0.5 * sin (20.0 * reg[sr][2] * reg[cr][2])); - break; + case SINE: + reg[dr][0] = 0.5 + (0.5 * sin (20.0 * reg[sr][0] * reg[cr][0])); + reg[dr][1] = 0.5 + (0.5 * sin (20.0 * reg[sr][1] * reg[cr][1])); + reg[dr][2] = 0.5 + (0.5 * sin (20.0 * reg[sr][2] * reg[cr][2])); + break; - case CONDITIONAL: - if ((reg[cr][0] + reg[cr][1] + reg[cr][2]) > 0.5) - { - reg[dr][0] = reg[sr][0]; - reg[dr][1] = reg[sr][1]; - reg[dr][2] = reg[sr][2]; - } - else - { - reg[dr][0] = reg[cr][0]; - reg[dr][1] = reg[cr][1]; - reg[dr][2] = reg[cr][2]; - } - break; + case CONDITIONAL: + if ((reg[cr][0] + reg[cr][1] + reg[cr][2]) > 0.5) + { + reg[dr][0] = reg[sr][0]; + reg[dr][1] = reg[sr][1]; + reg[dr][2] = reg[sr][2]; + } + else + { + reg[dr][0] = reg[cr][0]; + reg[dr][1] = reg[cr][1]; + reg[dr][2] = reg[cr][2]; + } + break; - case COMPLEMENT: - reg[dr][0] = 1.0 - reg[sr][0]; - reg[dr][1] = 1.0 - reg[sr][1]; - reg[dr][2] = 1.0 - reg[sr][2]; - break; - } - } - for (i = 0; i < 3; i++) - { - accum[i] += (unsigned char) (reg[0][i] * 255.0 + 0.5); - } - } - } + case COMPLEMENT: + reg[dr][0] = 1.0 - reg[sr][0]; + reg[dr][1] = 1.0 - reg[sr][1]; + reg[dr][2] = 1.0 - reg[sr][2]; + break; + } + } + for (i = 0; i < 3; i++) + { + accum[i] += (unsigned char) (reg[0][i] * 255.0 + 0.5); + } + } + } for (i = 0; i < bpp; i++) - { - if (i < 3) - { - buffer[i] = (guchar) (((gfloat) accum[i] / - (gfloat) (oversampling * oversampling)) + 0.5); - } - else - { - buffer[i] = 255; - } - } + { + if (i < 3) + { + buffer[i] = (guchar) (((gfloat) accum[i] / + (gfloat) (oversampling * oversampling)) + 0.5); + } + else + { + buffer[i] = 255; + } + } buffer += bpp; } @@ -393,10 +388,10 @@ qbist (ExpInfo *info, GimpPlugInInfo PLUG_IN_INFO = { - NULL, /* init_proc */ - NULL, /* quit_proc */ - query, /* query_proc */ - run /* run_proc */ + NULL, /* init_proc */ + NULL, /* quit_proc */ + query, /* query_proc */ + run /* run_proc */ }; MAIN () @@ -412,16 +407,16 @@ query (void) }; gimp_install_procedure (PLUG_IN_NAME, - "Create images based on a random genetic formula", - "This Plug-in is based on an article by Jörn Loviscach (appeared in c't 10/95, page 326). It generates modern art pictures from a random genetic formula.", - "Jörn Loviscach, Jens Ch. Restemeier", - "Jörn Loviscach, Jens Ch. Restemeier", - PLUG_IN_VERSION, - N_("_Qbist..."), - "RGB*", - GIMP_PLUGIN, - G_N_ELEMENTS (args), 0, - args, NULL); + "Create images based on a random genetic formula", + "This Plug-in is based on an article by Jörn Loviscach (appeared in c't 10/95, page 326). It generates modern art pictures from a random genetic formula.", + "Jörn Loviscach, Jens Ch. Restemeier", + "Jörn Loviscach, Jens Ch. Restemeier", + PLUG_IN_VERSION, + N_("_Qbist..."), + "RGB*", + GIMP_PLUGIN, + G_N_ELEMENTS (args), 0, + args, NULL); gimp_plugin_menu_register (PLUG_IN_NAME, N_("/Filters/Render/Pattern")); @@ -463,7 +458,7 @@ run (const gchar *name, img_bpp = gimp_drawable_bpp (drawable->drawable_id); img_has_alpha = gimp_drawable_has_alpha (drawable->drawable_id); gimp_drawable_mask_bounds (drawable->drawable_id, - &sel_x1, &sel_y1, &sel_x2, &sel_y2); + &sel_x1, &sel_y1, &sel_x2, &sel_y2); if (!gimp_drawable_is_rgb (drawable->drawable_id)) status = GIMP_PDB_CALLING_ERROR; @@ -475,81 +470,81 @@ run (const gchar *name, qbist_info.oversampling = 4; switch (run_mode) - { - case GIMP_RUN_INTERACTIVE: - /* Possibly retrieve data */ - gimp_get_data (PLUG_IN_NAME, &qbist_info); + { + case GIMP_RUN_INTERACTIVE: + /* Possibly retrieve data */ + gimp_get_data (PLUG_IN_NAME, &qbist_info); - /* Get information from the dialog */ - if (dialog_run ()) - { - status = GIMP_PDB_SUCCESS; - gimp_set_data (PLUG_IN_NAME, &qbist_info, sizeof (QbistInfo)); - } - else - status = GIMP_PDB_EXECUTION_ERROR; - break; + /* Get information from the dialog */ + if (dialog_run ()) + { + status = GIMP_PDB_SUCCESS; + gimp_set_data (PLUG_IN_NAME, &qbist_info, sizeof (QbistInfo)); + } + else + status = GIMP_PDB_EXECUTION_ERROR; + break; - case GIMP_RUN_NONINTERACTIVE: - status = GIMP_PDB_CALLING_ERROR; - break; + case GIMP_RUN_NONINTERACTIVE: + status = GIMP_PDB_CALLING_ERROR; + break; - case GIMP_RUN_WITH_LAST_VALS: - /* Possibly retrieve data */ - gimp_get_data (PLUG_IN_NAME, &qbist_info); - status = GIMP_PDB_SUCCESS; - break; + case GIMP_RUN_WITH_LAST_VALS: + /* Possibly retrieve data */ + gimp_get_data (PLUG_IN_NAME, &qbist_info); + status = GIMP_PDB_SUCCESS; + break; - default: - status = GIMP_PDB_CALLING_ERROR; - break; - } + default: + status = GIMP_PDB_CALLING_ERROR; + break; + } if (status == GIMP_PDB_SUCCESS) - { - GimpPixelRgn imagePR; - gpointer pr; + { + GimpPixelRgn imagePR; + gpointer pr; - gimp_tile_cache_ntiles ((drawable->width + gimp_tile_width () - 1) / - gimp_tile_width ()); - gimp_pixel_rgn_init (&imagePR, drawable, - 0, 0, img_width, img_height, TRUE, TRUE); + gimp_tile_cache_ntiles ((drawable->width + gimp_tile_width () - 1) / + gimp_tile_width ()); + gimp_pixel_rgn_init (&imagePR, drawable, + 0, 0, img_width, img_height, TRUE, TRUE); - optimize (&qbist_info.info); + optimize (&qbist_info.info); - gimp_progress_init (_("Qbist ...")); + gimp_progress_init (_("Qbist ...")); - for (pr = gimp_pixel_rgns_register (1, &imagePR); - pr != NULL; - pr = gimp_pixel_rgns_process (pr)) - { - gint row; + for (pr = gimp_pixel_rgns_register (1, &imagePR); + pr != NULL; + pr = gimp_pixel_rgns_process (pr)) + { + gint row; - for (row = 0; row < imagePR.h; row++) - { - qbist (&qbist_info.info, - imagePR.data + row * imagePR.rowstride, - imagePR.x, - imagePR.y + row, - imagePR.w, - sel_x2 - sel_x1, - sel_y2 - sel_y1, - imagePR.bpp, - qbist_info.oversampling); - } + for (row = 0; row < imagePR.h; row++) + { + qbist (&qbist_info.info, + imagePR.data + row * imagePR.rowstride, + imagePR.x, + imagePR.y + row, + imagePR.w, + sel_x2 - sel_x1, + sel_y2 - sel_y1, + imagePR.bpp, + qbist_info.oversampling); + } - gimp_progress_update ((gfloat) (imagePR.y - sel_y1) / - (gfloat) (sel_y2 - sel_y1)); - } + gimp_progress_update ((gfloat) (imagePR.y - sel_y1) / + (gfloat) (sel_y2 - sel_y1)); + } - gimp_drawable_flush (drawable); - gimp_drawable_merge_shadow (drawable->drawable_id, TRUE); - gimp_drawable_update (drawable->drawable_id, - sel_x1, sel_y1, - (sel_x2 - sel_x1), (sel_y2 - sel_y1)); + gimp_drawable_flush (drawable); + gimp_drawable_merge_shadow (drawable->drawable_id, TRUE); + gimp_drawable_update (drawable->drawable_id, + sel_x1, sel_y1, + (sel_x2 - sel_x1), (sel_y2 - sel_y1)); - gimp_displays_flush (); - } + gimp_displays_flush (); + } } values[0].type = GIMP_PDB_STATUS; @@ -565,7 +560,7 @@ static ExpInfo info[9]; static void dialog_new_variations (GtkWidget *widget, - gpointer data) + gpointer data) { gint i; @@ -575,29 +570,30 @@ dialog_new_variations (GtkWidget *widget, static void dialog_update_previews (GtkWidget *widget, - gpointer data) + gpointer data) { gint i, j; - guchar buf[PREVIEW_SIZE * 3]; + guchar buf[PREVIEW_SIZE * PREVIEW_SIZE * 3]; for (j = 0; j < 9; j++) { optimize (&info[(j + 5) % 9]); for (i = 0; i < PREVIEW_SIZE; i++) - { - qbist (&info[(j + 5) % 9], buf, - 0, i, PREVIEW_SIZE, PREVIEW_SIZE, PREVIEW_SIZE, 3, 1); - gtk_preview_draw_row (GTK_PREVIEW (preview[j]), buf, - 0, i, PREVIEW_SIZE); - } - - gtk_widget_queue_draw (preview[j]); + { + qbist (&info[(j + 5) % 9], buf + i * PREVIEW_SIZE * 3, + 0, i, PREVIEW_SIZE, PREVIEW_SIZE, PREVIEW_SIZE, 3, 1); + } + gimp_preview_area_draw (GIMP_PREVIEW_AREA (preview[j]), + 0, 0, PREVIEW_SIZE, PREVIEW_SIZE, + GIMP_RGB_IMAGE, + buf, + PREVIEW_SIZE *3); } } static void dialog_select_preview (GtkWidget *widget, - ExpInfo *n_info) + ExpInfo *n_info) { info[0] = *n_info; dialog_new_variations (widget, NULL); @@ -614,7 +610,7 @@ get_be16 (guint8 *buf) static void set_be16 (guint8 *buf, - guint16 val) + guint16 val) { buf[0] = val >> 8; buf[1] = val & 0xFF; @@ -670,7 +666,7 @@ save_data (gchar *name) for (i = 0; i < MAX_TRANSFORMS; i++) set_be16 (buf + i * 2 + MAX_TRANSFORMS * 2 * 0, - info[0].transformSequence[i]); + info[0].transformSequence[i]); for (i = 0; i < MAX_TRANSFORMS; i++) set_be16 (buf + i * 2 + MAX_TRANSFORMS * 2 * 1, info[0].source[i]); @@ -728,7 +724,7 @@ file_chooser_load_response (GtkWidget *dialog, static void dialog_load (GtkWidget *widget, - gpointer data) + gpointer data) { GtkWidget *parent; GtkWidget *dialog; @@ -758,7 +754,7 @@ dialog_load (GtkWidget *widget, static void dialog_save (GtkWidget *widget, - gpointer data) + gpointer data) { GtkWidget *parent; GtkWidget *dialog; @@ -788,7 +784,7 @@ dialog_save (GtkWidget *widget, static void dialog_toggle_antialaising (GtkWidget *widget, - gpointer data) + gpointer data) { qbist_info.oversampling = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? 4 : 1; @@ -809,17 +805,17 @@ dialog_run (void) dialog = gimp_dialog_new (_("G-Qbist"), "gqbist", NULL, 0, - gimp_standard_help_func, HELP_ID, + gimp_standard_help_func, HELP_ID, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, - NULL); + NULL); vbox = gtk_vbox_new (FALSE, 12); gtk_container_set_border_width (GTK_CONTAINER (vbox), 12); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, - FALSE, FALSE, 0); + FALSE, FALSE, 0); gtk_widget_show (vbox); table = gtk_table_new (3, 3, FALSE); @@ -835,23 +831,23 @@ dialog_run (void) { button = gtk_button_new (); gtk_table_attach (GTK_TABLE (table), - button, i % 3, (i % 3) + 1, i / 3, (i / 3) + 1, - GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); + button, i % 3, (i % 3) + 1, i / 3, (i / 3) + 1, + GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); gtk_widget_show (button); g_signal_connect (button, "clicked", G_CALLBACK (dialog_select_preview), (gpointer) & (info[(i + 5) % 9])); - preview[i] = gtk_preview_new (GTK_PREVIEW_COLOR); - gtk_preview_size (GTK_PREVIEW (preview[i]), PREVIEW_SIZE, PREVIEW_SIZE); + preview[i] = gimp_preview_area_new (); + gtk_widget_set_size_request (preview[i], PREVIEW_SIZE, PREVIEW_SIZE); gtk_container_add (GTK_CONTAINER (button), preview[i]); gtk_widget_show (preview[i]); } button = gtk_check_button_new_with_mnemonic (_("_Antialiasing")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), - qbist_info.oversampling > 1); + qbist_info.oversampling > 1); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_widget_show (button); @@ -881,8 +877,8 @@ dialog_run (void) G_CALLBACK (dialog_save), NULL); - dialog_update_previews (NULL, NULL); gtk_widget_show (dialog); + dialog_update_previews (NULL, NULL); run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);