#include <libjpeg/jpeg-marker.h>
+#include <libexif/exif-utils.h>
+
#undef MAX
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
exif_data_free (data);
return (NULL);
}
+ data->ifd0->parent = data;
+ data->ifd1->parent = data;
+ data->ifd_exif->parent = data;
+ data->ifd_gps->parent = data;
+ data->ifd_interoperability->parent = data;
return (data);
}
{
unsigned int s, doff;
- entry->order = data->priv->order;
entry->tag = exif_get_short (d + offset + 0, data->priv->order);
entry->format = exif_get_short (d + offset + 2, data->priv->order);
entry->components = exif_get_long (d + offset + 4, data->priv->order);
unsigned int i;
ExifTag tag;
- ifd->order = data->priv->order;
-
/* Read the number of entries */
n = exif_get_short (d + offset, data->priv->order);
#ifdef DEBUG
}
}
}
+
+ExifByteOrder
+exif_data_get_byte_order (ExifData *data)
+{
+ if (!data)
+ return (0);
+
+ return (data->priv->order);
+}
+
+void
+exif_data_foreach_content (ExifData *data, ExifDataForeachContentFunc func,
+ void *user_data)
+{
+ func (data->ifd0, user_data);
+ func (data->ifd1, user_data);
+ func (data->ifd_exif, user_data);
+ func (data->ifd_gps, user_data);
+ func (data->ifd_interoperability, user_data);
+}
+
+typedef struct _ByteOrderChangeData ByteOrderChangeData;
+struct _ByteOrderChangeData {
+ ExifByteOrder old, new;
+};
+
+static void
+entry_set_byte_order (ExifEntry *e, void *data)
+{
+ ByteOrderChangeData *d = data;
+ unsigned int i;
+ ExifShort s;
+ ExifLong l;
+ ExifSLong sl;
+ ExifRational r;
+ ExifSRational sr;
+
+ if (!e)
+ return;
+
+ switch (e->format) {
+ case EXIF_FORMAT_SHORT:
+ for (i = 0; i < e->components; i++) {
+ s = exif_get_short (e->data +
+ (i * exif_format_get_size (e->format)),
+ d->old);
+ exif_set_short (e->data +
+ (i * exif_format_get_size (e->format)),
+ d->new, s);
+ }
+ break;
+ case EXIF_FORMAT_LONG:
+ for (i = 0; i < e->components; i++) {
+ l = exif_get_long (e->data +
+ (i * exif_format_get_size (e->format)),
+ d->old);
+ exif_set_long (e->data +
+ (i * exif_format_get_size (e->format)),
+ d->new, l);
+ }
+ break;
+ case EXIF_FORMAT_RATIONAL:
+ for (i = 0; i < e->components; i++) {
+ r = exif_get_rational (e->data +
+ (i * exif_format_get_size (e->format)),
+ d->old);
+ exif_set_rational (e->data +
+ (i * exif_format_get_size (e->format)),
+ d->new, r);
+ }
+ break;
+ case EXIF_FORMAT_SLONG:
+ for (i = 0; i < e->components; i++) {
+ sl = exif_get_slong (e->data +
+ (i * exif_format_get_size (e->format)),
+ d->old);
+ exif_set_slong (e->data +
+ (i * exif_format_get_size (e->format)),
+ d->new, sl);
+ }
+ break;
+ case EXIF_FORMAT_SRATIONAL:
+ for (i = 0; i < e->components; i++) {
+ sr = exif_get_srational (e->data +
+ (i * exif_format_get_size (e->format)),
+ d->old);
+ exif_set_srational (e->data +
+ (i * exif_format_get_size (e->format)),
+ d->new, sr);
+ }
+ break;
+ case EXIF_FORMAT_UNDEFINED:
+ case EXIF_FORMAT_BYTE:
+ case EXIF_FORMAT_ASCII:
+ default:
+ /* Nothing here. */
+ break;
+ }
+}
+
+static void
+content_set_byte_order (ExifContent *content, void *data)
+{
+ exif_content_foreach_entry (content, entry_set_byte_order, data);
+}
+
+void
+exif_data_set_byte_order (ExifData *data, ExifByteOrder order)
+{
+ ByteOrderChangeData d;
+
+ if (!data || (order == data->priv->order))
+ return;
+
+ d.old = data->priv->order;
+ d.new = order;
+ exif_data_foreach_content (data, content_set_byte_order, &d);
+ data->priv->order = order;
+}
#include <time.h>
#include <math.h>
-#include <exif-i18n.h>
+#include "exif-i18n.h"
+#include "exif-utils.h"
//#define DEBUG
ExifSRational v_srat;
static char v[1024], b[1024];
const char *c;
+ ExifByteOrder o;
+
+ /* We need the byte order */
+ if (!e || !e->parent || !e->parent->parent)
+ return (NULL);
+ o = exif_data_get_byte_order (e->parent->parent);
memset (v, 0, sizeof (v));
switch (e->tag) {
case EXIF_TAG_APERTURE_VALUE:
CF (e->format, EXIF_FORMAT_RATIONAL, v);
CC (e->components, 1, v);
- v_rat = exif_get_rational (e->data, e->order);
+ v_rat = exif_get_rational (e->data, o);
snprintf (b, sizeof (b), "%i/%i", (int) v_rat.numerator,
(int) v_rat.denominator);
snprintf (v, sizeof (v), "%s (APEX: f%.01f)", b,
case EXIF_TAG_SHUTTER_SPEED_VALUE:
CF (e->format, EXIF_FORMAT_SRATIONAL, v);
CC (e->components, 1, v);
- v_srat = exif_get_srational (e->data, e->order);
+ v_srat = exif_get_srational (e->data, o);
snprintf (b, sizeof (b), "%.0f/%.0f sec.",
(float) v_srat.numerator, (float) v_srat.denominator);
snprintf (v, sizeof (v), "%s (APEX: %i)", b,
case EXIF_TAG_BRIGHTNESS_VALUE:
CF (e->format, EXIF_FORMAT_SRATIONAL, v);
CC (e->components, 1, v);
- v_srat = exif_get_srational (e->data, e->order);
+ v_srat = exif_get_srational (e->data, o);
snprintf (v, sizeof (v), "%i/%i", (int) v_srat.numerator,
(int) v_srat.denominator);
//FIXME: How do I calculate the APEX value?
case EXIF_TAG_METERING_MODE:
CF (e->format, EXIF_FORMAT_SHORT, v);
CC (e->components, 1, v);
- v_short = exif_get_short (e->data, e->order);
+ v_short = exif_get_short (e->data, o);
switch (v_short) {
case 0:
strncpy (v, _("Unknown"), sizeof (v));
case EXIF_TAG_COMPRESSION:
CF (e->format, EXIF_FORMAT_SHORT, v);
CC (e->components, 1, v);
- v_short = exif_get_short (e->data, e->order);
+ v_short = exif_get_short (e->data, o);
switch (v_short) {
case 1:
strncpy (v, _("Uncompressed"), sizeof (v));
case EXIF_TAG_PLANAR_CONFIGURATION:
CF (e->format, EXIF_FORMAT_SHORT, v);
CC (e->components, 1, v);
- v_short = exif_get_short (e->data, e->order);
+ v_short = exif_get_short (e->data, o);
switch (v_short) {
case 1:
strncpy (v, _("chunky format"), sizeof (v));
case EXIF_TAG_SENSING_METHOD:
CF (e->format, EXIF_FORMAT_SHORT, v);
CC (e->components, 1, v);
- v_short = exif_get_short (e->data, e->order);
+ v_short = exif_get_short (e->data, o);
switch (v_short) {
case 1:
strncpy (v, _("Not defined"), sizeof (v));
case EXIF_TAG_LIGHT_SOURCE:
CF (e->format, EXIF_FORMAT_SHORT, v);
CC (e->components, 1, v);
- v_short = exif_get_short (e->data, e->order);
+ v_short = exif_get_short (e->data, o);
switch (v_short) {
case 0:
strncpy (v, _("Unknown"), sizeof (v));
case EXIF_TAG_RESOLUTION_UNIT:
CF (e->format, EXIF_FORMAT_SHORT, v);
CC (e->components, 1, v);
- v_short = exif_get_short (e->data, e->order);
+ v_short = exif_get_short (e->data, o);
switch (v_short) {
case 2:
strncpy (v, _("Inch"), sizeof (v));
case EXIF_TAG_EXPOSURE_PROGRAM:
CF (e->format, EXIF_FORMAT_SHORT, v);
CC (e->components, 1, v);
- v_short = exif_get_short (e->data, e->order);
+ v_short = exif_get_short (e->data, o);
switch (v_short) {
case 0:
strncpy (v, _("Not defined"), sizeof (v));
case EXIF_TAG_ORIENTATION:
CF (e->format, EXIF_FORMAT_SHORT, v);
CC (e->components, 1, v);
- v_short = exif_get_short (e->data, e->order);
+ v_short = exif_get_short (e->data, o);
switch (v_short) {
case 1:
strncpy (v, _("top - left"), sizeof (v));
case EXIF_TAG_YCBCR_POSITIONING:
CF (e->format, EXIF_FORMAT_SHORT, v);
CC (e->components, 1, v);
- v_short = exif_get_short (e->data, e->order);
+ v_short = exif_get_short (e->data, o);
switch (v_short) {
case 1:
strncpy (v, _("centered"), sizeof (v));
case EXIF_TAG_YCBCR_SUB_SAMPLING:
CF (e->format, EXIF_FORMAT_SHORT, v);
CC (e->components, 2, v);
- v_short = exif_get_short (e->data, e->order);
+ v_short = exif_get_short (e->data, o);
v_short2 = exif_get_short (
e->data + exif_format_get_size (e->format),
- e->order);
+ o);
if ((v_short == 2) && (v_short2 == 1))
strncpy (v, _("YCbCr4:2:2"), sizeof (v));
else if ((v_short == 2) && (v_short2 == 2))
case EXIF_TAG_PHOTOMETRIC_INTERPRETATION:
CF (e->format, EXIF_FORMAT_SHORT, v);
CC (e->components, 1, v);
- v_short = exif_get_short (e->data, e->order);
+ v_short = exif_get_short (e->data, o);
switch (v_short) {
case 2:
strncpy (v, _("RGB"), sizeof (v));
case EXIF_TAG_COLOR_SPACE:
CF (e->format, EXIF_FORMAT_SHORT, v);
CC (e->components, 1, v);
- v_short = exif_get_short (e->data, e->order);
+ v_short = exif_get_short (e->data, o);
switch (v_short) {
case 1:
strncpy (v, _("sRGB"), sizeof (v));
case EXIF_TAG_FLASH:
CF (e->format, EXIF_FORMAT_SHORT, v);
CC (e->components, 1, v);
- v_short = exif_get_short (e->data, e->order);
+ v_short = exif_get_short (e->data, o);
switch (v_short) {
case 0x000:
strncpy (v, _("Flash did not fire."), sizeof (v));
}
break;
case EXIF_FORMAT_SHORT:
- v_short = exif_get_short (e->data, e->order);
+ v_short = exif_get_short (e->data, o);
snprintf (v, sizeof (v), "%i", v_short);
for (i = 1; i < e->components; i++) {
v_short = exif_get_short (e->data +
exif_format_get_size (e->format) *
- i, e->order);
+ i, o);
snprintf (b, sizeof (b), "%i", v_short);
strncat (v, ", ", sizeof (v));
strncat (v, b, sizeof (v));
}
break;
case EXIF_FORMAT_LONG:
- v_long = exif_get_long (e->data, e->order);
+ v_long = exif_get_long (e->data, o);
snprintf (v, sizeof (v), "%i", (int) v_long);
for (i = 1; i < e->components; i++) {
v_long = exif_get_long (e->data +
exif_format_get_size (e->format) *
- i, e->order);
+ i, o);
snprintf (b, sizeof (b), "%li", v_long);
strncat (v, ", ", sizeof (v));
strncat (v, b, sizeof (v));
}
break;
case EXIF_FORMAT_SLONG:
- v_slong = exif_get_slong (e->data, e->order);
+ v_slong = exif_get_slong (e->data, o);
snprintf (v, sizeof (v), "%li", v_slong);
for (i = 1; i < e->components; i++) {
v_long = exif_get_slong (e->data +
exif_format_get_size (e->format) *
- i, e->order);
+ i, o);
snprintf (b, sizeof (b), "%li", v_long);
strncat (v, ", ", sizeof (v));
strncat (v, b, sizeof (v));
strncpy (v, e->data, MIN (sizeof (v), e->size));
break;
case EXIF_FORMAT_RATIONAL:
- v_rat = exif_get_rational (e->data, e->order);
+ v_rat = exif_get_rational (e->data, o);
snprintf (v, sizeof (v), "%i/%i",
(int) v_rat.numerator,
(int) v_rat.denominator);
for (i = 1; i < e->components; i++) {
v_rat = exif_get_rational (
- e->data + 8 * i, e->order);
+ e->data + 8 * i, o);
snprintf (b, sizeof (b), "%i/%i",
(int) v_rat.numerator,
(int) v_rat.denominator);
}
break;
case EXIF_FORMAT_SRATIONAL:
- v_srat = exif_get_srational (e->data, e->order);
+ v_srat = exif_get_srational (e->data, o);
snprintf (v, sizeof (v), "%i/%i",
(int) v_srat.numerator,
(int) v_srat.denominator);
for (i = 1; i < e->components; i++) {
v_srat = exif_get_srational (
- e->data + 8 * i, e->order);
+ e->data + 8 * i, o);
snprintf (b, sizeof (b), "%i/%i",
(int) v_srat.numerator,
(int) v_srat.denominator);
time_t t;
struct tm *tm;
ExifRational r;
+ ExifByteOrder o;
- if (!e)
- return;
- if (!e->parent || e->data)
+ /* We need the byte order */
+ if (!e || !e->parent || e->data || !e->parent->parent)
return;
+ o = exif_data_get_byte_order (e->parent->parent);
- e->order = e->parent->order;
e->tag = tag;
switch (tag) {
e->format = EXIF_FORMAT_SHORT;
e->size = exif_format_get_size (e->format) * e->components;
e->data = malloc (e->size);
- exif_set_short (e->data, e->order, 0);
+ exif_set_short (e->data, o, 0);
break;
/* SHORT, 1 component, default 1 */
e->format = EXIF_FORMAT_SHORT;
e->size = exif_format_get_size (e->format) * e->components;
e->data = malloc (e->size);
- exif_set_short (e->data, e->order, 1);
+ exif_set_short (e->data, o, 1);
break;
/* SHORT, 1 component, default 2 */
e->format = EXIF_FORMAT_SHORT;
e->size = exif_format_get_size (e->format) * e->components;
e->data = malloc (e->size);
- exif_set_short (e->data, e->order, 2);
+ exif_set_short (e->data, o, 2);
break;
/* SHORT, 1 component, default 3 */
e->format = EXIF_FORMAT_SHORT;
e->size = exif_format_get_size (e->format) * e->components;
e->data = malloc (e->size);
- exif_set_short (e->data, e->order, 3);
+ exif_set_short (e->data, o, 3);
break;
case EXIF_TAG_BITS_PER_SAMPLE:
e->format = EXIF_FORMAT_SHORT;
e->size = exif_format_get_size (e->format) * e->components;
e->data = malloc (e->size);
- exif_set_short (e->data, e->order, 8);
+ exif_set_short (e->data, o, 8);
exif_set_short (
e->data + exif_format_get_size (e->format),
- e->order, 8);
+ o, 8);
exif_set_short (
e->data + 2 * exif_format_get_size (e->format),
- e->order, 8);
+ o, 8);
break;
case EXIF_TAG_YCBCR_SUB_SAMPLING:
e->components = 2;
e->format = EXIF_FORMAT_SHORT;
e->size = exif_format_get_size (e->format) * e->components;
e->data = malloc (e->size);
- exif_set_short (e->data, e->order, 2);
+ exif_set_short (e->data, o, 2);
exif_set_short (
e->data + exif_format_get_size (e->format),
- e->order, 1);
+ o, 1);
break;
/* SRATIONAL, 1 component, no default */
e->data = malloc (e->size);
r.numerator = 72;
r.denominator = 1;
- exif_set_rational (e->data, e->order, r);
+ exif_set_rational (e->data, o, r);
break;
/* RATIONAL, 2 components, no default */
e->data = malloc (e->size);
r.denominator = 1;
r.numerator = 0;
- exif_set_rational (e->data, e->order, r);
+ exif_set_rational (e->data, o, r);
r.numerator = 255;
exif_set_rational (
- e->data + exif_format_get_size (e->format),
- e->order, r);
+ e->data + exif_format_get_size (e->format), o, r);
r.numerator = 0;
exif_set_rational (
- e->data + 2 * exif_format_get_size (e->format),
- e->order, r);
+ e->data + 2 * exif_format_get_size (e->format), o, r);
r.numerator = 255;
exif_set_rational (
- e->data + 3 * exif_format_get_size (e->format),
- e->order, r);
+ e->data + 3 * exif_format_get_size (e->format), o, r);
r.numerator = 0;
exif_set_rational (
- e->data + 4 * exif_format_get_size (e->format),
- e->order, r);
+ e->data + 4 * exif_format_get_size (e->format), o, r);
r.numerator = 255;
exif_set_rational (
- e->data + 5 * exif_format_get_size (e->format),
- e->order, r);
+ e->data + 5 * exif_format_get_size (e->format), o, r);
break;
case EXIF_TAG_DATE_TIME:
case EXIF_TAG_DATE_TIME_ORIGINAL: