~ubuntu-branches/ubuntu/vivid/rawstudio/vivid

« back to all changes in this revision

Viewing changes to src/rawstudio.c

  • Committer: Bazaar Package Importer
  • Author(s): Bernd Zeimetz
  • Date: 2011-07-28 17:36:32 UTC
  • mfrom: (2.1.11 upstream)
  • Revision ID: james.westby@ubuntu.com-20110728173632-5czluz9ye3c83zc5
Tags: 2.0-1
* [3750b2cf] Merge commit 'upstream/2.0'
* [63637468] Removing Patch, not necessary anymore.
* [2fb580dc] Add new build-dependencies.
* [c57d953b] Run dh_autoreconf due to patches in configure.in
* [13febe39] Add patch to remove the libssl requirement.
* [5ae773fe] Replace libjpeg62-dev by libjpeg8-dev :)
* [1969d755] Don't build static libraries.
* [7cfe0a2e] Add a patch to fix the plugin directory path.
  As plugins are shared libraries, they need to go into /usr/lib,
  not into /usr/share.
  Thanks to Andrew McMillan
* [c1d0d9dd] Don't install .la files for all plugins and libraries.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright (C) 2006-2009 Anders Brander <anders@brander.dk> and 
3
 
 * Anders Kvist <akv@lnxbx.dk>
4
 
 *
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.
9
 
 *
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.
14
 
 *
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.
18
 
 */
19
 
 
20
 
#include <glib/gstdio.h>
21
 
#include <unistd.h>
22
 
#include <math.h> /* pow() */
23
 
#include <string.h> /* memset() */
24
 
#include <time.h>
25
 
#include <config.h>
26
 
#include "rawstudio.h"
27
 
#include "gtk-interface.h"
28
 
#include "gtk-helper.h"
29
 
#include "rs-cache.h"
30
 
#include "color.h"
31
 
#include "rawfile.h"
32
 
#include "tiff-meta.h"
33
 
#include "ciff-meta.h"
34
 
#include "mrw-meta.h"
35
 
#include "x3f-meta.h"
36
 
#include "rs-image.h"
37
 
#include "gettext.h"
38
 
#include "conf_interface.h"
39
 
#include "filename.h"
40
 
#include "rs-jpeg.h"
41
 
#include "rs-tiff.h"
42
 
#include "rs-arch.h"
43
 
#include "rs-batch.h"
44
 
#include "rs-cms.h"
45
 
#include "rs-store.h"
46
 
#include "rs-color-transform.h"
47
 
#include "rs-preview-widget.h"
48
 
#include "rs-histogram.h"
49
 
#include "rs-curve.h"
50
 
#include "rs-photo.h"
51
 
#include "rs-math.h"
52
 
#include "rs-exif.h"
53
 
#include "rs-metadata.h"
54
 
#include "rs-filetypes.h"
55
 
#include "rs-utils.h"
56
 
 
57
 
static void photo_settings_changed(RS_PHOTO *photo, RSSettingsMask mask, RS_BLOB *rs);
58
 
static void photo_spatial_changed(RS_PHOTO *photo, RS_BLOB *rs);
59
 
static void rs_gdk_load_meta(const gchar *src, RSMetadata *metadata);
60
 
 
61
 
RS_FILETYPE *filetypes;
62
 
 
63
 
static void
64
 
rs_add_filetype(gchar *id, gint filetype, const gchar *ext, gchar *description,
65
 
        RS_IMAGE16 *(*load)(const gchar *, gboolean),
66
 
        void (*load_meta)(const gchar *, RSMetadata *),
67
 
        gboolean (*save)(RS_PHOTO *photo, const gchar *filename, gint filetype, gint width, gint height, gboolean keep_aspect, gdouble scale, gint snapshot, RS_CMS *cms))
68
 
