Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
mipmap_cache.c File Reference

shit ahead. More...

#include "common/mipmap_cache.h"
#include "common/darktable.h"
#include "common/debug.h"
#include "common/exif.h"
#include "common/file_location.h"
#include "common/grealpath.h"
#include "common/image_cache.h"
#include "common/imageio.h"
#include "common/imageio_jpeg.h"
#include "common/imageio_module.h"
#include "control/conf.h"
#include "control/jobs.h"
#include "develop/imageop_math.h"
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <glib.h>
#include <glib/gstdio.h>
#include <inttypes.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <sys/statvfs.h>
+ Include dependency graph for mipmap_cache.c:

Data Structures

struct  dt_mipmap_buffer_dsc
 
struct  _dummy_data_t
 

Macros

#define DT_MIPMAP_CACHE_FILE_MAGIC   0xD71337
 
#define DT_MIPMAP_CACHE_FILE_VERSION   23
 
#define DT_MIPMAP_CACHE_DEFAULT_FILE_NAME   "mipmaps"
 

Typedefs

typedef enum dt_mipmap_buffer_dsc_flags dt_mipmap_buffer_dsc_flags
 
typedef struct _dummy_data_t _dummy_data_t
 

Enumerations

enum  dt_mipmap_buffer_dsc_flags {
  DT_MIPMAP_BUFFER_DSC_FLAG_NONE = 0 ,
  DT_MIPMAP_BUFFER_DSC_FLAG_GENERATE = 1 << 0 ,
  DT_MIPMAP_BUFFER_DSC_FLAG_INVALIDATE = 1 << 1
}
 

Functions

struct dt_mipmap_buffer_dsc __attribute__ ((packed, aligned(DT_CACHELINE_BYTES)))
 
static const size_t dt_mipmap_buffer_dsc_size __attribute__ ((unused))
 
static uint8_t * _get_buffer_from_dsc (struct dt_mipmap_buffer_dsc *dsc)
 
static voiddead_image_8 (struct dt_mipmap_buffer_dsc *dsc)
 
static int32_t get_key (const int32_t imgid, const dt_mipmap_size_t size)
 
static uint32_t get_imgid (const uint32_t key)
 
static dt_mipmap_size_t get_size (const uint32_t key)
 
static int dt_mipmap_cache_get_filename (gchar *mipmapfilename, size_t size)
 
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, and optionaly return intermediate checks to get there, like whether the input is a JPEG file and if it exists on the filesystem.
 
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 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)
 
struct dt_mipmap_buffer_dsc_get_dsc_from_entry (dt_cache_entry_t *entry)
 
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 _invalidate_buffer (dt_mipmap_buffer_t *buf)
 
static size_t _get_entry_size (const size_t buffer_size)
 
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.
 
voiddt_mipmap_cache_alloc (dt_mipmap_buffer_t *buf, const dt_image_t *img)
 
void dt_mipmap_cache_allocate_dynamic (void *data, dt_cache_entry_t *entry)
 
static void dt_mipmap_cache_unlink_ondisk_thumbnail (void *data, int32_t imgid, dt_mipmap_size_t mip)
 
void dt_mipmap_cache_deallocate_dynamic (void *data, dt_cache_entry_t *entry)
 
void dt_mipmap_cache_init (dt_mipmap_cache_t *cache)
 
void dt_mipmap_cache_cleanup (dt_mipmap_cache_t *cache)
 
void dt_mipmap_cache_print (dt_mipmap_cache_t *cache)
 
static dt_mipmap_cache_one_t_get_cache (dt_mipmap_cache_t *cache, const dt_mipmap_size_t mip)
 
static void _paint_skulls (dt_mipmap_buffer_t *buf, struct dt_mipmap_buffer_dsc *dsc, const dt_mipmap_size_t mip)
 
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 gboolean _get_image_copy (const int32_t imgid, dt_image_t *buffered_image)
 
static void _generate_blocking (dt_cache_entry_t *entry, dt_mipmap_buffer_t *buf, const int32_t imgid, const dt_mipmap_size_t mip)
 
void dt_mipmap_cache_get_with_caller (dt_mipmap_cache_t *cache, 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)
 
