From 19f0aa8025ddd0e164eef825f0a5987ada9f4b0f Mon Sep 17 00:00:00 2001 From: Igor Pashev Date: Thu, 10 Nov 2022 15:39:19 +0200 Subject: Format --- img-save-dialog.c | 356 +++++++++++++++++++++++++++--------------------------- 1 file changed, 179 insertions(+), 177 deletions(-) (limited to 'img-save-dialog.c') diff --git a/img-save-dialog.c b/img-save-dialog.c index ce7c3ef..f5335a2 100644 --- a/img-save-dialog.c +++ b/img-save-dialog.c @@ -2,215 +2,217 @@ #include static GtkWidget *fmt_frame, *ckey_frame, *fmt_vbox, *ckey_vbox, *ckey_align, - *fmt_align, *hbox, *fmt_rgb565, *fmt_rgb, *fmt_rgba, *ckey_image, *ckey_use, - *gimp_color; + *fmt_align, *hbox, *fmt_rgb565, *fmt_rgb, *fmt_rgba, *ckey_image, *ckey_use, + *gimp_color; static GimpRGB color; static GdkPixbuf *pixbuf; static GtkWidget * -img_preview_new(gint32 image_ID) +img_preview_new (gint32 image_ID) { - GtkWidget *image, *event_box, *align; - guint32 width, height; - gint *frames, nframes, layer; + GtkWidget *image, *event_box, *align; + guint32 width, height; + gint *frames, nframes, layer; - frames = gimp_image_get_layers(image_ID, &nframes); - layer = frames[g_random_int() % nframes]; - g_free(frames); - width = gimp_drawable_width(layer); - height = gimp_drawable_height(layer); + frames = gimp_image_get_layers (image_ID, &nframes); + layer = frames[g_random_int () % nframes]; + g_free (frames); + width = gimp_drawable_width (layer); + height = gimp_drawable_height (layer); - pixbuf = - gimp_drawable_get_thumbnail(layer, MIN(width, 128), MIN(height, 128), - GIMP_PIXBUF_SMALL_CHECKS); + pixbuf = + gimp_drawable_get_thumbnail (layer, MIN (width, 128), MIN (height, 128), + GIMP_PIXBUF_SMALL_CHECKS); - image = gtk_image_new_from_pixbuf(pixbuf); - g_object_unref(pixbuf); + image = gtk_image_new_from_pixbuf (pixbuf); + g_object_unref (pixbuf); - event_box = gtk_event_box_new(); - gtk_widget_set_events(event_box, GDK_ALL_EVENTS_MASK); + event_box = gtk_event_box_new (); + gtk_widget_set_events (event_box, GDK_ALL_EVENTS_MASK); - align = gtk_alignment_new(0.5, 0.5, 0, 0); + align = gtk_alignment_new (0.5, 0.5, 0, 0); - gtk_widget_show(image); - gtk_widget_show(event_box); - gtk_container_add(GTK_CONTAINER(event_box), image); - gtk_container_add(GTK_CONTAINER(align), event_box); + gtk_widget_show (image); + gtk_widget_show (event_box); + gtk_container_add (GTK_CONTAINER (event_box), image); + gtk_container_add (GTK_CONTAINER (align), event_box); - return align; + return align; } static void -on_RGB(GtkWidget * widget, gpointer data) +on_RGB (GtkWidget * widget, gpointer data) { - gtk_widget_set_sensitive(ckey_vbox, - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON + gtk_widget_set_sensitive (ckey_vbox, + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (fmt_rgb)) || - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (fmt_rgba))); } static void -on_ckey_use(GtkWidget * widget, gpointer data) +on_ckey_use (GtkWidget * widget, gpointer data) { - gboolean active; + gboolean active; - active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); - gtk_widget_set_sensitive(ckey_image, active); - gtk_widget_set_sensitive(gimp_color, active); + active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); + gtk_widget_set_sensitive (ckey_image, active); + gtk_widget_set_sensitive (gimp_color, active); } static gboolean -on_image_click(GtkWidget * widget, GdkEventButton * event, gpointer data) +on_image_click (GtkWidget * widget, GdkEventButton * event, gpointer data) { - int width, height, rowstride, n_channels; - guchar *pixels, *p; - - n_channels = gdk_pixbuf_get_n_channels(pixbuf); - width = gdk_pixbuf_get_width(pixbuf); - height = gdk_pixbuf_get_height(pixbuf); - rowstride = gdk_pixbuf_get_rowstride(pixbuf); - pixels = gdk_pixbuf_get_pixels(pixbuf); - p = pixels + (int)(event->y * rowstride) + (int)(event->x * n_channels); - gimp_rgb_set_uchar(&color, p[0], p[1], p[2]); - gimp_color_button_set_color((GimpColorButton *) gimp_color, &color); - return TRUE; + int width, height, rowstride, n_channels; + guchar *pixels, *p; + + n_channels = gdk_pixbuf_get_n_channels (pixbuf); + width = gdk_pixbuf_get_width (pixbuf); + height = gdk_pixbuf_get_height (pixbuf); + rowstride = gdk_pixbuf_get_rowstride (pixbuf); + pixels = gdk_pixbuf_get_pixels (pixbuf); + p = pixels + (int) (event->y * rowstride) + (int) (event->x * n_channels); + gimp_rgb_set_uchar (&color, p[0], p[1], p[2]); + gimp_color_button_set_color ((GimpColorButton *) gimp_color, &color); + return TRUE; } gboolean -img_save_dialog(gint32 image, ImageParasite * plugin) +img_save_dialog (gint32 image, ImageParasite * plugin) { - GtkWidget *dialog; - gint response; - - gimp_ui_init(PLUG_IN_BINARY, TRUE); - dialog = - gimp_dialog_new("Save as IMG", PLUG_IN_BINARY, NULL, 0, - gimp_standard_help_func, "plug-in-img", - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, - GTK_RESPONSE_OK, NULL); - gimp_window_set_transient(GTK_WINDOW(dialog)); - gtk_widget_show(dialog); - - /* - * Radio buttons to select file format - */ - fmt_frame = gimp_frame_new("Image format"); - fmt_rgb565 = gtk_radio_button_new_with_label(NULL, FMT[FMT_RGB565]); - fmt_rgb = - gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON - (fmt_rgb565), FMT[FMT_RGB]); - fmt_rgba = - gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(fmt_rgb), - FMT[FMT_RGBA]); - gtk_widget_show(fmt_frame); - gtk_widget_show(fmt_rgb565); - gtk_widget_show(fmt_rgb); - gtk_widget_show(fmt_rgba); - - /* - * Horizontal main box - */ - hbox = gtk_hbox_new(TRUE, 2); - gtk_widget_show(hbox); - - /* - * Vertical box for radio buttons - */ - fmt_align = gtk_alignment_new(0.5, 0, 0, 0); - gtk_widget_show(fmt_align); - fmt_vbox = gtk_vbox_new(TRUE, 12); - gtk_container_add(GTK_CONTAINER(fmt_align), fmt_vbox); - gtk_container_set_border_width(GTK_CONTAINER(fmt_vbox), 12); - gtk_widget_show(fmt_vbox); - gtk_box_pack_start(GTK_BOX(fmt_vbox), fmt_frame, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(fmt_vbox), fmt_rgb565, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(fmt_vbox), fmt_rgb, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(fmt_vbox), fmt_rgba, TRUE, TRUE, 0); - - /* - * Allow color key for RGB and RGBA - */ - g_signal_connect(G_OBJECT(fmt_rgb), "clicked", G_CALLBACK(on_RGB), NULL); - g_signal_connect(G_OBJECT(fmt_rgba), "clicked", G_CALLBACK(on_RGB), NULL); - - /* - * Vertical box for color key - */ - ckey_align = gtk_alignment_new(0.5, 0, 0, 0); - gtk_widget_show(ckey_align); - ckey_vbox = gtk_vbox_new(FALSE, 2); - gtk_container_add(GTK_CONTAINER(ckey_align), ckey_vbox); - gtk_container_set_border_width(GTK_CONTAINER(ckey_vbox), 12); - ckey_frame = gimp_frame_new("Transparent color"); - ckey_use = gtk_check_button_new_with_label("Set transparent color"); - ckey_image = img_preview_new(image); - gimp_rgb_set_uchar(&color, plugin->ckey.R, plugin->ckey.G, plugin->ckey.B); - gimp_color = - gimp_color_button_new("Choose color", 64, 64, &color, - GIMP_COLOR_AREA_FLAT); - gtk_box_pack_start(GTK_BOX(ckey_vbox), ckey_frame, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(ckey_vbox), ckey_use, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(ckey_vbox), ckey_image, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(ckey_vbox), gimp_color, TRUE, TRUE, 0); - gtk_widget_show(gimp_color); - gtk_widget_show(ckey_vbox); - gtk_widget_show(ckey_frame); - gtk_widget_show(ckey_use); - gtk_widget_show(ckey_image); - g_signal_connect(G_OBJECT(ckey_use), "clicked", G_CALLBACK(on_ckey_use), - NULL); - g_signal_connect(G_OBJECT(ckey_image), "button-press-event", - G_CALLBACK(on_image_click), NULL); - /* - * Assemble all together - */ - gtk_box_pack_start(GTK_BOX(hbox), fmt_align, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(hbox), ckey_align, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 0); - - /* - * Set initial parameters - */ - switch (plugin->format) + GtkWidget *dialog; + gint response; + + gimp_ui_init (PLUG_IN_BINARY, TRUE); + dialog = + gimp_dialog_new ("Save as IMG", PLUG_IN_BINARY, NULL, 0, + gimp_standard_help_func, "plug-in-img", + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, + GTK_RESPONSE_OK, NULL); + gimp_window_set_transient (GTK_WINDOW (dialog)); + gtk_widget_show (dialog); + + /* + * Radio buttons to select file format + */ + fmt_frame = gimp_frame_new ("Image format"); + fmt_rgb565 = gtk_radio_button_new_with_label (NULL, FMT[FMT_RGB565]); + fmt_rgb = + gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON + (fmt_rgb565), FMT[FMT_RGB]); + fmt_rgba = + gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (fmt_rgb), + FMT[FMT_RGBA]); + gtk_widget_show (fmt_frame); + gtk_widget_show (fmt_rgb565); + gtk_widget_show (fmt_rgb); + gtk_widget_show (fmt_rgba); + + /* + * Horizontal main box + */ + hbox = gtk_hbox_new (TRUE, 2); + gtk_widget_show (hbox); + + /* + * Vertical box for radio buttons + */ + fmt_align = gtk_alignment_new (0.5, 0, 0, 0); + gtk_widget_show (fmt_align); + fmt_vbox = gtk_vbox_new (TRUE, 12); + gtk_container_add (GTK_CONTAINER (fmt_align), fmt_vbox); + gtk_container_set_border_width (GTK_CONTAINER (fmt_vbox), 12); + gtk_widget_show (fmt_vbox); + gtk_box_pack_start (GTK_BOX (fmt_vbox), fmt_frame, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (fmt_vbox), fmt_rgb565, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (fmt_vbox), fmt_rgb, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (fmt_vbox), fmt_rgba, TRUE, TRUE, 0); + + /* + * Allow color key for RGB and RGBA + */ + g_signal_connect (G_OBJECT (fmt_rgb), "clicked", G_CALLBACK (on_RGB), NULL); + g_signal_connect (G_OBJECT (fmt_rgba), "clicked", G_CALLBACK (on_RGB), + NULL); + + /* + * Vertical box for color key + */ + ckey_align = gtk_alignment_new (0.5, 0, 0, 0); + gtk_widget_show (ckey_align); + ckey_vbox = gtk_vbox_new (FALSE, 2); + gtk_container_add (GTK_CONTAINER (ckey_align), ckey_vbox); + gtk_container_set_border_width (GTK_CONTAINER (ckey_vbox), 12); + ckey_frame = gimp_frame_new ("Transparent color"); + ckey_use = gtk_check_button_new_with_label ("Set transparent color"); + ckey_image = img_preview_new (image); + gimp_rgb_set_uchar (&color, plugin->ckey.R, plugin->ckey.G, plugin->ckey.B); + gimp_color = + gimp_color_button_new ("Choose color", 64, 64, &color, + GIMP_COLOR_AREA_FLAT); + gtk_box_pack_start (GTK_BOX (ckey_vbox), ckey_frame, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (ckey_vbox), ckey_use, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (ckey_vbox), ckey_image, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (ckey_vbox), gimp_color, TRUE, TRUE, 0); + gtk_widget_show (gimp_color); + gtk_widget_show (ckey_vbox); + gtk_widget_show (ckey_frame); + gtk_widget_show (ckey_use); + gtk_widget_show (ckey_image); + g_signal_connect (G_OBJECT (ckey_use), "clicked", G_CALLBACK (on_ckey_use), + NULL); + g_signal_connect (G_OBJECT (ckey_image), "button-press-event", + G_CALLBACK (on_image_click), NULL); + /* + * Assemble all together + */ + gtk_box_pack_start (GTK_BOX (hbox), fmt_align, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), ckey_align, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, TRUE, TRUE, + 0); + + /* + * Set initial parameters + */ + switch (plugin->format) { - case FMT_RGB565: - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fmt_rgb565), TRUE); - break; - case FMT_RGB: - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fmt_rgb), TRUE); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ckey_use), - plugin->ckey.is != 0); - break; - case FMT_RGBA: - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fmt_rgba), TRUE); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ckey_use), - plugin->ckey.is != 0); - break; + case FMT_RGB565: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fmt_rgb565), TRUE); + break; + case FMT_RGB: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fmt_rgb), TRUE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ckey_use), + plugin->ckey.is != 0); + break; + case FMT_RGBA: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fmt_rgba), TRUE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ckey_use), + plugin->ckey.is != 0); + break; } - on_RGB(fmt_rgb, NULL); - on_ckey_use(ckey_use, NULL); - - /* - * Run the dialog - */ - response = gimp_dialog_run(GIMP_DIALOG(dialog)); - - /* - * Get new parameters - */ - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fmt_rgb565))) - plugin->format = FMT_RGB565; - else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fmt_rgb))) - plugin->format = FMT_RGB; - else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fmt_rgba))) - plugin->format = FMT_RGBA; - plugin->ckey.is = - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ckey_use)) ? 1 : 0; - gimp_color_button_get_color((GimpColorButton *) gimp_color, &color); - gimp_rgb_get_uchar(&color, &plugin->ckey.R, &plugin->ckey.G, - &plugin->ckey.B); - gtk_widget_destroy(dialog); - return (response == GTK_RESPONSE_OK); + on_RGB (fmt_rgb, NULL); + on_ckey_use (ckey_use, NULL); + + /* + * Run the dialog + */ + response = gimp_dialog_run (GIMP_DIALOG (dialog)); + + /* + * Get new parameters + */ + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (fmt_rgb565))) + plugin->format = FMT_RGB565; + else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (fmt_rgb))) + plugin->format = FMT_RGB; + else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (fmt_rgba))) + plugin->format = FMT_RGBA; + plugin->ckey.is = + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ckey_use)) ? 1 : 0; + gimp_color_button_get_color ((GimpColorButton *) gimp_color, &color); + gimp_rgb_get_uchar (&color, &plugin->ckey.R, &plugin->ckey.G, + &plugin->ckey.B); + gtk_widget_destroy (dialog); + return (response == GTK_RESPONSE_OK); } -- cgit v1.2.3