{
69
 
        RS_FILETYPE *cur = filetypes;
70
 
        if (filetypes==NULL)
71
 
                cur = filetypes = g_malloc(sizeof(RS_FILETYPE));
72
 
        else
73
 
        {
74
 
                while (cur->next) cur = cur->next;
75
 
                cur->next = g_malloc(sizeof(RS_FILETYPE));
76
 
                cur = cur->next;
77
 
        }
78
 
        cur->id = id;
79
 
        cur->filetype = filetype;
80
 
        cur->ext = ext;
81
 
        cur->description = description;
82
 
        cur->save = save;
83
 
        cur->next = NULL;
84
 
        return;
85
 
}
86
 
 
87
 
static void
88
 
rs_init_filetypes(void)
89
 
{
90
 
 
91
 
        rs_filetype_init();
92
 
 
93
 
#define REGISTER_FILETYPE(extension, description, load, meta) do { \
94
 
        rs_filetype_register_loader(extension, description, load, 10); \
95
 
        rs_filetype_register_meta_loader(extension, description, meta, 10); \
96
 
} while(0)
97
 
 
98
 
        /* Raw file formats */
99
 
        REGISTER_FILETYPE(".cr2", _("Canon CR2"), rs_image16_open_dcraw,  rs_tiff_load_meta);
100
 
        REGISTER_FILETYPE(".crw", _("Canon CIFF"), rs_image16_open_dcraw, rs_ciff_load_meta);
101
 
        REGISTER_FILETYPE(".nef", _("Nikon NEF"), rs_image16_open_dcraw, rs_tiff_load_meta);
102
 
        REGISTER_FILETYPE(".mrw", _("Minolta raw"), rs_image16_open_dcraw, rs_mrw_load_meta);
103
 
        REGISTER_FILETYPE(".tif", _("Canon TIFF"), rs_image16_open_dcraw, rs_tiff_load_meta);
104
 
        REGISTER_FILETYPE(".arw", _("Sony"), rs_image16_open_dcraw, rs_sony_load_meta);
105
 
        REGISTER_FILETYPE(".sr2", _("Sony"), rs_image16_open_dcraw, rs_sony_load_meta);
106
 
        REGISTER_FILETYPE(".srf", _("Sony"), rs_image16_open_dcraw, rs_sony_load_meta);
107
 
        REGISTER_FILETYPE(".kdc", _("Kodak"), rs_image16_open_dcraw, rs_tiff_load_meta);
108
 
        REGISTER_FILETYPE(".dcr", _("Kodak"), rs_image16_open_dcraw, rs_tiff_load_meta);
109
 
        REGISTER_FILETYPE(".x3f", _("Sigma"), rs_image16_open_dcraw, rs_x3f_load_meta);
110
 
        REGISTER_FILETYPE(".orf", _("Olympus"), rs_image16_open_dcraw, rs_tiff_load_meta);
111
 
        REGISTER_FILETYPE(".raw", _("Panasonic raw"), rs_image16_open_dcraw, rs_tiff_load_meta);
112
 
        REGISTER_FILETYPE(".rw2", _("Panasonic raw 2"), rs_image16_open_dcraw, rs_tiff_load_meta);
113
 
        REGISTER_FILETYPE(".pef", _("Pentax raw"), rs_image16_open_dcraw, rs_tiff_load_meta);
114
 
        REGISTER_FILETYPE(".dng", _("Adobe Digital negative"), rs_image16_open_dcraw, rs_tiff_load_meta);
115
 
        REGISTER_FILETYPE(".mef", _("Mamiya"), rs_image16_open_dcraw, rs_tiff_load_meta);
116
 
        REGISTER_FILETYPE(".3fr", _("Hasselblad"), rs_image16_open_dcraw, rs_tiff_load_meta);
117
 
        REGISTER_FILETYPE(".erf", _("Epson"), rs_image16_open_dcraw, rs_tiff_load_meta);
118
 
 
119
 
        /* GDK formats */
120
 
        REGISTER_FILETYPE(".jpg", _("JPEG (Joint Photographic Experts Group)"), rs_image16_open_gdk, rs_gdk_load_meta);
