Skip to content

Commit

Permalink
simplified exif.h, moved implementation-specific stuff to exif-int.h
Browse files Browse the repository at this point in the history
  • Loading branch information
nadvornik committed Feb 13, 2008
1 parent 431265b commit dd9103a
Show file tree
Hide file tree
Showing 11 changed files with 258 additions and 136 deletions.
14 changes: 6 additions & 8 deletions src/bar_exif.c
Original file line number Diff line number Diff line change
Expand Up @@ -241,30 +241,27 @@ static void bar_exif_update(ExifBar *eb)
GtkListStore *store;
GtkTreeIter iter;
GList *work;
ExifItem *item;

store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(eb->listview)));
gtk_list_store_clear(store);

work = exif->items;
while (work)
item = exif_get_first_item(exif);
while (item)
{
ExifItem *item;
gchar *tag;
const gchar *tag_name;
gchar *text;
const gchar *format;
gchar *elements;
const gchar *description;

item = work->data;
work = work->next;

tag = g_strdup_printf("0x%04x", item->tag);
tag = g_strdup_printf("0x%04x", exif_item_get_tag_id(item));
tag_name = exif_item_get_tag_name(item);
format = exif_item_get_format_name(item, TRUE);
text = exif_item_get_data_as_text(item);
text = bar_exif_validate_text(text);
elements = g_strdup_printf("%d", item->elements);
elements = g_strdup_printf("%d", exif_item_get_elements(item));
description = exif_item_get_description(item);
if (!description) description = "";
gtk_list_store_append(store, &iter);
Expand All @@ -279,6 +276,7 @@ static void bar_exif_update(ExifBar *eb)
g_free(tag);
g_free(text);
g_free(elements);
item = exif_get_next_item(exif);
}
}

Expand Down
175 changes: 175 additions & 0 deletions src/exif-int.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
/*
* GQView
* (C) 2006 John Ellis
*
* Authors:
* Support for Exif file format, originally written by Eric Swalens.
* Modified by Quy Tonthat
* Reimplemented with generic data storage by John Ellis
*
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#ifndef __EXIF_INT_H
#define __EXIF_INT_H

#include "exif.h"

/*
*-----------------------------------------------------------------------------
* Tag formats
*-----------------------------------------------------------------------------
*/

typedef enum {
EXIF_BYTE_ORDER_INTEL,
EXIF_BYTE_ORDER_MOTOROLA
} ExifByteOrder;

typedef struct _ExifFormatAttrib ExifFormatAttrib;
struct _ExifFormatAttrib
{
ExifFormatType type;
guint size;
const gchar *short_name;
const gchar *description;
};

/* the list of known tag data formats */
extern ExifFormatAttrib ExifFormatList[];


/*
*-----------------------------------------------------------------------------
* Data storage
*-----------------------------------------------------------------------------
*/

typedef struct _ExifMarker ExifMarker;
typedef struct _ExifTextList ExifTextList;

struct _ExifData
{
GList *items; /* list of (ExifItem *) */
GList *current; /* for exif_get_next_item */
};


struct _ExifItem
{
ExifFormatType format;
guint tag;
const ExifMarker *marker;
guint elements;
gpointer data;
guint data_len;
};

struct _ExifMarker
{
guint tag;
ExifFormatType format;
gint components;
gchar *key;
gchar *description;
ExifTextList *list;
};

#define EXIF_MARKER_LIST_END { 0x0000, EXIF_FORMAT_UNKNOWN, 0, NULL, NULL, NULL }

struct _ExifTextList
{
gint value;
const gchar* description;
};

#define EXIF_TEXT_LIST_END { -1, NULL }


typedef struct _ExifFormattedText ExifFormattedText;
struct _ExifFormattedText
{
const gchar *key;
const gchar *description;
};


/*
*-----------------------------------------------------------------------------
* Data
*-----------------------------------------------------------------------------
*/



/* the known exif tags list */
extern ExifMarker ExifKnownMarkersList[];

/* the unknown tags utilize this generic list */
extern ExifMarker ExifUnknownMarkersList[];

