66#include <glib/gstdio.h>
80#define _cache_print(channel, ...) \
82 if(_verbose) dt_print((channel), __VA_ARGS__); \
124#include <sys/statvfs.h>
180#define DT_MIPMAP_CACHE_FILE_MAGIC 0xD71337
181#define DT_MIPMAP_CACHE_FILE_VERSION 23
182#define DT_MIPMAP_CACHE_DEFAULT_FILE_NAME "mipmaps"
193 0x45, 0x78, 0x69, 0x66, 0x00, 0x00, 0x49, 0x49, 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69,
194 0x87, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
195 0x01, 0xa0, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
198 0x45, 0x78, 0x69, 0x66, 0x00, 0x00, 0x49, 0x49, 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69,
199 0x87, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
200 0x01, 0xa0, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
216#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
226#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
227static const size_t dt_mipmap_buffer_dsc_size
__attribute__((unused))
240 assert(dsc->
size > 64 *
sizeof(uint32_t));
241 const uint32_t X = 0xffffffffu;
242 const uint32_t o = 0u;
243 const uint32_t image[]
244 = { o, o, o, o, o, o, o, o,
245 o, o, X, X, X, X, o, o,
246 o, X, o, X, X, o, X, o,
247 o, X, X, X, X, X, X, o,
248 o, o, X, o, o, X, o, o,
249 o, o, o, o, o, o, o, o,
250 o, o, X, X, X, X, o, o,
251 o, o, o, o, o, o, o, o };
259 return (((int32_t)
size) << 28) | (imgid - 1);
264 return (
key & 0xfffffff) + 1;
275 g_snprintf(path,
sizeof(
char) *
DT_PATH_MAX,
"%s.d" G_DIR_SEPARATOR_S
"%d",
284 gchar *file = g_strdup_printf(
"%u.jpg", imgid);
292 char *abspath = NULL;
301 if(!strcmp(dbfilename,
":memory:"))
303 mipmapfilename[0] =
'\0';
309 if(
IS_NULL_PTR(abspath)) abspath = g_strdup(dbfilename);
311 GChecksum *chk = g_checksum_new(G_CHECKSUM_SHA1);
312 g_checksum_update(chk, (guchar *)abspath, strlen(abspath));
313 const gchar *filename = g_checksum_get_string(chk);
315 if(!filename || filename[0] ==
'\0')
320 g_checksum_free(chk);
344 gboolean *is_jpg_input, gboolean *use_embedded_jpg, gboolean *write_to_disk)
349 if(filename || ext || input_exists || is_jpg_input)
353 if(filename) strncpy(filename, _filename,
DT_PATH_MAX);
358 if(ext || is_jpg_input)
360 char *_ext = _filename + strlen(_filename);
361 while(*_ext !=
'.' && _ext > _filename) _ext--;
362 if(ext) strncpy(ext, _ext, 5);
363 if(is_jpg_input) *is_jpg_input = !strcasecmp(_ext,
".jpg") || !strcasecmp(_ext,
".jpeg");
371 gboolean altered =
FALSE;
376 const gboolean _use_embedded_jpg
378 || (mode == 1 && !altered));
379 if(use_embedded_jpg) *use_embedded_jpg = _use_embedded_jpg;
395 const int32_t imgid);
437 return (uint8_t *)(dsc + 1);
474 return buffer_size + dt_mipmap_buffer_dsc_size;
486 const size_t buffer_size)
500 (*dsc)->width =
width;
502 (*dsc)->iscale = 1.0f;
518 fprintf(stderr,
"trying to alloc a wrong mipmap size for %s: %i (should be: %i)\n", img->
filename, buf->
size,
DT_MIPMAP_FULL);
526 fprintf(stderr,
"trying to alloc a buffer entry that has no back-reference to cache entry\n");
539 const int wd = img->
width;
540 const int ht = img->
height;
542 const size_t buffer_size = wd * ht *
bpp;
543 const size_t min_buffer_size = 64 * 4 *
sizeof(float);
558 assert(entry->
data == dsc);
609 gboolean write_to_disk;
618 gboolean io_error =
FALSE;
620 uint8_t *blob = NULL;
625 f = g_fopen(filename,
"rb");
629 "[mipmap_cache] cached file for image %d at mip size %i does not exist\n",
634 fseek(
f, 0, SEEK_END);
638 error =
"empty file";
646 error =
"out of memory";
651 fseek(
f, 0, SEEK_SET);
652 const size_t rd = fread(blob,
sizeof(uint8_t), len,
f);
655 error =
"corrupted file";
662 error =
"couldn't decompress header";
671 error =
"couldn't decompress JPEG";
690 fprintf(stderr,
"[mipmap_cache] failed to open thumbnail for image %" PRIu32
" from `%s'. Reason: %s\n",
691 imgid, filename,
error);
732 gboolean write_to_disk;
748 const int mkd = g_mkdir_with_parents(cache_path, 0750);
757 if((
f = g_fopen(filename,
"wb")))
761 if (!
statvfs(filename, &vfsbuf))
766 fprintf(stderr,
"Aborting image write as only %" PRId64
" MB free to write %s\n", free_mb, filename);
772 fprintf(stderr,
"Aborting image write since couldn't determine free space available to write %s\n", filename);
777 const uint8_t *exif = NULL;
790 MIN(100,
MAX(10, cache_quality)), exif, exif_len))
945 g_hash_table_iter_init(&it, c->hashtable);
946 while(g_hash_table_iter_next(&it, &
key, &
value))
954 g_array_append_val(
out, s);
962 if(current) *current = 0;
973 if(current) *current = used;
995 return &cache->
mip_f;
1032 gboolean no_buffer =
TRUE;
1037 *buffered_image = *cimg;
1056 const uint32_t original_width = dsc->
width;
1057 const uint32_t original_height = dsc->
height;
1058 const float original_iscale = dsc->
iscale;
1064 _cache_print(
DT_DEBUG_CACHE,
"[mipmap_cache] image %d at mip size %i (%ix%i) will skip disk I/O, found in RAM cache.\n", imgid, mip,
1081 "[mipmap_cache] fetch image %i at mip size %d float32 (%ix%i) from original file I/O\n",
1099 *img = buffered_image;
1112 "[mipmap_cache] compute mip size %d float32 for image %i (%ix%i) from original file \n", mip,
1120 "[mipmap_cache] compute mip size %d uint8 for image %i (%ix%i) from original file \n", mip,
1132 dsc->
width = original_width;
1133 dsc->
height = original_height;
1134 dsc->
iscale = original_iscale;
1140 dsc->
flags &= ~DT_MIPMAP_BUFFER_DSC_FLAG_GENERATE;
1144 _cache_print(
DT_DEBUG_CACHE,
"[mipmap_cache] image %d at mip size %d got a new cache entry (%ix%i / %ix%i) at %p\n", imgid, mip,
1151 const char mode,
const char *file,
int line)
1162 assert(mip <= DT_MIPMAP_NONE && mip >=
DT_MIPMAP_0);
1186 __sync_fetch_and_add(&(
_get_cache(cache, mip)->stats_fetches), 1);
1223 assert(buf->
imgid > 0);
1235 const int32_t
height,
const uint32_t imgid)
1252 const int32_t
height,
const uint32_t imgid)
1285 const int32_t wd = dsc->
width;
1286 const int32_t ht = dsc->
height;
1296 dsc->
flags &= ~DT_MIPMAP_BUFFER_DSC_FLAG_GENERATE;
1367 const int32_t imgid)
1397 roi_in.
x = roi_in.
y = 0;
1400 roi_in.
scale = 1.0f;
1402 roi_out.
x = roi_out.
y = 0;
1407 roi_out.
scale = fminf(((
float)wd) / (
float)image->
width, ((
float)ht) / (
float)image->
height);
1483 void *exif,
int exif_len, int32_t imgid,
int num,
int total,
dt_dev_pixelpipe_t *pipe,
1484 const gboolean export_masks)
1487 memcpy(
d->buf, in,
sizeof(uint32_t) * data->
width * data->
height);
1491static int _load_jpg(
const char *filename,
const int32_t imgid,
const uint32_t wd,
const uint32_t ht,
1515 const size_t filename_len = strlen(filename) - strlen(ext);
1516 const char *exts[4] = {
".jpg",
".JPG",
".jpeg",
".JPEG" };
1518 for(
int i = 0;
i < 4;
i++)
1525 const size_t str_copy = g_snprintf(sidecar,
DT_PATH_MAX,
"%.*s%s", (
int)filename_len, filename, exts[
i]);
1531 if(g_file_test(sidecar, G_FILE_TEST_EXISTS))
1548 char ext[6] = { 0 };
1549 gboolean input_exists, is_jpg_input, use_embedded_jpg;
1590 if(use_embedded_jpg)
1604 if(
res && use_embedded_jpg)
1623 uint8_t *tmp = NULL;
1624 int32_t thumb_width, thumb_height;
1650 if(embedded_jpg_mode == 2)
1653 "[mipmap_cache] embedded JPEG mode forbids raw processing for image %d at mip %d\n",
1674 NULL, 1, 1, NULL, shutdown);
1689 fprintf(stderr,
"[mipmap_cache] could not process thumbnail!\n");
1699 gboolean write_to_disk_src, write_to_disk_dst;
1703 if(cache->
cachedir[0] && write_to_disk_src && write_to_disk_dst)
1712 GFile *src = g_file_new_for_path(srcpath);
1713 GFile *dst = g_file_new_for_path(dstpath);
1714 GError *gerror = NULL;
1715 g_file_copy(src, dst, G_FILE_COPY_NONE, NULL, NULL, NULL, &gerror);
1717 g_object_unref(dst);
1718 g_object_unref(src);
1719 g_clear_error(&gerror);
static void error(char *msg)
int dt_atomic_get_int(dt_atomic_int *var)
#define dt_cache_release(A, B)
#define dt_cache_get(A, B, C)
static void dt_cache_set_cleanup_callback(dt_cache_t *cache, dt_cache_cleanup_t cleanup_cb, void *cleanup_data)
static void dt_cache_set_allocate_callback(dt_cache_t *cache, dt_cache_allocate_t allocate_cb, void *allocate_data)
gboolean dt_colorprofiles_bgra8_to_adobergb_rgba8(const uint8_t *const in, uint8_t *const out, const int width, const int height, const dt_colorspaces_color_profile_type_t src_space)
The storage leg: convert an 8-bit plane from src_space (BGRA8) to AdobeRGB (RGBA8),...
const dt_colormatrix_t dt_aligned_pixel_t out
dt_image_path_source_t dt_image_choose_input_path(const dt_image_t *img, char *pathname, size_t pathname_len, gboolean force_cache)
gboolean dt_image_resolve_usercrop(const int32_t imgid, dt_boundingbox_t box)
#define ASAN_POISON_MEMORY_REGION(addr, size)
#define ASAN_UNPOISON_MEMORY_REGION(addr, size)
void * dt_alloc_align(size_t size)
Allocate cacheline-aligned memory.
const gchar * dt_database_get_path(void)
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)
Initialise a mutex. With mutexattr NULL – which is how 54 of the 56 call sites in this tree spell it ...
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
void dt_loc_get_user_cache_dir(char *cachedir, size_t bufsize)
static gchar * g_realpath(const char *path)
float dt_boundingbox_t[4]
void dt_image_cache_write_release(dt_image_t *img, dt_image_cache_write_mode_t mode)
dt_image_t * dt_image_cache_get(const int32_t imgid, char mode)
void dt_image_cache_read_release(const dt_image_t *img)
int dt_imageio_export_with_flags(const int32_t imgid, const char *filename, dt_imageio_module_format_t *format, dt_imageio_module_data_t *format_params, const gboolean ignore_exif, const gboolean display_byteorder, const gboolean high_quality, gboolean is_scaling, const gboolean thumbnail_export, const char *filter, const gboolean copy_metadata, const gboolean export_masks, dt_colorspaces_color_profile_type_t icc_type, const gchar *icc_filename, dt_iop_color_intent_t icc_intent, dt_imageio_module_storage_t *storage, dt_imageio_module_data_t *storage_params, int num, int total, dt_export_metadata_t *metadata, dt_atomic_int *shutdown)
dt_imageio_retval_t dt_imageio_open(dt_image_t *img, const char *filename, dt_mipmap_buffer_t *buf)
gboolean dt_imageio_crop_thumbnail(const dt_boundingbox_t box, uint8_t *const buffer, int32_t *width, int32_t *height)
Crop an 8-bit RGBA preview buffer in place to a normalized bounding box.
int dt_imageio_large_thumbnail(const char *filename, uint8_t **buffer, int32_t *th_width, int32_t *th_height, dt_colorspaces_color_profile_type_t *color_space, const int width, const int height)
Load the thumbnail embedded into a RAW file having at least the size MAX(width, height) x MAX(width,...
int dt_imageio_jpeg_read(dt_imageio_jpeg_t *jpg, uint8_t *out)
int dt_imageio_jpeg_read_header(const char *filename, dt_imageio_jpeg_t *jpg)
dt_colorspaces_color_profile_type_t dt_imageio_jpeg_read_color_space(dt_imageio_jpeg_t *jpg)
int dt_imageio_jpeg_decompress_header(const void *in, size_t length, dt_imageio_jpeg_t *jpg)
int dt_imageio_jpeg_decompress(dt_imageio_jpeg_t *jpg, uint8_t *out)
int dt_imageio_jpeg_write(const char *filename, const uint8_t *in, const int width, const int height, const int quality, const void *exif, int exif_len)
void dt_iop_clip_and_zoom_mosaic_half_size_f(float *const out, const float *const in, const dt_iop_roi_t *const roi_out, const dt_iop_roi_t *const roi_in, const int32_t out_stride, const int32_t in_stride, const uint32_t filters)
void dt_iop_clip_and_zoom(float *out, const float *const in, const dt_iop_roi_t *const roi_out, const dt_iop_roi_t *const roi_in, const int32_t out_stride, const int32_t in_stride)
void dt_iop_flip_and_zoom_8(const uint8_t *in, int32_t iw, int32_t ih, uint8_t *out, int32_t ow, int32_t oh, const dt_image_orientation_t orientation, uint32_t *width, uint32_t *height)
void dt_iop_clip_and_zoom_mosaic_half_size(uint16_t *const out, const uint16_t *const in, const dt_iop_roi_t *const roi_out, const dt_iop_roi_t *const roi_in, const int32_t out_stride, const int32_t in_stride, const uint32_t filters)
void dt_iop_clip_and_zoom_mosaic_third_size_xtrans(uint16_t *const out, const uint16_t *const in, const dt_iop_roi_t *const roi_out, const dt_iop_roi_t *const roi_in, const int32_t out_stride, const int32_t in_stride, const uint8_t(*const xtrans)[6])
void dt_iop_clip_and_zoom_mosaic_third_size_xtrans_f(float *const out, const float *const in, const dt_iop_roi_t *const roi_out, const dt_iop_roi_t *const roi_in, const int32_t out_stride, const int32_t in_stride, const uint8_t(*const xtrans)[6])
#define DT_CTL_WORKER_RESERVED
float *const restrict const size_t k
#define dt_unreachable_codepath()
Mark a branch as impossible.
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
#define dt_free_align(ptr)
Release memory from dt_alloc_align() and set ptr to NULL.
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
#define DT_CACHELINE_BYTES
void * dt_mipmap_cache_alloc(dt_mipmap_buffer_t *buf, const dt_image_t *img)
static void _sync_dsc_to_buf(dt_mipmap_buffer_t *buf, struct dt_mipmap_buffer_dsc *dsc, const int32_t imgid, const dt_mipmap_size_t mip)
static void _paint_skulls(dt_mipmap_buffer_t *buf, struct dt_mipmap_buffer_dsc *dsc, const int32_t imgid, const dt_mipmap_size_t mip)
static dt_mipmap_cache_settings_t _settings_get(void)
dt_mipmap_size_t dt_mipmap_cache_get_fitting_size(const int32_t width, const int32_t height, const uint32_t imgid)
static const uint8_t dt_mipmap_cache_exif_data_srgb[]
void dt_mipmap_cache_get_usage(size_t *current, size_t *max)
static int _write_image(dt_imageio_module_data_t *data, const char *filename, const void *in, dt_colorspaces_color_profile_type_t over_type, const char *over_filename, void *exif, int exif_len, int32_t imgid, int num, int total, dt_dev_pixelpipe_t *pipe, const gboolean export_masks)
static int _bpp(dt_imageio_module_data_t *data)
static void _init_f(dt_mipmap_buffer_t *mipmap_buf, float *buf, uint32_t *width, uint32_t *height, float *iscale, const int32_t imgid)
static const int dt_mipmap_cache_exif_data_adobergb_length
static void _init_8(uint8_t *buf, uint32_t *width, uint32_t *height, float *iscale, dt_colorspaces_color_profile_type_t *color_space, const int32_t imgid, const dt_mipmap_size_t size, dt_atomic_int *shutdown)
static dt_pthread_mutex_t _settings_lock
void dt_mipmap_cache_update_buffer_addresses(dt_cache_entry_t *entry, struct dt_mipmap_buffer_dsc **dsc, const size_t width, const size_t height, const size_t buffer_size)
Resync all references to all references.
static int _find_sidecar_jpg(const char *filename, const char *ext, char *sidecar)
void dt_mipmap_cache_get_with_caller(dt_mipmap_buffer_t *buf, const int32_t imgid, const dt_mipmap_size_t mip, const dt_mipmap_get_flags_t flags, const char mode, const char *file, int line)
static void _mipmap_subcache_collect(dt_cache_t *c, GArray *out)
void dt_mipmap_cache_init(const dt_mipmap_cache_settings_t *settings, const gboolean verbose)
Initialise the cache.
void dt_mipmap_cache_cleanup(void)
static void _invalidate_buffer(dt_mipmap_buffer_t *buf)
void dt_mipmap_cache_release_with_caller(dt_mipmap_buffer_t *buf, const char *file, int line)
static const int dt_mipmap_cache_exif_data_srgb_length
#define _cache_print(channel,...)
static dt_mipmap_cache_one_t * _get_cache(dt_mipmap_cache_t *cache, const dt_mipmap_size_t mip)
void dt_mipmap_cache_write_get_with_caller(dt_mipmap_buffer_t *buf, const int32_t imgid, const int mip, const char *file, int line)
static int dt_mipmap_cache_get_filename(gchar *mipmapfilename, size_t size)
void dt_mipmap_cache_remove(const int32_t imgid, const gboolean flush_disk)
static uint8_t * _get_buffer_from_dsc(struct dt_mipmap_buffer_dsc *dsc)
static void _write_mipmap_to_disk(const int32_t imgid, char *filename, char *ext, gboolean *input_exists, gboolean *is_jpg_input, gboolean *use_embedded_jpg, gboolean *write_to_disk)
Check if an image should be written to disk, if the thumbnail should be computed from embedded JPEG,...
static const uint8_t dt_mipmap_cache_exif_data_adobergb[]
void dt_mipmap_cache_remove_all_sizes(const int32_t imgid, const gboolean flush_disk)
static void * dead_image_8(struct dt_mipmap_buffer_dsc *dsc)
void dt_mipmap_cache_copy_thumbnails(const uint32_t dst_imgid, const uint32_t src_imgid)
static void _settings_lock_ensure(void)
static void _generate_blocking(dt_cache_entry_t *entry, dt_mipmap_buffer_t *buf, const int32_t imgid, const dt_mipmap_size_t mip, dt_atomic_int *shutdown)
static gboolean _get_image_copy(const int32_t imgid, dt_image_t *buffered_image)
void dt_mipmap_get_cache_dir(char path[DT_PATH_MAX], dt_mipmap_size_t mip)
void dt_mipmap_cache_get_settings(dt_mipmap_cache_settings_t *settings)
Read back the settings in force. Snapshot, taken under the same lock the setter takes,...
void dt_mipmap_cache_remove_at_size(const int32_t imgid, const dt_mipmap_size_t mip, const gboolean flush_disk)
static void _validate_buffer(dt_mipmap_buffer_t *buf, struct dt_mipmap_buffer_dsc *dsc, const int32_t imgid, const dt_mipmap_size_t mip)
static size_t _get_entry_size(const size_t buffer_size)
static uint32_t get_imgid(const uint32_t key)
void dt_mipmap_cache_print(void)
void dt_mipmap_cache_deallocate_dynamic(void *data, dt_cache_entry_t *entry)
void dt_mipmap_cache_get_with_caller_and_shutdown(dt_mipmap_buffer_t *buf, const int32_t imgid, const dt_mipmap_size_t mip, const dt_mipmap_get_flags_t flags, const char mode, dt_atomic_int *shutdown, const char *file, int line)
void dt_mipmap_cache_set_settings(const dt_mipmap_cache_settings_t *settings)
Apply new settings to a running cache.
void dt_mipmap_cache_allocate_dynamic(void *data, dt_cache_entry_t *entry)
static int _load_jpg(const char *filename, const int32_t imgid, const uint32_t wd, const uint32_t ht, const dt_mipmap_size_t size, const dt_image_orientation_t orientation, uint8_t *buf, uint32_t *width, uint32_t *height, dt_colorspaces_color_profile_type_t *color_space)
void dt_mimap_cache_evict(const int32_t imgid)
static int32_t get_key(const int32_t imgid, const dt_mipmap_size_t size)
static dt_mipmap_cache_settings_t _settings
struct dt_mipmap_buffer_dsc * _get_dsc_from_entry(dt_cache_entry_t *entry)
#define DT_MIPMAP_CACHE_DEFAULT_FILE_NAME
GArray * dt_mipmap_cache_get_entries_stats(void)
dt_mipmap_size_t dt_mipmap_cache_get_matching_size(const int32_t width, const int32_t height, const uint32_t imgid)
dt_colorspaces_color_profile_type_t color_space
static dt_mipmap_size_t get_size(const uint32_t key)
void dt_mipmap_get_cache_filename(char path[DT_PATH_MAX], dt_mipmap_size_t mip, const int32_t imgid)
dt_mipmap_buffer_dsc_flags
@ DT_MIPMAP_BUFFER_DSC_FLAG_NONE
@ DT_MIPMAP_BUFFER_DSC_FLAG_INVALIDATE
@ DT_MIPMAP_BUFFER_DSC_FLAG_GENERATE
static void dt_mipmap_cache_unlink_ondisk_thumbnail(void *data, int32_t imgid, dt_mipmap_size_t mip)
static dt_mipmap_cache_t * _mipmap_cache
static void _remove_one_size(const int32_t imgid, const dt_mipmap_size_t mip)
dt_mipmap_buffer_dsc_flags flags
void dt_mipmap_cache_swap_at_size(const int32_t imgid, const dt_mipmap_size_t mip, const uint8_t *const in, const int32_t width, const int32_t height, dt_colorspaces_color_profile_type_t profile)
static gsize _settings_lock_inited
static int _levels(dt_imageio_module_data_t *data)
#define dt_mipmap_cache_get(B, C, D, E, F)
#define dt_mipmap_cache_release(B)
#define DT_PATH_MAX
Buffer size for a filesystem path anywhere in Ansel.
void dt_concat_path_file(char destination[4096], const char path[4096], const char *const file)
Append a constant filename to a variable, stack-based, fixed-sized, directory, and add a / in-between...
#define dt_pixelpipe_cache_free_align(mem)
@ DT_INTENT_LAST
Count of real intents, and the codebase's "unset" marker – never a user choice.
dt_colorspaces_color_profile_type_t
@ DT_COLORSPACE_DISPLAY
The monitor profile – the one list entry that mutates after init.
@ DT_COLORSPACE_SRGB
sRGB – registered TWICE, and the two entries are not interchangeable.
@ DT_COLORSPACE_NONE
No profile / "take it from the image settings". Never matches a list entry.
float dt_aligned_pixel_simd_t __attribute__((vector_size(16), aligned(16)))
Apply one channel's tone curve to each of the three colour channels, or pass the channel through unto...
static const dt_aligned_pixel_simd_t value
void dt_cache_release_with_caller(dt_cache_t *cache, dt_cache_entry_t *entry, const char *file, int line)
dt_cache_entry_t * dt_cache_testget(dt_cache_t *cache, const uint32_t key, char mode)
void dt_cache_init(dt_cache_t *cache, size_t entry_size, size_t cost_quota)
dt_cache_entry_t * dt_cache_get_with_caller(dt_cache_t *cache, const uint32_t key, char mode, const char *file, int line)
int dt_cache_remove(dt_cache_t *cache, const uint32_t key)
void dt_cache_cleanup(dt_cache_t *cache)
unsigned __int64 uint64_t
dt_imageio_module_data_t head
dt_image_orientation_t orientation
char filename[DT_MAX_FILENAME_LEN]
dt_iop_buffer_type_t datatype
Region of interest passed through the pixelpipe.
dt_colorspaces_color_profile_type_t color_space
dt_mipmap_buffer_dsc_flags flags
dt_colorspaces_color_profile_type_t color_space
dt_cache_entry_t * cache_entry
long int stats_near_match
Everything about the mipmap cache that the USER decides.
size_t max_memory
RAM budget for the thumbnail LRU, in bytes. A soft quota, not a hard limit.
int embedded_jpg
Whether to prefer the embedded JPEG over decoding (lighttable/embedded_jpg).
int cache_quality
JPEG quality for thumbnails written to disk (database_cache_quality).
gboolean disk_backend
Write generated thumbnails to the on-disk cache (cache_disk_backend).
dt_mipmap_cache_one_t mip_full
size_t max_height[DT_MIPMAP_NONE]
dt_mipmap_cache_one_t mip_f
dt_mipmap_cache_one_t mip_thumbs
char cachedir[DT_PATH_MAX]
size_t max_width[DT_MIPMAP_NONE]
size_t buffer_size[DT_MIPMAP_NONE]
void dt_supervisor_mipmap(const dt_sv_op_t op, const int32_t imgid, const int mip)
void dt_supervisor_image(const dt_sv_op_t op, const int32_t imgid, const dt_image_t *img)
static gboolean dt_supervisor_active(void)