[gimp] plug-ins: prepare file-dds for GimpProcedureConfig porting



commit b10bdf88fdc888500f67f73c21196c3d90ad35e8
Author: Michael Natterer <mitch gimp org>
Date:   Mon Sep 30 12:55:57 2019 +0200

    plug-ins: prepare file-dds for GimpProcedureConfig porting
    
    by replacing its own combo box code by GimpIntComboBox which is
    trivially portable to propwidgets. Also some formatting cleanup in the
    save code.

 plug-ins/file-dds/dds.c       |   9 +-
 plug-ins/file-dds/ddsplugin.h |  27 +-
 plug-ins/file-dds/ddswrite.c  | 708 ++++++++++++++++++------------------------
 3 files changed, 326 insertions(+), 418 deletions(-)
---
diff --git a/plug-ins/file-dds/dds.c b/plug-ins/file-dds/dds.c
index fa4fb1fa43..176d9a051b 100644
--- a/plug-ins/file-dds/dds.c
+++ b/plug-ins/file-dds/dds.c
@@ -98,12 +98,11 @@ DDSWriteVals dds_write_vals =
   -1,
   DDS_MIPMAP_FILTER_DEFAULT,
   DDS_MIPMAP_WRAP_DEFAULT,
-  0,
-  0,
+  FALSE,
+  FALSE,
   0.0,
-  0,
-  0,
-  0,
+  FALSE,
+  FALSE,
   0.5
 };
 
diff --git a/plug-ins/file-dds/ddsplugin.h b/plug-ins/file-dds/ddsplugin.h
index 06cb0348e7..60550f5fda 100644
--- a/plug-ins/file-dds/ddsplugin.h
+++ b/plug-ins/file-dds/ddsplugin.h
@@ -32,20 +32,19 @@
 
 typedef struct
 {
-  int compression;
-  int mipmaps;
-  int savetype;
-  int format;
-  int transindex;
-  int mipmap_filter;
-  int mipmap_wrap;
-  int gamma_correct;
-  int srgb;
-  float gamma;
-  int perceptual_metric;
-  int show_adv_opt;
-  int preserve_alpha_coverage;
-  float alpha_test_threshold;
+  gint     compression;
+  gint     mipmaps;
+  gint     savetype;
+  gint     format;
+  gint     transindex;
+  gint     mipmap_filter;
+  gint     mipmap_wrap;
+  gboolean gamma_correct;
+  gboolean srgb;
+  gdouble  gamma;
+  gboolean perceptual_metric;
+  gboolean preserve_alpha_coverage;
+  gdouble  alpha_test_threshold;
 } DDSWriteVals;
 
 typedef struct
diff --git a/plug-ins/file-dds/ddswrite.c b/plug-ins/file-dds/ddswrite.c
index ff7ea0cc43..87ce248273 100644
--- a/plug-ins/file-dds/ddswrite.c
+++ b/plug-ins/file-dds/ddswrite.c
@@ -44,25 +44,12 @@
 #include "color.h"
 
 
-enum
-{
-  COMBO_VALUE,
-  COMBO_STRING,
-  COMBO_SENSITIVE
-};
-
+static gboolean   write_image (FILE         *fp,
+                               GimpImage    *image,
+                               GimpDrawable *drawable);
+static gint       save_dialog (GimpImage    *image,
+                               GimpDrawable *drawable);
 