121
 
        REGISTER_FILETYPE(".png", _("PNG (Portable Network Graphics)"), rs_image16_open_gdk, rs_gdk_load_meta);
122
 
 
123
 
#undef REGISTER_FILETYPE
124
 
 
125
 
        /* TIFF is special - we need higher priority to try raw first */
126
 
        rs_filetype_register_loader(".tif", _("8-bit TIFF (Tagged Image File Format)"), rs_image16_open_gdk, 20);
127
 
        rs_filetype_register_meta_loader(".tif", _("8-bit TIFF (Tagged Image File Format)"), rs_gdk_load_meta, 20);
128
 
 
129
 
        /* Old-style savers - FIXME: Port to RSFiletype */
130
 
        filetypes = NULL;
131
 
        rs_add_filetype("jpeg", FILETYPE_JPEG, ".jpg", _("JPEG (Joint Photographic Experts Group)"),
132
 
                rs_image16_open_gdk, rs_gdk_load_meta, rs_photo_save);
133
 
        rs_add_filetype("png", FILETYPE_PNG, ".png", _("PNG (Portable Network Graphics)"),
134
 
                rs_image16_open_gdk, rs_gdk_load_meta, rs_photo_save);
135
 
        rs_add_filetype("tiff8", FILETYPE_TIFF8, ".tif", _("8-bit TIFF (Tagged Image File Format)"),
136
 
                rs_image16_open_gdk, rs_gdk_load_meta, rs_photo_save);
137
 
        rs_add_filetype("tiff16", FILETYPE_TIFF16, ".tif", _("16-bit TIFF (Tagged Image File Format)"),
138
 
                rs_image16_open_gdk, rs_gdk_load_meta, rs_photo_save);
139
 
        return;
140
 
}
141
 
 
142
 
void
143
 
rs_free(RS_BLOB *rs)
144
 
{
145
 
        if (rs->photo)
146
 
                g_object_unref(rs->photo);
147
 
}
148
 
 
149
 
static void
150
 
photo_settings_changed(RS_PHOTO *photo, RSSettingsMask mask, RS_BLOB *rs)
151
 
{
152
 
        const gint snapshot = mask>>24;
153
 
        mask &= 0x00ffffff;
154
 
 
155
 
        /* Is this really safe? */
156
 
        if (snapshot != rs->current_setting)
157
 
                return;
158
 
 
159
 
        if (photo == rs->photo)
160
 
        {
161
 
                /* Update histogram */
162
 
                rs_histogram_set_settings(RS_HISTOGRAM_WIDGET(rs->histogram), rs->photo->settings[rs->current_setting]);
163
 
 
164
 
                /* Update histogram in curve */
165
 
                rs_curve_draw_histogram(RS_CURVE_WIDGET(rs->curve[rs->current_setting]),
166
 
                        rs->histogram_dataset,
167
 
                        rs->photo->settings[rs->current_setting]);
168
 
        }
169
 
}
170
 
 
171
 
static void
172
 
photo_spatial_changed(RS_PHOTO *photo, RS_BLOB *rs)
173
 
{
174
 
        if (photo == rs->photo)
175
 
        {
176
 
                /* Update histogram dataset */
177
 
                if (rs->histogram_dataset)
178
 
                        rs_image16_free(rs->histogram_dataset);
179
 
 
180
 
                rs->histogram_dataset = rs_image16_transform(photo->input, NULL,
181
 
                        NULL, NULL, photo->crop, 250, 250,
182
 
                        TRUE, -1.0f, photo->angle, photo->orientation, NULL);
183
 
 
184
 
                rs_histogram_set_image(RS_HISTOGRAM_WIDGET(rs->histogram), rs->histogram_dataset);
185
 
 
186
 
                /* Force update of histograms */
187
 
                photo_settings_changed(photo, MASK_ALL, rs);
188
 
        }
189
 
}
190
 
 
191
 