/* the list of specially formatted keys, for human readable output */
extern ExifFormattedText ExifFormattedList[];


/*
*-----------------------------------------------------------------------------
* functions
*-----------------------------------------------------------------------------
*/


/* usually for debugging to stdout */
void exif_write_data_list(ExifData *exif, FILE *f, gint human_readable_list);



/* These funcs for use by makernote/tiff parsers only */

#define EXIF_TIFF_MAX_LEVELS 4

#define EXIF_TIFD_OFFSET_TAG 0
#define EXIF_TIFD_OFFSET_FORMAT 2
#define EXIF_TIFD_OFFSET_COUNT 4
#define EXIF_TIFD_OFFSET_DATA 8
#define EXIF_TIFD_SIZE 12


guint16 exif_byte_get_int16(unsigned char *f, ExifByteOrder bo);
guint32 exif_byte_get_int32(unsigned char *f, ExifByteOrder bo);
void exif_byte_put_int16(unsigned char *f, guint16 n, ExifByteOrder bo);
void exif_byte_put_int32(unsigned char *f, guint32 n, ExifByteOrder bo);

ExifItem *exif_item_new(ExifFormatType format, guint tag,
guint elements, const ExifMarker *marker);
void exif_item_copy_data(ExifItem *item, void *src, guint len,
ExifFormatType src_format, ExifByteOrder bo);

gint exif_parse_IFD_table(ExifData *exif,
unsigned char *tiff, guint offset,
guint size, ExifByteOrder bo,
gint level,
const ExifMarker *list);

gint exif_tiff_directory_offset(unsigned char *data, const guint len,
guint *offset, ExifByteOrder *bo);
gint exif_tiff_parse(ExifData *exif, unsigned char *tiff, guint size, ExifMarker *list);

gchar *exif_text_list_find_value(ExifTextList *list, guint value);


#endif

53 changes: 52 additions & 1 deletion src/exif.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@
#include "intl.h"

#include "gqview.h"
#include "exif.h"
#include "exif-int.h"

#include "format_raw.h"
#include "ui_fileops.h"
Expand Down Expand Up @@ -512,6 +512,29 @@ const char *exif_item_get_tag_name(ExifItem *item)
return item->marker->key;
}

guint exif_item_get_tag_id(ExifItem *item)
{
return item->tag;
}

guint exif_item_get_elements(ExifItem *item)
{
return item->elements;
}

char *exif_item_get_data(ExifItem *item, guint *data_len)
{
if (data_len)
*data_len = item->data_len;
return item->data;
}

guint exif_item_get_format_id(ExifItem *item)
{
return item->format;
}


const char *exif_item_get_description(ExifItem *item)
{
if (!item || !item->marker) return NULL;
Expand Down Expand Up @@ -575,6 +598,7 @@ gchar *exif_text_list_find_value(ExifTextList *list, guint value)
return result;
}


/*
*-------------------------------------------------------------------
* byte order utils
Expand Down Expand Up @@ -1122,6 +1146,32 @@ static gint exif_jpeg_parse(ExifData *exif,
*-------------------------------------------------------------------
*/


ExifItem *exif_get_first_item(ExifData *exif)
{
if (exif->items)
{
ExifItem *ret = (ExifItem *)exif->items->data;
exif->current = exif->items->next;
return ret;
}
exif->current = NULL;
return NULL;
}

ExifItem *exif_get_next_item(ExifData *exif)
{
if (exif->current)
{
ExifItem *ret = (ExifItem *)exif->current->data;
exif->current = exif->current->next;
return ret;
}
return NULL;
}



static gint map_file(const gchar *path, void **mapping, int *size)
{
int fd;
Expand Down Expand Up @@ -1201,6 +1251,7 @@ ExifData *exif_read(FileData *fd, gint parse_color_profile)

exif = g_new0(ExifData, 1);
exif->items = NULL;
exif->current = NULL;

if ((res = exif_jpeg_parse(exif, (unsigned char *)f, size,
ExifKnownMarkersList,
Expand Down
Loading

0 comments on commit dd9103a

Please sign in to comment.