-static gint       save_dialog          (GimpImage    *image,
-                                        GimpDrawable *drawable);
-static void       save_dialog_response (GtkWidget    *widget,
-                                        gint          response_id,
-                                        gpointer      data);
-static gboolean   write_image          (FILE         *fp,
-                                        GimpImage    *image,
-                                        GimpDrawable *drawable);
-
-
-static gboolean runme = FALSE;
 
 static const char *cubemap_face_names[4][6] =
 {
@@ -106,88 +93,6 @@ static GtkWidget *pm_chk;
 static GtkWidget *alpha_coverage_chk;
 static GtkWidget *alpha_test_threshold_spin;
 
-typedef struct string_value_s
-{
-  gint   value;
-  gchar *string;
-} string_value_t;
-
-static string_value_t compression_strings[] =
-{
-  { DDS_COMPRESS_NONE,   "None" },
-  { DDS_COMPRESS_BC1,    "BC1 / DXT1" },
-  { DDS_COMPRESS_BC2,    "BC2 / DXT3" },
-  { DDS_COMPRESS_BC3,    "BC3 / DXT5" },
-  { DDS_COMPRESS_BC3N,   "BC3nm / DXT5nm" },
-  { DDS_COMPRESS_BC4,    "BC4 / ATI1 (3Dc+)" },
-  { DDS_COMPRESS_BC5,    "BC5 / ATI2 (3Dc)" },
-  { DDS_COMPRESS_RXGB,   "RXGB (DXT5)" },
-  { DDS_COMPRESS_AEXP,   "Alpha Exponent (DXT5)" },
-  { DDS_COMPRESS_YCOCG,  "YCoCg (DXT5)" },
-  { DDS_COMPRESS_YCOCGS, "YCoCg scaled (DXT5)" },
-  { -1, 0}
-};
-
-static string_value_t format_strings[] =
-{
-  { DDS_FORMAT_DEFAULT, "Default" },
-  { DDS_FORMAT_RGB8,    "RGB8" },
-  { DDS_FORMAT_RGBA8,   "RGBA8" },
-  { DDS_FORMAT_BGR8,    "BGR8" },
-  { DDS_FORMAT_ABGR8,   "ABGR8" },
-  { DDS_FORMAT_R5G6B5,  "R5G6B5" },
-  { DDS_FORMAT_RGBA4,   "RGBA4" },
-  { DDS_FORMAT_RGB5A1,  "RGB5A1" },
-  { DDS_FORMAT_RGB10A2, "RGB10A2" },
-  { DDS_FORMAT_R3G3B2,  "R3G3B2" },
-  { DDS_FORMAT_A8,      "A8" },
-  { DDS_FORMAT_L8,      "L8" },
-  { DDS_FORMAT_L8A8,    "L8A8" },
-  { DDS_FORMAT_AEXP,    "AExp" },
-  { DDS_FORMAT_YCOCG,   "YCoCg" },
-  { -1, 0}
-};
-
-static string_value_t mipmap_strings[] =
-{
-  { DDS_MIPMAP_NONE,     "No mipmaps" },
-  { DDS_MIPMAP_GENERATE, "Generate mipmaps" },
-  { DDS_MIPMAP_EXISTING, "Use existing mipmaps" },
-  { -1, 0}
-};
-
-static string_value_t mipmap_filter_strings[] =
-{
-  { DDS_MIPMAP_FILTER_DEFAULT,   "Default" },
-  { DDS_MIPMAP_FILTER_NEAREST,   "Nearest" },
-  { DDS_MIPMAP_FILTER_BOX,       "Box" },
-  { DDS_MIPMAP_FILTER_TRIANGLE,  "Triangle" },
-  { DDS_MIPMAP_FILTER_QUADRATIC, "Quadratic" },
-  { DDS_MIPMAP_FILTER_BSPLINE,   "B-Spline" },
-  { DDS_MIPMAP_FILTER_MITCHELL,  "Mitchell" },
-  { DDS_MIPMAP_FILTER_LANCZOS,   "Lanczos" },
-  { DDS_MIPMAP_FILTER_KAISER,    "Kaiser" },
-  { -1, 0}
-};
-
-static string_value_t mipmap_wrap_strings[] =
-{
-  { DDS_MIPMAP_WRAP_DEFAULT, "Default" },
-  { DDS_MIPMAP_WRAP_MIRROR,  "Mirror" },
-  { DDS_MIPMAP_WRAP_REPEAT,  "Repeat" },
-  { DDS_MIPMAP_WRAP_CLAMP,   "Clamp" },
-  { -1, 0}
-};
-
-static string_value_t save_type_strings[] =
-{
-  { DDS_SAVE_SELECTED_LAYER, "Image / Selected layer" },
-  { DDS_SAVE_CUBEMAP,        "As cube map" },
-  { DDS_SAVE_VOLUMEMAP,      "As volume map" },
-  { DDS_SAVE_ARRAY,          "As texture array" },
-  { -1, 0}
-};
-
 static struct
 {
   int          format;
@@ -221,16 +126,18 @@ static gboolean
 check_mipmaps (GimpImage *image,
                gint       savetype)
 {
-  GList *layers;
-  GList *list;
-  gint   num_layers;
-  gint   i, j, w, h, mipw, miph;
-  gint   num_mipmaps;
-  gint   num_surfaces = 0;
-  gint   min_surfaces = 1;
-  gint   max_surfaces = 1;
-  gboolean valid = TRUE;
-  GimpImageType type;
+  GList         *layers;
+  GList         *list;
+  gint           num_layers;
+  gint           i, j;
+  gint           w, h;
+  gint           mipw, miph;
+  gint           num_mipmaps;
+  gint           num_surfaces = 0;
+  gint           min_surfaces = 1;
+  gint           max_surfaces = 1;
+  gboolean       valid        = TRUE;
+  GimpImageType  type;
 
   /* not handling volume maps for the moment... */
   if (savetype == DDS_SAVE_VOLUMEMAP)
@@ -306,13 +213,14 @@ check_mipmaps (GimpImage *image,
 static gboolean
 check_cubemap (GimpImage *image)
 {
-  GList *layers;
-  GList *list;
-  gint   num_layers;
-  gboolean cubemap = TRUE;
-  gint i, j, k, w, h;
-  gchar *layer_name;
-  GimpImageType type;
+  GList         *layers;
+  GList         *list;
+  gint           num_layers;
+  gboolean       cubemap = TRUE;
+  gint           i, j, k;
+  gint           w, h;
+  gchar         *layer_name;
+  GimpImageType  type;
 
   layers = gimp_image_list_layers (image);
   num_layers = g_list_length (layers);
@@ -456,12 +364,13 @@ check_cubemap (GimpImage *image)
 static gboolean
 check_volume (GimpImage *image)
 {
-  GList *layers;
-  GList *list;
-  gint   num_layers;
-  gboolean volume = FALSE;
-  gint i, w, h;
-  GimpImageType type;
+  GList         *layers;
+  GList         *list;
+  gint           num_layers;
+  gboolean       volume = FALSE;
+  gint           i;
+  gint           w, h;
+  GimpImageType  type;
 
   layers = gimp_image_list_layers (image);
   num_layers = g_list_length (layers);
@@ -504,11 +413,12 @@ check_volume (GimpImage *image)
 static gboolean
 check_array (GimpImage *image)
 {
-  GList *layers;
-  gint   num_layers;
-  gboolean array = FALSE;
-  gint i, w, h;
-  GimpImageType type;
+  GList         *layers;
+  gint           num_layers;
+  gboolean       array = FALSE;
+  gint           i;
+  gint           w, h;
+  GimpImageType  type;
 
   if (check_mipmaps (image, DDS_SAVE_ARRAY))
     return 1;
@@ -564,7 +474,8 @@ get_array_size (GimpImage *image)
   GList *layers;
   GList *list;
   gint   num_layers;
-  gint   i, w, h;
+  gint   i;
+  gint   w, h;
   gint   elements = 0;
 
   layers = gimp_image_list_layers (image);
@@ -667,7 +578,7 @@ swap_rb (unsigned char *pixels,
          unsigned int   n,
          int            bpp)
 {
-  unsigned int i;
+  unsigned int  i;
   unsigned char t;
 
   for (i = 0; i < n; ++i)
@@ -728,7 +639,7 @@ convert_pixels (unsigned char *dst,
                 unsigned char *palette,
                 int            mipmaps)
 {
-  unsigned int i, num_pixels;
+  unsigned int  i, num_pixels;
   unsigned char r, g, b, a;
 
   if (d > 0)
@@ -844,12 +755,15 @@ get_mipmap_chain (unsigned char *dst,
                   GimpImage     *image,
                   GimpDrawable  *drawable)
 {
-  GList *layers;
-  GList *list;
-  gint   num_layers;
+  GList      *layers;
+  GList      *list;
+  gint        num_layers;
   GeglBuffer *buffer;
-  const Babl *format = 0;
-  int i, idx = 0, offset, mipw, miph;
+  const Babl *format;
+  gint        i;
+  gint        idx = 0;
+  gint        offset;
+  gint        mipw, miph;
 
   if (bpp == 1)
     format = babl_format ("Y' u8");
@@ -914,15 +828,23 @@ write_layer (FILE         *fp,
              int           fmtbpp,
              int           mipmaps)
 {
-  GeglBuffer *buffer;
-  const Babl *format = 0;
-  GimpImageBaseType basetype;
-  GimpImageType type;
-  unsigned char *src, *dst, *fmtdst, *tmp;
-  unsigned char *palette = NULL;
-  int i, c, x, y, size, fmtsize, offset, colors;
-  int compression = dds_write_vals.compression;
-  int flags = 0;
+  GeglBuffer        *buffer;
+  const Babl        *format;
+  GimpImageBaseType  basetype;
+  GimpImageType      type;
+  guchar            *src;
+  guchar            *dst;
+  guchar            *fmtdst;
+  guchar            *tmp;
+  guchar            *palette = NULL;
+  gint               i, c;
+  gint               x, y;
+  gint               size;
+  gint               fmtsize;
+  gint               offset;
+  gint               colors;
+  gint               compression = dds_write_vals.compression;
+  gint               flags = 0;
 
   basetype = gimp_image_base_type (image);
   type = gimp_drawable_type (drawable);
@@ -1185,17 +1107,24 @@ write_volume_mipmaps (FILE      *fp,
                       int        fmtbpp,
                       int        mipmaps)
 {
-  GList *list;
-  int i, size, offset, colors;
-  unsigned char *src, *dst, *tmp, *fmtdst;
-  unsigned char *palette = 0;
-  GeglBuffer *buffer;
-  const Babl *format;
-  GimpImageBaseType type;
+  GList             *list;
+  gint               i;
+  gint               size;
+  gint               offset;
+  gint               colors;
+  guchar            *src;
+  guchar            *dst;
+  guchar            *tmp;
+  guchar            *fmtdst;
+  guchar            *palette = 0;
+  GeglBuffer        *buffer;
+  const Babl        *format;
+  GimpImageBaseType  type;
 
   type = gimp_image_base_type (image);
 
-  if (dds_write_vals.compression != DDS_COMPRESS_NONE) return;
+  if (dds_write_vals.compression != DDS_COMPRESS_NONE)
+    return;
 
   src = g_malloc (w * h * bpp * d);
 
@@ -1292,27 +1221,27 @@ write_image (FILE         *fp,
              GimpImage    *image,
              GimpDrawable *drawable)
 {
-  GimpImageType drawable_type;
-  GimpImageBaseType basetype;
-  gint i, w, h;
-  gint bpp = 0;
-  gint fmtbpp = 0;
-  gint has_alpha = 0;
-  gint num_mipmaps;
-  guchar hdr[DDS_HEADERSIZE];
-  guchar hdr10[DDS_HEADERSIZE_DX10];
-  guint flags = 0, pflags = 0, caps = 0, caps2 = 0, size = 0;
-  guint rmask = 0, gmask = 0, bmask = 0, amask = 0;
-  guint fourcc = 0;
-  DXGI_FORMAT dxgi_format = DXGI_FORMAT_UNKNOWN;
-  gint32  num_layers;
-  GList  *layers;
-  GList *list;
-  guchar *cmap;
-  gint    colors;
-  guchar zero[4] = {0, 0, 0, 0};
-  gint is_dx10 = 0;
-  gint array_size = 1;
+  GimpImageType      drawable_type;
+  GimpImageBaseType  basetype;
+  gint               i, w, h;
+  gint               bpp = 0;
+  gint               fmtbpp = 0;
+  gint               has_alpha = 0;
+  gint               num_mipmaps;
+  guchar             hdr[DDS_HEADERSIZE];
+  guchar             hdr10[DDS_HEADERSIZE_DX10];
+  guint              flags = 0, pflags = 0, caps = 0, caps2 = 0, size = 0;
+  guint              rmask = 0, gmask = 0, bmask = 0, amask = 0;
+  guint              fourcc = 0;
+  DXGI_FORMAT        dxgi_format = DXGI_FORMAT_UNKNOWN;
+  gint32             num_layers;
+  GList             *layers;
+  GList             *list;
+  guchar            *cmap;
+  gint               colors;
+  guchar             zero[4] = {0, 0, 0, 0};
+  gint               is_dx10 = 0;
+  gint               array_size = 1;
 
   layers = gimp_image_list_layers (image);
   num_layers = g_list_length (layers);
@@ -1707,117 +1636,45 @@ write_image (FILE         *fp,
   return TRUE;
 }
 
-static GtkWidget *
-string_value_combo_new (string_value_t *strings,
-                        int             active_value)
-{
-  GtkWidget *opt;
-  GtkCellRenderer *renderer;
-  GtkListStore *store;
-  GtkTreeIter iter;
-  gint i;
-  gint active = 0;
-
-  store = gtk_list_store_new (3, G_TYPE_INT, G_TYPE_STRING, G_TYPE_BOOLEAN);
-  for (i = 0; strings[i].string; ++i)
-    {
-      if (strings[i].value == active_value) active = i;
-      gtk_list_store_append (store, &iter);
-      gtk_list_store_set (store, &iter,
-                          0, strings[i].value,
-                          1, strings[i].string,
-                          2, 1,
-                          -1);
-    }
-
-  renderer = gtk_cell_renderer_text_new ();
-
-  opt = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
-  gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (opt), renderer, 1);
-  gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (opt), renderer,
-                                  "text", COMBO_STRING,
-                                  "sensitive", COMBO_SENSITIVE,
-                                  NULL);
-
-  gtk_combo_box_set_active (GTK_COMBO_BOX (opt), active);
-
-  g_object_unref (store);
-
-  return opt;
-}
-
-static void
-string_value_combo_selected (GtkWidget *widget,
-                             gpointer   data)
+static gboolean
+combo_sensitivity_func (gint     value,
+                        gpointer data)
 {
-  gint value;
-  GtkTreeIter iter;
   GtkTreeModel *model;
+  GtkTreeIter   iter;
 
-  model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
-  gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter);
-  gtk_tree_model_get (model, &iter, COMBO_VALUE, &value, -1);
+  model = gtk_combo_box_get_model (GTK_COMBO_BOX (data));
 
-  *((int *)data) = value;
-}
+  if (gimp_int_store_lookup_by_value (model, value, &iter))
+    {
+      gpointer insensitive;
 
-static void
-string_value_combo_set_item_sensitive (GtkWidget *widget,
-                                       gint       value,
-                                       gboolean   sensitive)
-{
-  GtkTreeIter iter;
-  GtkTreeModel *model;
-  gint val;
+      gtk_tree_model_get (model, &iter,
+                          GIMP_INT_STORE_USER_DATA, &insensitive,
+                          -1);
 
-  model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
-  gtk_tree_model_get_iter_first (model, &iter);
-  do
-    {
-      gtk_tree_model_get (model, &iter, COMBO_VALUE, &val, -1);
-      if (val == value)
-        {
-          gtk_list_store_set (GTK_LIST_STORE (model), &iter,
-                              COMBO_SENSITIVE, sensitive, -1);
-          break;
-        }
-    } while (gtk_tree_model_iter_next (model, &iter));
+      return ! GPOINTER_TO_INT (insensitive);
+    }
+
+  return TRUE;
 }
 
 static void
-string_value_combo_set_active (GtkWidget *widget,
-                               gint       value)
+combo_set_item_sensitive (GtkWidget *widget,
+                          gint       value,
+                          gboolean   sensitive)
 {
-  GtkTreeIter iter;
   GtkTreeModel *model;
-  int val;
+  GtkTreeIter   iter;
 
   model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
-  gtk_tree_model_get_iter_first (model, &iter);
-  do
-    {
-      gtk_tree_model_get (model, &iter, COMBO_VALUE, &val, -1);
-      if (val == value)
-        {
-          gtk_combo_box_set_active_iter (GTK_COMBO_BOX (widget), &iter);
-          break;
-        }
-    } while (gtk_tree_model_iter_next (model, &iter));
-}
 
-static void
-save_dialog_response (GtkWidget *widget,
-                      gint       response_id,
-                      gpointer   data)
-{
-  switch (response_id)
+  if (gimp_int_store_lookup_by_value (model, value, &iter))
     {
-    case GTK_RESPONSE_OK:
-      runme = TRUE;
-
-    default:
-      gtk_widget_destroy (widget);
-      break;
+      gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+                          GIMP_INT_STORE_USER_DATA,
+                          ! GINT_TO_POINTER (sensitive),
+                          -1);
     }
 }
 
@@ -1825,19 +1682,16 @@ static void
 compression_selected (GtkWidget *widget,
                       gpointer   data)
 {
-  GtkTreeIter iter;
-  GtkTreeModel *model;
+  gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget),
+                                 &dds_write_vals.compression);
 
-  model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
-  gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter);
-  gtk_tree_model_get (model, &iter, COMBO_VALUE,
-                      &dds_write_vals.compression,
-                      -1);
+  if (format_opt)
+    gtk_widget_set_sensitive (format_opt,
+                              dds_write_vals.compression == DDS_COMPRESS_NONE);
 
-  gtk_widget_set_sensitive (format_opt,
-                            dds_write_vals.compression == DDS_COMPRESS_NONE);
-  gtk_widget_set_sensitive (pm_chk,
-                            dds_write_vals.compression != DDS_COMPRESS_NONE);
+  if (pm_chk)
+    gtk_widget_set_sensitive (pm_chk,
+                              dds_write_vals.compression != DDS_COMPRESS_NONE);
 }
 
 static void
@@ -1846,7 +1700,8 @@ savetype_selected (GtkWidget *widget,
 {
   GimpImage *image = data;
 
-  dds_write_vals.savetype = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
+  gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget),
+                                 &dds_write_vals.savetype);
 
   switch (dds_write_vals.savetype)
     {
@@ -1858,55 +1713,55 @@ savetype_selected (GtkWidget *widget,
 
     case DDS_SAVE_VOLUMEMAP:
       dds_write_vals.compression = DDS_COMPRESS_NONE;
-      gtk_combo_box_set_active (GTK_COMBO_BOX (compress_opt),
-                                DDS_COMPRESS_NONE);
+      gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (compress_opt),
+                                     DDS_COMPRESS_NONE);
       gtk_widget_set_sensitive (compress_opt, FALSE);
       break;
     }
 
-  string_value_combo_set_item_sensitive (mipmap_opt, DDS_MIPMAP_EXISTING,
-                                         check_mipmaps (image, dds_write_vals.savetype));
+  if (mipmap_opt)
+    combo_set_item_sensitive (mipmap_opt, DDS_MIPMAP_EXISTING,
+                              check_mipmaps (image, dds_write_vals.savetype));
 }
 
 static void
 mipmaps_selected (GtkWidget *widget,
                   gpointer   data)
 {
-  GtkTreeModel *model;
-  GtkTreeIter   iter;
-
-  model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
-  gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter);
-  gtk_tree_model_get (model, &iter, COMBO_VALUE,
-                      &dds_write_vals.mipmaps, -1);
-
-  gtk_widget_set_sensitive (mipmap_filter_opt,
-                            dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE);
-  gtk_widget_set_sensitive (mipmap_wrap_opt,
-                            dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE);
-  gtk_widget_set_sensitive (gamma_chk,
-                            dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE);
-  gtk_widget_set_sensitive (srgb_chk,
-                            (dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE) &&
-                            dds_write_vals.gamma_correct);
-  gtk_widget_set_sensitive (gamma_spin,
-                            (dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE) &&
-                            dds_write_vals.gamma_correct &&
-                            !dds_write_vals.srgb);
-  gtk_widget_set_sensitive (alpha_coverage_chk,
-                            dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE);
-  gtk_widget_set_sensitive (alpha_test_threshold_spin,
-                            (dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE) &&
-                            dds_write_vals.preserve_alpha_coverage);
-}
-
-static void
-toggle_clicked (GtkWidget *widget,
-                gpointer   data)
-{
-  gint *flag = (int *)data;
-
-  (*flag) = !(*flag);
+  gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget),
+                                 &dds_write_vals.mipmaps);
+
+  if (mipmap_filter_opt)
+    gtk_widget_set_sensitive (mipmap_filter_opt,
+                              dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE);
+
+  if (mipmap_wrap_opt)
+    gtk_widget_set_sensitive (mipmap_wrap_opt,
+                              dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE);
+
+  if (gamma_chk)
+    gtk_widget_set_sensitive (gamma_chk,
+                              dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE);
+
+  if (srgb_chk)
+    gtk_widget_set_sensitive (srgb_chk,
+                              (dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE) &&
+                              dds_write_vals.gamma_correct);
+
+  if (gamma_spin)
+    gtk_widget_set_sensitive (gamma_spin,
+                              (dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE) &&
+                              dds_write_vals.gamma_correct &&
+                              !dds_write_vals.srgb);
+
+  if (alpha_coverage_chk)
+    gtk_widget_set_sensitive (alpha_coverage_chk,
+                              dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE);
+
+  if (alpha_test_threshold_spin)
+    gtk_widget_set_sensitive (alpha_test_threshold_spin,
+                              (dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE) &&
+                              dds_write_vals.preserve_alpha_coverage);
 }
 
 static void
@@ -1991,7 +1846,7 @@ static gint
 save_dialog (GimpImage    *image,
              GimpDrawable *drawable)
 {
-  GtkWidget *dlg;
+  GtkWidget *dialog;
   GtkWidget *vbox;
   GtkWidget *hbox;
   GtkWidget *grid;
@@ -2000,30 +1855,25 @@ save_dialog (GimpImage    *image,
   GtkWidget *spin;
   GtkWidget *frame;
   GimpImageBaseType basetype;
+  gboolean   run;
+
 
   if (is_cubemap || is_volume || is_array)
     dds_write_vals.savetype = DDS_SAVE_SELECTED_LAYER;
 
   basetype = gimp_image_base_type (image);
 
-  dlg = gimp_dialog_new (_("Export as DDS"), "dds", NULL, GTK_WIN_POS_MOUSE,
-                         gimp_standard_help_func, SAVE_PROC,
-                         _("_Cancel"), GTK_RESPONSE_CANCEL,
-                         _("_Export"), GTK_RESPONSE_OK,
-                         NULL);
+  dialog = gimp_dialog_new (_("Export as DDS"), "dds", NULL, GTK_WIN_POS_MOUSE,
+                            gimp_standard_help_func, SAVE_PROC,
+                            _("_Cancel"), GTK_RESPONSE_CANCEL,
+                            _("_Export"), GTK_RESPONSE_OK,
+                            NULL);
 
-  g_signal_connect (dlg, "response",
-                    G_CALLBACK (save_dialog_response),
-                    NULL);
-  g_signal_connect (dlg, "destroy",
-                    G_CALLBACK (gtk_main_quit),
-                    NULL);
-
-  gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE);
+  gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
 
   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
   gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
-  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dlg))),
+  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
                       vbox, TRUE, TRUE, 0);
   gtk_widget_show (vbox);
 
@@ -2033,78 +1883,122 @@ save_dialog (GimpImage    *image,
   gtk_box_pack_start (GTK_BOX (vbox), grid, FALSE, FALSE, 0);
   gtk_widget_show (grid);
 
-  opt = string_value_combo_new (compression_strings,
-                                dds_write_vals.compression);
+  opt = gimp_int_combo_box_new ("None",                  DDS_COMPRESS_NONE,
+                                "BC1 / DXT1",            DDS_COMPRESS_BC1,
+                                "BC2 / DXT3",            DDS_COMPRESS_BC2,
+                                "BC3 / DXT5",            DDS_COMPRESS_BC3,
+                                "BC3nm / DXT5nm",        DDS_COMPRESS_BC3N,
+                                "BC4 / ATI1 (3Dc+)",     DDS_COMPRESS_BC4,
+                                "BC5 / ATI2 (3Dc)",      DDS_COMPRESS_BC5,
+                                "RXGB (DXT5)",           DDS_COMPRESS_RXGB,
+                                "Alpha Exponent (DXT5)", DDS_COMPRESS_AEXP,
+                                "YCoCg (DXT5)",          DDS_COMPRESS_YCOCG,
+                                "YCoCg scaled (DXT5)",   DDS_COMPRESS_YCOCGS,
+                                NULL);
   gimp_grid_attach_aligned (GTK_GRID (grid), 0, 0,
                             _("_Compression:"),
                             0.0, 0.5,
                             opt, 1);
 
-  g_signal_connect (opt, "changed",
-                    G_CALLBACK (compression_selected),
-                    NULL);
-
   compress_opt = opt;
 
+  gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (opt),
+                              dds_write_vals.compression,
+                              G_CALLBACK (compression_selected),
+                              NULL, NULL);
+
   check = gtk_check_button_new_with_mnemonic (_("Use _perceptual error metric"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check),
                                 dds_write_vals.perceptual_metric);
   gtk_grid_attach (GTK_GRID (grid), check, 1, 1, 1, 1);
   gtk_widget_show (check);
 