void
192
 
rs_set_photo(RS_BLOB *rs, RS_PHOTO *photo)
193
 
{
194
 
        g_assert(rs != NULL);
195
 
 
196
 
        /* Unref old photo if any */
197
 
        if (rs->photo)
198
 
                g_object_unref(rs->photo);
199
 
        rs->photo = NULL;
200
 
 
201
 
        /* Apply settings from photo */
202
 
        rs_settings_copy(photo->settings[0], MASK_ALL, rs->settings[0]);
203
 
        rs_settings_copy(photo->settings[1], MASK_ALL, rs->settings[1]);
204
 
        rs_settings_copy(photo->settings[2], MASK_ALL, rs->settings[2]);
205
 
 
206
 
        /* make sure we're synchronized */
207
 
        rs_settings_link(rs->settings[0], photo->settings[0]);
208
 
        rs_settings_link(rs->settings[1], photo->settings[1]);
209
 
        rs_settings_link(rs->settings[2], photo->settings[2]);
210
 
 
211
 
        /* ... both ways */
212
 
        rs_settings_link(photo->settings[0], rs->settings[0]);
213
 
        rs_settings_link(photo->settings[1], rs->settings[1]);
214
 
        rs_settings_link(photo->settings[2], rs->settings[2]);
215
 
 
216
 
        /* Set photo in preview-widget */
217
 
        rs_preview_widget_set_photo(RS_PREVIEW_WIDGET(rs->preview), photo);
218
 
 
219
 
        /* Save photo in blob */
220
 
        rs->photo = photo;
221
 
 
222
 
        if (rs->photo)
223
 
        {
224
 
                g_signal_connect(G_OBJECT(rs->photo), "settings-changed", G_CALLBACK(photo_settings_changed), rs);
225
 
                g_signal_connect(G_OBJECT(rs->photo), "spatial-changed", G_CALLBACK(photo_spatial_changed), rs);
226
 
 
227
 
                /* Force an update! */
228
 
                photo_spatial_changed(rs->photo, rs);
229
 
        }
230
 
}
231
 
 
232
 
void
233
 
rs_set_snapshot(RS_BLOB *rs, gint snapshot)
234
 
{
235
 
        g_assert (rs != NULL);
236
 
        g_assert ((snapshot>=0) && (snapshot<=2));
237
 
 
238
 
        rs->current_setting = snapshot;
239
 
 
240
 
        /* Switch preview widget to the correct snapshot */
241
 
        rs_preview_widget_set_snapshot(RS_PREVIEW_WIDGET(rs->preview), 0, snapshot);
242
 
 
243
 
        /* Force an update */
244
 
        if (rs->photo)
245
 
                photo_settings_changed(rs->photo, MASK_ALL|(snapshot<<24), rs);
246
 
}
247
 
 
248
 
gboolean
249
 
rs_photo_save(RS_PHOTO *photo, const gchar *filename, gint filetype, gint width, gint height, gboolean keep_aspect, gdouble scale, gint snapshot, RS_CMS *cms)
250
 
