[gimp] Issue #4492: Add "Flip image", save visible layers feature to DDS
- From: Jacob Boerema <jboerema src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Issue #4492: Add "Flip image", save visible layers feature to DDS
- Date: Mon, 16 May 2022 18:56:27 +0000 (UTC)
commit 42cbaff322b940ea377c701a65b9039964943de6
Author: Nikc <nikcdc gmail com>
Date: Mon May 16 18:56:16 2022 +0000
Issue #4492: Add "Flip image", save visible layers feature to DDS
plug-ins/file-dds/dds.c | 16 +++++++++----
plug-ins/file-dds/dds.h | 1 +
plug-ins/file-dds/ddswrite.c | 54 +++++++++++++++++++++++++++++++++++---------
plug-ins/file-dds/ddswrite.h | 3 ++-
4 files changed, 58 insertions(+), 16 deletions(-)
---
diff --git a/plug-ins/file-dds/dds.c b/plug-ins/file-dds/dds.c
index fcaaa9a878..13d5751d88 100644
--- a/plug-ins/file-dds/dds.c
+++ b/plug-ins/file-dds/dds.c
@@ -216,8 +216,9 @@ dds_create_procedure (GimpPlugIn *plug_in,
GIMP_PROC_ARG_INT (procedure, "save-type",
"Save type",
"How to save the image (0 = selected layer, "
- "1 = cube map, 2 = volume map, 3 = texture array",
- 0, 3, DDS_SAVE_SELECTED_LAYER,
+ "1 = cube map, 2 = volume map, 3 = texture array, "
+ "4 = all visible layers)",
+ 0, 4, DDS_SAVE_SELECTED_LAYER,
G_PARAM_READWRITE);
GIMP_PROC_ARG_INT (procedure, "format",
@@ -233,6 +234,12 @@ dds_create_procedure (GimpPlugIn *plug_in,
0, 14, DDS_FORMAT_DEFAULT,
G_PARAM_READWRITE);
+ GIMP_PROC_ARG_BOOLEAN (procedure, "flip-image",
+ "Flip image vertically",
+ "Flip the image vertically on export",
+ FALSE,
+ G_PARAM_READWRITE);
+
GIMP_PROC_ARG_BOOLEAN (procedure, "transparent-color",
"Transparent color",
"Make an indexed color transparent",
@@ -263,7 +270,7 @@ dds_create_procedure (GimpPlugIn *plug_in,
G_PARAM_READWRITE);
GIMP_PROC_ARG_BOOLEAN (procedure, "gamma-correct",
- "Gamme correct",
+ "Gamma correct",
"Use gamma correct mipmap filtering",
FALSE,
G_PARAM_READWRITE);
@@ -476,7 +483,8 @@ dds_save (GimpProcedure *procedure,
*/
status = write_dds (file, image, drawables[0],
run_mode == GIMP_RUN_INTERACTIVE,
- procedure, G_OBJECT (config));
+ procedure, G_OBJECT (config),
+ export == GIMP_EXPORT_EXPORT);
if (export == GIMP_EXPORT_EXPORT)
{
diff --git a/plug-ins/file-dds/dds.h b/plug-ins/file-dds/dds.h
index 6a0f909315..481206569e 100644
--- a/plug-ins/file-dds/dds.h
+++ b/plug-ins/file-dds/dds.h
@@ -60,6 +60,7 @@ typedef enum
DDS_SAVE_CUBEMAP,
DDS_SAVE_VOLUMEMAP,
DDS_SAVE_ARRAY,
+ DDS_SAVE_VISIBLE_LAYERS,
DDS_SAVE_MAX
} DDS_SAVE_TYPE;
diff --git a/plug-ins/file-dds/ddswrite.c b/plug-ins/file-dds/ddswrite.c
index 4ada0d3966..8adea55922 100644
--- a/plug-ins/file-dds/ddswrite.c
+++ b/plug-ins/file-dds/ddswrite.c
@@ -91,6 +91,7 @@ static GtkWidget *mipmap_filter_opt;
static GtkWidget *mipmap_wrap_opt;
static GtkWidget *transparent_spin;
static GtkWidget *srgb_check;
+static GtkWidget *flip_check;
static GtkWidget *gamma_check;
static GtkWidget *gamma_spin;
static GtkWidget *pm_check;
@@ -510,7 +511,8 @@ write_dds (GFile *file,
GimpDrawable *drawable,
gboolean interactive,
GimpProcedure *procedure,
- GObject *config)
+ GObject *config,
+ gboolean is_duplicate_image)
{
FILE *fp;
gint rc = 0;
@@ -578,7 +580,19 @@ write_dds (GFile *file,
gimp_progress_init_printf ("Saving %s:", gimp_file_get_utf8_name (file));
- rc = write_image (fp, image, drawable, config);
+ /* If destructive changes are going to happen to the image,
+ * make sure we send a duplicate of it to write_image()
+ */
+ if (! is_duplicate_image)
+ {
+ GimpImage *duplicate_image = gimp_image_duplicate (image);
+ rc = write_image (fp, duplicate_image, drawable, config);
+ gimp_image_delete (duplicate_image);
+ }
+ else
+ {
+ rc = write_image (fp, image, drawable, config);
+ }
fclose (fp);
@@ -1329,6 +1343,7 @@ write_image (FILE *fp,
gint savetype;
gint pixel_format;
gint transindex;
+ gboolean flip_export;
g_object_get (config,
"compression-format", &compression,
@@ -1336,8 +1351,15 @@ write_image (FILE *fp,
"save-type", &savetype,
"format", &pixel_format,
"transparent-index", &transindex,
+ "flip-image", &flip_export,
NULL);
+ if (flip_export)
+ {
+ gimp_image_flip (image, GIMP_ORIENTATION_VERTICAL);
+ drawable = gimp_image_get_active_drawable (image);
+ }
+
layers = gimp_image_list_layers (image);
num_layers = g_list_length (layers);
@@ -1642,7 +1664,8 @@ write_image (FILE *fp,
if (is_dx10)
{
- array_size = ((savetype == DDS_SAVE_SELECTED_LAYER) ?
+ array_size = ((savetype == DDS_SAVE_SELECTED_LAYER ||
+ savetype == DDS_SAVE_VISIBLE_LAYERS) ?
1 : get_array_size (image));
PUTL32 (hdr10 + 0, dxgi_format);
@@ -1724,6 +1747,9 @@ write_image (FILE *fp,
}
else
{
+ if (savetype == DDS_SAVE_VISIBLE_LAYERS)
+ drawable = GIMP_DRAWABLE (gimp_image_merge_visible_layers (image,
+ GIMP_CLIP_TO_IMAGE));
write_layer (fp, image, drawable, config,
w, h, bpp, fmtbpp, num_mipmaps);
}
@@ -1807,6 +1833,7 @@ config_notify (GObject *config,
switch (savetype)
{
case DDS_SAVE_SELECTED_LAYER:
+ case DDS_SAVE_VISIBLE_LAYERS:
case DDS_SAVE_CUBEMAP:
case DDS_SAVE_ARRAY:
gtk_widget_set_sensitive (compress_opt, TRUE);
@@ -2014,10 +2041,11 @@ save_dialog (GimpImage *image,
0.0, 0.5,
format_opt, 1);
- store = gimp_int_store_new ("Image / Selected layer", DDS_SAVE_SELECTED_LAYER,
- "As cube map", DDS_SAVE_CUBEMAP,
- "As volume map", DDS_SAVE_VOLUMEMAP,
- "As texture array", DDS_SAVE_ARRAY,
+ store = gimp_int_store_new (_("Selected layer"), DDS_SAVE_SELECTED_LAYER,
+ _("All visible layers"), DDS_SAVE_VISIBLE_LAYERS,
+ _("As cube map"), DDS_SAVE_CUBEMAP,
+ _("As volume map"), DDS_SAVE_VOLUMEMAP,
+ _("As texture array"), DDS_SAVE_ARRAY,
NULL);
opt = gimp_prop_int_combo_box_new (config, "save-type",
GIMP_INT_STORE (store));
@@ -2034,13 +2062,17 @@ save_dialog (GimpImage *image,
combo_set_item_sensitive (opt, DDS_SAVE_VOLUMEMAP, is_volume);
combo_set_item_sensitive (opt, DDS_SAVE_ARRAY, is_array);
- store = gimp_int_store_new ("No mipmaps", DDS_MIPMAP_NONE,
- "Generate mipmaps", DDS_MIPMAP_GENERATE,
- "Use existing mipmaps", DDS_MIPMAP_EXISTING,
+ flip_check = gimp_prop_check_button_new (config, "flip-image",
+ _("Flip image _vertically on export"));
+ gtk_grid_attach (GTK_GRID (grid), flip_check, 1, 4, 1, 1);
+
+ store = gimp_int_store_new (_("No mipmaps"), DDS_MIPMAP_NONE,
+ _("Generate mipmaps"), DDS_MIPMAP_GENERATE,
+ _("Use existing mipmaps"), DDS_MIPMAP_EXISTING,
NULL);
mipmap_opt = gimp_prop_int_combo_box_new (config, "mipmaps",
GIMP_INT_STORE (store));
- gimp_grid_attach_aligned (GTK_GRID (grid), 0, 4,
+ gimp_grid_attach_aligned (GTK_GRID (grid), 0, 5,
_("_Mipmaps:"),
0.0, 0.5,
mipmap_opt, 1);
diff --git a/plug-ins/file-dds/ddswrite.h b/plug-ins/file-dds/ddswrite.h
index 414850d73b..06b2084e7e 100644
--- a/plug-ins/file-dds/ddswrite.h
+++ b/plug-ins/file-dds/ddswrite.h
@@ -27,7 +27,8 @@ extern GimpPDBStatusType write_dds (GFile *file,
GimpDrawable *drawable,
gboolean interactive,
GimpProcedure *procedure,
- GObject *config);
+ GObject *config,
+ gboolean is_duplicate_image);
#endif /* __DDSWRITE_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]