2
* Copyright (C) 2006-2009 Anders Brander <anders@brander.dk> and
3
* Anders Kvist <akv@lnxbx.dk>
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License
7
* as published by the Free Software Foundation; either version 2
8
* of the License, or (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21
#include <sys/types.h>
28
#include <arpa/inet.h>
44
guint first_ifd_offset;
48
#if BYTE_ORDER == LITTLE_ENDIAN
49
const static gushort cpuorder = 0x4949;
50
#elif BYTE_ORDER == BIG_ENDIAN
51
const static gushort cpuorder = 0x4D4D;
62
raw_get_uint(RAWFILE *rawfile, guint pos, guint *target)
64
if((rawfile->base+pos+4)>rawfile->size)
66
if (rawfile->byteorder == cpuorder)
67
*target = *(guint *)(rawfile->map+pos+rawfile->base);
69
*target = ENDIANSWAP4(*(guint *)(rawfile->map+pos+rawfile->base));
74
raw_get_ushort(RAWFILE *rawfile, guint pos, gushort *target)
76
if((rawfile->base+pos+2)>rawfile->size)
78
if (rawfile->byteorder == cpuorder)
79
*target = *(gushort *)(rawfile->map+rawfile->base+pos);
81
*target = ENDIANSWAP2(*(gushort *)(rawfile->map+rawfile->base+pos));
86
raw_get_ushort_from_string(RAWFILE *rawfile, gchar *source)
90
if (rawfile->byteorder == cpuorder)
91
target = *(gushort *)(source);
93
target = ENDIANSWAP2(*(gushort *)(source));
98
raw_get_short(RAWFILE *rawfile, guint pos, gshort *target)
100
if((rawfile->base+pos+2)>rawfile->size)
102
if (rawfile->byteorder == cpuorder)
103
*target = *(gshort *)(rawfile->map+rawfile->base+pos);
105
*target = ENDIANSWAP2(*(gshort *)(rawfile->map+rawfile->base+pos));
110
raw_get_short_from_string(RAWFILE *rawfile, gchar *source)
114
if (rawfile->byteorder == cpuorder)
115
target = *(gshort *)(source);
117
target = ENDIANSWAP2(*(gshort *)(source));
122
raw_get_float(RAWFILE *rawfile, guint pos, gfloat *target)
124
if((rawfile->base+pos+4)>rawfile->size)
127
if (rawfile->byteorder == cpuorder)
128
*target = *(gfloat *)(rawfile->map+rawfile->base+pos);
130
*target = (gfloat) (ENDIANSWAP4(*(gint *)(rawfile->map+rawfile->base+pos)));
135
raw_get_uchar(RAWFILE *rawfile, guint pos, guchar *target)
137
if((rawfile->base+pos+1)>rawfile->size)
140
*target = *(guchar *)(rawfile->map+rawfile->base+pos);
145
raw_strcmp(RAWFILE *rawfile, guint pos, const gchar *needle, gint len)
147
if((rawfile->base+pos+len) > rawfile->size)
149
if(0 == g_ascii_strncasecmp(needle, rawfile->map+rawfile->base+pos, len))
156
raw_strcpy(RAWFILE *rawfile, guint pos, void *target, gint len)
158
if((rawfile->base+pos+len) > rawfile->size)
160
g_memmove(target, rawfile->map+rawfile->base+pos, len);
165
raw_strdup(RAWFILE *rawfile, guint pos, gint len)
167
if((rawfile->base+pos+len) > rawfile->size)
169
return(g_strndup(rawfile->map+rawfile->base+pos, len));
173
raw_get_pixbuf(RAWFILE *rawfile, guint pos, guint length)
176
GdkPixbuf *pixbuf = NULL;
177
gboolean cont = TRUE; /* Are we good to continue? */
178
if((rawfile->base+pos+length)>rawfile->size)
181
pl = gdk_pixbuf_loader_new();
182
while((length > 100000) && cont)
184
cont = gdk_pixbuf_loader_write(pl, rawfile->map+rawfile->base+pos, 80000, NULL);
189
gdk_pixbuf_loader_write(pl, rawfile->map+rawfile->base+pos, length, NULL);
190
pixbuf = gdk_pixbuf_loader_get_pixbuf(pl);
191
gdk_pixbuf_loader_close(pl, NULL);
196
raw_open_file(const gchar *filename)
202
if(stat(filename, &st))
204
rawfile = g_malloc(sizeof(RAWFILE));
205
rawfile->size = st.st_size;
208
rawfile->filehandle = CreateFile(filename, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
209
if (rawfile->filehandle == INVALID_HANDLE_VALUE)
215
if ((rawfile->maphandle = CreateFileMapping(rawfile->filehandle, NULL, PAGE_READONLY, 0, 0, NULL))==NULL)
221
rawfile->map = MapViewOfFile(rawfile->maphandle, FILE_MAP_READ, 0, 0, rawfile->size);
222
if (rawfile->map == NULL)
229
if ((fd = open(filename, O_RDONLY)) == -1)
234
rawfile->map = mmap(NULL, rawfile->size, PROT_READ, MAP_SHARED, fd, 0);
235
if(rawfile->map == MAP_FAILED)
243
rawfile->byteorder = 0x4D4D;
248
raw_init_file_tiff(RAWFILE *rawfile, guint pos)
252
if((pos+12)>rawfile->size)
254
rawfile->byteorder = *((gushort *) (rawfile->map+pos));
255
raw_get_uint(rawfile, pos+4, &rawfile->first_ifd_offset);
256
if (rawfile->first_ifd_offset > rawfile->size)
259
raw_get_uchar(rawfile, pos+2, &version);
266
raw_close_file(RAWFILE *rawfile)
269
UnmapViewOfFile(rawfile->map);
270
CloseHandle(rawfile->maphandle);
271
CloseHandle(rawfile->filehandle);
273
munmap(rawfile->map, rawfile->size);
281
raw_reset_base(RAWFILE *rawfile)
288
raw_get_base(RAWFILE *rawfile)
290
return rawfile->base;
294
raw_get_byteorder(RAWFILE *rawfile)
296
return rawfile->byteorder;
300
raw_set_byteorder(RAWFILE *rawfile, gushort byteorder)
302
rawfile->byteorder = byteorder;
306
get_first_ifd_offset(RAWFILE *rawfile)
308
return rawfile->first_ifd_offset;
312
raw_get_map(RAWFILE *rawfile)
318
raw_get_filesize(RAWFILE *rawfile)
320
return rawfile->size;