{
251
 
        GdkPixbuf *pixbuf;
252
 
        RS_IMAGE16 *rsi;
253
 
        RS_IMAGE16 *sharpened;
254
 
        RS_IMAGE16 *image16;
255
 
        gint quality = 100;
256
 
        gboolean uncompressed_tiff = FALSE;
257
 
        RSColorTransform *rct;
258
 
        void *transform = NULL;
259
 
        RS_EXIF_DATA *exif;
260
 
 
261
 
        g_assert(RS_IS_PHOTO(photo));
262
 
        g_assert(filename != NULL);
263
 
 
264
 
        rs_image16_demosaic(photo->input, RS_DEMOSAIC_PPG);
265
 
 
266
 
        sharpened = rs_image16_sharpen(photo->input, NULL, photo->settings[snapshot]->sharpen, NULL);
267
 
 
268
 
        /* transform and crop */
269
 
        rsi = rs_image16_transform(sharpened, NULL,
270
 
                        NULL, NULL, photo->crop, width, height, keep_aspect, scale,
271
 
                        photo->angle, photo->orientation, NULL);
272
 
 
273
 
        rs_image16_unref(sharpened);
274
 
 
275
 
        if (cms)
276
 
                transform = rs_cms_get_transform(cms, TRANSFORM_EXPORT);
277
 
 
278
 
        /* Initialize color transform */
279
 
        rct = rs_color_transform_new();
280
 
        rs_color_transform_set_cms_transform(rct, transform);
281
 
        rs_color_transform_set_adobe_matrix(rct, &photo->metadata->adobe_coeff);
282
 
        rs_color_transform_set_from_settings(rct, photo->settings[snapshot], MASK_ALL);
283
 
        rs_color_transform_set_output_format(rct, 8);
284
 
 
285
 
        /* actually save */
286
 
        switch (filetype)
287
 
        {
288
 
                case FILETYPE_JPEG:
289
 
                        pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, rsi->w, rsi->h);
290
 
                        rs_color_transform_transform(rct, rsi->w, rsi->h, rsi->pixels,
291
 
                                rsi->rowstride, gdk_pixbuf_get_pixels(pixbuf), gdk_pixbuf_get_rowstride(pixbuf));
292
 
 
293
 
                        rs_conf_get_integer(CONF_EXPORT_JPEG_QUALITY, &quality);
294
 
                        if (quality > 100)
295
 
                                quality = 100;
296
 
                        else if (quality < 0)
297
 
                                quality = 0;
298
 
 
299
 
                        rs_jpeg_save(pixbuf, filename, quality, rs_cms_get_profile_filename(cms, CMS_PROFILE_EXPORT));
300
 
                        g_object_unref(pixbuf);
301
 
                        break;
302
 
                case FILETYPE_PNG:
303
 
                        pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, rsi->w, rsi->h);
304
 
                        rs_color_transform_transform(rct, rsi->w, rsi->h, rsi->pixels, rsi->rowstride,
305
 
                                gdk_pixbuf_get_pixels(pixbuf), gdk_pixbuf_get_rowstride(pixbuf));
306
 
                        gdk_pixbuf_save(pixbuf, filename, "png", NULL, NULL);
307
 
                        g_object_unref(pixbuf);
308
 
                        break;
309
 
                case FILETYPE_TIFF8:
310
 
                        pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, rsi->w, rsi->h);
311
 
                        rs_conf_get_boolean(CONF_EXPORT_TIFF_UNCOMPRESSED, &uncompressed_tiff);
312
 
                        rs_color_transform_transform(rct, rsi->w, rsi->h, rsi->pixels,
313
 
                                rsi->rowstride, gdk_pixbuf_get_pixels(pixbuf), gdk_pixbuf_get_rowstride(pixbuf));
314
 
                        rs_tiff8_save(pixbuf, filename, rs_cms_get_profile_filename(cms, CMS_PROFILE_EXPORT), uncompressed_tiff);
315
 
                        g_object_unref(pixbuf);
316
 
                        break;
317
 
                case FILETYPE_TIFF16:
318
 
                        rs_conf_get_boolean(CONF_EXPORT_TIFF_UNCOMPRESSED, &uncompressed_tiff);
319
 
                        image16 = rs_image16_new(rsi->w, rsi->h, 3, 3);
320
 
                        rs_color_transform_set_output_format(rct, 16);
321
 
                        rs_color_transform_transform(rct, rsi->w, rsi->h,
322
 
                                rsi->pixels, rsi->rowstride,
323
 
                                image16->pixels, image16->rowstride*2);
324
 
                        rs_tiff16_save(image16, filename, rs_cms_get_profile_filename(cms, CMS_PROFILE_EXPORT), uncompressed_tiff);
325
 
                        rs_image16_free(image16);
