[gimp/wip/simon/palettestuff: 1/2] Get rid of image->n_colors and image->colormap



commit 74dd86fe3de0b8cdc60ab9bbec9a4d307180af38
Author: Simon Budig <simon budig de>
Date:   Fri Nov 8 10:50:32 2019 +0100

    Get rid of image->n_colors and image->colormap

 app/core/gimpdrawable.c             |   2 +-
 app/core/gimpdrawable.h             |   2 +-
 app/core/gimpimage-color-profile.c  |   2 +-
 app/core/gimpimage-colormap.c       | 191 ++++++++++++++++++++++--------------
 app/core/gimpimage-colormap.h       |   5 +-
 app/core/gimpimage-duplicate.c      |   7 +-
 app/core/gimpimage-new.c            |   7 +-
 app/core/gimpimage-private.h        |   2 -
 app/core/gimpimage.c                |  20 ++--
 app/core/gimpimageundo.c            |   6 +-
 app/core/gimppalette-import.c       |  24 +----
 app/pdb/image-cmds.c                |   2 +-
 app/widgets/gimpcolormapeditor.c    |   9 +-
 app/widgets/gimpcolormapselection.c |  17 ++--
 app/xcf/xcf-save.c                  |  12 ++-
 pdb/groups/image.pdb                |   2 +-
 16 files changed, 164 insertions(+), 146 deletions(-)
---
diff --git a/app/core/gimpdrawable.c b/app/core/gimpdrawable.c
index 6d9af71813..ae4d5dd305 100644
--- a/app/core/gimpdrawable.c
+++ b/app/core/gimpdrawable.c
@@ -1867,7 +1867,7 @@ gimp_drawable_get_component_index (GimpDrawable    *drawable,
   return -1;
 }
 
