1
/**************************************************************************
3
Fotoxx edit photos and manage collections
5
Copyright 2007 2008 2009 2010 2011 Michael Cornelison
6
Source URL: http://kornelix.squarespace.com/fotoxx
7
Contact: kornelix2@googlemail.com
9
This program is free software: you can redistribute it and/or modify
10
it under the terms of the GNU General Public License as published by
11
the Free Software Foundation, either version 3 of the License, or
12
(at your option) any later version.
14
This program is distributed in the hope that it will be useful,
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
GNU General Public License for more details.
19
You should have received a copy of the GNU General Public License
20
along with this program. If not, see http://www.gnu.org/licenses/.
22
***************************************************************************/
30
#define TEXTWIN GTK_TEXT_WINDOW_TEXT // GDK window of GTK text view
31
#define NODITHER GDK_RGB_DITHER_NONE
32
#define ALWAYS GTK_POLICY_ALWAYS
33
#define NEVER GTK_POLICY_NEVER
34
#define RGBCOLOR GDK_COLORSPACE_RGB
35
#define LINEATTRIBUTES GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER
36
#define BILINEAR GDK_INTERP_BILINEAR
37
#define HYPER GDK_INTERP_HYPER
38
#define MWIN GTK_WINDOW(mWin)
40
// EXIF/IPTC keys for embedded image data
42
#define iptc_tags_key "Keywords" // tags (IPTC)
43
#define iptc_rating_key "Rating" // star rating (IPTC)
44
#define exif_date_key "DateTimeOriginal" // date/time (EXIF)
45
#define exif_width_key "ImageWidth" // width, pixels (EXIF)
46
#define exif_height_key "ImageHeight" // height, pixels (EXIF)
47
#define exif_orientation_key "Orientation" // orientation (EXIF)
48
#define iptc_editlog_key "EditStatus" // edits applied list (IPTC)
49
#define exif_comment_key "UserComment" // user comments (EXIF)
50
#define iptc_caption_key "Caption-Abstract" // image caption (IPTC)
51
#define exif_focal_length_key "FocalLengthIn35mmFormat" // focal length (EXIF)
55
#define mega (1024 * 1024)
56
#define ftrash "Desktop/fotoxx-trash" // special trash folder location
57
#define def_jpeg_quality "90" // default jpeg quality (high)
58
#define pi 3.141592654
59
#define PXMpix(pxm,px,py) ((uint16 *) pxm->bmp+((py)*(pxm->ww)+(px))*3) // return PXM pixel[3] at (px,py) (16-bit)
60
#define PXMpix8(pxm,px,py) ((uint8 *) pxm->bmp+((py)*(pxm->ww)+(px))*3) // return PXM pixel[3] at (px,py) (8-bit)
61
#define pixbright(pix) (0.25*(pix)[0]+0.65*(pix)[1]+0.10*(pix)[2]) // pixel brightness, 0-64K
62
#define pixred(pix) (25 * pix[0] / (pixbright(pix)+1)) // pixel redness, 0-100%
63
#define Nrecentfiles 100 // most recent image files
64
#define max_threads 6 // max. working threads v.10.10
65
#define maxedits 100 // max. edits, undo/redo depth
67
#define maxtagcats 200 // max tag categories
68
#define tagcc 50 // max cc for one tag or category ID
69
#define tagFcc 1000 // max tag cc for one image file
70
#define tagntc 1000 // max no. tags for one category
71
#define tagGcc 50000 // max tag cc for one category
72
#define tagTcc 50000 // max tag cc for all defined tags
73
#define tagMcc 200 // max tag cc for batch add tags
74
#define tagScc 200 // max tag cc for search tags
75
#define tagRcc 200 // max tag cc for recent tags
76
#define tagrecl 2000 // tag rec. cc (>maxfcc and >tagFcc)
77
#define tagdelims ",;" // valid tag delimiters (; obsolete) v.11.02
78
#define tagdelim1 ',' // delimiter for new tags v.11.02
79
#define tagdelim2 ", " // delimiter + blank v.11.02
81
// camera RAW file extensions (also upper case will work)
84
".3fr .ari .arw .srf .sr2 .bay .crw .cr2 .cap .iiq .eip .dcs .dcr " \
85
".drf .k25 .kdc .dng .erf .fff .mef .mos .mrw .nef .nrw .orf .pef " \
86
".ptx .pxn .r3d .raf .raw .rw2 .raw .rwl .dng .rwz .srw .x3f "
88
// externals from zfuncs module
91
extern char zlanguage[8]; // current language lc_RC
92
extern cchar *F1_help_topic; // F1 context help topic
93
extern char zicondir[200]; // where application icons live
94
extern int zdialog_busy; // tracks open zdialog's
95
extern int open_popup_windows; // tracks popup windows open
98
namespace image_navi { // image_gallery() data
99
extern char *galleryname; // directory or file list name
100
extern int gallerytype; // 1/2 = directory / file list
101
extern int nfiles, nimages; // file counts, total and images
102
extern int xwinW, xwinH; // image gallery window size
103
extern int thumbfilesize; // thumbnail file image size
104
extern int thumbsize; // curr. thumbnail display size
105
extern int genthumbs; // counts thumbnails generated
108
#define ccc (maxfcc*2+200) // max. command line size
109
EX char command[ccc]; // command, parameters, 2 filespecs
111
EX char PIDstring[12]; // process PID as string
112
EX int Nwt; // working threads to use
113
EX int wtnx[8]; // internal thread IDs
114
EX int wthreads_busy; // active thread count
116
EX GtkWidget *mWin, *drWin, *mVbox; // main and drawing window
117
EX GtkWidget *mMbar, *mTbar, *STbar; // menu bar, tool bar, status bar
118
EX GdkGC *gdkgc; // GDK graphics context
119
EX GdkColor black, white, red, green;
120
EX GdkColor lgray, dgray;
121
EX GdkColor fg_color; // current foreground color
122
EX GdkColormap *colormap;
125
EX GdkCursor *arrowcursor; // main window cursors
126
EX GdkCursor *dragcursor;
127
EX GdkCursor *drawcursor;
129
EX int Fexiftool; // exiftool program available
130
EX int Fexifwarned; // missing exiftool was warned
131
EX int Fufraw; // ufraw-batch program is available
132
EX int Fxdgopen; // xdg-open program available
133
EX int Fshutdown; // app shutdown underway
134
EX int Fdebug; // debug flag
135
EX int Fkillfunc; // signal, kill running function
136
EX int Ffuncbusy; // function is busy/working
137
EX int Wrepaint; // request window paint
138
EX int Wpainted; // window was repainted
139
EX int Fmodified; // image was edited/modified
140
EX int Fsaved; // image saved since last mod
141
EX int Ftagschanged; // image tags changed and not saved
142
EX int Fpreview; // use window image for edits
143
EX int Fblowup; // zoom small images to window size
144
EX int Fmenulock; // lock for some menu functions
145
EX int Fslideshow; // slide show mode is active
146
EX int Frecent; // start with recent files gallery
147
EX int Fprev; // start with previous file
149
EX int Fautosync; // auto file sync is requested
150
EX int Fmansync; // manual file sync is requested
151
EX int Fsyncbusy; // file sync is busy/working
152
EX cchar *fsync_lock; // synchronize files interlock v.11.11
154
EX char *topmenu; // latest top-menu selection
155
EX cchar *threadmessage; // popup message from thread process
157
EX char *SS_imagefile; // command line -slideshow parameter
158
EX char *SS_musicfile; // command line -music parameter
160
volatile // stop optimizer removing code v.11.03
161
EX int SB_goal, SB_done; // status bar progress tracking v.11.06
162
EX char SB_text[200]; // optional status bar application text
164
EX char *topdirk; // user's top-level image directory
165
EX char *curr_file, *curr_dirk; // current image file and directory
166
EX char *recentfiles[Nrecentfiles]; // most recent image files opened
167
EX char curr_file_type[8]; // jpg / tif / png / other
168
EX int curr_file_bpc; // image file bits/color, 8/16
169
EX int curr_file_size; // image file size on disk
170
EX int curr_file_posn; // position in current file set
171
EX int curr_file_count; // count of images in current set
172
EX double curr_image_time; // time current image opened v.11.07
174
EX char f_load_type[8]; // data returned by f_load()
175
EX int f_load_bpc, f_load_size;
176
EX char f_save_type[8]; // data returned by f_save()
177
EX int f_save_bpc, f_save_size;
178
EX char jpeg_quality[8]; // jpeg file save quality
180
// files and directories in /home/<user>/.fotoxx/
182
EX char topdirk_file[200]; // top directory file v.11.11
183
EX char tags_defined_file[200]; // tags defined file
184
EX char search_index_file[200]; // search index file v.11.02
185
EX char recentfiles_file[200]; // file of recent image files v.11.09
186
EX char collections_dirk[200]; // directory for saved image collections
187
EX char saved_areas_dirk[200]; // directory for saved select area files
188
EX char saved_curves_dirk[200]; // directory for saved curve data
189
EX char annotations_dirk[200]; // directory for annotation files
191
// fotoxx PXM pixmaps
193
typedef struct { // PXM pixmap
195
int ww, hh, bpc; // width, height, bits per color
196
void *bmp; // uint8*/uint16* (bpc=8/16)
199
EX PXM *Fpxm8; // input file pixmap, PXM-8
200
EX PXM *Fpxm16; // input file pixmap, PXM-16
201
EX PXM *E1pxm16; // edit pixmap, base image
202
EX PXM *E3pxm16; // edit pixmap, edited image
203
EX PXM *ERpxm16; // edit pixmap, undo/redo image
204
EX PXM *E8pxm16; // scratch image for some functions
205
EX PXM *E9pxm16; // scratch image for some functions
206
EX PXM *Dpxm16; // drawing window pixmap, 1x 16-bits
207
EX PXM *Dpxm8; // drawing window pixmap, Mscale 8-bits
209
EX int Fww, Fhh; // input image dimensions
210
EX int E1ww, E1hh, E3ww, E3hh; // edit image dimensions
211
EX int ERww, ERhh; // undo/redo image dimensions
212
EX int E9ww, E9hh; // scratch image dimensions
213
EX int Dww, Dhh; // drawing window size
215
EX mutex Fpixmap_lock; // lock for accessing PXM pixmaps
217
EX int Frefresh; // full image refresh needed
218
EX double Fzoom; // image zoom scale (0 = fit window)
219
EX int zoomx, zoomy; // req. zoom center of window
220
EX double Mscale; // scale factor, image to window
221
EX int Iww, Ihh; // current image size at 1x
222
EX int iww, ihh; // image area in drawing window at Mscale
223
EX int dww, dhh; // drawing window image, iww * Mscale
224
EX int Iorgx, Iorgy; // drawing window origin in image
225
EX int Dorgx, Dorgy; // image origin in drawing window
227
EX int Mbutton; // mouse button, 1/3 = left/right
228
EX int LMclick, RMclick; // mouse left, right click
229
EX int Mxclick, Myclick; // mouse click position
230
EX int Mxposn, Myposn; // mouse move position
231
EX int Mxdown, Mydown, Mxdrag, Mydrag; // mouse drag vector
232
EX int Mdrag; // mouse drag underway
233
EX int Mcapture; // mouse captured by edit function
235
EX int KBcapture; // KB key captured by edit function
236
EX int KBkey; // active keyboard key
238
EX int Ntoplines, Nptoplines; // lines on top of image in window
239
EX int toplinex1[4], topliney1[4], toplinex2[4], topliney2[4];
240
EX int ptoplinex1[4], ptopliney1[4], ptoplinex2[4], ptopliney2[4];
242
EX int Ftoparc, ptoparc; // arc (circle/ellipse) on top
243
EX int toparcx,toparcy,toparcw,toparch; // of image in window
244
EX int ptoparcx,ptoparcy,ptoparcw,ptoparch;
246
struct toptext_t { // list of text straings that are
247
int ID, px, py; // painted over image whenever
248
cchar *text; // the main window is repainted
251
#define maxtoptext 100 // max. text strings
252
EX toptext_t toptext[100]; // text strings written on main window
253
EX int Ntoptext; // current count
255
EX zdialog *zdedittags; // edit tags zdialog
256
EX zdialog *zdexifview; // view EXIF/IPTC data
257
EX zdialog *zdexifedit; // edit EXIF/IPTC data
258
EX zdialog *zdeditcctext; // edit IPTC caption and EXIF user comments
259
EX zdialog *zdrename; // rename file zdialog
260
EX zdialog *zdsela; // select area dialog
264
#define sa_initseq 10 // initial sequence number (0/1/2 reserved)
265
#define sa_maxseq 9999 // could go to 16 bits = 64K
266
EX int sa_geom1, sa_geom2;
267
EX uint16 sa_endpx[10000], sa_endpy[10000]; // last pixel drawn per seqence no.
268
EX int sa_thresh; // mouse pixel distance threshold
269
EX int sa_mouseradius; // mouse selection radius
270
EX int sa_mousex, sa_mousey; // mouse position in image
271
EX double sa_colormatch; // color range to match (0.001 to 1.0)
272
EX uint16 sa_matchRGB[1000][3]; // match colors, up to 1000
273
EX int sa_Nmatch; // count of match colors
274
EX int sa_firewall; // selected pixels block propagation
275
EX GdkColor *sa_pixRGB; // select area outline color
276
EX int sa_radius, sa_radius2; // current mouse radius, radius**2
277
EX int sa_calced; // edge calculation done
278
EX int sa_blend; // edge blend width
279
EX int sa_minx, sa_maxx; // enclosing rectangle for area
280
EX int sa_miny, sa_maxy;
281
EX char *sa_stackdirec; // pixel search stack
285
EX int sa_stat; // 0/1/2/3 = none/edit/pause/complete
286
EX int sa_mode; // 1-7 = curr. select area edit method
287
EX int sa_hole; // finish failure (outline has a hole)
288
EX int sa_currseq; // current select sequence no.
289
EX int sa_Ncurrseq; // current sequence pixel count
290
EX char *sa_pixselc; // maps pixels (re)selected in current cycle
291
EX uint16 *sa_pixmap; // 0/1/2+ = outside/edge/inside (edge dist)
292
EX int sa_Npixel; // total select_area pixel count
293
EX int sa_fww, sa_fhh; // valid image dimensions for select area
294
EX int Fshowarea; // show select area outline
295
EX int Factivearea; // select area complete and enabled
299
typedef void t_spcfunc(int spc); // callback function, spline curve edit
301
typedef struct { // spline curve data
302
GtkWidget *drawarea; // drawing area for spline curves
303
t_spcfunc *spcfunc; // callback function when curve changed
304
int Nspc; // number of active curves, 1-10
305
int vert[10]; // curve is vert. (1) or horz. (0)
306
int nap[10]; // anchor points per curve
307
double apx[10][50], apy[10][50]; // up to 50 anchor points per curve
308
double yval[10][1000]; // y-values for x = 0 to 1 by 0.001
309
int Nscale; // no. of fixed scale lines, 0-10
310
double xscale[2][10]; // 2 x-values for end points
311
double yscale[2][10]; // 2 y-values for end points v.11.10
314
// edit collections data
316
EX char *edit_coll_file; // current edit collection file
317
EX char *edit_coll_name; // collection name = file name
318
EX char *edit_coll_memberfile; // collection member image file
319
EX zdialog *zd_edit_coll; // edit collections dialog
321
// image edit function data
323
typedef struct { // edit function data
324
cchar *funcname; // function name, e.g. flatten
325
int Fprev; // flag, use preview window
326
int Farea; // select area: 0/1/2 = delete/ignore/usable
327
int Fpara; // flag, parallel edit OK
328
int Fmod; // flag, image modified by this func
329
zdialog *zd; // edit dialog
330
spldat *curves; // edit curve data
331
void * (*threadfunc)(void *); // edit thread function
332
void (*mousefunc)(); // edit mouse function
335
EX editfunc *CEF; // current active edit function
336
EX pvlist *editlog; // log of image edits done v.10.2
337
EX char *undo_files; // undo/redo stack, image files
338
EX int Pundo; // undo/redo stack position
339
EX int Pumax; // undo/redo stack depth
341
#define maxplugins 100
342
EX int Nplugins; // plugin menu items
343
EX char *plugins[100];
345
// The following are saved and restored across sessions.
346
// They belong to different functions in different source modules.
348
EX char *pversion; // prior fotoxx version
349
EX char *last_session; // last fotoxx session exit time
350
EX int Ffirsttime; // first time startup
351
EX int newfiles; // new files found since last synch
352
EX int mwgeom[4]; // main window position and size
353
EX cchar *tbar_style; // toolbar style
354
EX int Fwarnoverwrite; // warn overwrite of original image
355
EX char *lens4_name[4]; // names for 4 lenses
356
EX double lens4_mm[4], lens4_bow[4]; // characteristics for 4 lenses
357
EX double lens_mm, lens_bow; // current lens characteristics
358
EX int curr_lens; // current lens, 0-3
359
EX char lensname[40]; // current lens name
360
EX int trimsize[2]; // trim (crop) width, height
361
EX char *trimbuttons[6]; // trim dialog button labels
362
EX char *trimratios[6]; // corresponding aspect ratios
363
EX int editresize[2]; // edit resize width, height
364
EX int batchresize[2]; // batch resize width, height
365
EX int emailsize[2]; // email resize width, height
366
EX char *annotate_text; // annotation text
367
EX char *annotate_font; // font and size, e.g. "Sans 20"
368
EX char *annotate_color[3]; // text, background, text outline colors
369
EX int annotate_trans[3]; // corresp. transparencies
370
EX int annotate_outline; // text outline width, pixels
371
EX double annotate_angle; // angle of text
372
EX int Fgrid; // both grid lines on / off
373
EX int gridon[2]; // x/y gridlines on / off
374
EX int gridspace[2]; // x/y grid line spacing
375
EX int gridcount[2]; // x/y grid line counts (alternative)
376
EX int gridoffset[2]; // x/y grid line starting offsets
377
EX int rotate_grid[8]; // rotate function grid status
378
EX int unbend_grid[8]; // unbend function grid status
379
EX int warpC_grid[8]; // warp image (curved) grid status
380
EX int warpL_grid[8]; // warp image (linear) grid status
381
EX int warpF_grid[8]; // warp image (affine) grid status
382
#define SSNF 12 // no. slide show transition types
383
EX int ss_funcs[SSNF]; // user preferred transitions
384
EX char *ss_musicfile; // music file or playlist
388
int main(int argc, char * argv[]); // main program
389
int gtkinitfunc(void *data); // GTK initz. function
390
int gtimefunc(void *arg); // periodic function
391
void update_statusbar(); // update main window status bar
392
int delete_event(); // window delete event function
393
void destroy_event(); // window destroy event function
394
void topmenufunc(GtkWidget *, cchar *menu); // top level menu function
395
int mwpaint1(); // window repaint (expose event)
396
void mwpaint2(); // window repaint (thread callable)
397
void mwpaint3(int px, int py, int ww, int hh); // paint window area from image area
398
void mouse_event(GtkWidget *, GdkEventButton *, void *); // mouse event function
399
int KBpress(GtkWidget *, GdkEventKey *, void *); // KB key press event function
400
int KBrelease(GtkWidget *, GdkEventKey *, void *); // KB key release event
401
void paint_toplines(int arg); // paint lines on image
402
void paint_toparc(int arg); // paint arc on image
403
void paint_gridlines(); // paint grid lines on image
404
void draw_line(int x1, int y1, int x2, int y2); // draw line, image space
405
void erase_line(int x1, int y1, int x2, int y2); // erase line
406
void draw_pixel(int px, int py, GdkColor *color); // draw one pixel using color
407
void draw_fat_pixel(int px, int py, GdkColor *color); // draw one fat pixel using color
408
void add_toptext(int ID, int px, int py, cchar *text, cchar *font); // paint text on window (image space)
409
void erase_toptext(int ID); // remove all text strings with ID
410
void paint_toptext(); // paint text strings when window repainted
411
void paint_text(int px, int py, cchar *text, cchar *font); // paint text on window (window space)
413
typedef void CBfunc(); // callback function type
414
EX CBfunc *mouseCBfunc; // current mouse handler function
415
EX zdialog *mouse_zd; // current dialog holding mouse
417
void takeMouse(zdialog *zd, CBfunc func, GdkCursor *); // capture mouse for dialog v.11.03
418
void freeMouse(); // free mouse for main window
420
// spline curve edit functions
422
spldat * splcurve_init(GtkWidget *frame, void func(int spc)); // initialize spline curves
423
int splcurve_adjust(void *, GdkEventButton *event, spldat *); // curve editing function
424
int splcurve_draw(void *, void *, spldat *); // curve drawing function
425
int splcurve_generate(spldat *, int spc); // generate data from anchor points
426
double splcurve_yval(spldat *, int spc, double xval); // get curve y-value
427
int splcurve_load(spldat *sd); // load curve from a file
428
int splcurve_save(spldat *sd); // save curve to a file
430
// file menu functions
432
void m_gallery(GtkWidget *, cchar *); // show image gallery window
433
void m_gallery2(int Nth, int button); // receives clicked files
434
void m_clone1(GtkWidget *, cchar *); // start new fotoxx window (desktop 50/50)
435
void m_clone2(GtkWidget *, cchar *); // start new fotoxx window (overlay prior)
436
void m_open(GtkWidget *, cchar *); // open image file in same window
437
void m_open_drag(int x, int y, char *file); // open drag-drop file
438
void m_open_newin(GtkWidget *, cchar *); // open image file in new window
439
void m_previous(GtkWidget *, cchar *); // open previously accessed file
440
void m_recent(GtkWidget *, cchar *); // open recently accessed file
441
void add_recent_file(cchar *file); // add file to recent file list
442
int f_open(cchar *file, int flock, int Nth = 0, int fswitch = 0); // set new current file
443
void m_prev(GtkWidget *, cchar *); // open previous file in gallery
444
void m_next(GtkWidget *, cchar *); // open next file in gallery
445
void m_save(GtkWidget *, cchar *); // save modified image to same file
446
void m_savevers(GtkWidget *, cchar *); // save modified image to new file version
447
void m_saveas(GtkWidget *, cchar *); // save modified image to another file
448
void m_zoom(GtkWidget *, cchar *); // zoom image +/-
449
void m_create(GtkWidget *, cchar *); // create new blank image file
450
void m_trash(GtkWidget *, cchar *); // move image to trash
451
void m_rename(GtkWidget *, cchar *); // rename file
452
void m_batchrename(GtkWidget *, cchar *); // rename many files, base + sequence
453
void m_print(GtkWidget *, cchar *); // print image file
454
void m_quit(GtkWidget *, cchar *); // exit application
456
// tools menu functions
458
void m_manage_collections(GtkWidget *, cchar *); // create and edit image collections
459
void m_move_collections(GtkWidget *, cchar *); // change top image directory
460
void edit_coll_popmenu(GtkWidget *, char *file); // popup menu for editing collections
461
void m_moncheck(GtkWidget *, cchar *); // check monitor brightness and color
462
void m_mongamma(GtkWidget *, cchar *); // adjust monitor gamma
463
void m_histogram(GtkWidget *, cchar *); // start brightness histogram
464
void histogram_paint(); // update brightness histogram
465
void histogram_destroy(); // remove histogram window
466
void m_slideshow(GtkWidget *, cchar *); // enter or leave slideshow mode
467
void slideshow_next(cchar *); // show prev/next image
468
void m_show_RGB(GtkWidget *, cchar *); // show RGB values at mouse click
469
void m_gridlines(GtkWidget *, cchar *); // set up grid lines
470
void load_grid(int *griddata); // load grid from saved state
471
void save_grid(int *griddata); // save grid to saved state
472
void toggle_grid(int action); // set grid off/on or toggle (0/1/2)
473
void m_lensparms(GtkWidget *, cchar *); // edit lens parameters
474
void m_lang(GtkWidget *, cchar *); // change language
475
void m_translate(GtkWidget *, cchar *); // edit translation
476
void m_menu_launcher(GtkWidget *, cchar *); // make desktop menu entry and launcher
477
void m_conv_raw(GtkWidget *, cchar *); // convert RAW files to tiff
478
void m_burn(GtkWidget *, cchar *); // burn selected images to CD/DVD
479
void m_email(GtkWidget *, cchar *); // e-mail selected images
480
void m_syncfiles(GtkWidget *, cchar *); // rebuild thumbnails and search index
481
int syncfiles_func(void *); // sync files function (in subprocess)
482
void m_tbar_style(GtkWidget *, cchar *); // customize toolbar style dialog
483
void tbar_style_set(cchar *style); // set toolbar style (initz. and dialog)
484
void m_memory_usage(GtkWidget *, cchar *); // report memory consumption by category
486
// Image Information menu functions (EXIF, IPTC, etc.)
488
void m_edit_cctext(GtkWidget *, cchar *); // edit caption and user comments dialog
489
void m_edit_tags(GtkWidget *, cchar *); // edit tags dialog
490
void m_manage_tags(GtkWidget *, cchar *); // manage tags dialog
491
void load_fileinfo(cchar *file); // EXIF/IPTC >> tags_date, _stars, _filetags
492
void save_fileinfo(cchar *file); // tags_date, _stars, _filetags >> EXIF/IPTC
493
void update_search_index(cchar *file); // update search index file
494
void delete_search_index(cchar *file); // delete entry from search index file
495
void m_batchAddTags(GtkWidget *, cchar *); // add tags to many files at once
496
void m_batchDelTag(GtkWidget *, cchar *); // delete/replace a tag for many files
497
void m_info_view_short(GtkWidget *, cchar *); // view selected EXIF/IPTC data
498
void m_info_view_long(GtkWidget *, cchar *); // view all EXIF/IPTC data
499
void info_view(int length); // view EXIF/IPTC data in popup window
500
void m_info_edit(GtkWidget *, cchar *); // add or change EXIF/IPTC data
501
void m_info_delete(GtkWidget *, cchar *); // delete EXIF/IPTC data
502
char ** info_get(cchar *file, cchar **keys, int nkeys); // get EXIF/IPTC data for given key(s)
503
int info_put(cchar *file, cchar **keys, cchar **text, int nkeys); // put EXIF/IPTC data for given key(s)
504
int info_copy(cchar *f1, cchar *f2, cchar **k, cchar **t, int nk); // copy EXIF/IPTC data from file to file
505
void m_search_images(GtkWidget *, cchar *); // search tags, comments, captions, files
507
// select area menu functions
509
void m_select(GtkWidget *, cchar *); // select area within image
510
void m_select_show(GtkWidget *, cchar *); // enable area for subsequent edits
511
void m_select_hide(GtkWidget *, cchar *); // show area outline
512
void m_select_enable(GtkWidget *, cchar *); // hide area outline
513
void m_select_disable(GtkWidget *, cchar *); // disable area
514
void m_select_invert(GtkWidget *, cchar *); // invert area
515
void m_select_unselect(GtkWidget *, cchar *); // unselect area
516
void m_select_copy(GtkWidget *, cchar *); // copy area, save in memory
517
void m_select_paste(GtkWidget *, cchar *); // paste saved area into image
518
void m_select_open(GtkWidget *, cchar *); // open an area file, save in memory
519
void m_select_save(GtkWidget *, cchar *); // save area to a file
520
void m_select_whole_image(GtkWidget *, cchar *); // select whole image area
521
void m_select_edit(GtkWidget *, cchar *); // select and edit in parallel
523
// functions for area selection using the mouse
525
void sa_geom_mousefunc(); // select rectangle or ellipse
526
void sa_draw_mousefunc(); // line drawing functions
527
int sa_nearpix(int mx, int my, int rad, int &npx, int &npy); // find nearest line-end
528
void sa_draw_line(int px1, int py1, int px2, int py2); // draw a connected line
529
void sa_draw1pix(int px, int py); // draw one pixel if not already
530
void sa_color_mousefunc(); // color range select function
531
void sa_radius_mousefunc(); // radius select function
532
void sa_nextseq(); // start next sequence number
533
void sa_unselect_pixels(); // remove current selection
535
// other select area functions
537
void sa_finish(); // finish - map interior pixels
538
void sa_finish_auto(); // finish - interior pixels already known
539
void sa_map_pixels(); // map edge and interior pixels
540
void sa_unfinish(); // set finished area back to edit mode
541
void sa_show(int flag); // show or hide area
542
void sa_enable(); // enable area
543
void sa_disable(); // disable area
544
void sa_invert(); // invert area
545
void sa_unselect(); // unselect area
546
void sa_edgecalc(); // calculate edge distances
548
// image edit functions - transform menu
550
void m_rotate(GtkWidget *, cchar *); // rotate image
551
void m_trim(GtkWidget *, cchar *); // trim image
552
void m_resize(GtkWidget *, cchar *); // resize image
553
void m_batchresize(GtkWidget *, cchar *); // resize many images
554
void m_annotate(GtkWidget *, cchar *); // annotate image
555
void m_flip(GtkWidget *, cchar *); // flip horizontally or vertically
556
void m_negate(GtkWidget *, cchar *); // B+W and color negatives
557
void m_unbend(GtkWidget *, cchar *); // fix perspective problems
558
void m_keystone(GtkWidget *, cchar *); // convert tetragon image to rectangle
559
void m_warp_area(GtkWidget *, cchar *); // warp image within an area
560
void m_warp_curved(GtkWidget *, cchar *); // warp image, curved transform
561
void m_warp_linear(GtkWidget *, cchar *); // warp image, linear transform
562
void m_warp_affine(GtkWidget *, cchar *); // warp image, affine transform
564
// image edit functions - retouch menu
566
void m_tune(GtkWidget *, cchar *); // brightness / color adjustments
567
void m_gamma(GtkWidget *, cchar *); // gamma adjustments
568
void m_xbrange(GtkWidget *, cchar *); // clip brightness, expand rest
569
void m_flatten(GtkWidget *, cchar *); // flatten brightness distribution
570
void m_brightramp(GtkWidget *, cchar *); // ramp brightness across image
571
void m_tonemap(GtkWidget *, cchar *); // tone mapping
572
void m_whitebal(GtkWidget *, cchar *); // adjust white balance
573
void m_match_color(GtkWidget *, cchar *); // set image2 colors to match image1
574
void m_DRGB(GtkWidget *, cchar *); // brightness / color adjust with OD units
575
void m_revise_RGB(GtkWidget *, cchar *); // revise RGB values
576
void m_redeye(GtkWidget *, cchar *); // red-eye removal
577
void m_blur(GtkWidget *, cchar *); // blur image
578
void m_sharpen(GtkWidget *, cchar *); // sharpen image
579
void m_denoise(GtkWidget *, cchar *); // image noise reduction
580
void m_smart_erase(GtkWidget *, const char *); // smart erase object
581
void m_dust(GtkWidget *, const char *); // remove dust
582
void m_pixedit(GtkWidget *, cchar *); // edit pixels
584
// image edit functions - art menu
586
void m_colordep(GtkWidget *, cchar *); // set color depth 1-16 bits/color
587
void m_draw(GtkWidget *, cchar *); // make simulated drawing
588
void m_outlines(GtkWidget *, cchar *); // make an outline image
589
void m_emboss(GtkWidget *, cchar *); // make simulated embossing
590
void m_tiles(GtkWidget *, cchar *); // make simulated tiles (pixelate)
591
void m_dots(GtkWidget *, cchar *); // convert image to dot matrix form
592
void m_painting(GtkWidget *, cchar *); // make simulated painting
594
// image edit functions - combine menu
596
void m_HDR(GtkWidget *, cchar *); // make HDR composite image
597
void m_HDF(GtkWidget *, cchar *); // make HDF composite image
598
void m_STP(GtkWidget *, cchar *); // stack / paint image
599
void m_STN(GtkWidget *, cchar *); // stack / noise reduction
600
void m_pano(GtkWidget *, cchar *); // make panorama composite image
601
void m_vpano(GtkWidget *, cchar *); // make vertical panorama
603
// plugin functions // v.11.03
605
void m_run_plugin(GtkWidget *, cchar *); // perform a plugin edit function
606
void m_edit_plugins(GtkWidget *, cchar *); // add and remove plugin functions
608
// edit support functions
610
int edit_setup(editfunc &EF); // start new edit transaction
611
void edit_suspend(); // suspend edit function (parallel)
612
void edit_cancel(editfunc &EF); // cancel edit
613
void edit_done(editfunc &EF); // commit edit, add undo stack
614
void edit_takeover(editfunc &EF); // set current (parallel) edit func
615
void edit_undo(); // undo edit, back to org. image
616
void edit_redo(); // redo the edit after undo
617
void edit_reset(); // reset to initial status
618
void edit_zapredo(); // clear image redo copy
619
void edit_fullsize(); // convert to full-size pixmaps
620
void m_undo(GtkWidget *, cchar *); // toolbar, undo one edit
621
void m_redo(GtkWidget *, cchar *); // toolbar, redo one edit
622
void undo_all(); // undo all edits of current image
623
void save_undo(cchar *funcname); // undo/redo save function
624
void load_undo(); // undo/redo read function
625
int mod_keep(); // query keep/discard edited image
626
int menulock(int lock); // lock/unlock menu for some funcs
627
int is_syncbusy(); // check Fsyncbusy, message user to wait
629
// thread support functions
631
typedef void * threadfunc(void *); // edit thread function
632
void start_thread(threadfunc func, void *arg); // start edit thread
633
void signal_thread(); // signal thread, work is pending
634
void wait_thread_idle(); // wait for work complete
635
void wrapup_thread(int command); // wait for exit or command exit
636
void thread_idle_loop(); // thread: wait for work or exit command
637
void thread_exit(); // thread: exit unconditionally
638
void start_wthread(threadfunc func, void *arg); // start working thread (per processor core)
639
void exit_wthread(); // exit working thread
640
void wait_wthreads(); // wait for working threads
642
// other support functions
644
void m_help(GtkWidget *, cchar *); // various help functions
645
void load_params(); // load parameters from prior session
646
void save_params(); // save parameters for next session
647
void brhood_calc(int radius, char method); // compute neighborhood brightness
648
float get_brhood(int px, int py); // get pixel neighborhood brightness
649
void free_resources(int fkeepundo = 0); // free all allocated resources
650
int vpixel(PXM *pxm, double px, double py, uint16 *vpix); // get virtual pixel at (px,py)
651
int sigdiff(double d1, double d2, double signf); // test for significant difference
653
// file load and save functions
655
PXM * f_load(cchar *filespec, int bpc); // load a file into an PXM pixmap
656
int f_save(char *outfile, cchar *type, int bpc); // save current image pixmap to a file
657
PXM * TIFFread(cchar *filespec); // read TIFF file, native bpc
658
int TIFFwrite(PXM *pxm, cchar *filespec); // write TIFF file, bpc from pxm
659
void tiffwarninghandler(cchar *mod, cchar *fmt, va_list); // intercepts TIFF lib warnings
660
PXM * PXBread(cchar *filespec); // read using pixbuf library, bpc = 8
661
int PXBwrite(PXM *pxm, cchar *filespec); // write using pixbuf library, bpc = 8
663
// PXM pixmap conversion functions
665
PXM * PXM_make(int ww, int hh, int bpc); // initialize PXM pixmap
666
void PXM_free(PXM *&pxm); // free PXM pixmap
667
PXM * PXM_copy(PXM *pxm); // copy PXM pixmap
668
PXM * PXM_copy_area(PXM *pxm, int orgx, int orgy, int ww, int hh); // copy section of PXM pixmap
669
PXM * PXM_convbpc(PXM *pxm); // convert from 8/16 to 16/8 bpc
670
PXM * PXM_rescale(PXM *pxm, int ww, int hh); // rescale PXM pixmap (ww/hh)
671
void PXM_update(PXM *p16, PXM *p8, int orgx, int orgy, int ww, int hh); // copy section of PXM-16 into PXM-8
672
PXM * PXM_rotate(PXM *pxm, double angle); // rotate PXM pixmap
673
void PXM_fixblue(PXM *pxm); // set blue = 0 pixels to blue = 1
675
// translatable strings used in multiple dialogs
677
#define Babsolute ZTX("absolute")
678
#define Badd ZTX("Add")
679
#define Baddall ZTX("Add All")
680
#define Ball ZTX("All")
681
#define Bamount ZTX("Amount")
682
#define Bapply ZTX("Apply")
683
#define Bblendwidth ZTX("Blend Width")
684
#define Bblue ZTX("Blue")
685
#define Bbrightness ZTX("Brightness")
686
#define Bbrowse ZTX("Browse")
687
#define Bcancel ZTX("Cancel")
688
#define Bclear ZTX("Clear")
689
#define Bcolor ZTX("Color")
690
#define Bcommit ZTX("Commit")
691
#define Bcopy ZTX("Copy")
692
#define Bcurvefile ZTX("Curve File:")
693
#define Bcut ZTX("Cut")
694
#define Bdarker ZTX("Darker Areas")
695
#define Bdelete ZTX("Delete")
696
#define Bdisable ZTX("Disable")
697
#define Bdone ZTX("Done")
698
#define Bedit ZTX("Edit")
699
#define Benable ZTX("Enable")
700
#define Berase ZTX("Erase")
701
#define Bexiftoolmissing ZTX("package libimage-exiftool-perl is required")
702
#define Bfetch ZTX("Fetch")
703
#define Bfinish ZTX("Finish")
704
#define Bfont ZTX("Font")
705
#define Bgreen ZTX("Green")
706
#define Bheight ZTX("Height")
707
#define Bhistogram ZTX("histogram")
708
#define Bhide ZTX("Hide")
709
#define Binsert ZTX("Insert")
710
#define Binvert ZTX("Invert")
711
#define Blighter ZTX("Lighter Areas")
712
#define Blimit ZTX("limit")
713
#define BmyMouse ZTX("my mouse")
714
#define Bnew ZTX("New")
715
#define Bnext ZTX("Next")
716
#define BOK ZTX("OK")
717
#define Bopen ZTX("Open")
718
#define Bopenrawfile ZTX("Open RAW File")
719
#define Bpaste ZTX("Paste")
720
#define Bpause ZTX("Pause")
721
#define Bpercent ZTX("Percent")
722
#define Bpresets ZTX("Presets")
723
#define Bproceed ZTX("Proceed")
724
#define Bradius ZTX("Radius")
725
#define Brange ZTX("range")
726
#define Bred ZTX("Red")
727
#define Bredo ZTX("Redo")
728
#define Breduce ZTX("Reduce")
729
#define Bremove ZTX("Remove")
730
#define Breset ZTX("Reset")
731
#define Bsave ZTX("Save")
732
#define Bsavetoedit ZTX("Unknown file type, save as tiff/jpeg/png to edit")
733
#define Bsearch ZTX("Search")
734
#define Bselect ZTX("Select")
735
#define Bselectfiles ZTX("Select Files")
736
#define Bshow ZTX("Show")
737
#define Bstart ZTX("Start")
738
#define Bthresh ZTX("Threshold")
739
#define Bundoall ZTX("Undo All")
740
#define Bundolast ZTX("Undo Last")
741
#define Bundo ZTX("Undo")
742
#define Bunfinish ZTX("Unfinish")
743
#define Bunselect ZTX("Unselect")
744
#define Bview ZTX("View")
745
#define Bwidth ZTX("Width")