326
 
                        break;
327
 
        }
328
 
 
329
 
        rs_image16_free(rsi);
330
 
        g_object_unref(rct);
331
 
 
332
 
        photo->exported = TRUE;
333
 
        rs_cache_save(photo, MASK_ALL);
334
 
 
335
 
        /* Set the exported flag */
336
 
        rs_store_set_flags(NULL, photo->filename, NULL, NULL, &photo->exported);
337
 
 
338
 
        /* Save exif for JPEG files */
339
 
        if (filetype == FILETYPE_JPEG)
340
 
        {
341
 
                exif = rs_exif_load_from_file(photo->filename);
342
 
                if (exif)
343
 
                {
344
 
                        rs_exif_add_to_file(exif, filename);
345
 
                        rs_exif_free(exif);
346
 
                }
347
 
        }
348
 
 
349
 
        return(TRUE);
350
 
}
351
 
 
352
 
RS_BLOB *
353
 
rs_new(void)
354
 
{
355
 
        RS_BLOB *rs;
356
 
        guint c;
357
 
        rs = g_malloc(sizeof(RS_BLOB));
358
 
        rs->histogram_dataset = NULL;
359
 
        rs->settings_buffer = NULL;
360
 
        rs->photo = NULL;
361
 
        rs->queue = rs_batch_new_queue();
362
 
        rs->current_setting = 0;
363
 
        for(c=0;c<3;c++)
364
 
                rs->settings[c] = rs_settings_new();
365
 
        return(rs);
366
 
}
367
 
 
368
 
void
369
 
rs_gdk_load_meta(const gchar *src, RSMetadata *metadata)
370
 
{
371
 
        metadata->thumbnail = gdk_pixbuf_new_from_file_at_size(src, 128, 128, NULL);
372
 
}
373
 
 
374
 
void
375
 
rs_white_black_point(RS_BLOB *rs)
376
 
{
377
 
        if (rs->photo)
378
 
        {
379
 
                guint hist[4][256];
380
 
                gint i = 0;
381
 
                gdouble black_threshold = 0.003; // Percent underexposed pixels
382
 
                gdouble white_threshold = 0.01; // Percent overexposed pixels
383
 
                gdouble blackpoint;
384
 
                gdouble whitepoint;
385
 
                guint total = 0;
386
 
                RSColorTransform *rct;
387
 
 
388
 
                rct = rs_color_transform_new();
389
 
                rs_color_transform_set_from_settings(rct, rs->photo->settings[rs->current_setting], MASK_ALL ^ MASK_CURVE);
390
 
                rs_color_transform_make_histogram(rct, rs->histogram_dataset, hist);
391
 
                g_object_unref(rct);
392
 
 
393
 
                // calculate black point
394
 
                while(i < 256) {
395
 
                        total += hist[R][i]+hist[G][i]+hist[B][i];
396
 
                        if ((total/3) > ((250*250*3)/100*black_threshold))
397
 
                                break;
398
 
                        i++;
399
 
                }
400
 
                blackpoint = (gdouble) i / (gdouble) 255;
401
 
                
402
 
                // calculate white point
403
 
                i = 255;
404
 
                while(i) {
405
 
                        total += hist[R][i]+hist[G][i]+hist[B][i];
406
 
                        if ((total/3) > ((250*250*3)/100*white_threshold))
407
 
                                break;
408
 
                        i--;
409
 
                }
410
 
                whitepoint = (gdouble) i / (gdouble) 255;
411
 
 
412
 
                rs_curve_widget_move_knot(RS_CURVE_WIDGET(rs->curve[rs->current_setting]),0,blackpoint,0.0);
413
 
                rs_curve_widget_move_knot(RS_CURVE_WIDGET(rs->curve[rs->current_setting]),-1,whitepoint,1.0);
414
 
        }
415
 
}
416
 
 
417
 