void dt_mipmap_cache_write_get_with_caller (dt_mipmap_cache_t *cache, dt_mipmap_buffer_t *buf, const int32_t imgid, const int mip, const char *file, int line)
 
void dt_mipmap_cache_release_with_caller (dt_mipmap_cache_t *cache, dt_mipmap_buffer_t *buf, const char *file, int line)
 
dt_mipmap_size_t dt_mipmap_cache_get_matching_size (const dt_mipmap_cache_t *cache, const int32_t width, const int32_t height)
 
void dt_mipmap_cache_remove_at_size (dt_mipmap_cache_t *cache, const int32_t imgid, const dt_mipmap_size_t mip, const gboolean flush_disk)
 
void dt_mipmap_cache_remove (dt_mipmap_cache_t *cache, const int32_t imgid, const gboolean flush_disk)
 
void dt_mimap_cache_evict (dt_mipmap_cache_t *cache, const int32_t imgid)
 
static int _levels (dt_imageio_module_data_t *data)
 
static int _bpp (dt_imageio_module_data_t *data)
 
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 _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)
 
static int _find_sidecar_jpg (const char *filename, const char *ext, char *sidecar)
 
void dt_mipmap_cache_copy_thumbnails (const dt_mipmap_cache_t *cache, const uint32_t dst_imgid, const uint32_t src_imgid)
 

Variables

static const uint8_t dt_mipmap_cache_exif_data_srgb []
 
static const uint8_t dt_mipmap_cache_exif_data_adobergb []
 
static const int dt_mipmap_cache_exif_data_srgb_length = sizeof(dt_mipmap_cache_exif_data_srgb) / sizeof(*dt_mipmap_cache_exif_data_srgb)
 
static const int dt_mipmap_cache_exif_data_adobergb_length = sizeof(dt_mipmap_cache_exif_data_adobergb) / sizeof(*dt_mipmap_cache_exif_data_adobergb)
 
uint32_t width
 
uint32_t height
 
float iscale
 
size_t size
 
dt_mipmap_buffer_dsc_flags flags
 
dt_colorspaces_color_profile_type_t color_space
 

Detailed Description

shit ahead.

So, (dt_mipmap_buffer_t *buf)->cache_entry holds a back-reference to the cache entry dt_cache_entry_t *entry. (dt_cache_entry_t *entry)->data is a reference to the dt_mipmap_buffer_dsc *dsc, which is mostly a duplicate of dt_mipmap_buffer_t *buf, adding state flags and then 64-bytes memory padding.

entry->data is an opaque, manually-handled, memory buffer holding (in this order):

  • the dt_mipmap_buffer_dsc dsc structure,
  • memory padding for 64-bytes alignment,
  • the actual pixel buffer buf->buf (aligned to 64 bytes);

So the only way of accessing the buf->buf memory is by shifting the entry->data pointer by the size of one dt_mipmap_buffer_dsc structure.

But we need to resync the dt_mipmap_buffer_dsc dsc values with those in dt_mipmap_buffer_t *buf all the fucking time (namely, width, height, scale, color space). And then, we need to resync the buffer sizes between entry->data_size and dsc->size. But beware, because buf->size is actually the integer enum member of mipmap fixed sizes.

All in all, this clever design guarantees a maximum number of opportunities for mistakes, along with non-uniforms accesses, sometimes to dsc, sometimes to buf.

From the rest of the app, we access only dt_mipmap_buffer_t *buf, so this is our way of communicating stuff out there.

Macro Definition Documentation

◆ DT_MIPMAP_CACHE_DEFAULT_FILE_NAME

#define DT_MIPMAP_CACHE_DEFAULT_FILE_NAME   "mipmaps"

◆ DT_MIPMAP_CACHE_FILE_MAGIC

#define DT_MIPMAP_CACHE_FILE_MAGIC   0xD71337

◆ DT_MIPMAP_CACHE_FILE_VERSION

#define DT_MIPMAP_CACHE_FILE_VERSION   23

Typedef Documentation

◆ _dummy_data_t

typedef struct _dummy_data_t _dummy_data_t

◆ dt_mipmap_buffer_dsc_flags

Enumeration Type Documentation

◆ dt_mipmap_buffer_dsc_flags