-const guchar *
+guchar *
 gimp_drawable_get_colormap (GimpDrawable *drawable)
 {
   GimpImage *image;
diff --git a/app/core/gimpdrawable.h b/app/core/gimpdrawable.h
index eb8000241a..a80f1dcfbc 100644
--- a/app/core/gimpdrawable.h
+++ b/app/core/gimpdrawable.h
@@ -224,7 +224,7 @@ const Babl      * gimp_drawable_get_component_format (GimpDrawable    *drawable,
 gint              gimp_drawable_get_component_index  (GimpDrawable    *drawable,
                                                       GimpChannelType  channel);
 
-const guchar    * gimp_drawable_get_colormap         (GimpDrawable    *drawable);
+guchar          * gimp_drawable_get_colormap         (GimpDrawable    *drawable);
 
 void              gimp_drawable_start_paint          (GimpDrawable    *drawable);
 gboolean          gimp_drawable_end_paint            (GimpDrawable    *drawable);
diff --git a/app/core/gimpimage-color-profile.c b/app/core/gimpimage-color-profile.c
index 961f0fc879..325ef7407c 100644
--- a/app/core/gimpimage-color-profile.c
+++ b/app/core/gimpimage-color-profile.c
@@ -871,7 +871,7 @@ gimp_image_convert_profile_colormap (GimpImage                *image,
   gint                     n_colors;
 
   n_colors = gimp_image_get_colormap_size (image);
-  cmap     = g_memdup (gimp_image_get_colormap (image), n_colors * 3);
+  cmap     = gimp_image_get_colormap (image);
 
   if (bpc)
     flags |= GIMP_COLOR_TRANSFORM_FLAGS_BLACK_POINT_COMPENSATION;
diff --git a/app/core/gimpimage-colormap.c b/app/core/gimpimage-colormap.c
index 2647e37aea..93e719e665 100644
--- a/app/core/gimpimage-colormap.c
+++ b/app/core/gimpimage-colormap.c
@@ -62,7 +62,6 @@ gimp_image_colormap_init (GimpImage *image)
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  g_return_if_fail (private->colormap == NULL);
   g_return_if_fail (private->palette == NULL);
 
   palette_name = g_strdup_printf (_("Colormap of Image #%d (%s)"),
@@ -71,8 +70,6 @@ gimp_image_colormap_init (GimpImage *image)
   palette_id = g_strdup_printf ("gimp-indexed-image-palette-%d",
                                 gimp_image_get_id (image));
 
-  private->n_colors = 0;
-  private->colormap = g_new0 (guchar, GIMP_IMAGE_COLORMAP_SIZE);
   private->palette  = GIMP_PALETTE (gimp_palette_new (NULL, palette_name));
 
   gimp_image_colormap_update_formats (image);
@@ -99,7 +96,6 @@ gimp_image_colormap_dispose (GimpImage *image)
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  g_return_if_fail (private->colormap != NULL);
   g_return_if_fail (GIMP_IS_PALETTE (private->palette));
 
   palettes = gimp_data_factory_get_container (image->gimp->palette_factory);
@@ -116,10 +112,8 @@ gimp_image_colormap_free (GimpImage *image)
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  g_return_if_fail (private->colormap != NULL);
   g_return_if_fail (GIMP_IS_PALETTE (private->palette));
 
-  g_clear_pointer (&private->colormap, g_free);
   g_clear_object (&private->palette);
 
   /* don't touch the image's babl_palettes because we might still have
@@ -150,20 +144,28 @@ gimp_image_colormap_update_formats (GimpImage *image)
 
   g_free (format_name);
 
-  if (private->colormap && private->n_colors > 0)
+  if (private->palette)
     {
+      guchar *colormap;
+      gint n_colors;
+
+      colormap = gimp_image_get_colormap (image);
+      n_colors = gimp_image_get_colormap_size (image);
+
       babl_palette_set_palette (private->babl_palette_rgb,
                                 gimp_babl_format (GIMP_RGB,
                                                   private->precision, FALSE,
                                                   space),
-                                private->colormap,
-                                private->n_colors);
+                                colormap,
+                                n_colors);
       babl_palette_set_palette (private->babl_palette_rgba,
                                 gimp_babl_format (GIMP_RGB,
                                                   private->precision, FALSE,
                                                   space),
-                                private->colormap,
-                                private->n_colors);
+                                colormap,
+                                n_colors);
+
+      g_free (colormap);
     }
 }
 
@@ -191,20 +193,84 @@ gimp_image_get_colormap_palette (GimpImage *image)
   return GIMP_IMAGE_GET_PRIVATE (image)->palette;
 }
 
-const guchar *
+void
+gimp_image_set_colormap_palette (GimpImage   *image,
+                                 GimpPalette *palette,
+                                 gboolean     push_undo)
+{
+  GimpImagePrivate *private;
+  GimpPaletteEntry *entry;
+  gint              n_colors, i;
+
+  g_return_if_fail (GIMP_IS_IMAGE (image));
+  g_return_if_fail (palette != NULL);
+  n_colors = gimp_palette_get_n_colors (palette);
+  g_return_if_fail (n_colors >= 0 && n_colors <= 256);
+
+  private = GIMP_IMAGE_GET_PRIVATE (image);
+
+  if (push_undo)
+    gimp_image_undo_push_image_colormap (image, C_("undo-type", "Set Colormap"));
+
+  if (!private->palette)
+    gimp_image_colormap_init (image);
+
+  gimp_data_freeze (GIMP_DATA (private->palette));
+
+  while ((entry = gimp_palette_get_entry (private->palette, 0)))
+    gimp_palette_delete_entry (private->palette, entry);
+
+  for (i = 0; i < n_colors; i++)
+    {
+      GimpPaletteEntry *entry = gimp_palette_get_entry (palette, i);
+      gimp_image_colormap_set_palette_entry (image, &entry->color, i);
+    }
+
+  gimp_data_thaw (GIMP_DATA (private->palette));
+
+  gimp_image_colormap_changed (image, -1);
+}
+
+guchar *
 gimp_image_get_colormap (GimpImage *image)
 {
+  GimpImagePrivate *private;
+  guchar *colormap;
+  gint n_colors, i;
+
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
+  private = GIMP_IMAGE_GET_PRIVATE (image);
+
+  if (private->palette == NULL)
+    return NULL;
+
+  n_colors = gimp_palette_get_n_colors (private->palette);
+  colormap = g_new0 (guchar, GIMP_IMAGE_COLORMAP_SIZE);
+
+  for (i = 0; i < n_colors; i++)
+    {
+      GimpPaletteEntry *entry = gimp_palette_get_entry (private->palette, i);
+      gimp_rgb_get_uchar (&entry->color,
+                          &colormap[i * 3],
+                          &colormap[i * 3 + 1],
+                          &colormap[i * 3 + 2]);
+    }
 
-  return GIMP_IMAGE_GET_PRIVATE (image)->colormap;
+  return colormap;
 }
 
 gint
 gimp_image_get_colormap_size (GimpImage *image)
 {
+  GimpImagePrivate *private;
+
   g_return_val_if_fail (GIMP_IS_IMAGE (image), 0);
+  private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  return GIMP_IMAGE_GET_PRIVATE (image)->n_colors;
+  if (private->palette == NULL)
+    return 0;
+
+  return gimp_palette_get_n_colors (private->palette);
 }
 
 void
@@ -226,26 +292,24 @@ gimp_image_set_colormap (GimpImage    *image,
   if (push_undo)
     gimp_image_undo_push_image_colormap (image, C_("undo-type", "Set Colormap"));
 
-  if (private->colormap)
-    memset (private->colormap, 0, GIMP_IMAGE_COLORMAP_SIZE);
-  else
+  if (!private->palette)
     gimp_image_colormap_init (image);
 
-  if (colormap)
-    memcpy (private->colormap, colormap, n_colors * 3);
-
-  /* make sure the image's colormap always has at least one color.  when
-   * n_colors == 0, use black.
-   */
-  private->n_colors = MAX (n_colors, 1);
-
   gimp_data_freeze (GIMP_DATA (private->palette));
 
   while ((entry = gimp_palette_get_entry (private->palette, 0)))
     gimp_palette_delete_entry (private->palette, entry);
 
-  for (i = 0; i < private->n_colors; i++)
-    gimp_image_colormap_set_palette_entry (image, NULL, i);
+  for (i = 0; i < n_colors; i++)
+    {
+      GimpRGB color;
+      gimp_rgba_set_uchar (&color,
+                           colormap[3 * i + 0],
+                           colormap[3 * i + 1],
+                           colormap[3 * i + 2],
+                           255);
+      gimp_image_colormap_set_palette_entry (image, &color, i);
+    }
 
   gimp_data_thaw (GIMP_DATA (private->palette));
 
@@ -266,14 +330,12 @@ gimp_image_unset_colormap (GimpImage *image,
     gimp_image_undo_push_image_colormap (image,
                                          C_("undo-type", "Unset Colormap"));
 
-  if (private->colormap)
+  if (private->palette)
     {
       gimp_image_colormap_dispose (image);
       gimp_image_colormap_free (image);
     }
 
-  private->n_colors = 0;
-
   gimp_image_colormap_changed (image, -1);
 }
 
@@ -283,20 +345,22 @@ gimp_image_get_colormap_entry (GimpImage *image,
                                GimpRGB   *color)
 {
   GimpImagePrivate *private;
+  GimpPaletteEntry *entry;
 
   g_return_if_fail (GIMP_IS_IMAGE (image));
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  g_return_if_fail (private->colormap != NULL);
-  g_return_if_fail (color_index >= 0 && color_index < private->n_colors);
+  g_return_if_fail (private->palette != NULL);
+  g_return_if_fail (color_index >= 0 &&
+                    color_index < gimp_palette_get_n_colors (private->palette));
   g_return_if_fail (color != NULL);
 
-  gimp_rgba_set_uchar (color,
-                       private->colormap[color_index * 3],
-                       private->colormap[color_index * 3 + 1],
-                       private->colormap[color_index * 3 + 2],
-                       255);
+  entry = gimp_palette_get_entry (private->palette, color_index);
+
+  g_return_if_fail (entry != NULL);
+
+  *color = entry->color;
 }
 
 void
@@ -311,21 +375,16 @@ gimp_image_set_colormap_entry (GimpImage     *image,
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  g_return_if_fail (private->colormap != NULL);
-  g_return_if_fail (color_index >= 0 && color_index < private->n_colors);
+  g_return_if_fail (private->palette != NULL);
+  g_return_if_fail (color_index >= 0 &&
+                    color_index < gimp_palette_get_n_colors (private->palette));
   g_return_if_fail (color != NULL);
 
   if (push_undo)
     gimp_image_undo_push_image_colormap (image,
                                          C_("undo-type", "Change Colormap entry"));
 
-  gimp_rgb_get_uchar (color,
-                      &private->colormap[color_index * 3],
-                      &private->colormap[color_index * 3 + 1],
-                      &private->colormap[color_index * 3 + 2]);
-
-  if (private->palette)
-    gimp_image_colormap_set_palette_entry (image, color, color_index);
+  gimp_image_colormap_set_palette_entry (image, color, color_index);
 
   gimp_image_colormap_changed (image, color_index);
 }
@@ -340,22 +399,15 @@ gimp_image_add_colormap_entry (GimpImage     *image,
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  g_return_if_fail (private->colormap != NULL);
-  g_return_if_fail (private->n_colors < 256);
+  g_return_if_fail (private->palette != NULL);
+  g_return_if_fail (gimp_palette_get_n_colors (private->palette) < 256);
   g_return_if_fail (color != NULL);
 
   gimp_image_undo_push_image_colormap (image,
                                        C_("undo-type", "Add Color to Colormap"));
 
-  gimp_rgb_get_uchar (color,
-                      &private->colormap[private->n_colors * 3],
-                      &private->colormap[private->n_colors * 3 + 1],
-                      &private->colormap[private->n_colors * 3 + 2]);
-
-  private->n_colors++;
-
-  if (private->palette)
-    gimp_image_colormap_set_palette_entry (image, color, private->n_colors - 1);
+  gimp_image_colormap_set_palette_entry (image, color,
+                                         gimp_palette_get_n_colors (private->palette));
 
   gimp_image_colormap_changed (image, -1);
 }
@@ -365,29 +417,20 @@ gimp_image_add_colormap_entry (GimpImage     *image,
 
 static void
 gimp_image_colormap_set_palette_entry (GimpImage     *image,
-                                       const GimpRGB *c,
+                                       const GimpRGB *color,
                                        gint           index)
 {
   GimpImagePrivate *private = GIMP_IMAGE_GET_PRIVATE (image);
-  GimpRGB           color;
+  GimpRGB           black;
   gchar             name[64];
 
-  /* Avoid converting to char then back to double if we have the
-   * original GimpRGB color.
-   */
-  if (c)
-    color = *c;
-  else
-    gimp_rgba_set_uchar (&color,
-                         private->colormap[3 * index + 0],
-                         private->colormap[3 * index + 1],
-                         private->colormap[3 * index + 2],
-                         255);
+  g_return_if_fail (color != NULL);
+
+  gimp_rgb_set (&black, 0, 0, 0);
+  while (gimp_palette_get_n_colors (private->palette) <= index)
+    gimp_palette_add_entry (private->palette, index, name, &black);
 
   g_snprintf (name, sizeof (name), "#%d", index);
 
-  if (gimp_palette_get_n_colors (private->palette) < private->n_colors)
-    gimp_palette_add_entry (private->palette, index, name, &color);
-  else
-    gimp_palette_set_entry (private->palette, index, name, &color);
+  gimp_palette_set_entry (private->palette, index, name, color);
 }
diff --git a/app/core/gimpimage-colormap.h b/app/core/gimpimage-colormap.h
index 917b4b14c3..b5a963b78a 100644
--- a/app/core/gimpimage-colormap.h
+++ b/app/core/gimpimage-colormap.h
@@ -32,8 +32,11 @@ const Babl   * gimp_image_colormap_get_rgb_format  (GimpImage     *image);
 const Babl   * gimp_image_colormap_get_rgba_format (GimpImage     *image);
 
 GimpPalette  * gimp_image_get_colormap_palette     (GimpImage     *image);
+void           gimp_image_set_colormap_palette     (GimpImage     *image,
+                                                    GimpPalette   *palette,
+                                                    gboolean       push_undo);
 
-const guchar * gimp_image_get_colormap             (GimpImage     *image);
+guchar *       gimp_image_get_colormap             (GimpImage     *image);
 gint           gimp_image_get_colormap_size        (GimpImage     *image);
 void           gimp_image_set_colormap             (GimpImage     *image,
                                                     const guchar  *colormap,
diff --git a/app/core/gimpimage-duplicate.c b/app/core/gimpimage-duplicate.c
index e013cb3cb4..7fe9a3438b 100644
--- a/app/core/gimpimage-duplicate.c
+++ b/app/core/gimpimage-duplicate.c
@@ -199,10 +199,9 @@ gimp_image_duplicate_colormap (GimpImage *image,
                                GimpImage *new_image)
 {
   if (gimp_image_get_base_type (new_image) == GIMP_INDEXED)
-    gimp_image_set_colormap (new_image,
-                             gimp_image_get_colormap (image),
-                             gimp_image_get_colormap_size (image),
-                             FALSE);
+    gimp_image_set_colormap_palette (new_image,
+                                     gimp_image_get_colormap_palette (image),
+                                     FALSE);
 }
 
 static GimpItem *
diff --git a/app/core/gimpimage-new.c b/app/core/gimpimage-new.c
index ade36025da..a9e8093cfe 100644
--- a/app/core/gimpimage-new.c
+++ b/app/core/gimpimage-new.c
@@ -193,10 +193,9 @@ gimp_image_new_from_drawable (Gimp         *gimp,
   gimp_image_undo_disable (new_image);
 
   if (type == GIMP_INDEXED)
-    gimp_image_set_colormap (new_image,
-                             gimp_image_get_colormap (image),
-                             gimp_image_get_colormap_size (image),
-                             FALSE);
+    gimp_image_set_colormap_palette (new_image,
+                                     gimp_image_get_colormap_palette (image),
+                                     FALSE);
 
   gimp_image_get_resolution (image, &xres, &yres);
   gimp_image_set_resolution (new_image, xres, yres);
diff --git a/app/core/gimpimage-private.h b/app/core/gimpimage-private.h
index 0c77b9a281..4d3882a53c 100644
--- a/app/core/gimpimage-private.h
+++ b/app/core/gimpimage-private.h
@@ -56,8 +56,6 @@ struct _GimpImagePrivate
   gboolean           bounding_box_update_pending;
   GeglBuffer        *pickable_buffer;
 
-  guchar            *colormap;              /*  colormap (for indexed)       */
-  gint               n_colors;              /*  # of colors (for indexed)    */
   GimpPalette       *palette;               /*  palette of colormap          */
   const Babl        *babl_palette_rgb;      /*  palette's RGB Babl format    */
   const Babl        *babl_palette_rgba;     /*  palette's RGBA Babl format   */
diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c
index f490e310eb..ea193b0964 100644
--- a/app/core/gimpimage.c
+++ b/app/core/gimpimage.c
@@ -69,6 +69,7 @@
 #include "gimplayermask.h"
 #include "gimplayerstack.h"
 #include "gimpmarshal.h"
+#include "gimppalette.h"
 #include "gimpparasitelist.h"
 #include "gimppickable.h"
 #include "gimpprojectable.h"
@@ -736,8 +737,6 @@ gimp_image_init (GimpImage *image)
   private->bounding_box.height = 0;
   private->pickable_buffer     = NULL;
 
-  private->colormap            = NULL;
-  private->n_colors            = 0;
   private->palette             = NULL;
 
   private->metadata            = NULL;
@@ -1045,7 +1044,7 @@ gimp_image_dispose (GObject *object)
   GimpImage        *image   = GIMP_IMAGE (object);
   GimpImagePrivate *private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  if (private->colormap)
+  if (private->palette)
     gimp_image_colormap_dispose (image);
 
   gimp_image_undo_free (image);
@@ -1100,7 +1099,7 @@ gimp_image_finalize (GObject *object)
   g_clear_object (&private->graph);
   private->visible_mask = NULL;
 
-  if (private->colormap)
+  if (private->palette)
     gimp_image_colormap_free (image);
 
   _gimp_image_free_color_profile (image);
@@ -1200,9 +1199,6 @@ gimp_image_get_memsize (GimpObject *object,
   GimpImagePrivate *private = GIMP_IMAGE_GET_PRIVATE (image);
   gint64            memsize = 0;
 
-  if (gimp_image_get_colormap (image))
-    memsize += GIMP_IMAGE_COLORMAP_SIZE;
-
   memsize += gimp_object_get_memsize (GIMP_OBJECT (private->palette),
                                       gui_size);
 
@@ -2644,7 +2640,7 @@ gimp_image_get_xcf_version (GimpImage    *image,
       reasons = g_list_prepend (reasons, tmp); }
 
   /* need version 1 for colormaps */
-  if (gimp_image_get_colormap (image))
+  if (gimp_image_get_colormap_palette (image))
     version = 1;
 
   layers = gimp_image_get_layer_list (image);
@@ -3526,9 +3522,13 @@ void
 gimp_image_colormap_changed (GimpImage *image,
                              gint       color_index)
 {
+  GimpPalette *palette;
+  gint n_colors;
+
   g_return_if_fail (GIMP_IS_IMAGE (image));
-  g_return_if_fail (color_index >= -1 &&
-                    color_index < GIMP_IMAGE_GET_PRIVATE (image)->n_colors);
+  palette = GIMP_IMAGE_GET_PRIVATE (image)->palette;
+  n_colors = palette ? gimp_palette_get_n_colors (palette) : 0;
+  g_return_if_fail (color_index >= -1 && color_index < n_colors);
 
   g_signal_emit (image, gimp_image_signals[COLORMAP_CHANGED], 0,
                  color_index);
diff --git a/app/core/gimpimageundo.c b/app/core/gimpimageundo.c
index d3d4ee5ef2..c0b1048f12 100644
--- a/app/core/gimpimageundo.c
+++ b/app/core/gimpimageundo.c
@@ -183,8 +183,7 @@ gimp_image_undo_constructed (GObject *object)
 
     case GIMP_UNDO_IMAGE_COLORMAP:
       image_undo->num_colors = gimp_image_get_colormap_size (image);
-      image_undo->colormap   = g_memdup (gimp_image_get_colormap (image),
-                                         GIMP_IMAGE_COLORMAP_SIZE);
+      image_undo->colormap   = gimp_image_get_colormap (image);
       break;
 
     case GIMP_UNDO_IMAGE_HIDDEN_PROFILE:
@@ -454,8 +453,7 @@ gimp_image_undo_pop (GimpUndo            *undo,
         gint    num_colors;
 
         num_colors = gimp_image_get_colormap_size (image);
-        colormap   = g_memdup (gimp_image_get_colormap (image),
-                               GIMP_IMAGE_COLORMAP_SIZE);
+        colormap   = gimp_image_get_colormap (image);
 
         if (image_undo->colormap)
           gimp_image_set_colormap (image,
diff --git a/app/core/gimppalette-import.c b/app/core/gimppalette-import.c
index d2c7dc25d7..b6b3b0b19f 100644
--- a/app/core/gimppalette-import.c
+++ b/app/core/gimppalette-import.c
@@ -404,35 +404,15 @@ gimp_palette_import_from_indexed_image (GimpImage   *image,
                                         const gchar *palette_name)
 {
   GimpPalette  *palette;
-  const guchar *colormap;
-  guint         n_colors;
-  gint          count;
-  GimpRGB       color;
 
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
   g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
   g_return_val_if_fail (gimp_image_get_base_type (image) == GIMP_INDEXED, NULL);
   g_return_val_if_fail (palette_name != NULL, NULL);
 
-  palette = GIMP_PALETTE (gimp_palette_new (context, palette_name));
-
-  colormap = gimp_image_get_colormap (image);
-  n_colors = gimp_image_get_colormap_size (image);
-
-  for (count = 0; count < n_colors; ++count)
-    {
-      gchar name[256];
+  palette = GIMP_PALETTE (gimp_data_duplicate (GIMP_DATA (gimp_image_get_colormap_palette (image))));
 
-      g_snprintf (name, sizeof (name), _("Index %d"), count);
-
-      gimp_rgba_set_uchar (&color,
-                           colormap[count * 3 + 0],
-                           colormap[count * 3 + 1],
-                           colormap[count * 3 + 2],
-                           255);
-
-      gimp_palette_add_entry (palette, -1, name, &color);
-    }
+  gimp_object_set_name (GIMP_OBJECT (palette), palette_name);
 
   return palette;
 }
diff --git a/app/pdb/image-cmds.c b/app/pdb/image-cmds.c
index 37b3fba3bc..7b2edcb127 100644
--- a/app/pdb/image-cmds.c
+++ b/app/pdb/image-cmds.c
@@ -1547,7 +1547,7 @@ image_get_colormap_invoker (GimpProcedure         *procedure,
   if (success)
     {
       num_bytes = 3 * gimp_image_get_colormap_size (image);
-      colormap = g_memdup (gimp_image_get_colormap (image), num_bytes);
+      colormap = gimp_image_get_colormap (image);
     }
 
   return_vals = gimp_procedure_get_return_values (procedure, success,
diff --git a/app/widgets/gimpcolormapeditor.c b/app/widgets/gimpcolormapeditor.c
index 8a2152822a..acfe83366f 100644
--- a/app/widgets/gimpcolormapeditor.c
+++ b/app/widgets/gimpcolormapeditor.c
@@ -208,7 +208,6 @@ void
 gimp_colormap_editor_edit_color (GimpColormapEditor *editor)
 {
   GimpImage    *image;
-  const guchar *colormap;
   GimpRGB       color;
   gchar        *desc;
   gint          index;
@@ -223,13 +222,7 @@ gimp_colormap_editor_edit_color (GimpColormapEditor *editor)
     /* No colormap. */
     return;
 
-  colormap = gimp_image_get_colormap (image);
-
-  gimp_rgba_set_uchar (&color,
-                       colormap[index * 3],
-                       colormap[index * 3 + 1],
-                       colormap[index * 3 + 2],
-                       255);
+  gimp_image_get_colormap_entry (image, index, &color);
 
   desc = g_strdup_printf (_("Edit colormap entry #%d"), index);
 
diff --git a/app/widgets/gimpcolormapselection.c b/app/widgets/gimpcolormapselection.c
index 7d582fac0c..fc5afa073f 100644
--- a/app/widgets/gimpcolormapselection.c
+++ b/app/widgets/gimpcolormapselection.c
@@ -70,7 +70,7 @@ enum
 #define HAVE_COLORMAP(image) \
         (image != NULL && \
          gimp_image_get_base_type (image) == GIMP_INDEXED && \
-         gimp_image_get_colormap (image) != NULL)
+         gimp_image_get_colormap_palette (image) != NULL)
 
 
 static void   gimp_colormap_selection_set_property    (GObject               *object,
@@ -555,15 +555,16 @@ gimp_colormap_selection_update_entries (GimpColormapSelection *selection)
     }
   else
     {
-      const guchar *colormap = gimp_image_get_colormap (image);
-      const guchar *col;
-      gchar        *string;
-
-      gtk_adjustment_set_value (selection->index_adjustment, selection->col_index);
+      GimpRGB color;
+      guchar r, g, b;
+      gchar *string;
 
-      col = colormap + selection->col_index * 3;
+      gtk_adjustment_set_value (selection->index_adjustment,
+                                selection->col_index);
+      gimp_image_get_colormap_entry (image, selection->col_index, &color);
+      gimp_rgb_get_uchar (&color, &r, &g, &b);
 
-      string = g_strdup_printf ("%02x%02x%02x", col[0], col[1], col[2]);
+      string = g_strdup_printf ("%02x%02x%02x", r, g, b);
       gtk_entry_set_text (GTK_ENTRY (selection->color_entry), string);
       g_free (string);
 
diff --git a/app/xcf/xcf-save.c b/app/xcf/xcf-save.c
index 6d1b6587f4..7e0c558ace 100644
--- a/app/xcf/xcf-save.c
+++ b/app/xcf/xcf-save.c
@@ -370,10 +370,14 @@ xcf_save_image_props (XcfInfo    *info,
   gimp_image_get_resolution (image, &xres, &yres);
 
   /* check and see if we should save the colormap property */
-  if (gimp_image_get_colormap (image))
-    xcf_check_error (xcf_save_prop (info, image, PROP_COLORMAP, error,
-                                    gimp_image_get_colormap_size (image),
-                                    gimp_image_get_colormap (image)));
+  if (gimp_image_get_colormap_palette (image))
+    {
+      guint8 *colormap = gimp_image_get_colormap (image);
+      xcf_check_error (xcf_save_prop (info, image, PROP_COLORMAP, error,
+                                      gimp_image_get_colormap_size (image),
+                                      colormap));
+      g_free (colormap);
+    }
 
   if (info->compression != COMPRESS_NONE)
     xcf_check_error (xcf_save_prop (info, image, PROP_COMPRESSION, error,
diff --git a/pdb/groups/image.pdb b/pdb/groups/image.pdb
index 64d269ee25..4d0e72f3a9 100644
--- a/pdb/groups/image.pdb
+++ b/pdb/groups/image.pdb
@@ -1531,7 +1531,7 @@ HELP
         code => <<'CODE'
 {
   num_bytes = 3 * gimp_image_get_colormap_size (image);
-  colormap = g_memdup (gimp_image_get_colormap (image), num_bytes);
+  colormap = gimp_image_get_colormap (image);
 }
 CODE
     );


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