/**
418
 
 * This is a very simple regression test for Rawstudio. Filenames will be read
419
 
 * from "testimages" in the current directory, one filename per line, and a
420
 
 * small series of tests will be carried out for each filename. Output can be
421
 
 * piped to a file for further processing.
422
 
 */
423
 
void
424
 
test()
425
 
{
426
 
        gchar *filename, *basename;
427
 
        GdkPixbuf *pixbuf;
428
 
        GIOChannel *io = g_io_channel_new_file("testimages", "r", NULL);
429
 
        gint sum, good = 0, bad = 0;
430
 
 
431
 
        printf("basename, load, filetype, thumb, meta, make, a-make, a-model, aperture, iso, s-speed, wb, f-length\n");
432
 
        while (G_IO_STATUS_EOF != g_io_channel_read_line(io, &filename, NULL, NULL, NULL))
433
 
        {
434
 
                gboolean filetype_ok = FALSE;
435
 
                gboolean load_ok = FALSE;
436
 
                gboolean thumbnail_ok = FALSE;
437
 
                gboolean load_meta_ok = FALSE;
438
 
                gboolean make_ok = FALSE;
439
 
                gboolean make_ascii_ok = FALSE;
440
 
                gboolean model_ascii_ok = FALSE;
441
 
                gboolean aperture_ok = FALSE;
442
 
                gboolean iso_ok = FALSE;
443
 
                gboolean shutterspeed_ok = FALSE;
444
 
                gboolean wb_ok = FALSE;
445
 
                gboolean focallength_ok = FALSE;
446
 
 
447
 
                g_strstrip(filename);
448
 
 
449
 
                if (rs_filetype_can_load(filename))
450
 
                {
451
 
                        RS_PHOTO *photo = NULL;
452
 
                        filetype_ok = TRUE;
453
 
                        photo = rs_photo_load_from_file(filename, TRUE);
454
 
                        if (photo)
455
 
                        {
456
 
                                load_ok = TRUE;
457
 
                                g_object_unref(photo);
458
 
                        }
459
 
 
460
 
                        RSMetadata *metadata = rs_metadata_new_from_file(filename);
461
 
 
462
 
                        load_meta_ok = TRUE;
463
 
 
464
 
                        if (metadata->make != MAKE_UNKNOWN)
465
 
                                make_ok = TRUE;
466
 
                        if (metadata->make_ascii != NULL)
467
 
                                make_ascii_ok = TRUE;
468
 
                        if (metadata->model_ascii != NULL)
469
 
                                model_ascii_ok = TRUE;
470
 
                        if (metadata->aperture > 0.0)
471
 
                                aperture_ok = TRUE;
472
 
                        if (metadata->iso > 0)
473
 
                                iso_ok = TRUE;
474
 
                        if (metadata->shutterspeed > 1.0)
475
 
                                shutterspeed_ok = TRUE;
476
 
                        if (metadata->cam_mul[0] > 0.1 && metadata->cam_mul[0] != 1.0)
477
 
                                wb_ok = TRUE;
478
 
                        if (metadata->focallength > 0.0)
479
 
                                focallength_ok = TRUE;
480
 
 
481
 
                        /* FIXME: Port to RSFiletype */
482
 
                        pixbuf = rs_metadata_get_thumbnail(metadata);
483
 
                        if (pixbuf)
484
 
                        {
485
 
                                thumbnail_ok = TRUE;
486
 
                                g_object_unref(pixbuf);
487
 
                        }
488
 
                        g_object_unref(metadata);
489
 
 
490
 
                }
491
 
 
492
 
                basename = g_path_get_basename(filename);
493
 
                printf("%s, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n",
494
 
                        basename,
495
 
                        load_ok,
496
 
                        filetype_ok,
497
 
                        thumbnail_ok,
498
 
                        load_meta_ok,
499
 
                        make_ok,
500
 
                        make_ascii_ok,
501
 
                        model_ascii_ok,
502
 
                        aperture_ok,
503
 
                        iso_ok,
504
 
                        shutterspeed_ok,
505
 
                        wb_ok,
506
 
                        focallength_ok
507
 
                );
508
 
                sum = load_ok
509
 
                        +filetype_ok
510
 
                        +thumbnail_ok
511
 
                        +load_meta_ok
512
 
                        +make_ok
513
 
                        +make_ascii_ok
514
 
                        +model_ascii_ok
515
 
                        +aperture_ok
516
 
                        +iso_ok
517
 
                        +shutterspeed_ok
518
 
                        +wb_ok
519
 
                        +focallength_ok;
520
 
 
521
 
                good += sum;
522
 
                bad += (12-sum);
523
 
 
524
 
                g_free(basename);
525
 
 
526
 
                g_free(filename);
527
 
        }
528
 
        printf("Passed: %d Failed: %d (%d%%)\n", good, bad, (good*100)/(good+bad));
529
 
        g_io_channel_shutdown(io, TRUE, NULL);
530
 
        exit(0);
531
 
}
532
 
 
533
 
