84#if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__)
88#include <sys/malloc.h>
145#if !defined(_WIN32) && !defined(__APPLE__)
146#include <fontconfig/fontconfig.h>
149#include <glib/gstdio.h>
150#include <pango/pangocairo.h>
155#include <sys/param.h>
156#include <sys/types.h>
161#if defined(__x86_64__) || defined(__i386__)
162#include <xmmintrin.h>
165#ifdef HAVE_GRAPHICSMAGICK
166#include <magick/api.h>
167#elif defined HAVE_IMAGEMAGICK
168#include <MagickWand/MagickWand.h>
173#if defined(__SUNOS__)
174#include <sys/varargs.h>
183#if !defined(_WIN32) && !defined(__APPLE__)
196 gsize n_fields, gpointer user_data)
198 const gchar *message = NULL;
200 for(gsize
k = 0;
k < n_fields;
k++)
202 if(g_strcmp0(fields[
k].
key,
"MESSAGE"))
continue;
204 message = fields[
k].value;
214 if(!g_strcmp0(message,
"Unable to load dot from the cursor theme"))
215 return G_LOG_WRITER_HANDLED;
217 if(g_str_has_prefix(message,
"Theme parsing error:")
218 && g_str_has_suffix(message,
"The :insensitive pseudo-class is deprecated. Use :disabled instead."))
219 return G_LOG_WRITER_HANDLED;
221 if(g_str_has_prefix(message,
"Theme parsing error:")
222 && g_str_has_suffix(message,
"The :inconsistent pseudo-class is deprecated. Use :indeterminate instead."))
223 return G_LOG_WRITER_HANDLED;
226 return g_log_writer_default(log_level, fields, n_fields, user_data);
232 char *logfile = g_build_filename(g_get_user_cache_dir(),
"ansel",
"ansel-log.txt", NULL);
235 printf(
"usage: %s [options] [IMG_1234.{RAW,..}|image_folder/]\n", argv0);
237 printf(
"options:\n");
239 printf(
" --cachedir <user cache directory>\n");
240 printf(
" --conf <key>=<value>\n");
241 printf(
" --configdir <user config directory>\n");
242 printf(
" -d {all,cache,camctl,camsupport,colorprofile,control,demosaic,dev,gtk,history,imageio,import,\n");
243 printf(
" input,ioporder,lighttable,lua,masks,memory,nan,nocache_reuse,opencl,params,\n");
244 printf(
" perf,pipe,pipecache,print,pwstorage,signal,sql,shortcuts,tiling,undo,verbose}\n");
245 printf(
" --d-signal <signal> \n");
246 printf(
" --d-signal-act <all,raise,connect,disconnect");
248#ifdef DT_HAVE_SIGNAL_TRACE
249 printf(
",print-trace");
252 printf(
" --datadir <data directory>\n");
254 printf(
" --disable-opencl\n");
256 printf(
" -h, --help");
261 printf(
" --library <library file>\n");
262 printf(
" --localedir <locale directory>\n");
263 printf(
" --moduledir <module directory>\n");
264 printf(
" --noiseprofiles <noiseprofiles json file>\n");
265 printf(
" -t <num openmp threads>\n");
266 printf(
" --tmpdir <tmp directory>\n");
267 printf(
" --version\n");
270 printf(
" note: debug log and output will be written to this file:\n");
271 printf(
" %s\n", logfile);
283 char ver[100] = { 0 };
287 for(
char *
p = ver; *
p;
p++)
292 if(*
p >=
'0' && *
p <=
'9')
301 if(*
p ==
'.' || *
p ==
'+') count++;
309 return g_strdup(start);
315 char *ext = g_strrstr(filename,
".");
319 for(
const char **
i = dt_supported_extensions; !
IS_NULL_PTR(*
i);
i++)
320 if(!g_ascii_strncasecmp(ext, *
i, strlen(*
i)))
331 if(
IS_NULL_PTR(input) || input[0] ==
'\0')
return 0;
341 if(g_file_test(filename, G_FILE_TEST_IS_DIR))
354 if(single_image) *single_image =
FALSE;
359 gchar *directory = g_path_get_dirname((
const gchar *)filename);
390 if(single_image) *single_image =
TRUE;
399#if defined(__linux__)
400 FILE *
f = g_fopen(
"/proc/meminfo",
"rb");
405 int first = 1, found = 0;
407 while(!found &&
getline(&line, &len,
f) != -1)
409 char *colon = strchr(line,
':');
411 found = !strncmp(line,
"MemTotal:", 9);
412 if(found || first) mem = atol(colon + 1);
421#elif defined(__APPLE__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) \
422 || defined(__OpenBSD__)
423#if defined(__APPLE__)
424 int mib[2] = { CTL_HW, HW_MEMSIZE };
425#elif defined(HW_PHYSMEM64)
426 int mib[2] = { CTL_HW, HW_PHYSMEM64 };
428 int mib[2] = { CTL_HW, HW_PHYSMEM };
432 sysctl(mib, 2, (
void *)&physical_memory, &length, (
void *)NULL, 0);
433 return physical_memory / 1024;
435 MEMORYSTATUSEX memInfo;
436 memInfo.dwLength =
sizeof(MEMORYSTATUSEX);
437 GlobalMemoryStatusEx(&memInfo);
438 return memInfo.ullTotalPhys / (
uint64_t)1024;
441 fprintf(stderr,
"Unknown memory size. Assuming 2GB\n");
451int dt_init(
int argc,
char *argv[],
const gboolean init_gui,
const gboolean load_data)
456 if(getuid() == 0 || geteuid() == 0)
458 "WARNING: either your user id or the effective user id are 0. are you running darktable as root?\n");
465#ifdef M_MMAP_THRESHOLD
466 mallopt(M_MMAP_THRESHOLD, 128 * 1024);
482 pthread_mutexattr_t recursive_locking;
483 pthread_mutexattr_init(&recursive_locking);
484 pthread_mutexattr_settype(&recursive_locking, PTHREAD_MUTEX_RECURSIVE);
495 char *dbfilename_from_command = NULL;
496 char *noiseprofiles_from_command = NULL;
497 char *datadir_from_command = NULL;
498 char *moduledir_from_command = NULL;
499 char *localedir_from_command = NULL;
500 char *tmpdir_from_command = NULL;
501 char *configdir_from_command = NULL;
502 char *cachedir_from_command = NULL;
503 char *kerneldir_from_command = NULL;
506 gboolean exclude_opencl =
FALSE;
507 gboolean print_statistics = (strstr(argv[0],
"ansel-cltest") == NULL);
516 gboolean cpu_threads_from_cli =
FALSE;
518 GSList *config_override = NULL;
519 for(
int k = 1;
k < argc;
k++)
522 if(!strcmp(argv[
k],
"/?"))
524 return usage(argv[0]);
527 if(argv[
k][0] ==
'-')
529 if(!strcmp(argv[
k],
"--help") || !strcmp(argv[
k],
"-h"))
531 return usage(argv[0]);
533 else if(!strcmp(argv[
k],
"--version"))
535 printf(
"this is %s\ncopyright (c) 2009-2022 Johannes Hanika, (c) 2022-%s Aurélien Pierre\n" PACKAGE_BUGREPORT "\n\ncompile options:\n"
536 " bit depth is %" G_GSIZE_FORMAT
" bit\n"
543 " OpenMP support enabled\n"
545 " OpenMP support disabled\n"
549 " OpenCL support enabled\n"
551 " OpenCL support disabled\n"
555 " Colord support enabled\n"
557 " Colord support disabled\n"
560#ifdef HAVE_GRAPHICSMAGICK
561 " GraphicsMagick support enabled\n"
563 " GraphicsMagick support disabled\n"
566#ifdef HAVE_IMAGEMAGICK
567 " ImageMagick support enabled\n"
569 " ImageMagick support disabled\n"
573 " OpenEXR support enabled\n"
575 " OpenEXR support disabled\n"
580 CHAR_BIT *
sizeof(
void *)
584 else if(!strcmp(argv[
k],
"--library") && argc >
k + 1)
586 dbfilename_from_command = argv[++
k];
590 else if(!strcmp(argv[
k],
"--datadir") && argc >
k + 1)
592 datadir_from_command = argv[++
k];
596 else if(!strcmp(argv[
k],
"--moduledir") && argc >
k + 1)
598 moduledir_from_command = argv[++
k];
602 else if(!strcmp(argv[
k],
"--tmpdir") && argc >
k + 1)
604 tmpdir_from_command = argv[++
k];
608 else if(!strcmp(argv[
k],
"--configdir") && argc >
k + 1)
610 configdir_from_command = argv[++
k];
614 else if(!strcmp(argv[
k],
"--cachedir") && argc >
k + 1)
616 cachedir_from_command = argv[++
k];
620 else if(!strcmp(argv[
k],
"--localedir") && argc >
k + 1)
622 localedir_from_command = argv[++
k];
626 else if(!strcmp(argv[
k],
"--kerneldir") && argc >
k + 1)
628 kerneldir_from_command = argv[++
k];
632 else if(argv[
k][1] ==
'd' && argc >
k + 1)
634 if(!strcmp(argv[
k + 1],
"all"))
636 else if(!strcmp(argv[
k + 1],
"cache"))
638 else if(!strcmp(argv[
k + 1],
"control"))
640 else if(!strcmp(argv[
k + 1],
"dev"))
642 else if(!strcmp(argv[
k + 1],
"gtk"))
644 else if(!strcmp(argv[
k + 1],
"input"))
646 else if(!strcmp(argv[
k + 1],
"pipecache"))
648 else if(!strcmp(argv[
k + 1],
"perf"))
650 else if(!strcmp(argv[
k + 1],
"pwstorage"))
652 else if(!strcmp(argv[
k + 1],
"opencl"))
654 else if(!strcmp(argv[
k + 1],
"sql"))
656 else if(!strcmp(argv[
k + 1],
"memory"))
658 else if(!strcmp(argv[
k + 1],
"lighttable"))
660 else if(!strcmp(argv[
k + 1],
"nan"))
662 else if(!strcmp(argv[
k + 1],
"masks"))
664 else if(!strcmp(argv[
k + 1],
"lua"))
666 else if(!strcmp(argv[
k + 1],
"print"))
668 else if(!strcmp(argv[
k + 1],
"camsupport"))
670 else if(!strcmp(argv[
k + 1],
"colorprofile"))
672 else if(!strcmp(argv[
k + 1],
"nocache_reuse"))
674 else if(!strcmp(argv[
k + 1],
"ioporder"))
676 else if(!strcmp(argv[
k + 1],
"imageio"))
678 else if(!strcmp(argv[
k + 1],
"undo"))
680 else if(!strcmp(argv[
k + 1],
"signal"))
682 else if(!strcmp(argv[
k + 1],
"params"))
684 else if(!strcmp(argv[
k + 1],
"demosaic"))
686 else if(!strcmp(argv[
k + 1],
"shortcuts"))
688 else if(!strcmp(argv[
k + 1],
"tiling"))
690 else if(!strcmp(argv[
k + 1],
"verbose"))
692 else if(!strcmp(argv[
k + 1],
"pipe"))
694 else if(!strcmp(argv[
k + 1],
"history"))
696 else if(!strcmp(argv[
k + 1],
"import"))
699 return usage(argv[0]);
704 else if(!strcmp(argv[
k],
"--d-signal-act") && argc >
k + 1)
706 if(!strcmp(argv[
k + 1],
"all"))
708 else if(!strcmp(argv[
k + 1],
"raise"))
710 else if(!strcmp(argv[
k + 1],
"connect"))
712 else if(!strcmp(argv[
k + 1],
"disconnect"))
714 else if(!strcmp(argv[
k + 1],
"print-trace"))
716#ifdef DT_HAVE_SIGNAL_TRACE
719 fprintf(stderr,
"[signal] print-trace not available, skipping\n");
723 return usage(argv[0]);
728 else if(!strcmp(argv[
k],
"--d-signal") && argc >
k + 1)
730 gchar *str = g_ascii_strup(argv[
k+1], -1);
732 #define CHKSIGDBG(sig) else if(!g_strcmp0(str, #sig)) do {darktable.unmuted_signal_dbg[sig] = TRUE;} while (0)
733 if(!g_strcmp0(str,
"ALL"))
781 fprintf(stderr,
"unknown signal name: '%s'. use 'ALL' to enable debug for all or use full signal name\n", str);
782 return usage(argv[0]);
790 else if(argv[
k][1] ==
't' && argc >
k + 1)
797 cpu_threads_from_cli =
TRUE;
799 else if(!strcmp(argv[
k],
"--conf") && argc >
k + 1)
801 gchar *keyval = g_strdup(argv[++
k]), *c = keyval;
804 gchar *end = keyval + strlen(keyval);
805 while(*c !=
'=' && c < end) c++;
806 if(*c ==
'=' && *(c + 1) !=
'\0')
810 entry->
key = g_strdup(keyval);
811 entry->
value = g_strdup(c);
812 config_override = g_slist_append(config_override, entry);
816 else if(!strcmp(argv[
k],
"--noiseprofiles") && argc >
k + 1)
818 noiseprofiles_from_command = argv[++
k];
822 else if(!strcmp(argv[
k],
"--disable-opencl"))
825 exclude_opencl =
TRUE;
829 else if(!strcmp(argv[
k],
"--debug"))
833 else if(!strcmp(argv[
k],
"--"))
840 else if(!strncmp(argv[
k],
"-psn_", 5))
847 return usage(argv[0]);
852 for(
int i = 1;
i < argc;
i++)
855 for(
k =
i;
k < argc;
k++)
861 for(
int j =
i +
k; j < argc; j++)
871 dt_loc_init(datadir_from_command, moduledir_from_command, localedir_from_command, configdir_from_command, cachedir_from_command, tmpdir_from_command, kerneldir_from_command);
882 fprintf(stderr,
"[memory] at startup\n");
892 const gchar *xdg_data_dirs = g_getenv(
"XDG_DATA_DIRS");
893 gchar *new_xdg_data_dirs = NULL;
894 gboolean set_env =
TRUE;
895 if(!
IS_NULL_PTR(xdg_data_dirs) && *xdg_data_dirs !=
'\0')
898 gboolean found =
FALSE;
899 gchar **tokens = g_strsplit(xdg_data_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
901 for(
char **iter = tokens; !
IS_NULL_PTR(*iter); iter++)
902 if(!strcmp(sharedir, *iter))
911 new_xdg_data_dirs = g_strjoin(G_SEARCHPATH_SEPARATOR_S, sharedir, xdg_data_dirs, NULL);
918 if(!g_strcmp0(sharedir,
"/usr/local/share")
919 || !g_strcmp0(sharedir,
"/usr/local/share/")
920 || !g_strcmp0(sharedir,
"/usr/share") || !g_strcmp0(sharedir,
"/usr/share/"))
921 new_xdg_data_dirs = g_strdup(
"/usr/local/share/" G_SEARCHPATH_SEPARATOR_S
"/usr/share/");
923 new_xdg_data_dirs = g_strdup_printf(
"%s" G_SEARCHPATH_SEPARATOR_S
"/usr/local/share/" G_SEARCHPATH_SEPARATOR_S
924 "/usr/share/", sharedir);
930 if(set_env) g_setenv(
"XDG_DATA_DIRS", new_xdg_data_dirs, 1);
935 setlocale(LC_ALL,
"");
971 if(!cpu_threads_from_cli)
985 gtk_init(&argc, &argv);
997 gboolean recheck_needed =
TRUE;
998 while (recheck_needed)
1003 printf(
"ERROR : cannot open database\n");
1013 gboolean image_loaded_elsewhere =
FALSE;
1014#ifndef MAC_INTEGRATION
1016 fprintf(stderr,
"trying to open the images in the running instance\n");
1020 GDBusConnection *connection = NULL;
1021 for(
int i = 1;
i < argc;
i++)
1024 if(argv[
i] == NULL || *argv[
i] ==
'\0')
continue;
1027 if(
IS_NULL_PTR(connection)) connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
1029 image_loaded_elsewhere = g_dbus_connection_call_sync(connection,
"org.darktable.service",
"/darktable",
1030 "org.darktable.service.Remote",
"Open",
1031 g_variant_new(
"(s)", filename), NULL,
1032 G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL) != NULL;
1035 if(connection) g_object_unref(connection);
1042 fprintf(stderr,
"ERROR: can't acquire database lock, aborting.\n");
1052 recheck_needed =
FALSE;
1073 GList *changed_xmp_files = NULL;
1085 if(dbfilename_from_command && !strcmp(dbfilename_from_command,
":memory:"))
1115#ifdef HAVE_GRAPHICSMAGICK
1122#elif defined HAVE_IMAGEMAGICK
1125 MagickWandGenesis();
1142 fprintf(stderr,
"ERROR: can't init gui, aborting.\n");
1162 fprintf(stderr,
"ERROR: can't init develop system, aborting.\n");
1170 fprintf(stderr,
"ERROR: can't init pixelpipe cache, aborting.\n");
1206 fprintf(stderr,
"ERROR: iop order looks bad, aborting.\n");
1244 fprintf(stderr,
"[memory] after successful startup\n");
1254#ifndef MAC_INTEGRATION
1272 if(init_gui && changed_xmp_files)
1305 if(max_iters <= 0)
return;
1306 GMainContext *ctx = g_main_context_default();
1307 for(
int i = 0;
i < max_iters && g_main_context_pending(ctx);
i++)
1308 g_main_context_iteration(ctx,
FALSE);
1334 gchar **snaps_to_remove = NULL;
1335 if(perform_snapshot)
1391 if(GTK_IS_WIDGET(main_window))
1392 gtk_widget_destroy(main_window);
1444#ifdef HAVE_GRAPHICSMAGICK
1446#elif defined HAVE_IMAGEMAGICK
1447 MagickWandTerminus();
1452 if(perform_maintenance)
1459 if(perform_snapshot)
1464 while(snaps_to_remove[
i])
1467 g_chmod(snaps_to_remove[
i], S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
1470 const int retunlink = g_remove(snaps_to_remove[
i++]);
1477 g_strfreev(snaps_to_remove);
1522 g_thread_pool_stop_unused_threads();
1523#if !defined(_WIN32) && !defined(__APPLE__)
1524 PangoFontMap *fontmap = pango_cairo_font_map_get_default();
1525 gboolean use_fontconfig_backend =
FALSE;
1527 if(fontmap && PANGO_IS_CAIRO_FONT_MAP(fontmap))
1529 const cairo_font_type_t font_backend
1530 = pango_cairo_font_map_get_font_type(PANGO_CAIRO_FONT_MAP(fontmap));
1531 use_fontconfig_backend = (font_backend == CAIRO_FONT_TYPE_FT);
1536 if(use_fontconfig_backend) FcFini();
1538 pango_cairo_font_map_set_default(NULL);
1588 snprintf(buf,
sizeof(buf),
"%s took %.3f secs (%.3f CPU)", prefix, end.
clock - start->
clock,
1602 const int n = snprintf(buf,
sizeof(buf),
"%s took %.3f secs (%.3f CPU) ", prefix, end.
clock - start->
clock,
1604 if(
n <
sizeof(buf) - 1)
1607 va_start(ap, suffix);
1608 vsnprintf(buf +
n,
sizeof(buf) -
n, suffix, ap);
1620 MEMORYSTATUSEX status;
1621 status.dwLength =
sizeof(status);
1622 if(GlobalMemoryStatusEx(&status))
1623 return (
size_t)status.ullAvailPhys;
1628#elif defined(__APPLE__)
1629#include <mach/mach.h>
1633 mach_port_t host = mach_host_self();
1634 vm_statistics64_data_t vmstat;
1635 mach_msg_type_number_t count = HOST_VM_INFO64_COUNT;
1636 if(host_statistics64(host, HOST_VM_INFO64, (host_info64_t)&vmstat, &count) != KERN_SUCCESS)
return 0;
1639 host_page_size(host, &page_size);
1642 return (vmstat.free_count + vmstat.inactive_count) * page_size;
1645#elif defined(__linux__)
1650 FILE *
f = g_fopen(
"/proc/meminfo",
"r");
1654 size_t available_kb = 0;
1656 while(fgets(line,
sizeof(line),
f))
1658 if(sscanf(line,
"MemAvailable: %" G_GSIZE_FORMAT
" kB", &available_kb) == 1)
1661 return available_kb * 1024;
1697 const size_t mem = resources->
total_memory / (1024 * 1024);
1698 const size_t bits = CHAR_BIT *
sizeof(
void *);
1699 const gboolean sufficient = (mem >= 4096 && threads >= 2);
1701 dt_print(
DT_DEBUG_MEMORY,
"[MEMORY CONFIGURATION] found a %s %" G_GSIZE_FORMAT
"-bit system with %" G_GSIZE_FORMAT
" cores\n",
1702 (sufficient) ?
"sufficient" :
"low performance", bits, threads);
1719 const size_t min_pipecache_memory = 6 * 6000 * 4000 * 4 *
sizeof(float);
1725 (int64_t)min_pipecache_memory);
1730 "MEMORY WARNING: your pixelpipe cache allocated RAM is too small for your typical raw size.\n"
1731 "MEMORY WARNING: reduce your OS/apps headroom, or your thumbnail cache size.\n"
1732 "MEMORY WARNING: you may also simply need more RAM or need to reset the config key host_memory.\n"
1733 "MEMORY WARNING: we shrank the thumbnails cache to the bare minimum to leave enough space for pixelpipe cache.\n");
1737 (int64_t)128 * 1024 * 1024);
1756 dt_control_log(_(
"CRITICAL WARNING: Ansel will not be able to use the RAM you allocated it.\n"
1757 "Review your memory settings or add more RAM to your system."));
1762 for(GList *capabilities =
darktable.
capabilities; capabilities; capabilities = g_list_next(capabilities))
1764 if(!strcmp(capabilities->data, capability))
1803 fprintf(stdout,
"[memory] Currently-free and reclaimable memory detected: %lu MiB\n",
get_usable_memory_bytes() / (1024 * 1024));
1805#if defined(__linux__)
1814 char pidstatus[128];
1815 snprintf(pidstatus,
sizeof(pidstatus),
"/proc/%u/status", (uint32_t)getpid());
1817 f = g_fopen(pidstatus,
"r");
1821 while(
getline(&line, &len,
f) != -1)
1823 if(!strncmp(line,
"VmPeak:", 7))
1824 g_strlcpy(vmpeak, line + 8,
sizeof(vmpeak));
1825 else if(!strncmp(line,
"VmSize:", 7))
1826 g_strlcpy(vmsize, line + 8,
sizeof(vmsize));
1827 else if(!strncmp(line,
"VmRSS:", 6))
1828 g_strlcpy(vmrss, line + 8,
sizeof(vmrss));
1829 else if(!strncmp(line,
"VmHWM:", 6))
1830 g_strlcpy(vmhwm, line + 8,
sizeof(vmhwm));
1835 fprintf(stderr,
"[memory] max address space (vmpeak): %15s"
1836 "[memory] cur address space (vmsize): %15s"
1837 "[memory] max used memory (vmhwm ): %15s"
1838 "[memory] cur used memory (vmrss ): %15s",
1839 vmpeak, vmsize, vmhwm, vmrss);
1841#elif defined(__APPLE__)
1842 struct task_basic_info t_info;
1843 mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
1845 if(KERN_SUCCESS != task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count))
1847 fprintf(stderr,
"[memory] task memory info unknown.\n");
1852 fprintf(stderr,
"[memory] max address space (vmpeak): %15s\n"
1853 "[memory] cur address space (vmsize): %12llu kB\n"
1854 "[memory] max used memory (vmhwm ): %15s\n"
1855 "[memory] cur used memory (vmrss ): %12llu kB\n",
1856 "unknown", (
uint64_t)t_info.virtual_size / 1024,
"unknown", (
uint64_t)t_info.resident_size / 1024);
1857#elif defined (_WIN32)
1859 MEMORYSTATUSEX memInfo;
1860 memInfo.dwLength =
sizeof(MEMORYSTATUSEX);
1861 GlobalMemoryStatusEx(&memInfo);
1865 PROCESS_MEMORY_COUNTERS_EX pmc;
1866 GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS *)&pmc,
sizeof(pmc));
1867 size_t virtualMemUsedByMe = pmc.PagefileUsage;
1868 size_t virtualMemUsedByMeMax = pmc.PeakPagefileUsage;
1871 size_t physMemUsedByMeMax = pmc.PeakWorkingSetSize;
1874 size_t physMemUsedByMe = pmc.WorkingSetSize;
1877 fprintf(stderr,
"[memory] max address space (vmpeak): %12llu kB\n"
1878 "[memory] cur address space (vmsize): %12llu kB\n"
1879 "[memory] max used memory (vmhwm ): %12llu kB\n"
1880 "[memory] cur used memory (vmrss ): %12llu Kb\n",
1881 virtualMemUsedByMeMax / 1024, virtualMemUsedByMe / 1024, physMemUsedByMeMax / 1024,
1882 physMemUsedByMe / 1024);
1885 fprintf(stderr,
"dt_print_mem_usage() currently unsupported on this platform\n");
1891 g_strlcpy(destination, path,
sizeof(
char) *
PATH_MAX);
1892 g_strlcat(destination, G_DIR_SEPARATOR_S,
sizeof(
char) *
PATH_MAX);
1893 g_strlcat(destination, file,
sizeof(
char) *
PATH_MAX);
void dt_accels_connect_accels(dt_accels_t *accels)
Actually enable accelerators after having loaded user config.
void dt_accels_cleanup(dt_accels_t *accels)
void dt_accels_load_user_config(dt_accels_t *accels)
Loads keyboardrc.lang from config dir. This needs to run after we inited the accel map from widgets c...
static void error(char *msg)
void dt_bauhaus_cleanup(dt_bauhaus_t *bauhaus)
dt_bauhaus_t * dt_bauhaus_init()
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
void dt_culling_mode_to_selection()
dt_collection_t * dt_collection_new()
void dt_collection_free(const dt_collection_t *collection)
void dt_colorlabels_cleanup(void)
void dt_colorspaces_cleanup(dt_colorspaces_t *self)
dt_colorspaces_t * dt_colorspaces_init()
const dt_aligned_pixel_t f
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
void dt_history_cleanup(void)
int32_t dt_image_import(const int32_t film_id, const char *filename, gboolean raise_signals)
void dt_image_cleanup(void)
#define PACKAGE_BUGREPORT
#define DT_BUILD_CPU_MODE
#define DT_BUILD_CXX_COMPILER
#define DT_BUILD_C_COMPILER
const char darktable_package_string[]
#define DT_BUILD_CXX_FLAGS
const char darktable_last_commit_year[]
void dt_conf_cleanup(dt_conf_t *cf)
int dt_conf_get_bool(const char *name)
void dt_conf_init(dt_conf_t *cf, const char *filename, GSList *override_entries)
void dt_conf_set_int(const char *name, int val)
int dt_conf_get_int(const char *name)
int64_t dt_conf_get_int64(const char *name)
void dt_ctl_switch_mode_to(const char *mode)
void dt_control_init(dt_control_t *s)
void dt_control_set_mouse_over_id(int32_t value)
void dt_control_log(const char *msg,...)
void dt_control_shutdown(dt_control_t *s)
void dt_control_cleanup(dt_control_t *s)
void dt_control_crawler_show_image_list(GList *images)
GList * dt_control_crawler_run(void)
void dt_printers_abort_discovery(void)
void dt_vprint(dt_debug_thread_t thread, const char *msg,...)
void dt_show_times(const dt_times_t *start, const char *prefix)
GType pango_fc_font_map_get_type(void)
int dt_load_from_string(const gchar *input, gboolean open_image_in_dr, gboolean *single_image)
static GLogWriterOutput _gtk_log_writer_filter(GLogLevelFlags log_level, const GLogField *fields, gsize n_fields, gpointer user_data)
static void _dt_drain_main_context(const int max_iters)
void dt_concat_path_file(char destination[PATH_MAX], const char path[PATH_MAX], const char *const file)
void dt_print_mem_usage()
size_t get_usable_memory_bytes()
struct _PangoFcFontMap PangoFcFontMap
void pango_fc_font_map_shutdown(PangoFcFontMap *fcfontmap)
void * dt_alloc_align(size_t size)
void dt_capabilities_remove(char *capability)
int dt_init(int argc, char *argv[], const gboolean init_gui, const gboolean load_data)
size_t dt_get_mipmap_mem()
static size_t _get_total_memory()
char * dt_version_major_minor()
void dt_print_nts(dt_debug_thread_t thread, const char *msg,...)
void dt_configure_runtime_performance(dt_sys_resources_t *resources, gboolean init_gui)
void dt_capabilities_add(char *capability)
gboolean dt_supported_image(const gchar *filename)
check if file is a supported image
void dt_capabilities_cleanup()
void dt_show_times_f(const dt_times_t *start, const char *prefix, const char *suffix,...)
size_t dt_get_available_mem()
int dt_capabilities_check(char *capability)
static int usage(const char *argv0)
void dt_print(dt_debug_thread_t thread, const char *msg,...)
@ DT_DEBUG_CAMERA_SUPPORT
#define omp_get_max_threads()
static void * dt_alloc_align_internal(size_t size)
static void dt_free_gpointer(gpointer ptr)
static void dt_get_times(dt_times_t *t)
static double dt_get_wtime(void)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
void dt_database_cleanup_busy_statements(const struct dt_database_t *db)
void dt_database_optimize(const struct dt_database_t *db)
gboolean dt_database_snapshot(const struct dt_database_t *db)
void dt_database_perform_maintenance(const struct dt_database_t *db)
void dt_database_destroy(const dt_database_t *db)
gboolean dt_database_show_error(const dt_database_t *db)
char ** dt_database_snaps_to_remove(const struct dt_database_t *db)
gboolean dt_database_maybe_maintenance(const struct dt_database_t *db, const gboolean has_gui, const gboolean closing_time)
gboolean dt_database_get_lock_acquired(const dt_database_t *db)
dt_database_t * dt_database_init(const char *alternative, const gboolean load_data, const gboolean has_gui)
gboolean dt_database_maybe_snapshot(const struct dt_database_t *db)
void dt_dev_history_cleanup(void)
Cleanup cached statements or state used by history I/O.
void dt_dev_pixelpipe_cache_wait_dump_pending(const char *reason)
Dump pending GUI cache wait requests for lifecycle debugging.
#define dt_pthread_rwlock_destroy
static int dt_pthread_mutex_unlock(dt_pthread_mutex_t *mutex) RELEASE(mutex) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_mutex_init(dt_pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
static int dt_pthread_mutex_destroy(dt_pthread_mutex_t *mutex)
#define dt_pthread_rwlock_init
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
int supported(struct dt_imageio_module_storage_t *storage, struct dt_imageio_module_format_t *format)
void dt_exif_set_exiv2_taglist()
void dt_loc_get_sharedir(char *sharedir, size_t bufsize)
void dt_loc_get_localedir(char *localedir, size_t bufsize)
void dt_loc_init(const char *datadir, const char *moduledir, const char *localedir, const char *configdir, const char *cachedir, const char *tmpdir, const char *kerneldir)
void dt_loc_get_user_config_dir(char *configdir, size_t bufsize)
int dt_film_new(dt_film_t *film, const char *directory)
int dt_film_open(const int32_t id)
void dt_film_set_folder_status()
int dt_film_import(const char *dirname)
dt_job_t * dt_pathlist_import_create(int argc, char *argv[])
ssize_t getline(char **lineptr, size_t *n, FILE *stream)
int dt_gui_gtk_init(dt_gui_gtk_t *gui)
GtkWidget * dt_ui_main_window(dt_ui_t *ui)
get the main window widget
void dt_gui_presets_init()
void dt_gui_presets_cleanup()
void dt_gui_throttle_init(void)
void dt_gui_throttle_cleanup(void)
void dt_guides_cleanup(GList *guides)
void dt_image_cache_cleanup(dt_image_cache_t *cache)
void dt_image_cache_init(dt_image_cache_t *cache)
void dt_image_cache_connect_info_changed_first(const struct dt_control_signal_t *ctlsig)
void dt_imageio_cleanup(dt_imageio_t *iio)
void dt_imageio_init(dt_imageio_t *iio)
void dt_iop_set_darktable_iop_table()
void dt_iop_load_modules_so(void)
void dt_iop_unload_modules_so()
GList * dt_ioppr_get_iop_order_list(int32_t imgid, gboolean sorted)
Load the order list for an image from the DB.
GList * dt_ioppr_get_iop_order_rules()
Return the list of ordering rules (prev/next constraints).
int dt_ioppr_check_so_iop_order(GList *iop_list, GList *iop_order_list)
Check whether any module .so is missing an iop_order entry.
int dt_control_add_job(dt_control_t *control, dt_job_queue_t queue_id, _dt_job_t *job)
dt_l10n_t * dt_l10n_init(gboolean init_list)
void dt_lib_init(dt_lib_t *lib)
void dt_lib_cleanup(dt_lib_t *lib)
float *const restrict const size_t k
void dt_mipmap_cache_init(dt_mipmap_cache_t *cache)
void dt_mipmap_cache_cleanup(dt_mipmap_cache_t *cache)
#define dt_mipmap_cache_get(A, B, C, D, E, F)
#define dt_mipmap_cache_release(A, B)
JsonParser * dt_noiseprofile_init(const char *alternative)
void dt_opencl_init(dt_opencl_t *cl, const gboolean exclude_opencl, const gboolean print_statistics)
void dt_opencl_cleanup(dt_opencl_t *cl)
gboolean dt_opencl_finish(const int devid)
void dt_dev_pixelpipe_cache_cleanup(dt_dev_pixelpipe_cache_t *cache)
dt_dev_pixelpipe_cache_t * dt_dev_pixelpipe_cache_init(size_t max_memory)
static void dt_points_cleanup(dt_points_t *p)
static void dt_points_init(dt_points_t *p, const unsigned int num_threads)
void dt_privacy_ask_consent(const gboolean have_gui)
void dt_control_progress_init(struct dt_control_t *control)
const dt_pwstorage_t * dt_pwstorage_new()
void dt_pwstorage_destroy(const dt_pwstorage_t *pwstorage)
void dt_selection_free(dt_selection_t *selection)
dt_selection_t * dt_selection_new()
void dt_sentry_shutdown(void)
void dt_sentry_init(const gboolean have_gui)
void dt_control_signal_cleanup(dt_control_signal_t *ctlsig)
dt_control_signal_t * dt_control_signal_init()
@ DT_DEBUG_SIGNAL_ACT_DISCONNECT
@ DT_DEBUG_SIGNAL_ACT_CONNECT
@ DT_DEBUG_SIGNAL_ACT_RAISE
@ DT_DEBUG_SIGNAL_ACT_PRINT_TRACE
@ DT_SIGNAL_DEVELOP_INITIALIZE
This signal is raised when darktable.develop is initialized.
@ DT_SIGNAL_METADATA_CHANGED
This signal is raised when metadata status (shown/hidden) or value has changed.
@ DT_SIGNAL_VIEWMANAGER_THUMBTABLE_ACTIVATE
@ DT_SIGNAL_ACTIVE_IMAGES_CHANGE
This signal is raised when image shown in the main view change no param, no returned value.
@ DT_SIGNAL_CONTROL_REDRAW_ALL
This signal is raised when dt_control_queue_redraw() is called. no param, no returned value.
@ DT_SIGNAL_DEVELOP_HISTORY_CHANGE
This signal is raised when develop history is changed no param, no returned value.
@ DT_SIGNAL_DEVELOP_IMAGE_CHANGED
This signal is raised when image is changed in darkroom.
@ DT_SIGNAL_CONTROL_PROFILE_USER_CHANGED
This signal is raised when a profile is changed by the user 1 uint32_t : the profile type that has ch...
@ DT_SIGNAL_IMAGE_EXPORT_TMPFILE
This signal is raised after an image has been exported to a file, but before it is sent to facebook/p...
@ DT_SIGNAL_IMAGES_ORDER_CHANGE
This signal is raised to request image order change.
@ DT_SIGNAL_DEVELOP_PREVIEW_PIPE_FINISHED
This signal is raised when develop preview pipe process is finished no param, no returned value.
@ DT_SIGNAL_STYLE_CHANGED
This signal is raised when a style is added/deleted/changed
@ DT_SIGNAL_DARKROOM_UI_CHANGED
Signal that the darkroom GUI color changed.
@ DT_SIGNAL_DEVELOP_UI_PIPE_FINISHED
This signal is raised when pipe is finished and the gui is attached no param, no returned value.
@ DT_SIGNAL_FILMROLLS_CHANGED
This signal is raised when a filmroll is deleted/changed but not imported.
@ DT_SIGNAL_MOUSE_OVER_IMAGE_CHANGE
This signal is raised when mouse hovers over image thumbs both on lighttable and in the filmstrip....
@ DT_SIGNAL_CONTROL_TOAST_REDRAW
This signal is raised when dt_control_toast_redraw() is called. no param, no returned value.
@ DT_SIGNAL_DEVELOP_MODULE_MOVED
This signal is raised when order of modules in pipeline is changed.
@ DT_SIGNAL_IMAGE_INFO_CHANGED
This signal is raised when any of image info has changed
@ DT_SIGNAL_PREFERENCES_CHANGE
This signal is raised after preferences have been changed no parameters no return.
@ DT_SIGNAL_CONTROL_REDRAW_CENTER
This signal is raised when dt_control_queue_redraw_center() is called. no param, no returned value.
@ DT_SIGNAL_DEVELOP_MODULEGROUPS_SET
This signal is raised to request a modulegroups update. 1 : dt_iop_module_t *module,...
@ DT_SIGNAL_FILMROLLS_REMOVED
This signal is raised only when a filmroll is removed.
@ DT_SIGNAL_TAG_CHANGED
This signal is raised when a tag is added/deleted/changed
@ DT_SIGNAL_IMAGEIO_STORAGE_CHANGE
This signal is raised when a new storage module is loaded noparameters no return.
@ DT_SIGNAL_VIEWMANAGER_FILMSTRIP_ACTIVATE
This signal is raised when a thumb is single-clicked in the filmstrip. Views that want filmstrip clic...
@ DT_SIGNAL_DEVELOP_MODULE_REMOVE
This signal is raised when a module is removed from the history stack 1 module no returned value.
@ DT_SIGNAL_IMAGE_LOADED
This signal is raised when an asynchronous darkroom image load finishes. 1 : uint32_t the load reques...
@ DT_SIGNAL_SELECTION_CHANGED
This signal is raised when the selection is changed no param, no returned value.
@ DT_SIGNAL_CONTROL_PICKERDATA_READY
This signal is raised when new color picker data are available in darkroom. no param,...
@ DT_SIGNAL_CONTROL_PROFILE_CHANGED
This signal is raised when the screen profile has changed no param, no returned value.
@ DT_SIGNAL_VIEWMANAGER_FILMSTRIP_DRAG_BEGIN
This signal is raised when a drag starts from the filmstrip. Views that need filmstrip drags to commi...
@ DT_SIGNAL_IMAGE_IMPORT
This signal is raised when a new image is imported (not cloned) 1 uint32_t : the new image id no retu...
@ DT_SIGNAL_COLLECTION_CHANGED
This signal is raised when collection changed. To avoid leaking the list, dt_collection_t is connecte...
@ DT_SIGNAL_CONTROL_LOG_REDRAW
This signal is raised when dt_control_log_redraw() is called. no param, no returned value.
@ DT_SIGNAL_CONTROL_NAVIGATION_REDRAW
This signal is raised when dt_control_navigation_redraw() is called. no param, no returned value.
@ DT_SIGNAL_METADATA_UPDATE
@ DT_SIGNAL_DEVELOP_HISTORY_WILL_CHANGE
This signal is raised when develop history is about to be changed 1 : GList * the current history 2 :...
@ DT_SIGNAL_VIEWMANAGER_VIEW_CHANGED
This signal is raised by viewmanager when a view has changed. 1 : dt_view_t * the old view 2 : dt_vie...
void dt_gui_splash_close(void)
struct _GtkWidget GtkWidget
void dt_styles_cleanup(void)
unsigned __int64 uint64_t
dt_pthread_mutex_t readFile_mutex
int32_t unmuted_signal_dbg_acts
struct dt_imageio_t * imageio
struct dt_dev_pixelpipe_cache_t * pixelpipe_cache
int32_t num_openmp_threads
struct dt_gui_gtk_t * gui
dt_pthread_rwlock_t database_threadsafe
struct dt_colorspaces_t * color_profiles
struct dt_collection_t * collection
struct dt_mipmap_cache_t * mipmap_cache
struct dt_selection_t * selection
dt_pthread_mutex_t exiv2_threadsafe
struct dt_sys_resources_t dtresources
dt_pthread_mutex_t plugin_threadsafe
dt_pthread_mutex_t capabilities_threadsafe
const struct dt_database_t * db
struct dt_control_signal_t * signals
struct dt_bauhaus_t * bauhaus
struct dt_opencl_t * opencl
struct dt_image_cache_t * image_cache
struct dt_develop_t * develop
struct dt_points_t * points
dt_pthread_mutex_t pipeline_threadsafe
struct dt_view_manager_t * view_manager
JsonParser * noiseprofile_parser
gboolean unmuted_signal_dbg[DT_SIGNAL_COUNT]
const struct dt_pwstorage_t * pwstorage
struct dt_control_t * control
dt_pthread_mutex_t run_mutex
dt_pthread_mutex_t log_mutex
GDBusConnection * dbus_connection
cairo_surface_t * surface
void dt_set_signal_handlers()
void dt_telemetry_shutdown(void)
void dt_telemetry_init(const gboolean have_gui)
void dt_undo_cleanup(dt_undo_t *self)
dt_undo_t * dt_undo_init(void)
gchar * dt_util_normalize_path(const gchar *_input)
void dt_view_manager_cleanup(dt_view_manager_t *vm)
void dt_view_manager_init(dt_view_manager_t *vm)
void dt_view_manager_gui_init(dt_view_manager_t *vm)
void dt_ui_cleanup_titlebar(dt_ui_t *ui)
void dt_ui_cleanup_main_table(dt_ui_t *ui)
void dt_ui_init_global_menu(dt_ui_t *ui)