[gimp] libgimpbase: use gexiv2_metadata_get_exif_tag_rational() to get the resolution
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] libgimpbase: use gexiv2_metadata_get_exif_tag_rational() to get the resolution
- Date: Fri, 1 Nov 2013 16:03:05 +0000 (UTC)
commit e03fd943bf94a27adaf078e2c0310b80e383d85b
Author: Michael Natterer <mitch gimp org>
Date: Fri Nov 1 17:01:44 2013 +0100
libgimpbase: use gexiv2_metadata_get_exif_tag_rational() to get the resolution
and remove our own rational parser, we can get it back from git if we
need it again.
libgimpbase/gimpmetadata.c | 235 ++++++++++----------------------------------
1 files changed, 54 insertions(+), 181 deletions(-)
---
diff --git a/libgimpbase/gimpmetadata.c b/libgimpbase/gimpmetadata.c
index fc10e59..df68254 100644
--- a/libgimpbase/gimpmetadata.c
+++ b/libgimpbase/gimpmetadata.c
@@ -30,6 +30,7 @@
#include "gimpbasetypes.h"
+#include "gimplimits.h"
#include "gimpmetadata.h"
#include "gimpunit.h"
@@ -49,19 +50,9 @@
**/
-#define TAG_LINE_DELIMITER "\v"
-#define TAG_TAG_DELIMITER "#"
-
-
-static GQuark gimp_metadata_error_quark (void);
-static gint gimp_metadata_length (const gchar *testline,
- const gchar *delim);
-static gboolean gimp_metadata_get_rational (const gchar *value,
- gint sections,
- gchar ***numerator,
- gchar ***denominator);
-static void gimp_metadata_add (GimpMetadata *src,
- GimpMetadata *dest);
+static GQuark gimp_metadata_error_quark (void);
+static void gimp_metadata_add (GimpMetadata *src,
+ GimpMetadata *dest);
static const gchar *tiff_tags[] =
@@ -748,83 +739,66 @@ gimp_metadata_get_resolution (GimpMetadata *metadata,
gdouble *yres,
GimpUnit *unit)
{
- gchar *xr;
- gchar *yr;
- gchar *un;
- gint exif_unit = 2;
- gchar **xnom = NULL;
- gchar **xdenom = NULL;
- gchar **ynom = NULL;
- gchar **ydenom = NULL;
+ gint xnom, xdenom;
+ gint ynom, ydenom;
g_return_val_if_fail (GEXIV2_IS_METADATA (metadata), FALSE);
- xr = gexiv2_metadata_get_tag_string (metadata, "Exif.Image.XResolution");
- yr = gexiv2_metadata_get_tag_string (metadata, "Exif.Image.YResolution");
-
- if (! (xr && yr))
- {
- g_free (xr);
- g_free (yr);
- return FALSE;
- }
-
- un = gexiv2_metadata_get_tag_string (metadata, "Exif.Image.ResolutionUnit");
-
- if (un)
+ if (gexiv2_metadata_get_exif_tag_rational (metadata,
+ "Exif.Image.XResolution",
+ &xnom, &xdenom) &&
+ gexiv2_metadata_get_exif_tag_rational (metadata,
+ "Exif.Image.YResolution",
+ &ynom, &ydenom))
{
- exif_unit = atoi (un);
- g_free (un);
- }
+ gchar *un;
+ gint exif_unit = 2;
- if (exif_unit == 3)
- *unit = GIMP_UNIT_MM;
- else
- *unit = GIMP_UNIT_INCH;
-
- if (gimp_metadata_get_rational (xr, 1, &xnom, &xdenom))
- {
- gdouble x1 = g_ascii_strtod (xnom[0], NULL);
- gdouble x2 = g_ascii_strtod (xdenom[0], NULL);
- gdouble xrd;
-
- if (x2 == 0.0)
- return FALSE;
-
- xrd = x1 / x2;
-
- if (exif_unit == 3)
- xrd *= 2.54;
-
- *xres = xrd;
- }
-
- if (gimp_metadata_get_rational (yr, 1, &ynom, &ydenom))
- {
- gdouble y1 = g_ascii_strtod (ynom[0], NULL);
- gdouble y2 = g_ascii_strtod (ydenom[0], NULL);
- gdouble yrd;
-
- if (y2 == 0.0)
- return FALSE;
+ un = gexiv2_metadata_get_tag_string (metadata,
+ "Exif.Image.ResolutionUnit");
+ if (un)
+ {
+ exif_unit = atoi (un);
+ g_free (un);
+ }
- yrd = y1 / y2;
+ if (xnom != 0 && xdenom != 0 &&
+ ynom != 0 && ydenom != 0)
+ {
+ gdouble xresolution = (gdouble) xnom / (gdouble) xdenom;
+ gdouble yresolution = (gdouble) ynom / (gdouble) ydenom;
- if (exif_unit == 3)
- yrd *= 2.54;
+ if (exif_unit == 3)
+ {
+ xresolution *= 2.54;
+ yresolution *= 2.54;
+ }
- *yres = yrd;
+ if (xresolution >= GIMP_MIN_RESOLUTION &&
+ xresolution <= GIMP_MAX_RESOLUTION &&
+ yresolution >= GIMP_MIN_RESOLUTION &&
+ yresolution <= GIMP_MAX_RESOLUTION)
+ {
+ if (xres)
+ *xres = xresolution;
+
+ if (yres)
+ *yres = yresolution;
+
+ if (unit)
+ {
+ if (exif_unit == 3)
+ *unit = GIMP_UNIT_MM;
+ else
+ *unit = GIMP_UNIT_INCH;
+ }
+
+ return TRUE;
+ }
+ }
}
- g_free (xr);
- g_free (yr);
-
- g_strfreev (xnom);
- g_strfreev (xdenom);
- g_strfreev (ynom);
- g_strfreev (ydenom);
-
- return TRUE;
+ return FALSE;
}
/**
@@ -938,107 +912,6 @@ gimp_metadata_error_quark (void)
return quark;
}
-/**
- * determines the amount of delimiters in serialized
- * metadata string
- */
-static gint
-gimp_metadata_length (const gchar *testline,
- const gchar *delim)
-{
- gchar *delim_test;
- gint i;
- gint sum;
-
- delim_test = g_strdup (testline);
-
- sum =0;
-
- for (i=0; i < strlen (delim_test); i++)
- {
- if (delim_test[i] == delim[0])
- sum++;
- }
-
- g_free (delim_test);
-
- return sum;
-}
-
-/**
- * gets rational values from string
- */
-static gboolean
-gimp_metadata_get_rational (const gchar *value,
- gint sections,
- gchar ***numerator,
- gchar ***denominator)
-{
- GSList *nomlist = NULL;
- GSList *denomlist = NULL;
-
- GSList *nlist, *dlist;
-
- gchar sect[] = " ";
- gchar rdel[] = "/";
- gchar **sects;
- gchar **nom = NULL;
- gint i;
- gint n;
-
- gchar **num;
- gchar **den;
-
- if (! value)
- return FALSE;
-
- if (gimp_metadata_length (value, sect) == (sections -1))
- {
- i = 0;
- sects = g_strsplit (value, sect, -1);
- while (sects[i] != NULL)
- {
- if(gimp_metadata_length (sects[i], rdel) == 1)
- {
- nom = g_strsplit (sects[i], rdel, -1);
- nomlist = g_slist_prepend (nomlist, g_strdup (nom[0]));
- denomlist = g_slist_prepend (denomlist, g_strdup (nom[1]));
- }
- else
- {
- return FALSE;
- }
- i++;
- }
- }
- else
- {
- return FALSE;
- }
-
- n = i;
-
- num = g_new0 (gchar*, i + 1);
- den = g_new0 (gchar*, n + 1);
-
- for (nlist = nomlist; nlist; nlist = nlist->next)
- num[--i] = nlist->data;
-
- for (dlist = denomlist; dlist; dlist = dlist->next)
- den[--n] = dlist->data;
-
- *numerator = num;
- *denominator = den;
-
- g_slist_free (nomlist);
- g_slist_free (denomlist);
-
- g_strfreev (sects);
- g_strfreev (nom);
-
- return TRUE;
-}
-
static void
gimp_metadata_add (GimpMetadata *src,
GimpMetadata *dest)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]