gboolean rs_raf_load_meta(const gchar *service, RAWFILE *rawfile, guint offset, RSMetadata *meta) { guint directory; guint directory_entries; guint entry; gushort tag, length; gushort temp; if (raw_strcmp(rawfile, 0, "FUJIFILM", 8)) { raw_get_uint(rawfile, 84, &meta->preview_start); raw_get_uint(rawfile, 88, &meta->preview_length); raw_get_uint(rawfile, 92, &directory); raw_get_uint(rawfile, directory, &directory_entries); offset = directory+4; meta->make = MAKE_FUJIFILM; if (directory_entries < 256) { for(entry=0;entry<directory_entries;entry++) { raw_get_ushort(rawfile, offset, &tag); raw_get_ushort(rawfile, offset+2, &length); switch(tag) { case 0x2ff0: /* White balance */ raw_get_ushort(rawfile, offset+4, &temp); meta->cam_mul[G] = temp; raw_get_ushort(rawfile, offset+6, &temp); meta->cam_mul[R] = temp; raw_get_ushort(rawfile, offset+8, &temp); meta->cam_mul[G2] = temp; raw_get_ushort(rawfile, offset+10, &temp); meta->cam_mul[B] = temp; rs_metadata_normalize_wb(meta); break; } offset = offset + 4 + length; } } guint meta_offset = 0; if (raw_get_uint(rawfile, 100, &meta_offset)) { gushort order = raw_get_byteorder(rawfile); rs_filetype_meta_load(".tiff", meta, rawfile, meta_offset); raw_set_byteorder(rawfile, order); raw_reset_base(rawfile); } meta->thumbnail = rs_raf_load_thumb(rawfile); rs_filetype_meta_load(".tiff", meta, rawfile, meta->preview_start+12); return TRUE; } return FALSE; }
gboolean rs_metadata_load_from_file(RSMetadata *metadata, const gchar *filename) { gboolean ret = FALSE; RAWFILE *rawfile; g_return_val_if_fail(RS_IS_METADATA(metadata), FALSE); g_return_val_if_fail(filename != NULL, FALSE); g_return_val_if_fail(g_path_is_absolute(filename), FALSE); rawfile = raw_open_file(filename); if (rawfile) { ret = rs_filetype_meta_load(filename, metadata, rawfile, 0); raw_close_file(rawfile); } return ret; }