Project

General

Profile

Bug #11292

Style creation different between GUI and lua API

Added by James Bowen about 1 year ago. Updated about 1 year ago.

Status:
New
Priority:
Low
Category:
Lua
Target version:
-
Start date:
11/08/2016
Due date:
% Done:

0%

Affected Version:
2.0.7
System:
Ubuntu
bitness:
64-bit
hardware architecture:
amd64/x86

Description

In taking my first stab at lua API programming, I've noticed an apparent bug with the style handing. Under certain circumstances, styles created via the GUI differ from style created from the same image via the lua API. The problems occur when multiple history items of the same type (in my testing, crop and rotate) occur back to back. The GUI will collapse these into a single operation and save. Using this style on a duplicate of the original, results in an image equivalent to the modified original, as expected.

Performing the same operation via lua results in the crop and rotate operations being split up, with some prepended before all other operations. Applying this style to a duplicate, causes repeated crop and rotate operations to be applied on top of each other causing a dramatically different result image.

Here is a database dump of the history of the original image

$ sqlite3 .config/darktable/library.db "SELECT * from history where imgid=4146" 
4146|0|1|sharpen||1||7|0|
4146|1|2|flip|����|1||7|0|
4146|2|2|basecurve||1||7|0|
4146|3|5|clipping||1||7|0|
4146|4|5|clipping||1||7|0|
4146|5|5|clipping||1||7|0|

(Notice the three clipping operations in succession)

Here is the DB dump of the style created via the GUI:

$ sqlite3 .config/darktable/library.db "SELECT * from style_items where styleid=3" 
3|0|1|sharpen||1||7|0|
3|1|2|flip|����|1||7|0|
3|2|2|basecurve||1||7|0|
3|5|5|clipping||1||7|0|


And here is the dump of the style created via lua:
$ sqlite3 .config/darktable/library.db "SELECT * from style_items where styleid=6" 
6|0|5|clipping||1||7|2|
6|1|5|clipping||1||7|1|    
6|2|1|sharpen||1||7|0|
6|3|2|flip|����|1||7|0|
6|4|2|basecurve||1||7|0|
6|5|5|clipping||1||7|0|


(Notice clipping operations 0 & 1 prior to sharpen and others)

Looking into the code, the chief codepath difference I see is that the GUI uses a filter to dt_styles_create_from_image() while lua does not. This filter can be seen in the sql debug output from the GUI style operation:

  [sql] /build/darktable-p3fEYL/darktable-2.0.7/src/common/styles.c:431, function dt_styles_create_from_image(): prepare "insert into style_items (styleid,num,module,operation,op_params,enabled,blendop_params,blendop_version,multi_priority,multi_name) select ?1, num,module,operation,op_params,enabled,blendop_params,blendop_version,multi_priority,multi_name from history where imgid=?2 and num in (5,2,1,0)" 

Notice the "in (5,2,1,0)" in the SQL statement. The lua code appears to hardcode NULL as the filter in the call to this function so no filtering is applied.

Reproduction
- select image and enter darkroom
- choose crop and rotate and perform some crop action
- click on another tool (but don't do anything)
- choose crop and rotate and perform another crop action
- click on another tool (but don't do anything)
- at this point the history should have two consecutive but different
crop and rotate operations in the history stack
- return to light table, select image and create style from image

- in lua: duplicate image, create style from original image

Example lua code:

local dt = require "darktable" 

dt.register_event("shortcut",function(event,shortcut)
    local images = dt.gui.action_images
    for _,v in pairs(images) do
      style = dt.styles.create(v, "temp-"..v.filename, "temp")
    end
  end,"Create a style from of image")

style-save-gui.dtstyle - dstyle file from GUI style creation (1.56 KB) James Bowen, 11/08/2016 02:15 AM

style-save-lua.dtstyle - dstyle file from lua style creation (2.45 KB) James Bowen, 11/08/2016 02:15 AM

History

#1 Updated by James Bowen about 1 year ago

Adding data files of exported styles from the above example.

Also available in: Atom PDF