[gimp] app: Refactor palette loaders.
- From: Michael Henning <mhenning src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: Refactor palette loaders.
- Date: Tue, 17 Sep 2013 22:01:54 +0000 (UTC)
commit 198f2514ab03cd77c769b0cea9678fa0deba4f6e
Author: Warren Turkal <wt penguintechs org>
Date: Sat Sep 14 23:46:28 2013 -0700
app: Refactor palette loaders.
I specifically moved the file opening/closing logic to the common
code. This makes the code easier to understand for me since there
is less duplication. In fact, this commit removes more lines than
it adds.
app/core/gimp.c | 4 +-
app/core/gimppalette-import.c | 31 +++++--
app/core/gimppalette-load.c | 208 ++++++++++++++---------------------------
app/core/gimppalette-load.h | 12 ++-
4 files changed, 109 insertions(+), 146 deletions(-)
---
diff --git a/app/core/gimp.c b/app/core/gimp.c
index 33c0652..d27a19d 100644
--- a/app/core/gimp.c
+++ b/app/core/gimp.c
@@ -585,8 +585,8 @@ gimp_real_initialize (Gimp *gimp,
static const GimpDataFactoryLoaderEntry palette_loader_entries[] =
{
- { gimp_palette_load, GIMP_PALETTE_FILE_EXTENSION, TRUE },
- { gimp_palette_load, NULL /* legacy loader */, TRUE }
+ { gimp_startup_palette_load, GIMP_PALETTE_FILE_EXTENSION, TRUE },
+ { gimp_startup_palette_load, NULL /* legacy loader */, TRUE }
};
static const GimpDataFactoryLoaderEntry tool_preset_loader_entries[] =
diff --git a/app/core/gimppalette-import.c b/app/core/gimppalette-import.c
index b815e4c..499ee95 100644
--- a/app/core/gimppalette-import.c
+++ b/app/core/gimppalette-import.c
@@ -17,12 +17,15 @@
#include "config.h"
+#include <errno.h>
#include <string.h>
#include <cairo.h>
#include <gegl.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <glib/gstdio.h>
+
#include "libgimpbase/gimpbase.h"
#include "libgimpcolor/gimpcolor.h"
@@ -497,35 +500,47 @@ gimp_palette_import_from_file (GimpContext *context,
{
GList *palette_list = NULL;
+ FILE *file;
+
g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
g_return_val_if_fail (filename != NULL, NULL);
g_return_val_if_fail (palette_name != NULL, NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
- switch (gimp_palette_load_detect_format (filename))
+ file = g_fopen (filename, "rb");
+
+ if (!file)
+ {
+ g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_OPEN,
+ _("Could not open '%s' for reading: %s"),
+ gimp_filename_to_utf8 (filename), g_strerror (errno));
+ return NULL;
+ }
+
+ switch (gimp_palette_load_detect_format (filename, file))
{
case GIMP_PALETTE_FILE_FORMAT_GPL:
- palette_list = gimp_palette_load (context, filename, error);
+ palette_list = gimp_palette_load (context, filename, file, error);
break;
case GIMP_PALETTE_FILE_FORMAT_ACT:
- palette_list = gimp_palette_load_act (context, filename, error);
+ palette_list = gimp_palette_load_act (context, filename, file, error);
break;
case GIMP_PALETTE_FILE_FORMAT_RIFF_PAL:
- palette_list = gimp_palette_load_riff (context, filename, error);
+ palette_list = gimp_palette_load_riff (context, filename, file, error);
break;
case GIMP_PALETTE_FILE_FORMAT_PSP_PAL:
- palette_list = gimp_palette_load_psp (context, filename, error);
+ palette_list = gimp_palette_load_psp (context, filename, file, error);
break;
case GIMP_PALETTE_FILE_FORMAT_ACO:
- palette_list = gimp_palette_load_aco (context, filename, error);
+ palette_list = gimp_palette_load_aco (context, filename, file, error);
break;
case GIMP_PALETTE_FILE_FORMAT_CSS:
- palette_list = gimp_palette_load_css (context, filename, error);
+ palette_list = gimp_palette_load_css (context, filename, file, error);
break;
default:
@@ -536,6 +551,8 @@ gimp_palette_import_from_file (GimpContext *context,
break;
}
+ fclose (file);
+
if (palette_list)
{
GimpPalette *palette = g_object_ref (palette_list->data);
diff --git a/app/core/gimppalette-load.c b/app/core/gimppalette-load.c
index 377eb9a..e7f0237 100644
--- a/app/core/gimppalette-load.c
+++ b/app/core/gimppalette-load.c
@@ -27,10 +27,6 @@
#include <unistd.h>
#endif
-#ifndef _O_BINARY
-#define _O_BINARY 0
-#endif
-
#include <cairo.h>
#include <gegl.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
@@ -52,15 +48,42 @@
GList *
+gimp_startup_palette_load (GimpContext *context,
+ const gchar *filename,
+ GError **error)
+{
+ FILE *file;
+ GList *glist;
+
+ g_return_val_if_fail (filename != NULL, NULL);
+ g_return_val_if_fail (g_path_is_absolute (filename), NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ file = g_fopen (filename, "rb");
+
+ if (! file)
+ {
+ g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_OPEN,
+ _("Could not open '%s' for reading: %s"),
+ gimp_filename_to_utf8 (filename), g_strerror (errno));
+ return NULL;
+ }
+ glist = gimp_palette_load (context, filename, file, error);
+ fclose (file);
+ return glist;
+}
+
+
+GList *
gimp_palette_load (GimpContext *context,
const gchar *filename,
+ FILE *file,
GError **error)
{
GimpPalette *palette;
GimpPaletteEntry *entry;
gchar str[1024];
gchar *tok;
- FILE *file;
gint r, g, b;
gint linenum;
@@ -70,16 +93,6 @@ gimp_palette_load (GimpContext *context,
r = g = b = 0;
- file = g_fopen (filename, "rb");
-
- if (! file)
- {
- g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_OPEN,
- _("Could not open '%s' for reading: %s"),
- gimp_filename_to_utf8 (filename), g_strerror (errno));
- return NULL;
- }
-
linenum = 1;
if (! fgets (str, sizeof (str), file))
{
@@ -87,7 +100,6 @@ gimp_palette_load (GimpContext *context,
_("Fatal parse error in palette file '%s': "
"Read error in line %d."),
gimp_filename_to_utf8 (filename), linenum);
- fclose (file);
return NULL;
}
@@ -97,7 +109,6 @@ gimp_palette_load (GimpContext *context,
_("Fatal parse error in palette file '%s': "
"Missing magic header."),
gimp_filename_to_utf8 (filename));
- fclose (file);
return NULL;
}
@@ -113,7 +124,6 @@ gimp_palette_load (GimpContext *context,
_("Fatal parse error in palette file '%s': "
"Read error in line %d."),
gimp_filename_to_utf8 (filename), linenum);
- fclose (file);
g_object_unref (palette);
return NULL;
}
@@ -134,7 +144,6 @@ gimp_palette_load (GimpContext *context,
_("Fatal parse error in palette file '%s': "
"Read error in line %d."),
gimp_filename_to_utf8 (filename), linenum);
- fclose (file);
g_object_unref (palette);
return NULL;
}
@@ -163,7 +172,6 @@ gimp_palette_load (GimpContext *context,
_("Fatal parse error in palette file '%s': "
"Read error in line %d."),
gimp_filename_to_utf8 (filename), linenum);
- fclose (file);
g_object_unref (palette);
return NULL;
}
@@ -239,14 +247,11 @@ gimp_palette_load (GimpContext *context,
_("Fatal parse error in palette file '%s': "
"Read error in line %d."),
gimp_filename_to_utf8 (filename), linenum);
- fclose (file);
g_object_unref (palette);
return NULL;
}
}
- fclose (file);
-
palette->colors = g_list_reverse (palette->colors);
return g_list_prepend (NULL, palette);
@@ -255,28 +260,18 @@ gimp_palette_load (GimpContext *context,
GList *
gimp_palette_load_act (GimpContext *context,
const gchar *filename,
+ FILE *file,
GError **error)
{
GimpPalette *palette;
gchar *palette_name;
- gint fd;
+ gint fd = fileno (file);
guchar color_bytes[4];
g_return_val_if_fail (filename != NULL, NULL);
g_return_val_if_fail (g_path_is_absolute (filename), NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
- fd = g_open (filename, O_RDONLY | _O_BINARY, 0);
-
- if (! fd)
- {
- g_set_error (error,
- G_FILE_ERROR, g_file_error_from_errno (errno),
- _("Could not open '%s' for reading: %s"),
- gimp_filename_to_utf8 (filename), g_strerror (errno));
- return NULL;
- }
-
palette_name = g_filename_display_basename (filename);
palette = GIMP_PALETTE (gimp_palette_new (context, palette_name));
g_free (palette_name);
@@ -293,36 +288,24 @@ gimp_palette_load_act (GimpContext *context,
gimp_palette_add_entry (palette, -1, NULL, &color);
}
- close (fd);
-
return g_list_prepend (NULL, palette);
}
GList *
gimp_palette_load_riff (GimpContext *context,
const gchar *filename,
+ FILE *file,
GError **error)
{
GimpPalette *palette;
gchar *palette_name;
- gint fd;
+ gint fd = fileno (file);
guchar color_bytes[4];
g_return_val_if_fail (filename != NULL, NULL);
g_return_val_if_fail (g_path_is_absolute (filename), NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
- fd = g_open (filename, O_RDONLY | _O_BINARY, 0);
-
- if (! fd)
- {
- g_set_error (error,
- G_FILE_ERROR, g_file_error_from_errno (errno),
- _("Could not open '%s' for reading: %s"),
- gimp_filename_to_utf8 (filename), g_strerror (errno));
- return NULL;
- }
-
palette_name = g_filename_display_basename (filename);
palette = GIMP_PALETTE (gimp_palette_new (context, palette_name));
g_free (palette_name);
@@ -342,19 +325,18 @@ gimp_palette_load_riff (GimpContext *context,
gimp_palette_add_entry (palette, -1, NULL, &color);
}
- close (fd);
-
return g_list_prepend (NULL, palette);
}
GList *
gimp_palette_load_psp (GimpContext *context,
const gchar *filename,
+ FILE *file,
GError **error)
{
GimpPalette *palette;
gchar *palette_name;
- gint fd;
+ gint fd = fileno (file);
guchar color_bytes[4];
gint number_of_colors;
gint data_size;
@@ -369,17 +351,6 @@ gimp_palette_load_psp (GimpContext *context,
g_return_val_if_fail (g_path_is_absolute (filename), NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
- fd = g_open (filename, O_RDONLY | _O_BINARY, 0);
-
- if (! fd)
- {
- g_set_error (error,
- G_FILE_ERROR, g_file_error_from_errno (errno),
- _("Could not open '%s' for reading: %s"),
- gimp_filename_to_utf8 (filename), g_strerror (errno));
- return NULL;
- }
-
palette_name = g_filename_display_basename (filename);
palette = GIMP_PALETTE (gimp_palette_new (context, palette_name));
g_free (palette_name);
@@ -434,19 +405,18 @@ gimp_palette_load_psp (GimpContext *context,
g_strfreev (lines);
- close (fd);
-
return g_list_prepend (NULL, palette);
}
GList *
gimp_palette_load_aco (GimpContext *context,
const gchar *filename,
+ FILE *file,
GError **error)
{
GimpPalette *palette;
gchar *palette_name;
- gint fd;
+ gint fd = fileno (file);
gint format_version;
gint number_of_colors;
gint i;
@@ -459,17 +429,6 @@ gimp_palette_load_aco (GimpContext *context,
g_return_val_if_fail (g_path_is_absolute (filename), NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
- fd = g_open (filename, O_RDONLY | _O_BINARY, 0);
-
- if (! fd)
- {
- g_set_error (error,
- G_FILE_ERROR, g_file_error_from_errno (errno),
- _("Could not open '%s' for reading: %s"),
- gimp_filename_to_utf8 (filename), g_strerror (errno));
- return NULL;
- }
-
status = read (fd, header, sizeof (header));
if (status != sizeof (header))
@@ -478,7 +437,6 @@ gimp_palette_load_aco (GimpContext *context,
GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
_("Could not read header from palette file '%s'"),
gimp_filename_to_utf8 (filename));
- close (fd);
return NULL;
}
@@ -501,7 +459,6 @@ gimp_palette_load_aco (GimpContext *context,
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
_("Fatal parse error in palette file '%s'"),
gimp_filename_to_utf8 (filename));
- close (fd);
g_object_unref (palette);
return NULL;
}
@@ -589,7 +546,6 @@ gimp_palette_load_aco (GimpContext *context,
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
_("Fatal parse error in palette file '%s'"),
gimp_filename_to_utf8 (filename));
- close (fd);
g_object_unref (palette);
return NULL;
}
@@ -602,8 +558,6 @@ gimp_palette_load_aco (GimpContext *context,
gimp_palette_add_entry (palette, -1, NULL, &color);
}
- close(fd);
-
return g_list_prepend (NULL, palette);
}
@@ -611,11 +565,11 @@ gimp_palette_load_aco (GimpContext *context,
GList *
gimp_palette_load_css (GimpContext *context,
const gchar *filename,
+ FILE *file,
GError **error)
{
GimpPalette *palette;
gchar *name;
- FILE *file;
GRegex *regex;
GimpRGB color;
@@ -627,16 +581,6 @@ gimp_palette_load_css (GimpContext *context,
if (! regex)
return NULL;
- file = g_fopen (filename, "rb");
-
- if (! file)
- {
- g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_OPEN,
- _("Could not open '%s' for reading: %s"),
- gimp_filename_to_utf8 (filename), g_strerror (errno));
- return NULL;
- }
-
name = g_filename_display_basename (filename);
palette = GIMP_PALETTE (gimp_palette_new (context, name));
g_free (name);
@@ -665,71 +609,63 @@ gimp_palette_load_css (GimpContext *context,
}
} while (! feof (file));
- fclose (file);
-
g_regex_unref (regex);
return g_list_prepend (NULL, palette);
}
GimpPaletteFileFormat
-gimp_palette_load_detect_format (const gchar *filename)
+gimp_palette_load_detect_format (const gchar *filename, FILE *file)
{
GimpPaletteFileFormat format = GIMP_PALETTE_FILE_FORMAT_UNKNOWN;
- gint fd;
+ gint fd = fileno (file);
gchar header[16];
- fd = g_open (filename, O_RDONLY | _O_BINARY, 0);
-
- if (fd)
+ if (fread (header, 1, sizeof (header), file) == sizeof (header))
{
- if (read (fd, header, sizeof (header)) == sizeof (header))
+ if (g_str_has_prefix (header + 0, "RIFF") &&
+ g_str_has_prefix (header + 8, "PAL data"))
{
- if (g_str_has_prefix (header + 0, "RIFF") &&
- g_str_has_prefix (header + 8, "PAL data"))
- {
- format = GIMP_PALETTE_FILE_FORMAT_RIFF_PAL;
- }
- else if (g_str_has_prefix (header, "GIMP Palette"))
- {
- format = GIMP_PALETTE_FILE_FORMAT_GPL;
- }
- else if (g_str_has_prefix (header, "JASC-PAL"))
- {
- format = GIMP_PALETTE_FILE_FORMAT_PSP_PAL;
- }
+ format = GIMP_PALETTE_FILE_FORMAT_RIFF_PAL;
}
-
- if (format == GIMP_PALETTE_FILE_FORMAT_UNKNOWN)
+ else if (g_str_has_prefix (header, "GIMP Palette"))
{
- gchar *lower_filename = g_ascii_strdown (filename, -1);
+ format = GIMP_PALETTE_FILE_FORMAT_GPL;
+ }
+ else if (g_str_has_prefix (header, "JASC-PAL"))
+ {
+ format = GIMP_PALETTE_FILE_FORMAT_PSP_PAL;
+ }
+ }
- if (g_str_has_suffix (lower_filename, ".aco"))
- {
- format = GIMP_PALETTE_FILE_FORMAT_ACO;
- }
- else if (g_str_has_suffix (lower_filename, ".css"))
- {
- format = GIMP_PALETTE_FILE_FORMAT_CSS;
- }
+ if (format == GIMP_PALETTE_FILE_FORMAT_UNKNOWN)
+ {
+ gchar *lower_filename = g_ascii_strdown (filename, -1);
- g_free (lower_filename);
+ if (g_str_has_suffix (lower_filename, ".aco"))
+ {
+ format = GIMP_PALETTE_FILE_FORMAT_ACO;
}
-
- if (format == GIMP_PALETTE_FILE_FORMAT_UNKNOWN)
+ else if (g_str_has_suffix (lower_filename, ".css"))
{
- struct stat file_stat;
-
- if (fstat (fd, &file_stat) >= 0)
- {
- if (file_stat.st_size == 768)
- format = GIMP_PALETTE_FILE_FORMAT_ACT;
- }
+ format = GIMP_PALETTE_FILE_FORMAT_CSS;
}
- close (fd);
+ g_free (lower_filename);
+ }
+
+ if (format == GIMP_PALETTE_FILE_FORMAT_UNKNOWN)
+ {
+ struct stat file_stat;
+
+ if (fstat (fd, &file_stat) >= 0)
+ {
+ if (file_stat.st_size == 768)
+ format = GIMP_PALETTE_FILE_FORMAT_ACT;
+ }
}
+ rewind (file);
return format;
}
diff --git a/app/core/gimppalette-load.h b/app/core/gimppalette-load.h
index b8764c5..5a1f80b 100644
--- a/app/core/gimppalette-load.h
+++ b/app/core/gimppalette-load.h
@@ -34,26 +34,36 @@ typedef enum
} GimpPaletteFileFormat;
+GList * gimp_startup_palette_load (GimpContext *context,
+ const gchar *filename,
+ GError **error);
GList * gimp_palette_load (GimpContext *context,
const gchar *filename,
+ FILE *file,
GError **error);
GList * gimp_palette_load_act (GimpContext *context,
const gchar *filename,
+ FILE *file,
GError **error);
GList * gimp_palette_load_riff (GimpContext *context,
const gchar *filename,
+ FILE *file,
GError **error);
GList * gimp_palette_load_psp (GimpContext *context,
const gchar *filename,
+ FILE *file,
GError **error);
GList * gimp_palette_load_aco (GimpContext *context,
const gchar *filename,
+ FILE *file,
GError **error);
GList * gimp_palette_load_css (GimpContext *context,
const gchar *filename,
+ FILE *file,
GError **error);
-GimpPaletteFileFormat gimp_palette_load_detect_format (const gchar *filename);
+GimpPaletteFileFormat gimp_palette_load_detect_format (const gchar *filename,
+ FILE *file);
#endif /* __GIMP_PALETTE_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]