/* We use out own reentrant locking for GDK/GTK */
534
 
 
535
 
static GStaticRecMutex gdk_lock = G_STATIC_REC_MUTEX_INIT;
536
 
 
537
 
static void
538
 
rs_gdk_lock()
539
 
{
540
 
        g_static_rec_mutex_lock (&gdk_lock);
541
 
}
542
 
 
543
 
static void
544
 
rs_gdk_unlock()
545
 
{
546
 
        g_static_rec_mutex_unlock (&gdk_lock);
547
 
}
548
 
 
549
 
 
550
 
int
551
 
main(int argc, char **argv)
552
 
{
553
 
        RS_BLOB *rs;
554
 
        int optimized = 1;
555
 
        gboolean do_test = FALSE;
556
 
        int opt;
557
 
        gboolean use_system_theme = DEFAULT_CONF_USE_SYSTEM_THEME;
558
 
 
559
 
        while ((opt = getopt(argc, argv, "nt")) != -1) {
560
 
                switch (opt) {
561
 
                case 'n':
562
 
                        optimized = 0;
563
 
                        break;
564
 
                case 't':
565
 
                        do_test = TRUE;
566
 
                        break;
567
 
                }
568
 
        }
569
 
 
570
 
        gdk_threads_set_lock_functions(rs_gdk_lock, rs_gdk_unlock);
571
 
        g_thread_init(NULL);
572
 
        gdk_threads_init();
573
 
 
574
 
        /* Bind default C functions */
575
 
        rs_bind_default_functions();
576
 
 
577
 
        /* Bind optimized functions if any */
578
 
        if (likely(optimized)) {
579
 
                rs_bind_optimized_functions();
580
 
        }
581
 
 
582
 
#ifdef ENABLE_NLS
583
 
        bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
584
 
        bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
585
 
        textdomain(GETTEXT_PACKAGE);
586
 
#endif
587
 
 
588
 
        /* Make sure the GType system is initialized */
589
 
        g_type_init();
590
 
 
591
 
        /* Switch to rawstudio theme before any drawing if needed */
592
 
        rs_conf_get_boolean_with_default(CONF_USE_SYSTEM_THEME, &use_system_theme, DEFAULT_CONF_USE_SYSTEM_THEME);
593
 
        if (!use_system_theme)
594
 
                gui_select_theme(RAWSTUDIO_THEME);
595
 
 
596
 
        rs_init_filetypes();
597
 
        gtk_init(&argc, &argv);
598
 
        check_install();
599
 
 
600
 
        rs = rs_new();
601
 
        rs->queue->cms = rs->cms = rs_cms_init();
602
 
 
603
 
        if (do_test)
604
 
                test();
605
 
        else
606
 
                gui_init(argc, argv, rs);
607
 
 
608
 
        /* This is so fucking evil, but Rawstudio will deadlock in some GTK atexit() function from time to time :-/ */
609
 
        _exit(0);
610
 
}