-  g_signal_connect (check, "clicked",
-                    G_CALLBACK (toggle_clicked),
-                    &dds_write_vals.perceptual_metric);
-
   pm_chk = check;
 
-  opt = string_value_combo_new (format_strings, dds_write_vals.format);
+  g_signal_connect (check, "toggled",
+                    G_CALLBACK (gimp_toggle_button_update),
+                    &dds_write_vals.perceptual_metric);
+
+  opt = gimp_int_combo_box_new ("Default", DDS_FORMAT_DEFAULT,
+                                "RGB8",    DDS_FORMAT_RGB8,
+                                "RGBA8",   DDS_FORMAT_RGBA8,
+                                "BGR8",    DDS_FORMAT_BGR8,
+                                "ABGR8",   DDS_FORMAT_ABGR8,
+                                "R5G6B5",  DDS_FORMAT_R5G6B5,
+                                "RGBA4",   DDS_FORMAT_RGBA4,
+                                "RGB5A1",  DDS_FORMAT_RGB5A1,
+                                "RGB10A2", DDS_FORMAT_RGB10A2,
+                                "R3G3B2",  DDS_FORMAT_R3G3B2,
+                                "A8",      DDS_FORMAT_A8,
+                                "L8",      DDS_FORMAT_L8,
+                                "L8A8",    DDS_FORMAT_L8A8,
+                                "AExp",    DDS_FORMAT_AEXP,
+                                "YCoCg",   DDS_FORMAT_YCOCG,
+                                NULL);
   gimp_grid_attach_aligned (GTK_GRID (grid), 0, 2,
                             _("_Format:"),
                             0.0, 0.5,
                             opt, 1);
 
