Showing with 66 additions and 44 deletions.
  1. +9 −9 README.md
  2. +2 −0 data/org.darktable.darktable.appdata.xml.in
  3. +7 −6 src/common/history.c
  4. +10 −2 src/develop/develop.c
  5. +27 −15 src/develop/imageop.c
  6. +1 −1 src/develop/lightroom.c
  7. +3 −3 src/iop/colorbalancergb.c
  8. +1 −1 src/iop/filmicrgb.c
  9. +4 −5 src/iop/liquify.c
  10. +1 −1 src/iop/negadoctor.c
  11. +1 −1 src/tests/integration
18 changes: 9 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,26 +89,26 @@ you can build the software yourself following the instructions [below](#building

### Latest release

4.4.0 (stable)
4.4.1 (stable)

* [Download executable for Windows](https://github.com/darktable-org/darktable/releases/download/release-4.4.0/darktable-4.4.0-win64.exe)
* [Download executable for macOS on Intel](https://github.com/darktable-org/darktable/releases/download/release-4.4.0/darktable-4.4.0-x86_64.dmg)
* [Download executable for macOS on Apple Silicon](https://github.com/darktable-org/darktable/releases/download/release-4.4.0/darktable-4.4.0-arm64.dmg)
* [Install native packages and repositories for Linux](https://software.opensuse.org/download.html?project=graphics:darktable:stable&package=darktable)
* [Download executable for Windows](https://github.com/darktable-org/darktable/releases/download/release-4.4.1/darktable-4.4.1-win64.exe)
* [Download executable for macOS on Intel](https://github.com/darktable-org/darktable/releases/download/release-4.4.1/darktable-4.4.1-x86_64.dmg)
* [Download executable for macOS on Apple Silicon](https://github.com/darktable-org/darktable/releases/download/release-4.4.1/darktable-4.4.1-arm64.dmg)
* [Install native packages or add a third-party repository for Linux distros](https://software.opensuse.org/download.html?project=graphics:darktable:stable&package=darktable)
* [Install Flatpak package for Linux](https://flathub.org/apps/details/org.darktable.Darktable)
* [More information about installing darktable on any system](https://www.darktable.org/install/)

*When using a pre-built package, ensure that it has been built with Lua, OpenCL, OpenMP and Colord support.
These are optional and will not prevent darktable from running if missing,
but their absence will degrade the user experience.
Notably, some Flatpak, Snap and AppImage packages lack OpenCL and Lua support.*
You can check for them by running darktable with the `--version` command line option.*

### Development snapshot

The development snapshot reflects the current state of the master branch. It is intended for testing and is generally not safe. See the notes [below](#get-the-source) for warnings and precautions about using the master branch.

* [Install native packages and repositories for Linux](https://software.opensuse.org/download.html?project=graphics:darktable:master&package=darktable) (one snapshot per day).
* [Binary packages are provided for macOS and Windows on a nightly basis](https://github.com/darktable-org/darktable/actions/workflows/nightly.yml) (x86_64 only).
* [Binary packages are provided for Linux (AppImage), macOS and Windows on a nightly basis](https://github.com/darktable-org/darktable/releases/tag/nightly) (x86_64 only).

Updating from older versions
----------------------------
Expand Down Expand Up @@ -264,7 +264,7 @@ See below (in "Using") how to start a test install of the unstable version witho

#### Latest stable release

4.4.0
4.4.1

The darktable project releases two major versions every year, on Summer and Winter Solstices, tagged with even numbers (e.g. 4.0, 4.2, 4.4, 4.6).
Minor revisions are tagged with a third digit (e.g. 4.0.1, 4.0.2) and mostly provide bug fixes and camera support.
Expand All @@ -274,7 +274,7 @@ You may want to compile these stable releases yourself to get better performance
git clone --recurse-submodules --depth 1 https://github.com/darktable-org/darktable.git
cd darktable
git fetch --tags
git checkout tags/release-4.4.0
git checkout tags/release-4.4.1
```

### Get submodules
Expand Down
2 changes: 2 additions & 0 deletions data/org.darktable.darktable.appdata.xml.in
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
</screenshots>
<content_rating type="oars-1.1" />
<releases>
<release date="2023-07-01" version="4.4.1"/>
<release date="2023-06-21" version="4.4.0"/>
<release date="2023-02-15" version="4.2.1"/>
<release date="2022-12-21" version="4.2.0"/>
<release date="2022-09-17" version="4.0.1"/>
Expand Down
13 changes: 7 additions & 6 deletions src/common/history.c
Original file line number Diff line number Diff line change
Expand Up @@ -925,20 +925,21 @@ char *dt_history_get_name_label(const char *name,
const char *label,
const gboolean markup)
{
char *result = NULL;

if(!label
|| strlen(label) == 0
|| strcmp(label, "0") == 0)
{
return g_strdup_printf("%s", name);
result = g_markup_escape_text(name, -1);
}
else
{
return g_strdup_printf("%s • %s%s%s",
name,
markup ? "<small>" : "",
label,
markup ? "</small>" : "");
result = markup ? g_markup_printf_escaped("%s • <small>%s</small>", name, label)
: g_markup_printf_escaped("%s • %s", name, label);
}

return result;
}

GList *dt_history_get_items(const dt_imgid_t imgid,
Expand Down
12 changes: 10 additions & 2 deletions src/develop/develop.c
Original file line number Diff line number Diff line change
Expand Up @@ -1704,12 +1704,20 @@ static gboolean _dev_auto_apply_presets(dt_develop_t *dev)
" ('ioporder', 'metadata', 'modulegroups', 'export',"
" 'tagging', 'collect', '%s')"
// select all user's auto presets or the hard-coded presets (for the workflow)
// if non auto-presets for the same operation found.
// if non auto-presets for the same operation and matching
// camera/lens/focal/format/exposure found.
" AND (writeprotect = 0"
" OR (SELECT NOT EXISTS"
" (SELECT op"
" FROM presets"
" WHERE autoapply = 1 AND operation = op AND writeprotect = 0)))"
" WHERE autoapply = 1 AND operation = op AND writeprotect = 0"
" AND ((?2 LIKE model AND ?3 LIKE maker)"
" OR (?4 LIKE model AND ?5 LIKE maker))"
" AND ?6 LIKE lens AND ?7 BETWEEN iso_min AND iso_max"
" AND ?8 BETWEEN exposure_min AND exposure_max"
" AND ?9 BETWEEN aperture_min AND aperture_max"
" AND ?10 BETWEEN focal_length_min AND focal_length_max"
" AND (format = 0 OR (format&?11 != 0 AND ~format&?12 != 0)))))"
" ORDER BY writeprotect DESC, LENGTH(model), LENGTH(maker), LENGTH(lens)",
// auto module:
// ON : we take as the preset label either the multi-name
Expand Down
42 changes: 27 additions & 15 deletions src/develop/imageop.c
Original file line number Diff line number Diff line change
Expand Up @@ -944,7 +944,12 @@ void dt_iop_gui_rename_module(dt_iop_module_t *module)
gtk_widget_set_name(entry, "iop-panel-label");
gtk_entry_set_width_chars(GTK_ENTRY(entry), 0);
gtk_entry_set_max_length(GTK_ENTRY(entry), sizeof(module->multi_name) - 1);
gtk_entry_set_text(GTK_ENTRY(entry), module->multi_name);
gtk_entry_set_text(GTK_ENTRY(entry),
strcmp(module->multi_name, "0")
|| module->multi_priority > 0
|| module->multi_name_hand_edited
? module->multi_name
: "");

// hide module instance name as we need the space for the entry
gtk_widget_hide(module->instance_name);
Expand Down Expand Up @@ -1206,24 +1211,28 @@ static void _iop_panel_name(dt_iop_module_t *module)

gtk_label_set_text(iname, new_label);

// check last history item and see if we can change its label
// accordingly. this must be done for the proper module and
// corresponding multi-priority.
// note: do not update for trouble messages has this will create
// some infinite loop with lens module.
const GList *history = g_list_last(darktable.develop->history);

if(history && !module->has_trouble)
if(dt_conf_get_bool("darkroom/ui/auto_module_name_update"))
{
dt_dev_history_item_t *hitem = (dt_dev_history_item_t *)(history->data);
// check last history item and see if we can change its label
// accordingly. this must be done for the proper module and
// corresponding multi-priority.
// note: do not update for trouble messages has this will create
// some infinite loop with lens module.

const GList *history = g_list_last(darktable.develop->history);

if(hitem->module == module
&& hitem->module->multi_priority == module->multi_priority)
if(history && !module->has_trouble)
{
const gboolean changed = g_strcmp0(hitem->multi_name, multi_name);
if(changed)
dt_dev_history_item_t *hitem = (dt_dev_history_item_t *)(history->data);

if(hitem->module == module
&& hitem->module->multi_priority == module->multi_priority)
{
dt_dev_add_history_item(darktable.develop, module, FALSE);
const gboolean changed = g_strcmp0(hitem->multi_name, multi_name);
if(changed)
{
dt_dev_add_history_item(darktable.develop, module, FALSE);
}
}
}
}
Expand Down Expand Up @@ -2890,14 +2899,17 @@ void dt_iop_gui_set_expander(dt_iop_module_t *module)
module->label = gtk_label_new(module->name());
gtk_widget_set_name(module->label, "iop-panel-label");
gtk_label_set_ellipsize(GTK_LABEL(module->label), PANGO_ELLIPSIZE_END);
gtk_widget_set_valign(module->label, GTK_ALIGN_BASELINE);
g_object_set(G_OBJECT(module->label), "xalign", 0.0, (gchar *)0);

gtk_container_add(GTK_CONTAINER(lab), module->label);
gtk_widget_set_valign(lab, GTK_ALIGN_BASELINE);

module->instance_name = gtk_label_new("");
hw[IOP_MODULE_INSTANCE_NAME] = module->instance_name;
gtk_widget_set_name(module->instance_name, "iop-module-name");
gtk_label_set_ellipsize(GTK_LABEL(module->instance_name), PANGO_ELLIPSIZE_MIDDLE);
gtk_widget_set_valign(module->instance_name, GTK_ALIGN_BASELINE);
g_object_set(G_OBJECT(module->instance_name), "xalign", 0.0, (gchar *)0);

if((module->flags() & IOP_FLAGS_DEPRECATED) && module->deprecated_msg())
Expand Down
2 changes: 1 addition & 1 deletion src/develop/lightroom.c
Original file line number Diff line number Diff line change
Expand Up @@ -1091,7 +1091,7 @@ gboolean dt_lightroom_import(dt_imgid_t imgid, dt_develop_t *dev, gboolean iauto

// Parse xml document

doc = xmlParseEntity(pathname);
doc = xmlReadFile(pathname, NULL, 0);

if(doc == NULL)
{
Expand Down
6 changes: 3 additions & 3 deletions src/iop/colorbalancergb.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ typedef struct dt_iop_colorbalancergb_data_t
float *gamut_LUT;
float *chroma_LUT;
float max_chroma;
float checker_color_1[4], checker_color_2[4];
dt_aligned_pixel_t checker_color_1, checker_color_2;
dt_iop_colorbalancrgb_saturation_t saturation_formula;
size_t checker_size;
gboolean lut_inited;
Expand Down Expand Up @@ -1328,7 +1328,7 @@ void commit_params(struct dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pix

void init_pipe(dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
{
piece->data = calloc(1, sizeof(dt_iop_colorbalancergb_data_t));
piece->data = dt_calloc_align(64, sizeof(dt_iop_colorbalancergb_data_t));
dt_iop_colorbalancergb_data_t *d = (dt_iop_colorbalancergb_data_t *)(piece->data);
d->gamut_LUT = dt_alloc_align_float(LUT_ELEM);
d->lut_inited = FALSE;
Expand All @@ -1339,7 +1339,7 @@ void cleanup_pipe(dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelp
{
dt_iop_colorbalancergb_data_t *d = (dt_iop_colorbalancergb_data_t *)(piece->data);
if(d->gamut_LUT) dt_free_align(d->gamut_LUT);
free(piece->data);
dt_free_align(piece->data);
piece->data = NULL;
}

Expand Down
2 changes: 1 addition & 1 deletion src/iop/filmicrgb.c
Original file line number Diff line number Diff line change
Expand Up @@ -2036,7 +2036,7 @@ static inline void filmic_v5(const float *const restrict in, float *const restri

gamut_mapping(Ych_final, Ych_original, pix_out, input_matrix_trans, output_matrix, output_matrix_trans,
export_input_matrix_trans, export_output_matrix, export_output_matrix_trans,
display_black, display_white, data->saturation, use_output_profile);
display_black, display_white, 0.0f, use_output_profile);
copy_pixel_nontemporal(out + k, pix_out);
}
dt_omploop_sfence(); // ensure that nontemporal writes complete before we attempt to read output
Expand Down
9 changes: 4 additions & 5 deletions src/iop/liquify.c
Original file line number Diff line number Diff line change
Expand Up @@ -977,7 +977,6 @@ static void apply_round_stamp(const dt_liquify_warp_t *const restrict warp,
for(size_t y = 0; y <= iradius; y++)
{
const float complex y_i = y * I;
const float complex minus_y_i = -y * I;
const float y2 = y*y;
for(size_t x = 0; x <= iradius; x++)
{
Expand Down Expand Up @@ -1011,13 +1010,13 @@ static void apply_round_stamp(const dt_liquify_warp_t *const restrict warp,
// DT_LIQUIFY_WARP_TYPE_RADIAL_GROW or _SHRINK
// abs_strength is negative for _SHRINK
const float abs_lookup = abs_strength * lookup_table[idist] / iradius;
*q1 += abs_lookup * ( x + minus_y_i);
*q1 -= abs_lookup * (x - y_i);
if(x!=0)
*q2 += abs_lookup * (-x + minus_y_i);
*q2 += abs_lookup * (x + y_i);
if(x!=0&&y!=0)
*q3 += abs_lookup * (-x + y_i);
*q3 += abs_lookup * (x - y_i);
if(y!=0)
*q4 += abs_lookup * ( x + y_i);
*q4 -= abs_lookup * (x + y_i);
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/iop/negadoctor.c
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ static inline void _process_pixel(const dt_aligned_pixel_t pix_in,
{
// Compress highlights. from https://lists.gnu.org/archive/html/openexr-devel/2005-03/msg00009.html
pix_out[c] = (print_gamma[c] > soft_clip[c])
? soft_clip[c] + (1.0f - e_to_gamma[c] * soft_clip_comp[c])
? soft_clip[c] + (1.0f - e_to_gamma[c]) * soft_clip_comp[c]
: print_gamma[c];
}
}
Expand Down