Enumerator
DT_MIPMAP_BUFFER_DSC_FLAG_NONE 
DT_MIPMAP_BUFFER_DSC_FLAG_GENERATE 
DT_MIPMAP_BUFFER_DSC_FLAG_INVALIDATE 

Function Documentation

◆ __attribute__() [1/2]

struct dt_mipmap_buffer_dsc __attribute__ ( (packed, aligned(DT_CACHELINE_BYTES))  )

◆ __attribute__() [2/2]

static const size_t dt_mipmap_buffer_dsc_size __attribute__ ( (unused)  )
static

◆ _bpp()

static int _bpp ( dt_imageio_module_data_t data)
static

Referenced by _init_8().

◆ _find_sidecar_jpg()

static int _find_sidecar_jpg ( const char *  filename,
const char *  ext,
char *  sidecar 
)
static

References PATH_MAX.

Referenced by _init_8().

◆ _generate_blocking()

◆ _get_buffer_from_dsc()

◆ _get_cache()

◆ _get_dsc_from_entry()

◆ _get_entry_size()

static size_t _get_entry_size ( const size_t  buffer_size)
static

◆ _get_image_copy()

static gboolean _get_image_copy ( const int32_t  imgid,
dt_image_t buffered_image 
)
static

◆ _init_8()

◆ _init_f()

◆ _invalidate_buffer()

◆ _levels()

static int _levels ( dt_imageio_module_data_t data)
static

References IMAGEIO_INT8, and IMAGEIO_RGB.

Referenced by _init_8().

◆ _load_jpg()

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 
)
static

◆ _paint_skulls()

◆ _sync_dsc_to_buf()

◆ _validate_buffer()

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

◆ _write_image()

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

◆ _write_mipmap_to_disk()

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 
)
static

Check if an image should be written to disk, if the thumbnail should be computed from embedded JPEG, and optionaly return intermediate checks to get there, like whether the input is a JPEG file and if it exists on the filesystem.

Parameters
imgidDatabase SQL ID of the image
filenameFilename of the input file. Can be NULL.
extExtension of the input file. Can be NULL.
input_existsWhether the file can be found on the filesystem. Can be NULL.
is_jpg_inputWhether the file is a JPEG. Can be NULL.
use_embedded_jpgWhether the lighttable should use the embedded JPEG thumbnail. Can be NULL.
write_to_diskWhether the cached thumbnail should be flushed to disk before being flushed from RAM. Can be NULL.

References dt_conf_get_bool(), dt_conf_get_int(), dt_image_altered(), dt_image_full_path(), PATH_MAX, and TRUE.

Referenced by _init_8(), dt_mipmap_cache_allocate_dynamic(), dt_mipmap_cache_copy_thumbnails(), and dt_mipmap_cache_deallocate_dynamic().

◆ dead_image_8()

◆ dt_mimap_cache_evict()

void dt_mimap_cache_evict ( dt_mipmap_cache_t cache,
const int32_t  imgid 
)

◆ dt_mipmap_cache_alloc()

◆ dt_mipmap_cache_allocate_dynamic()

◆ dt_mipmap_cache_cleanup()

◆ dt_mipmap_cache_copy_thumbnails()

void dt_mipmap_cache_copy_thumbnails ( const dt_mipmap_cache_t cache,
const uint32_t  dst_imgid,
const uint32_t  src_imgid 
)

◆ dt_mipmap_cache_deallocate_dynamic()

◆ dt_mipmap_cache_get_filename()

static int dt_mipmap_cache_get_filename ( gchar *  mipmapfilename,
size_t  size 
)
static

◆ dt_mipmap_cache_get_matching_size()

dt_mipmap_size_t dt_mipmap_cache_get_matching_size ( const dt_mipmap_cache_t cache,
const int32_t  width,
const int32_t  height 
)

◆ dt_mipmap_cache_get_with_caller()

◆ dt_mipmap_cache_init()

◆ dt_mipmap_cache_print()

◆ dt_mipmap_cache_release_with_caller()

◆ dt_mipmap_cache_remove()

◆ dt_mipmap_cache_remove_at_size()

◆ dt_mipmap_cache_unlink_ondisk_thumbnail()

static void dt_mipmap_cache_unlink_ondisk_thumbnail ( void data,
int32_t  imgid,
dt_mipmap_size_t  mip 
)
static

◆ dt_mipmap_cache_update_buffer_addresses()

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 
)

◆ dt_mipmap_cache_write_get_with_caller()

void dt_mipmap_cache_write_get_with_caller ( dt_mipmap_cache_t cache,
dt_mipmap_buffer_t buf,
const int32_t  imgid,
const int  mip,
const char *  file,
int  line 
)

◆ get_imgid()

static uint32_t get_imgid ( const uint32_t  key)
inlinestatic

◆ get_key()

static int32_t get_key ( const int32_t  imgid,
const dt_mipmap_size_t  size 
)
inlinestatic

◆ get_size()

static dt_mipmap_size_t get_size ( const uint32_t  key)
inlinestatic

Variable Documentation

◆ color_space

◆ dt_mipmap_cache_exif_data_adobergb

const uint8_t dt_mipmap_cache_exif_data_adobergb[]
static
Initial value:
= {
0x45, 0x78, 0x69, 0x66, 0x00, 0x00, 0x49, 0x49, 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69,
0x87, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
0x01, 0xa0, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}

Referenced by dt_mipmap_cache_deallocate_dynamic().

◆ dt_mipmap_cache_exif_data_adobergb_length

const int dt_mipmap_cache_exif_data_adobergb_length = sizeof(dt_mipmap_cache_exif_data_adobergb) / sizeof(*dt_mipmap_cache_exif_data_adobergb)
static

◆ dt_mipmap_cache_exif_data_srgb

const uint8_t dt_mipmap_cache_exif_data_srgb[]
static
Initial value:
= {
0x45, 0x78, 0x69, 0x66, 0x00, 0x00, 0x49, 0x49, 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69,
0x87, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
0x01, 0xa0, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}

Referenced by dt_mipmap_cache_deallocate_dynamic().

◆ dt_mipmap_cache_exif_data_srgb_length

const int dt_mipmap_cache_exif_data_srgb_length = sizeof(dt_mipmap_cache_exif_data_srgb) / sizeof(*dt_mipmap_cache_exif_data_srgb)
static

◆ flags

Referenced by _add_generic_accel(), _add_widget_accel(), _altered_clicked(), _button_draw(), _colorlabel_clicked(), _draw_triangle(), _ellipse_events_mouse_scrolled(), _ellipse_events_post_expose(), _ellipse_sanitize_config(), _image_import_internal(), _metadata_view_update_values(), _pop_menu_dictionary_edit_tag(), _rating_clicked(), _row_tooltip_setup(), _thumbnail_btn_draw(), _togglebutton_draw(), _tree_tagname_show(), _unaltered_clicked(), _update_altered_filters(), _update_colors_filter(), _update_rating_filter(), _upgrade_library_schema_step(), cht_state_callback(), dt_accels_init(), dt_codepaths_init(), dt_collection_reset(), dt_collection_set_filter_flags(), dt_collection_set_query_flags(), dt_control_crawler_run(), dt_control_refresh_exif_run(), dt_dng_opcode_process_opcode_list_2(), dt_draw_paint_to_pixbuf(), dt_gui_gtk_init(), dt_gui_hist_dialog_new(), dt_history_module_skip_copy(), dt_image_get_xmp_rating_from_flags(), dt_lib_export_metadata_configuration_dialog(), dt_lib_export_metadata_default_flags(), dt_lib_export_metadata_get_conf_flags(), dt_lib_gui_set_expanded(), dt_mipmap_cache_get_with_caller(), dt_tag_export(), dt_tag_get_flags(), dt_tag_get_hierarchical_export(), dt_tag_get_list_export(), dt_tag_get_tag_order_by_id(), dt_tag_set_flags(), dt_tag_set_tag_order_by_id(), dt_variables_set_tags_flags(), dtgtk_cairo_paint_alignment(), dtgtk_cairo_paint_altered(), dtgtk_cairo_paint_arrow(), dtgtk_cairo_paint_aspectflip(), dtgtk_cairo_paint_bulb(), dtgtk_cairo_paint_cut_forms(), dtgtk_cairo_paint_display_wavelet_scale(), dtgtk_cairo_paint_eye(), dtgtk_cairo_paint_eye_toggle(), dtgtk_cairo_paint_flip(), dtgtk_cairo_paint_grouping(), dtgtk_cairo_paint_label(), dtgtk_cairo_paint_label_flower(), dtgtk_cairo_paint_label_sel(), dtgtk_cairo_paint_line_arrow(), dtgtk_cairo_paint_local_copy(), dtgtk_cairo_paint_masks_drawn_and_parametric(), dtgtk_cairo_paint_masks_parametric(), dtgtk_cairo_paint_perspective(), dtgtk_cairo_paint_plus(), dtgtk_cairo_paint_plusminus(), dtgtk_cairo_paint_rawoverexposed(), dtgtk_cairo_paint_refresh(), dtgtk_cairo_paint_reject(), dtgtk_cairo_paint_solid_arrow(), dtgtk_cairo_paint_solid_triangle(), dtgtk_cairo_paint_sortby(), dtgtk_cairo_paint_styles(), dtgtk_cairo_paint_triangle(), dtgtk_cairo_paint_unaltered(), dtgtk_cell_renderer_button_activate(), legacy_params(), and rating_member().

◆ height

◆ iscale

◆ size

size_t size

Referenced by _ask_for_maintenance(), _colorspaces_create_transfer(), _compass_star(), _draw_ellipse(), _draw_rectangle(), _dt_masks_dynbuf_growto(), _get_image_list(), _get_max_scale(), _init_8(), _init_image_pin(), _init_place_pin(), _iop_zonesystem_calculate_zonemap(), _iop_zonesystem_zone_index_from_lightness(), _load_jpg(), _make_clipping_profile(), _panel_get_size_cb(), _print_trace(), _update_display_profile(), _update_params(), _update_size(), _util_get_svg_img(), _view_map_images_count(), ambient_light(), PermutohedralLattice< D, VD >::blur(), char2qstring(), checker_size_callback(), color_filter(), color_picker_helper_4ch(), color_picker_helper_4ch_parallel(), color_picker_helper_4ch_seq(), color_picker_helper_bayer(), color_picker_helper_xtrans(), commit_params(), curl_write_data_cb(), dark_channel(), dl(), draw_rectangle(), draw_triangle(), dt_alloc_align(), dt_alloc_align_internal(), dt_bauhaus_draw_indicator(), dt_box_mean_1ch(), dt_box_mean_4ch(), dt_calloc_align(), dt_colorspaces_get_profile_name(), dt_colorspaces_get_rgb_profile_from_mem(), dt_colorspaces_pseudoinverse(), dt_colorspaces_set_display_profile(), dt_dev_pixelpipe_cache_get(), dt_dev_pixelpipe_set_input(), dt_draw_paint_to_pixbuf(), dt_exif_get_color_space(), dt_exif_get_datetime_taken(), dt_exif_get_thumbnail(), dt_exif_read_from_blob(), dt_exif_write_blob(), dt_get_papers(), dt_hash(), dt_history_compress_on_list(), dt_history_end_attop(), dt_image_cache_init(), dt_imageio_avif_read_profile(), dt_imageio_export_with_flags(), dt_imageio_heif_read_profile(), dt_iop_alloc_image_buffers(), dt_ioppr_deserialize_iop_order_list(), dt_ioppr_serialize_iop_order_list(), dt_lua_event_multiinstance_destroy(), dt_masks_dynbuf_init(), dt_mipmap_cache_get_filename(), dt_pdf_add_icc_from_data(), dt_pdf_finish(), dt_pixel_cache_new_entry(), dt_pwstorage_kwallet_set(), dt_round_size(), dt_round_size_sse(), dt_ui_panel_get_size(), dt_util_get_logo(), dt_util_get_logo_text(), dwt_wavelet_decompose(), get_key(), get_params(), get_pref_name(), get_scales(), gui_post_expose(), guided_filter_tiling(), init(), init_presets(), legacy_params(), lin_interpolate(), main(), main(), matrice_pseudoinverse(), memset_zero(), PermutohedralLattice< D, VD >::merge_splat_threads(), modify_roi_out(), process(), process_common_cleanup(), process_laplacian_bayer(), rfwrite(), rt_adjust_levels(), rt_process_stats(), set_params(), set_params(), set_params(), set_params(), split_path(), to_char_array(), transition_map(), wavelet_denoise(), and wavelet_denoise_xtrans().

◆ width