-  g_signal_connect (opt, "changed",
-                    G_CALLBACK (string_value_combo_selected),
-                    &dds_write_vals.format);
+  format_opt = opt;
 
-  gtk_widget_set_sensitive (opt, dds_write_vals.compression == DDS_COMPRESS_NONE);
+  gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (opt),
+                              dds_write_vals.format,
+                              G_CALLBACK (gimp_int_combo_box_get_active),
+                              &dds_write_vals.format, NULL);
 
-  format_opt = opt;
+  gtk_widget_set_sensitive (opt, dds_write_vals.compression == DDS_COMPRESS_NONE);
 
-  opt = string_value_combo_new (save_type_strings, dds_write_vals.savetype);
+  opt = gimp_int_combo_box_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,
+                                NULL);
   gimp_grid_attach_aligned (GTK_GRID (grid), 0, 3,
                             _("_Save:"),
                             0.0, 0.5,
                             opt, 1);
 
-  g_signal_connect (opt, "changed",
-                    G_CALLBACK (savetype_selected),
-                    image);
+  gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (opt),
+                              dds_write_vals.savetype,
+                              G_CALLBACK (savetype_selected),
+                              image, NULL);
+
+  gimp_int_combo_box_set_sensitivity (GIMP_INT_COMBO_BOX (opt),
+                                      combo_sensitivity_func,
+                                      opt, NULL);
 
