[gimp] plug-ins: clean up file-bmp-save in preparation for GimpProcedureConfig
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] plug-ins: clean up file-bmp-save in preparation for GimpProcedureConfig
- Date: Sat, 28 Sep 2019 14:25:50 +0000 (UTC)
commit 68c3574569f7917051c476b98c5dcb698a0fa9b5
Author: Michael Natterer <mitch gimp org>
Date: Sat Sep 28 16:24:25 2019 +0200
plug-ins: clean up file-bmp-save in preparation for GimpProcedureConfig
and get rid of all these expanders and frames in the dialog.
plug-ins/file-bmp/bmp-save.c | 567 +++++++++++++++++++------------------------
1 file changed, 253 insertions(+), 314 deletions(-)
---
diff --git a/plug-ins/file-bmp/bmp-save.c b/plug-ins/file-bmp/bmp-save.c
index 392f6597de..6c82a83c9f 100644
--- a/plug-ins/file-bmp/bmp-save.c
+++ b/plug-ins/file-bmp/bmp-save.c
@@ -53,29 +53,29 @@ typedef enum
} RGBMode;
-static void write_image (FILE *f,
- guchar *src,
- gint width,
- gint height,
- gint use_run_length_encoding,
- gint channels,
- gint bpp,
- gint spzeile,
- gint MapSize,
- RGBMode rgb_format,
- gint mask_info_size,
- gint color_space_size);
-
-static gboolean save_dialog (gint channels);
+static void write_image (FILE *f,
+ guchar *src,
+ gint width,
+ gint height,
+ gboolean use_run_length_encoding,
+ gint channels,
+ gint bpp,
+ gint spzeile,
+ gint MapSize,
+ RGBMode rgb_format,
+ gint mask_info_size,
+ gint color_space_size);
+
+static gboolean save_dialog (gint channels);
static struct
{
- RGBMode rgb_format;
- gint use_run_length_encoding;
+ RGBMode rgb_format;
+ gboolean use_run_length_encoding;
/* Whether or not to write BITMAPV5HEADER color space data */
- gint dont_write_color_space_data;
+ gboolean dont_write_color_space_data;
} BMPSaveData;
@@ -249,8 +249,9 @@ save_image (GFile *file,
g_assert_not_reached ();
}
- BMPSaveData.use_run_length_encoding = 0;
- BMPSaveData.dont_write_color_space_data = 0;
+ BMPSaveData.use_run_length_encoding = FALSE;
+ BMPSaveData.dont_write_color_space_data = FALSE;
+
mask_info_size = 0;
if (run_mode != GIMP_RUN_NONINTERACTIVE)
@@ -367,7 +368,7 @@ save_image (GFile *file,
bitmap_head.biPlanes = 1;
bitmap_head.biBitCnt = BitsPerPixel;
- if (BMPSaveData.use_run_length_encoding == 0)
+ if (! BMPSaveData.use_run_length_encoding)
{
if (mask_info_size > 0)
bitmap_head.biCompr = 3; /* BI_BITFIELDS */
@@ -596,18 +597,18 @@ Make5551 (guchar r,
}
static void
-write_image (FILE *f,
- guchar *src,
- gint width,
- gint height,
- gint use_run_length_encoding,
- gint channels,
- gint bpp,
- gint spzeile,
- gint MapSize,
- RGBMode rgb_format,
- gint mask_info_size,
- gint color_space_size)
+write_image (FILE *f,
+ guchar *src,
+ gint width,
+ gint height,
+ gboolean use_run_length_encoding,
+ gint channels,
+ gint bpp,
+ gint spzeile,
+ gint MapSize,
+ RGBMode rgb_format,
+ gint mask_info_size,
+ gint color_space_size)
{
guchar buf[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 };
guint32 uint32buf;
@@ -708,182 +709,207 @@ write_image (FILE *f,
}
else
{
- switch (use_run_length_encoding) /* now it gets more difficult */
- { /* uncompressed 1,4 and 8 bit */
- case 0:
- {
- thiswidth = (width / (8 / bpp));
- if (width % (8 / bpp))
- thiswidth++;
-
- for (ypos = height - 1; ypos >= 0; ypos--) /* for each row */
- {
- for (xpos = 0; xpos < width;) /* for each _byte_ */
- {
- v = 0;
- for (i = 1;
- (i <= (8 / bpp)) && (xpos < width);
- i++, xpos++) /* for each pixel */
- {
- temp = src + (ypos * rowstride) + (xpos * channels);
- if (channels > 1 && *(temp+1) == 0) *temp = 0x0;
- v=v | ((guchar) *temp << (8 - (i * bpp)));
- }
- Write (f, &v, 1);
- }
- Write (f, &buf[3], spzeile - thiswidth);
- xpos = 0;
-
- cur_progress++;
- if ((cur_progress % 5) == 0)
- gimp_progress_update ((gdouble) cur_progress /
+ /* now it gets more difficult */
+ if (! use_run_length_encoding)
+ {
+ /* uncompressed 1,4 and 8 bit */
+
+ thiswidth = (width / (8 / bpp));
+ if (width % (8 / bpp))
+ thiswidth++;
+
+ for (ypos = height - 1; ypos >= 0; ypos--) /* for each row */
+ {
+ for (xpos = 0; xpos < width;) /* for each _byte_ */
+ {
+ v = 0;
+ for (i = 1;
+ (i <= (8 / bpp)) && (xpos < width);
+ i++, xpos++) /* for each pixel */
+ {
+ temp = src + (ypos * rowstride) + (xpos * channels);
+ if (channels > 1 && *(temp+1) == 0) *temp = 0x0;
+ v=v | ((guchar) *temp << (8 - (i * bpp)));
+ }
+ Write (f, &v, 1);
+ }
+
+ Write (f, &buf[3], spzeile - thiswidth);
+ xpos = 0;
+
+ cur_progress++;
+ if ((cur_progress % 5) == 0)
+ gimp_progress_update ((gdouble) cur_progress /
(gdouble) max_progress);
- }
- break;
- }
- default:
- { /* Save RLE encoded file, quite difficult */
- length = 0;
- buf[12] = 0;
- buf[13] = 1;
- buf[14] = 0;
- buf[15] = 0;
- row = g_new (guchar, width / (8 / bpp) + 10);
- ketten = g_new (guchar, width / (8 / bpp) + 10);
- for (ypos = height - 1; ypos >= 0; ypos--)
- { /* each row separately */
- j = 0;
- /* first copy the pixels to a buffer,
- * making one byte from two 4bit pixels
- */
- for (xpos = 0; xpos < width;)
- {
- v = 0;
- for (i = 1;
- (i <= (8 / bpp)) && (xpos < width);
- i++, xpos++)
- { /* for each pixel */
- temp = src + (ypos * rowstride) + (xpos * channels);
- if (channels > 1 && *(temp+1) == 0) *temp = 0x0;
- v = v | ((guchar) * temp << (8 - (i * bpp)));
- }
- row[j++] = v;
- }
- breite = width / (8 / bpp);
- if (width % (8 / bpp))
- breite++;
-
- /* then check for strings of equal bytes */
- for (i = 0; i < breite; i += j)
- {
- j = 0;
- while ((i + j < breite) &&
- (j < (255 / (8 / bpp))) &&
- (row[i + j] == row[i]))
- j++;
-
- ketten[i] = j;
- }
-
- /* then write the strings and the other pixels to the file */
- for (i = 0; i < breite;)
- {
- if (ketten[i] < 3)
+ }
+ }
+ else
+ {
+ /* Save RLE encoded file, quite difficult */
+
+ length = 0;
+ buf[12] = 0;
+ buf[13] = 1;
+ buf[14] = 0;
+ buf[15] = 0;
+
+ row = g_new (guchar, width / (8 / bpp) + 10);
+ ketten = g_new (guchar, width / (8 / bpp) + 10);
+
+ for (ypos = height - 1; ypos >= 0; ypos--)
+ {
+ /* each row separately */
+ j = 0;
+
+ /* first copy the pixels to a buffer, making one byte
+ * from two 4bit pixels
+ */
+ for (xpos = 0; xpos < width;)
+ {
+ v = 0;
+
+ for (i = 1;
+ (i <= (8 / bpp)) && (xpos < width);
+ i++, xpos++)
+ {
+ /* for each pixel */
+
+ temp = src + (ypos * rowstride) + (xpos * channels);
+ if (channels > 1 && *(temp+1) == 0) *temp = 0x0;
+ v = v | ((guchar) * temp << (8 - (i * bpp)));
+ }
+
+ row[j++] = v;
+ }
+
+ breite = width / (8 / bpp);
+ if (width % (8 / bpp))
+ breite++;
+
+ /* then check for strings of equal bytes */
+ for (i = 0; i < breite; i += j)
+ {
+ j = 0;
+
+ while ((i + j < breite) &&
+ (j < (255 / (8 / bpp))) &&
+ (row[i + j] == row[i]))
+ j++;
+
+ ketten[i] = j;
+ }
+
+ /* then write the strings and the other pixels to the file */
+ for (i = 0; i < breite;)
+ {
+ if (ketten[i] < 3)
+ {
/* strings of different pixels ... */
- {
- j = 0;
- while ((i + j < breite) &&
- (j < (255 / (8 / bpp))) &&
- (ketten[i + j] < 3))
- j += ketten[i + j];
-
- /* this can only happen if j jumps over
- * the end with a 2 in ketten[i+j]
- */
- if (j > (255 / (8 / bpp)))
- j -= 2;
- /* 00 01 and 00 02 are reserved */
- if (j > 2)
- {
- Write (f, &buf[12], 1);
- n = j * (8 / bpp);
- if (n + i * (8 / bpp) > width)
- n--;
- Write (f, &n, 1);
- length += 2;
- Write (f, &row[i], j);
- length += j;
- if ((j) % 2)
- {
- Write (f, &buf[12], 1);
- length++;
- }
- }
- else
- {
- for (k = i; k < i + j; k++)
- {
- n = (8 / bpp);
- if (n + i * (8 / bpp) > width)
- n--;
- Write (f, &n, 1);
- Write (f, &row[k], 1);
- /*printf("%i.#|",n); */
- length += 2;
- }
- }
- i += j;
- }
- else
+
+ j = 0;
+
+ while ((i + j < breite) &&
+ (j < (255 / (8 / bpp))) &&
+ (ketten[i + j] < 3))
+ j += ketten[i + j];
+
+ /* this can only happen if j jumps over the end
+ * with a 2 in ketten[i+j]
+ */
+ if (j > (255 / (8 / bpp)))
+ j -= 2;
+
+ /* 00 01 and 00 02 are reserved */
+ if (j > 2)
+ {
+ Write (f, &buf[12], 1);
+ n = j * (8 / bpp);
+ if (n + i * (8 / bpp) > width)
+ n--;
+ Write (f, &n, 1);
+ length += 2;
+ Write (f, &row[i], j);
+ length += j;
+ if ((j) % 2)
+ {
+ Write (f, &buf[12], 1);
+ length++;
+ }
+ }
+ else
+ {
+ for (k = i; k < i + j; k++)
+ {
+ n = (8 / bpp);
+ if (n + i * (8 / bpp) > width)
+ n--;
+ Write (f, &n, 1);
+ Write (f, &row[k], 1);
+ /*printf("%i.#|",n); */
+ length += 2;
+ }
+ }
+
+ i += j;
+ }
+ else
+ {
/* strings of equal pixels */
- {
- n = ketten[i] * (8 / bpp);
- if (n + i * (8 / bpp) > width)
- n--;
- Write (f, &n, 1);
- Write (f, &row[i], 1);
- i += ketten[i];
- length += 2;
- }
- }
-
- Write (f, &buf[14], 2); /* End of row */
- length += 2;
-
- cur_progress++;
- if ((cur_progress % 5) == 0)
- gimp_progress_update ((gdouble) cur_progress /
- (gdouble) max_progress);
- }
- fseek (f, -2, SEEK_CUR); /* Overwrite last End of row ... */
- Write (f, &buf[12], 2); /* ... with End of file */
+ n = ketten[i] * (8 / bpp);
+ if (n + i * (8 / bpp) > width)
+ n--;
+ Write (f, &n, 1);
+ Write (f, &row[i], 1);
+ i += ketten[i];
+ length += 2;
+ }
+ }
+
+ Write (f, &buf[14], 2); /* End of row */
+ length += 2;
+
+ cur_progress++;
+ if ((cur_progress % 5) == 0)
+ gimp_progress_update ((gdouble) cur_progress /
+ (gdouble) max_progress);
+ }
+
+ fseek (f, -2, SEEK_CUR); /* Overwrite last End of row ... */
+ Write (f, &buf[12], 2); /* ... with End of file */
- fseek (f, 0x22, SEEK_SET); /* Write length of image */
- uint32buf = GUINT32_TO_LE (length);
- Write (f, &uint32buf, 4);
+ fseek (f, 0x22, SEEK_SET); /* Write length of image */
+ uint32buf = GUINT32_TO_LE (length);
+ Write (f, &uint32buf, 4);
- fseek (f, 0x02, SEEK_SET); /* Write length of file */
- length += (0x36 + MapSize + mask_info_size + color_space_size);
- uint32buf = GUINT32_TO_LE (length);
- Write (f, &uint32buf, 4);
+ fseek (f, 0x02, SEEK_SET); /* Write length of file */
+ length += (0x36 + MapSize + mask_info_size + color_space_size);
+ uint32buf = GUINT32_TO_LE (length);
+ Write (f, &uint32buf, 4);
- g_free (ketten);
- g_free (row);
- break;
- }
+ g_free (ketten);
+ g_free (row);
}
}
gimp_progress_update (1.0);
}
-static void
-format_callback (GtkToggleButton *toggle,
- gpointer data)
+static gboolean
+format_sensitive_callback (gint value,
+ gpointer data)
{
- if (gtk_toggle_button_get_active (toggle))
- BMPSaveData.rgb_format = GPOINTER_TO_INT (data);
+ gint channels = GPOINTER_TO_INT (data);
+
+ switch (value)
+ {
+ case RGBA_5551:
+ case RGBA_8888:
+ return channels == 4;
+
+ default:
+ return TRUE;
+ };
}
static gboolean
@@ -891,12 +917,9 @@ save_dialog (gint channels)
{
GtkWidget *dialog;
GtkWidget *toggle;
- GtkWidget *vbox_main;
GtkWidget *vbox;
- GtkWidget *vbox2;
- GtkWidget *expander;
GtkWidget *frame;
- GSList *group;
+ GtkWidget *combo;
gboolean run;
/* Dialog init */
@@ -904,15 +927,15 @@ save_dialog (gint channels)
gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
- vbox_main = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
- gtk_container_set_border_width (GTK_CONTAINER (vbox_main), 12);
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
gtk_box_pack_start (GTK_BOX (gimp_export_dialog_get_content_area (dialog)),
- vbox_main, TRUE, TRUE, 0);
- gtk_widget_show (vbox_main);
+ vbox, TRUE, TRUE, 0);
+ gtk_widget_show (vbox);
/* Run-Length Encoded */
toggle = gtk_check_button_new_with_mnemonic (_("_Run-Length Encoded"));
- gtk_box_pack_start (GTK_BOX (vbox_main), toggle, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
BMPSaveData.use_run_length_encoding);
gtk_widget_show (toggle);
@@ -924,15 +947,9 @@ save_dialog (gint channels)
&BMPSaveData.use_run_length_encoding);
/* Compatibility Options */
- expander = gtk_expander_new_with_mnemonic (_("Co_mpatibility Options"));
-
- gtk_box_pack_start (GTK_BOX (vbox_main), expander, TRUE, TRUE, 0);
- gtk_widget_show (expander);
-
- vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
- gtk_container_set_border_width (GTK_CONTAINER (vbox2), 12);
- gtk_container_add (GTK_CONTAINER (expander), vbox2);
- gtk_widget_show (vbox2);
+ frame = gimp_frame_new (_("Compatibility"));
+ gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
toggle = gtk_check_button_new_with_mnemonic (_("_Do not write color space information"));
gimp_help_set_help_data (toggle,
@@ -942,7 +959,7 @@ save_dialog (gint channels)
"this option will cause GIMP to not write color "
"space information to the file."),
NULL);
- gtk_box_pack_start (GTK_BOX (vbox2), toggle, FALSE, FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (frame), toggle);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
BMPSaveData.dont_write_color_space_data);
gtk_widget_show (toggle);
@@ -952,110 +969,32 @@ save_dialog (gint channels)
&BMPSaveData.dont_write_color_space_data);
/* Advanced Options */
- expander = gtk_expander_new_with_mnemonic (_("_Advanced Options"));
-
- gtk_box_pack_start (GTK_BOX (vbox_main), expander, TRUE, TRUE, 0);
- gtk_widget_show (expander);
-
- if (channels < 3)
- gtk_widget_set_sensitive (expander, FALSE);
-
- vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
- gtk_container_set_border_width (GTK_CONTAINER (vbox2), 12);
- gtk_container_add (GTK_CONTAINER (expander), vbox2);
- gtk_widget_show (vbox2);
-
- group = NULL;
-
- frame = gimp_frame_new (_("16 bits"));
- gtk_box_pack_start (GTK_BOX (vbox2), frame, TRUE, TRUE, 0);
- gtk_widget_show (frame);
-
- vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
- gtk_container_add (GTK_CONTAINER (frame), vbox);
- gtk_widget_show (vbox);
-
- toggle = gtk_radio_button_new_with_mnemonic (group, "_R5 G6 B5");
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (toggle));
- gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
- gtk_widget_show (toggle);
- g_signal_connect (toggle, "toggled",
- G_CALLBACK (format_callback),
- GINT_TO_POINTER (RGB_565));
-
- toggle = gtk_radio_button_new_with_mnemonic (group, "_A1 R5 G5 B5");
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (toggle));
- gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
-
- if (channels < 4)
- gtk_widget_set_sensitive (toggle, FALSE);
-
- gtk_widget_show (toggle);
-
- g_signal_connect (toggle, "toggled",
- G_CALLBACK (format_callback),
- GINT_TO_POINTER (RGBA_5551));
- toggle = gtk_radio_button_new_with_mnemonic (group, "_X1 R5 G5 B5");
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (toggle));
- gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
- gtk_widget_show (toggle);
- g_signal_connect (toggle, "toggled",
- G_CALLBACK (format_callback),
- GINT_TO_POINTER (RGB_555));
-
- frame = gimp_frame_new (_("24 bits"));
- gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, FALSE, 0);
+ frame = gimp_frame_new (_("RGB Encoding"));
+ gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
- toggle = gtk_radio_button_new_with_mnemonic (group, "R_8 G8 B8");
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON(toggle));
- gtk_container_add (GTK_CONTAINER (frame), toggle);
- gtk_widget_show (toggle);
- g_signal_connect (toggle, "toggled",
- G_CALLBACK (format_callback),
- GINT_TO_POINTER (RGB_888));
- if (channels < 4)
- {
- BMPSaveData.rgb_format = RGB_888;
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), TRUE);
- }
-
- frame = gimp_frame_new (_("32 bits"));
- gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, FALSE, 0);
- gtk_widget_show (frame);
-
- vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
- gtk_container_add (GTK_CONTAINER (frame), vbox);
- gtk_widget_show (vbox);
-
- toggle = gtk_radio_button_new_with_mnemonic (group, "A8 R8 G8 _B8");
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (toggle));
- gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
- gtk_widget_show (toggle);
- g_signal_connect (toggle, "toggled",
- G_CALLBACK (format_callback),
- GINT_TO_POINTER (RGBA_8888));
-
-
- if (channels < 4)
- {
- gtk_widget_set_sensitive (toggle, FALSE);
- }
- else
- {
- BMPSaveData.rgb_format = RGBA_8888;
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), TRUE);
- }
-
- toggle = gtk_radio_button_new_with_mnemonic (group, "X8 R8 G8 _B8");
- group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (toggle));
- gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
- gtk_widget_show (toggle);
- g_signal_connect (toggle, "toggled",
- G_CALLBACK (format_callback),
- GINT_TO_POINTER (RGBX_8888));
+ if (channels < 3)
+ gtk_widget_set_sensitive (frame, FALSE);
+
+ combo = gimp_int_combo_box_new (_("16 bit (R5 G6 B5"), RGB_565,
+ _("16 bit (A1 R5 G5 B5"), RGBA_5551,
+ _("16 bit (X1 R5 G5 B5"), RGB_555,
+ _("24 bit (R8 G8 B8)"), RGB_888,
+ _("32 bit (A8 R8 G8 B8)"), RGBA_8888,
+ _("32 bit (X8 R8 G8 B8)"), RGBX_8888,
+ NULL);
+ gtk_container_add (GTK_CONTAINER (frame), combo);
+ gtk_widget_show (combo);
+
+ gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo),
+ BMPSaveData.rgb_format,
+ G_CALLBACK (gimp_int_combo_box_get_active),
+ &BMPSaveData.rgb_format, NULL);
+
+ gimp_int_combo_box_set_sensitivity (GIMP_INT_COMBO_BOX (combo),
+ format_sensitive_callback,
+ GINT_TO_POINTER (channels), NULL);
- /* Dialog show */
gtk_widget_show (dialog);
run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]