-  string_value_combo_set_item_sensitive (opt, DDS_SAVE_CUBEMAP, is_cubemap);
-  string_value_combo_set_item_sensitive (opt, DDS_SAVE_VOLUMEMAP, is_volume);
-  string_value_combo_set_item_sensitive (opt, DDS_SAVE_ARRAY, is_array);
+  combo_set_item_sensitive (opt, DDS_SAVE_CUBEMAP,   is_cubemap);
+  combo_set_item_sensitive (opt, DDS_SAVE_VOLUMEMAP, is_volume);
+  combo_set_item_sensitive (opt, DDS_SAVE_ARRAY,     is_array);
 
-  opt = string_value_combo_new (mipmap_strings, dds_write_vals.mipmaps);
+  opt = gimp_int_combo_box_new ("No mipmaps",           DDS_MIPMAP_NONE,
+                                "Generate mipmaps",     DDS_MIPMAP_GENERATE,
+                                "Use existing mipmaps", DDS_MIPMAP_EXISTING,
+                                NULL);
   gimp_grid_attach_aligned (GTK_GRID (grid), 0, 4,
                             _("_Mipmaps:"),
                             0.0, 0.5,
                             opt, 1);
 
-  g_signal_connect (opt, "changed",
-                    G_CALLBACK (mipmaps_selected),
-                    image);
+  mipmap_opt = opt;
 
-  string_value_combo_set_item_sensitive (opt, DDS_MIPMAP_EXISTING,
-                                         check_mipmaps (image,
-                                                        dds_write_vals.savetype));
+  gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (opt),
+                              dds_write_vals.mipmaps,
+                              G_CALLBACK (mipmaps_selected),
+                              image, NULL);
 
-  mipmap_opt = opt;
+  gimp_int_combo_box_set_sensitivity (GIMP_INT_COMBO_BOX (opt),
+                                      combo_sensitivity_func,
+                                      opt, NULL);
+
+  combo_set_item_sensitive (opt, DDS_MIPMAP_EXISTING,
+                            check_mipmaps (image,
+                                           dds_write_vals.savetype));
 
-  string_value_combo_set_item_sensitive (opt, DDS_MIPMAP_EXISTING,
-                                         ! (is_volume || is_cubemap) &&
-                                         is_mipmap_chain_valid);
+  combo_set_item_sensitive (opt, DDS_MIPMAP_EXISTING,
+                            ! (is_volume || is_cubemap) &&
+                            is_mipmap_chain_valid);
 
 
   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
@@ -2151,7 +2045,8 @@ save_dialog (GimpImage    *image,
   if (is_volume && dds_write_vals.savetype == DDS_SAVE_VOLUMEMAP)
     {
       dds_write_vals.compression = DDS_COMPRESS_NONE;
-      string_value_combo_set_active (compress_opt, DDS_COMPRESS_NONE);
+      gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (compress_opt),
+                                     DDS_COMPRESS_NONE);
       gtk_widget_set_sensitive (compress_opt, FALSE);
     }
 
@@ -2165,32 +2060,45 @@ save_dialog (GimpImage    *image,
   gtk_container_add (GTK_CONTAINER (frame), grid);
   gtk_widget_show (grid);
 
-  opt = string_value_combo_new (mipmap_filter_strings,
-                                dds_write_vals.mipmap_filter);
+  opt = gimp_int_combo_box_new ("Default",   DDS_MIPMAP_FILTER_DEFAULT,
+                                "Nearest",   DDS_MIPMAP_FILTER_NEAREST,
+                                "Box",       DDS_MIPMAP_FILTER_BOX,
+                                "Triangle",  DDS_MIPMAP_FILTER_TRIANGLE,
+                                "Quadratic", DDS_MIPMAP_FILTER_QUADRATIC,
+                                "B-Spline",  DDS_MIPMAP_FILTER_BSPLINE,
+                                "Mitchell",  DDS_MIPMAP_FILTER_MITCHELL,
+                                "Lanczos",   DDS_MIPMAP_FILTER_LANCZOS,
+                                "Kaiser",    DDS_MIPMAP_FILTER_KAISER,
+                                NULL);
   gimp_grid_attach_aligned (GTK_GRID (grid), 0, 0,
                             _("F_ilter:"),
                             0.0, 0.5,
                             opt, 1);
 
-  g_signal_connect (opt, "changed",
-                    G_CALLBACK (string_value_combo_selected),
-                    &dds_write_vals.mipmap_filter);
-
   mipmap_filter_opt = opt;
 
-  opt = string_value_combo_new (mipmap_wrap_strings,
-                                dds_write_vals.mipmap_wrap);
+  gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (opt),
+                              dds_write_vals.mipmap_filter,
+                              G_CALLBACK (gimp_int_combo_box_get_active),
+                              &dds_write_vals.mipmap_filter, NULL);
+
+  opt = gimp_int_combo_box_new ("Default", DDS_MIPMAP_WRAP_DEFAULT,
+                                "Mirror",  DDS_MIPMAP_WRAP_MIRROR,
+                                "Repeat",  DDS_MIPMAP_WRAP_REPEAT,
+                                "Clamp",   DDS_MIPMAP_WRAP_CLAMP,
+                                NULL);
   gimp_grid_attach_aligned (GTK_GRID (grid), 0, 1,
                             _("_Wrap mode:"),
                             0.0, 0.5,
                             opt, 1);
 
-  g_signal_connect (opt, "changed",
-                    G_CALLBACK (string_value_combo_selected),
-                    &dds_write_vals.mipmap_wrap);
-
   mipmap_wrap_opt = opt;
 
+  gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (opt),
+                              dds_write_vals.mipmap_wrap,
+                              G_CALLBACK (gimp_int_combo_box_get_active),
+                              &dds_write_vals.mipmap_wrap, NULL);
+
   check = gtk_check_button_new_with_mnemonic (_("Appl_y gamma correction"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check),
                                 dds_write_vals.gamma_correct &&
@@ -2198,12 +2106,12 @@ save_dialog (GimpImage    *image,
   gtk_grid_attach (GTK_GRID (grid), check, 1, 2, 1, 1);
   gtk_widget_show (check);
 
+  gamma_chk = check;
+
   g_signal_connect (check, "clicked",
                     G_CALLBACK (gamma_correct_clicked),
                     NULL);
 
-  gamma_chk = check;
-
   check = gtk_check_button_new_with_mnemonic (_("Use s_RGB colorspace"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check),
                                 dds_write_vals.gamma_correct &&
@@ -2211,27 +2119,28 @@ save_dialog (GimpImage    *image,
   gtk_grid_attach (GTK_GRID (grid), check, 1, 3, 1, 1);
   gtk_widget_show (check);
 
+  srgb_chk = check;
+
   g_signal_connect (check, "clicked",
                     G_CALLBACK (srgb_clicked),
                     NULL);
 
-  srgb_chk = check;
-
   spin = gimp_spin_button_new
     (GTK_ADJUSTMENT (gtk_adjustment_new (dds_write_vals.gamma,
                                          1e-05, 100, 0.1, 0.5, 0)), 1, 1);
-  gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spin), GTK_UPDATE_IF_VALID);
+  gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spin),
+                                     GTK_UPDATE_IF_VALID);
   gimp_grid_attach_aligned (GTK_GRID (grid), 0, 4,
                             _("_Gamma:"),
                             0.0, 0.5,
                             spin, 1);
 
+  gamma_spin = spin;
+
   g_signal_connect (spin, "value_changed",
                     G_CALLBACK (gamma_changed),
                     NULL);
 
-  gamma_spin = spin;
-
   check = gtk_check_button_new_with_mnemonic (_("Preserve alpha _test coverage"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check),
                                 dds_write_vals.preserve_alpha_coverage &&
@@ -2239,27 +2148,28 @@ save_dialog (GimpImage    *image,
   gtk_grid_attach (GTK_GRID (grid), check, 1, 5, 1, 1);
   gtk_widget_show (check);
 
+  alpha_coverage_chk = check;
+
   g_signal_connect (check, "clicked",
                     G_CALLBACK (alpha_coverage_clicked),
                     NULL);
 
-  alpha_coverage_chk = check;
-
   spin = gimp_spin_button_new
     (GTK_ADJUSTMENT (gtk_adjustment_new (dds_write_vals.alpha_test_threshold,
                                          0, 1, 0.01, 0.1, 0)), 1, 2);
-  gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spin), GTK_UPDATE_IF_VALID);
+  gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spin),
+                                     GTK_UPDATE_IF_VALID);
   gimp_grid_attach_aligned (GTK_GRID (grid), 0, 6,
                             _("_Alpha test threshold:"),
                             0.0, 0.5,
                             spin, 1);
 
+  alpha_test_threshold_spin = spin;
+
   g_signal_connect (spin, "value_changed",
                     G_CALLBACK (alpha_test_threshold_changed),
                     NULL);
 
-  alpha_test_threshold_spin = spin;
-
   gtk_widget_set_sensitive (mipmap_filter_opt,
                             dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE);
   gtk_widget_set_sensitive (mipmap_wrap_opt,
@@ -2281,11 +2191,11 @@ save_dialog (GimpImage    *image,
                             (dds_write_vals.mipmaps == DDS_MIPMAP_GENERATE) &&
                             dds_write_vals.preserve_alpha_coverage);
 
-  gtk_widget_show (dlg);
+  gtk_widget_show (dialog);
 
-  runme = FALSE;
+  run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);
 
-  gtk_main ();
+  gtk_widget_destroy (dialog);
 
-  return runme;
+  return run;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]