Commit graph

21467 commits

Author SHA1 Message Date
Ell
028b0f39dd app: fix cursor precision of source tools
In GimpCloneTool, set the cursor precision to PIXEL_CENTER while
setting a source, and have GimpBrushTool snap the brush outline to
pixel centers.

(cherry picked from commit ef2818231f)
2019-01-31 06:22:50 -05:00
Ell
b1c977e510 app: fix cursor precision of various tools
Fix the cursor precision of the cage-transform, foreground-select,
n-point deformation, and warp-transform tools.

(cherry picked from commit 158705e4ef)
2019-01-31 04:39:40 -05:00
Michael Natterer
17e360e34b Issue #2863 - Improve error reporting for scripts
gimp_plug_in_handle_proc_install(): print the procedure name when
bailing out of a wrong proc install call. For an obsolete full-path
menu label, also print the label. Original patch by Liam Quin.

(cherry picked from commit 07e3c1c15b)

In libgimp, add a note to gimp_install_procedure() stating that
passing a full menu path as "menu_label" is deprecated.
2019-01-27 13:42:36 +01:00
Salamandar
aaf5816695 Undo some (unnecessary) changes.
(cherry picked from commit fc657184a0)
2019-01-25 21:10:45 +01:00
Félix Piédallu
0436dd1cb7 (source modifs) Fix: Rename macros as it conflicts with Mingw headers.
* DATADIR -> GIMPDATADIR
* SYSCONFDIR -> GIMPSYSCONFDIR
* DATADIR -> SYSDATADIR (tools/)

(cherry picked from commit fc8303dd0a)
2019-01-25 21:10:41 +01:00
Jehan
ffe2fb478c app: new gimp_spin_scale_set_constrain_drag() and use it on paint...
... tools' brush options.
After discussions, it turned out that many people disliked that the spin
scale for brush size (and some other options) get you fractional values.
How often do you actually need to get a 4.32 pixel-size brush? And even
how meaningful is it? On the other hand, you usually want a 4 or a 5
pixel size brush and it's nearly impossible to get (exactly) by dragging
the scale widget.
It is so annoying that some even resort to edit the value with keyboard!
So I am adding an optional "constrain" feature to GimpSpinScale. It will
still be possible to get fractional values when constraining is on, for
instance with keyboard edit (the arrow incrementation also will keep any
fractional part). So the interaction for such scales is simply reversed
so that you get integers easily, and fractional parts with a bit more
effort.

It is not turned on by default (some feature actually need precision and
we don't want to break the sliders for these) and for the time being, I
only applied it to all the brush settings in paint tools. Now that it
exist, we may want to apply this to more scales in various parts of
GIMP.

(cherry picked from commit bff3903f37)
2019-01-25 18:34:09 +01:00
Jehan
ada21f2594 Issue #2848: some sentences have no translation.
(cherry picked from commit f508e24f0c)
2019-01-24 16:20:11 +01:00
Ell
8361377b43 app: in gimp:gradient, improve adaptive supersampling
In gimp:gradient, when using adaptive supersampling, render the
gradient tile-by-tile, using an iterator, instead of row-by-row.
This significantly improves performance, while also avoiding the
assumption that gimp_adaptive_supersample_area() works row-by-row.

Additionally, when not using supersampling, use a single GRand
instance, since the separation to distinct seed and per-tile
instances, which was a threading optimization (commit
7f39e41254), is no longer needed.

(cherry picked from commit 2cd7938f02)
2019-01-24 04:15:27 -05:00
Jehan
e7ec1aa550 app: allow more motion events with line art bucket fill.
When a fill zone was a bit too segmented, you'd want to just stroke
across it. But it was leaving some pieces uncolored, even though the
pointer dragged through it! The exact motion mode allows more events.

Note: I don't set it in the similar color filling (where it could have
been useful too) mostly because it is harder to remove events then (even
if a point was already filled, it could still serve as a seed for more
filling if threshold > 0), thus implied too much processing. Anyway in
all my tests, it was more a problem for line art filling anyway.

(cherry picked from commit 9c13058d54)
2019-01-23 19:42:35 +01:00
Ell
6a65e76267 app: fix rectangle-select tool rounded-corners option
In GimpToolRectangle, fix the type of the cornder_radius field, so
that non-integer radii are properly displayed.

In GimpRectangleSelectOptions and GimpToolRectangle, increase the
maximal corner radius.

(cherry picked from commit a472696012)
2019-01-21 11:39:28 -05:00
Michael Natterer
9adf6c89ff Issue #1942 - Smudge Tool with Sample Merged Option
Add a Sample Merged option to smudge, a lot like for heal, just needed
tweaking in more places.

(cherry picked from commit 34cad3a06e)
2019-01-20 17:50:50 +01:00
Ell
bcc44a08b1 app: fix indentation in gimpmaskundo.h
(cherry picked from commit 4db566f0e1)
2019-01-20 10:33:56 -05:00
Ell
8324aeba82 app: align mask-undo buffer to tile grid
In GimpMaskUndo, align the copied region to the source buffer's
tile grid, so that all copied tiles are COWed.

(cherry picked from commit 7cd768f3d8)
2019-01-20 10:07:33 -05:00
Jehan
10aa988afa Issue #2828: Scrolling up with a mouse within a drop-down list.
We were doing it all the wrong way, fixing one combo box object at a
time. So this commit basically reverses commits 68a33ab5bd, 6dfca83c2a
and a9a979b2d0 and instead runs the same code in the class code. This
way, all objects based on these base classes will have the fix from
scratch.
These improved various other drop-down lists (I found some of them, and
probably not all) as I fixed all GIMP custom widgets based on
GtkComboBox.

Note that it has to be run after filling the list apparently (I had the
problem especially with GimpIntComboBox if running in the _init() code,
then the list widget showed wrong).

(cherry picked from commit 1d984542e9)
2019-01-20 13:48:33 +01:00
Jehan
cbf5e7af7a Issue #2828: Scrolling up with a mouse within a drop-down list.
Just another instance of the GtkCombo issue, same as #2642.

(cherry picked from commit 68a33ab5bd)
2019-01-20 11:58:54 +01:00
Michael Natterer
a94b1389ed Issue #266 - Healing Tool - Sample Merged option does not work
gimp_heal_motion(): when sample merged is active, simply initialize
the paint buffer from the projection instead of the drawable.

(cherry picked from commit e269a837cd)
2019-01-19 18:33:00 +01:00
Ell
4c22313ce6 app: improve gimp_channel_clear()
When clearing a channel, do nothing if the channel is already
empty; otherwise, align the cleared rectangle to the channel
buffer's tile grid, so that all affected tiles are dropped, rather
than zeroed.  Furthermore, only update the affected region of the
channel.

(cherry picked from commit ac5e4f4c33)
2019-01-17 15:15:59 -05:00
Ell
858dbf6e18 app: update drawable filter upon alpha-lock change
In GimpDrawableFilter, when operating on a layer, update the filter
when the layer's lock-alpha flag changes.

(cherry picked from commit de4e7b4770)
2019-01-17 14:21:03 -05:00
Jehan
8064a17e86 app: fix a crash in bucket fill tool.
In commit c71b4916af, I forgot to disconnect signals on the bucket fill
options at finalization, leading the software to crash on an
non-existing tool.

(cherry picked from commit 0a952a3429)
2019-01-17 15:37:24 +01:00
Jehan
7700cb3d81 app: improved fix to commit 036ccc70cf.
After discussion with Sébastien Fourey and David Tschumperlé, it was
decided that a better fix for the edge case raised in #2785 was to add a
keypoint anyway, even if the point and none of its neigbours have a
positive smoothed curvature, yet they have a positive raw curvature. In
such case, we use the local maximum raw curvature instead of the local
maximum smoothed curvature.

(cherry picked from commit aa04258620)
2019-01-17 15:37:24 +01:00
Jehan
b35941ec4c Issue #2785: Fill by line art detection produces Segmentation fault...
... with some images.

(cherry picked from commit 036ccc70cf)
2019-01-17 15:37:24 +01:00
Ell
61a6b15a66 app: parallelize gimp_pickable_contiguous_region_by_color()
... by distributing the processed area over multiple threads.

(cherry picked from commit 8571d7812f)
2019-01-17 09:30:51 -05:00
Ell
cfd1d0463f app: convert gimppickable-contiguous-region to C++
(cherry picked from commit 9719dff9c5)
2019-01-17 09:30:50 -05:00
Jehan
32fdd69324 app: add the concept of line art source to Bucket Fill tool.
Additionally to sample merge and active layer, now we can only use the
layer above or below the active layer as line art source.

The line art fill is meant to work on drawing lines. Though sample merge
still is ok in many cases, the more you fill with colors, the more the
line art computation becomes unecessarily complex. Also when you use a
lot of layers with some of them already filled with colors, it makes it
impossible to colorize some line art zones with the tool. Moreover you
just don't want to have to hide every layers out there to colorize one
layer (especially background layers and such as you may want to see the
result with your background).
Thus we want to be able to set the source as a unique layer, while it
not being necessarily the active one (because you want lines and colors
on different layers). In this case, I am assuming that the color and the
line layers are next to each other (most common organization).

(cherry picked from commit c71b4916af)
2019-01-15 17:39:17 +01:00
Ell
fe5ee0f7b8 app: clear priority rect when finishing projection rendering
In gimp_projection_finish_draw(), clear the chunk iterator's
priority rect before finishing rendering, since it's not needed at
this point, and this is slightly more efficient.

(cherry picked from commit 9833da3431)
2019-01-13 08:23:05 -05:00
Ell
293ae15b72 app: in filter tools, allow toggling on-canvas controller visibility
In GimpFilterTool, when the filter uses an on-canvas controller,
provide a toggle in the tool's filter-options dialog allowing to
toggle the controller's visibility.  This allows getting the
controller out of the way when unneeded.

(cherry picked from commit 33c22ae2a3)
2019-01-13 08:15:51 -05:00
Ell
c862886205 app: add gimp_tool_widget_{get,set}_visible()
Add mew gimp_tool_widget_{get,set}_visible() functions, which allow
setting the visibility of a tool widget.  While the widget is
invisible, it ignores all events.

(cherry picked from commit f1a7abaef9)
2019-01-13 08:15:50 -05:00
Ell
3ac417afe4 app: in GimpDrawTool, avoid CRITICAL on widget signal if not active
In GimpDrawTool, do nothing in the tool-widget signal handlers if
the draw-tool isn't active, to avoid CRITICALs due to a NULL
display.  This can happen if a widget is set before the tool is
started.

(cherry picked from commit 34e6c8734b)
2019-01-13 08:15:49 -05:00
Ell
8477c3d3cd app: in GimpToolPath, use gimp_tool_message() instead of _set_status() ...
... when trying to edit a locked path.

(cherry picked from commit a9883e98e3)
2019-01-13 08:15:49 -05:00
Ell
300166a612 app: handle GimpToolWidget::message in GimpDrawTool
... by forwarding the message to the tool.

(cherry picked from commit 265071f34b)
2019-01-13 08:15:48 -05:00
Ell
52a8dadaf6 app: handle GimpToolWidget::message in GimpToolWidgetGroup
... by forwarding the message, if the emitting widget has focus.

(cherry picked from commit 00a06f94be)
2019-01-13 08:15:48 -05:00
Ell
38c74c2809 app: add gimp_tool_widget_message[_literal]()
Add a GimpToolWidget::message signal, which can be emitted by tool
widgets to display a message, instead of using the ::status signal.

Add corresponding gimp_tool_widget_message[_literal]() functions.

(cherry picked from commit 1ac4b85ce0)
2019-01-13 08:15:47 -05:00
Ell
10f22753e4 app: in gimpdrawtool.c, s/rectangle/widget/ in tool-widget signal handlers
(cherry picked from commit 749dc3c465)
2019-01-13 08:15:46 -05:00
Jehan
78392316db Issue #2786: a few string issues.
Several en_GB to en_US.

Also "Show a preview of the transform_grided image". "grided" should be
"gridded", but I also have a problem with the underscore. Should it be
"transform-gridded"? Even so, does it really make sense?
I chose to just read "Show a preview of the transformed image", which I
think is simpler and the most understandable (we don't need to leak the
implementation with a transform grid into the human read text IMO). If
anyone think that was not the right choice, feel free to propose
otherwise.
Thanks to Bruce Cowan for noticing these.

(cherry picked from commit f9c170dfbd)
2019-01-12 18:04:55 +01:00
Jehan
4fd8e4841f app: add link to Smart Colorization scientific paper.
This is sometimes asked, and myself also need to find it from time to
time. I may as well put the link inside the code comments, where it is
just easy to find!

(cherry picked from commit 005bc1406b)
2019-01-12 18:03:24 +01:00
Ell
dfc038e650 app: in gimp_projection_chunk_render_start(), properly invalidate preview
In gimp_projection_chunk_render_start(), when the current
projection rendering is complete, but not finalized yet, and no new
rendering is started (since the current update region is empty),
make sure to invalidate the projectable's preview, since it
normally happens when rendering is finalized, which doesn't happen
in this case.

(cherry picked from commit 42845c9462)
2019-01-12 08:33:24 -05:00
Ell
f21eec319f app: in gimp_projection_chunk_render_start(), don't leak empty region
In gimp_projection_chunk_render_start(), don't leak the current
update region when it's empty, but not NULL, and properly shut down
the idle source.

(cherry picked from commit 0e5de95760)
2019-01-12 08:20:16 -05:00
Ell
4cbec7608f app: fix gimp_chunk_iterator_set_priority_rect()
(cherry picked from commit 942e1aa939)
2019-01-12 07:32:08 -05:00
Ell
5e00c26295 app: in gimpchunkiterator.c, #include <stdlib.h>
... for qsort().

(cherry picked from commit a61f29e30a)
2019-01-12 06:16:50 -05:00
Ell
aa0df19af2 app: in gimp_gegl_apply_cached_operation(), s/cancellable/cancelable/
To align gimp-2-10 with master, and fix commit
50dc4571cb.
2019-01-12 05:11:47 -05:00
Ell
7547df54dd app: in the gradient tool, halt gradient editor before committing filter
In the gradient tool, halt the gradient editor before committing
the filter, so that its image-flush idle source is removed before
applying the operation, to avoid flushing the image, and hence
restarting its projection rendering, during application.

(cherry picked from commit 2256ab22f7)
2019-01-12 04:54:18 -05:00
Ell
bb4b1e3f1f app: in gimp_tile_handler_validate_buffer_copy(), temporarily remove source handler
In gimp_tile_handler_validate_buffer_copy(), temporarily remove the
source buffer's validate handler, is exists, so that the subsequent
gegl_buffer_copy() can use fast tile copying, using the TILE_COPY
command.  GEGL currently only uses TILE_COPY when the source buffer
doesn't have any user-provided tile handlers.

(cherry picked from commit f4750a0ae7)
2019-01-12 04:54:18 -05:00
Ell
50dc4571cb app: use GimpChunkIterator in gimp_gegl_apply_cached_operation()
In gimp_gegl_apply_cached_operation(), replace the use of
GeglProcessor with GimpChunkIterator, so that we use the same
chunking logic as for rendering projections.  This has the
advantage of better chunk alignment to the tile grid and dynamic
chunk sizing, which improve performance.

Use chunking even when there's no progress indication, since it
generally results in better cache locality.

(cherry picked from commit 4110f7b7b1)
2019-01-12 04:54:16 -05:00
Ell
b62e3fd3b8 app: use GimpChunkIterator in GimpProjection
Replace the custom chunking logic of GimpProjection with
GimpChunkIterator, added in the previous commit.

(cherry picked from commit 246e782858)
2019-01-12 04:53:11 -05:00
Ell
8c31ed6f02 app: add GimpChunkIterator
Factor out the region-chunking logic of GimpProjection into a new
GimpChunkIterator type, providing a generic mechanism for iterating
over a cairo region in discrete chunks.  The iterator doesn't
perform any processing itself, but rather dispenses rectangular
chunks, which the user then processes.

Iteration is broken into intervals, the duration of which is
configurable.  Each iteration begins with a call to
gimp_chunk_iterator_next(), after which
gimp_chunk_iterator_get_rect() should be called in succession to
fetch a rectangle to process, until it returns FALSE, which marks
the end of the iteration.  Updates to the UI should take place in
the interval between iterations, but not during an iteration.  The
iterator dynamically adjusts the chunk size according to processing
speed, in order to match the target iteration interval.

The iterator can be given a priority rectangle, which is processed
before the rest of the region.  It can also be given a
representative tile rectangle, defining a regular tile grid;
dispensed chunks are aligned to the tile grid as much as possible.

(cherry picked from commit ba9ce34e10)
2019-01-12 04:53:10 -05:00
Jehan
0055a2ad73 app: push a temporary status when picking layer with alt-midclick.
Though the layer list will also show updated, it is much easier to look
at the layer name in the status bar whose position never changes.
Anyway it makes sense to just show a temporary status info message
giving the picked layer name, making it all the easier to find the layer
you are looking for.

(cherry picked from commit 496bc02b49)
2019-01-11 13:19:56 +01:00
sabri ünal
a0361ec535 Annotation for translators.
(cherry picked from commit 74df62034a)
2019-01-10 12:55:42 +01:00
Ell
a16d06a40a Issue #1824 - Crash on 2.10.4 using tablet
In GimpTool, track the last-seen pointer coordinates, modifier
state, and event time, during button_press() and motion() events
and use those to synthesize a button_release() event when
comitting/halting the tool, if the tool is still active, and a
matching button_release() event has not been received.

The paint tools (as well as other tools) require each
button_press() event to be matched by a button_release() event in
order to properly finish their operation, but one isn't organically
generated when switching tools due to a device change.

(cherry picked from commit 9b25611857)
2019-01-09 13:40:48 -05:00
Ell
d2b98a6700 app: in gimp_display_empty(), clear image of matching contexts
In gimp_display_empty(), clear the image of all contexts whose
display is the current display, so that, in particular, when
subsequently updating the action groups, which causes certain
actions to be activated, the image that used to be bound to the
display is not found through the user context.  This avoids re-
validating the image projection when closing the last image,
postponing image destruction.

(cherry picked from commit 49e57f8d6e)
2019-01-08 10:05:55 -05:00
Jehan
b1fe1675ce app: expect event == NULL in gimp_device_info_get_event_coords().
The problem was not happening with the master code of
gimpdisplayshell-tool-events.c, but I encountered it in gimp-2-10 with
the layer picking code.
Even then, it still works, but I need to protect calls to
gdk_event_get_axis() to avoid CRITICALs.
2019-01-08 14:19:11 +01:00
Jehan
2dc3e1813c app: make layer picking a generic modifier of the shell.
Instead of having layer picking only on paint tools with alt-click, make
it available everywhere with alt-middle click. Moving through layers is
also a way to navigate an image, so it actually makes sense to be with
other modifiers (panning, zooming, rotating), while making the feature
more generic (this is definitely useful whatever the selected tool).

(cherry picked from commit 4c337353a0)
2019-01-08 13:41:06 +01:00
Jehan
e0be9bdef2 app: alt-click to pick a layer will loop through candidate layers.
If you click on a zone filled in several visible layers, you don't
necessarily want the top layer. You may want one below. With this
change, as long as you hold alt, you will loop through all candidate
layers from top to bottom (then looping back top when reaching the
bottom).
In a first alt-click, you will always end up to the top candidate.

(cherry picked from commit 90e9eb3fca)
2019-01-08 13:41:06 +01:00
Jehan
5790c809c1 app: allow picking layer in paint tools on alt-click.
When working with a lot of layers, it is common to have to switch easily
between layers. And having to go back to the layer list is annoying and
also sometimes not practical at all when you can't find easily the right
layer. This is a first step in an experiment for such a feature, worked
together with Aryeom as advisor (and originator of the feature idea).
For now I apply this only to paint tools, though we are considering
having it as a generic modifier too, working whatever the tool. Yet we
wouldn't be able to use alt-left click (as it is used already in some
tools).
How it works is simply that in any paint tool, alt-click allows to
switch to the topmost layer having a visible pixel at the clicked
position.

(cherry picked from commit 3b59e6f61e)
2019-01-08 13:41:05 +01:00
Ell
926e28b219 app: in bucket fill tool, don't calculate line art of layer groups
... since they can't be used with the fill tool.

(cherry picked from commit 4b4fffbd0e)
2019-01-07 04:29:13 -05:00
Michael Natterer
58e266ed8b Issue #1358 - Increase default size of "extended input device dialog"...
...for a less cramped look

With a minimum width of 300 instead of 200 pixels, much less device
names are cut off and need horizontal scrolling.

(cherry picked from commit ee6b629fa3)
2019-01-07 00:44:36 +01:00
Ell
0f2f95d97b app: in bucket-fill tool, avoid calculating line art when not in line-art mode
In the bucket-fill tool, don't pre-calculate the line art when not
using a line-art fill area.  Also, misc. cleanup.

(cherry picked from commit 823d4a0d24)
2019-01-06 16:31:11 -05:00
Ell
fbf73bee70 app: remove gimp-scratch; replace with gegl-scratch
The scratch allocator has been moved to GEGL (commit
gegl@b99032d799dda3436ffa8c1cc28f8b0d34fb965d).  Remove gimp-
scratch, and replace all its uses with gegl-scratch.

(cherry picked from commit 889e2e26ee)
2019-01-06 07:39:52 -05:00
Michael Natterer
25983b8280 Issue #2751 - Some Translated sentences appear as Untranslated
Pass the translation context to gimp_action_group_add_*_actions() to
make action translations work.

(cherry picked from commit 55219ffaf1)
2019-01-05 02:59:12 +01:00
Ell
7fa5fbab94 app: small fix to last commit
(cherry picked from commit d39ac2a3f0)
2019-01-04 15:32:19 -05:00
Ell
a299270f8a app: in GimpHistogramEditor, don't block when creating bg histogram
In GimpHistogramEditor, when the drawable preview is frozen, don't
duplicate the main histogram as the bg histogram if calculation is
still ongoing, since this will block until histogram calculation is
complete.  In particular, this creates a noticeable stall when
beginning a paint stroke while the histogram is being calculated.

Instead, defer the creation of the bg histogram to the completion
of the calculation of the main histogram.

(cherry picked from commit 471efee769)
2019-01-04 15:18:22 -05:00
Ell
f08065b8c6 app: write floating-point vars using C locale in performance logs
When writing floating-point instrumentation variables in
performance logs, always use the C locale, rather than the current
locale.

(cherry picked from commit 626208b17c)
2019-01-04 13:04:58 -05:00
Michael Natterer
adbac2f680 Issue #2446 - DPI information is not stored in clipboard
Set the "x-dpi" and "y-dpi" options on the GdkPixbuf set on the
clipboard. There is not much more we can do, getting that value across
the clipboard is out of our control, but at least we set the vlaues
now.

(cherry picked from commit a0263f40d0)
2019-01-04 18:13:42 +01:00
Michael Natterer
8dee1276f1 pdb: deprecate gimp_get_theme_dir() and gimp_get_icon_theme_dir()
They are unused in 2.10 and master, and we do this via the plug-in
config message anyway.
2019-01-04 15:55:47 +01:00
Michael Natterer
490d565b57 Issue #2136 - On-image UI for adjusting Linear Motion Blur
Add on-canvas GUI (simple lines) for circular, linear and zoom motion
blur. The restrictions in the interaction show pretty well that there
is room for improvement here, the line is just a bit too generic, but
it's better than nothing.

(cherry picked from commit 39406b83d3)
2019-01-04 14:40:25 +01:00
Ell
5f00ee2a7d app: in GimpHistogramEditor, cancel ongoing async upon update
In gimp_histogram_editor_update(), cancel any ongoing histogram-
calculation async before restarting the idle source.  The async
will have been canceled anyway when recalculating the histogram
once the idle source is run, but we can cancel it as soon as we
know the histogram is outdated.

(cherry picked from commit 5561da87e6)
2019-01-04 08:17:43 -05:00
Ell
8142fe4d1c app: In GimpHistogram, align copied buffer region to tile rect
In gimp_histogram_calculate_async(), align the copied region of the
drawable and mask buffers to the tile grid, so that all copied
tiles are COWed.

(cherry picked from commit d56d663eaa)
2019-01-04 08:17:42 -05:00
Michael Natterer
23cc540f62 Issue #2540 - block width / height slider of the pixelize filter don't...
...have the same scaling

gimp_prop_widget_new_from_pspec(): when restricting the scale to the
actual op area for pixel-coordinate and pixel-distance properties,
only use the max value in the axis direction for pixel-coordinate; for
pixel-distance make sure we use the same value on both axes, simply
use MAX (area.width, area.height).

(cherry picked from commit 0a1ecdf4ee)
2019-01-03 22:23:24 +01:00
Michael Natterer
75682c1650 Issue #1538 - Crash when adding file to already opened image and...
...closing this image while the file is being loaded

Ref the image around all calls to file_open_layers() and
gimp_image_add_layers() so it stays around even if the user closes the
display in the meantime.

(cherry picked from commit fc4add7c2b)
2019-01-03 16:48:32 +01:00
Michael Natterer
4572da5491 Issue #2685 - Crash when distributing layers horizontally
Fix xcf-load.c to correct out-of-range item offsets (simply set them
to 0), so XCF files that are broken this way can still be recovered.

This doesn't fix the original bug, just recovering the crash images.

(cherry picked from commit b9265e7cde)
2019-01-03 15:06:36 +01:00
Michael Natterer
c4e6c3add2 app: wrap some overly long lines in gimpbucketfilltool.c
and some other pedantic style fixes.

(cherry picked from commit 292903b78d)
2019-01-02 16:35:48 +01:00
Michael Natterer
fca2e84f4f app, libgimpbase: move enum GimpBucketFillArea to the core
The whole bucket fill specific enum stuff is on its way out, so let's
keep this one out of libgimp for now until we decide how to present
line art filling in the PDB.

(cherry picked from commit 368f2e596a)
2019-01-02 15:54:20 +01:00
Ell
e666041d72 app: in GimpTileHandlerValidate, avoid fetching/copying whole tiles
In GimpTileHandlerValidate, when rendering a whole tile in respone
to a TILE_GET command, use gegl_tile_handler_get_tile() to get the
tile without preserving its data, so that we avoid unnecessarily
fetching the tile from storage, or copying its data during
uncloning.

(cherry picked from commit 78ed038fca)
2019-01-02 07:41:44 -05:00
Michael Natterer
a27f7c7724 Issue #1788 - Inconsistency between FG color and selected color in...
...palette views despite selected color being in the currently
selected pallette

As suggested by Massimo, changing the color comparison EPSILON in
gimppalette.c from 1e-10 to 1e-6 fixes this, and is really small
enough.

Also, generally clean up color comparison epsilons:

- use a #define, not hardcoded values for all uses of
  gimp_rgb[a]_distance()
- call the #defines RGB_EPSILON and RGBA_EPSILON
- make them all 1e-6 or larger

(cherry picked from commit abd7cbfc8d)
2019-01-02 01:53:02 +01:00
Michael Natterer
d6ca6d510e Issue #2667 - When copying a text layer, paste should create a new...
...text layer, not an image of the text

In gimp_edit_paste_get_layer(), when pasting as floating selection,
collapse the pasted layer into an ordinary layer only if it's a group
layer. There is nothing that speaks against having a floating text
layer, it works just fine.

(cherry picked from commit 8a4aacb52f)
2019-01-02 00:17:45 +01:00
Michael Natterer
0f4cbb070f configure.ac: require babl >= 0.1.61
(cherry picked from commit b24cc6e7fa)
2019-01-01 19:24:42 +01:00
Ell
d90fd01b32 app: show message when attempting to change layers while there is a floating sel.
In GimpDrawableTreeView, show an error message when attempting to
select a different drawable while the image has an active floating
selection.  In GimpLayerTreeView, also blink the editor button-row
when this happens, as a hint that the floating selection can be
committed/canceled through the buttons (we already highlight the
relevant ones.)

(cherry picked from commit 070e10eda7)
2019-01-01 09:14:31 -05:00
Ell
563036eab6 app: more optimizations to gimp_gegl_mask_bounds()
Another inner-loop logic improvement.

(cherry picked from commit 3351174ebe)
2019-01-01 06:53:35 -05:00
Ell
ae54ed2d68 app: optimize gimp_gegl_mask_bounds()
... by using the mask's native format, and improving the inner-loop
logic.

(cherry picked from commit 819a5352f6)
2019-01-01 06:34:14 -05:00
Ell
5807ca820b app: optimize gimp_gegl_mask_is_empty()
... by using the mask's native format, and gegl_memeq_zero().

(cherry picked from commit 986a298a07)
2019-01-01 06:34:14 -05:00
Michael Natterer
1c43c6f989 app: fix last gimpcursor.c commit: g_printerr() needs a newline
(cherry picked from commit 20225a2268)
2018-12-31 19:14:05 +01:00
Michael Natterer
8ed8def107 app: support cursors with a scale factor of 2 for HiDPI
If the scale factor is 2 or larger, look for cursor images named
"filename-x2.png" and use them instead. Guess HiDPI based on the
monitor resolution being > 250 ppi, ugly but so what.

Manually scale up the default cursor if there is no "x2" image, using
NEAREST interpolation, which looks better than smooth scaling on HiDPI
monitors.

Next: adding better HiDPI cursor images.

(cherry picked from commit 8ff8f1d442)
2018-12-31 16:21:34 +01:00
Michael Natterer
1706950400 app: pass a GdkWindow not GdkDisplay to gimp_cursor_new()
Preparation for adding HiDPI cursors.

(cherry picked from commit 47ff7e1467)
2018-12-31 14:08:36 +01:00
Ell
e61188e666 app: small fix to gimp_drawable_edit_fill()
(cherry picked from commit 3738ff3ffd)
2018-12-31 05:33:45 -05:00
Ell
480d2aa588 app: show error on attempt to clear/cut layer with locked alpha channel
Show an error message, and blink the layers-dialog lock-box, when
attempting to clear/cut a layer with a locked alpha channel.

(cherry picked from commit e967e5fa9e)
2018-12-31 04:40:18 -05:00
Ell
5d905d1d65 app: in gimp_drawable_edit_fill(), make trivial alpha-only fill a NOP
In gimp_drawable_edit_fill(), if the fill only affects the alpha
channel, and if the drawable has no alpha channel, or the alpha
channel is masked out, do nothing, instead of unnecessarily
performing the fill, which has no effect.

(cherry picked from commit 6384ff01b6)
2018-12-31 04:40:18 -05:00
Ell
9058e4bd75 app: in gimp_gegl_apply_cached_operation(), intersect cached rects with dest rect
In gimp_gegl_apply_cached_operation(), intersect the cached rects
with the dest rect, so that we don't unnecessarily (if not
erroneously) copy cached regions outside the dest rect to the dest
buffer.  This can happen when the op's applicator crop-rect changes
dynamically.

(cherry picked from commit d9b4ffe09e)
2018-12-30 08:06:00 -05:00
Ell
f8a5c58d41 app: in warp tool, crop filter to stroke bounds
In the warp tool, set the drawable-filter's crop area to the
combined stroke bounds, so that, when comitting the tool, only this
area is processed, instead of the entire drawable area.

(cherry picked from commit e06c4643dc)
2018-12-30 05:13:30 -05:00
Ell
a330a94b94 app: in GimpDrawableFilter, only update crop/preview area when updating whole drawable
In GimpDrawableFilter, when updating the entire filter area, only
update the crop/preview area (as set by
gimp_drawable_filter_set_{crop,preview}()), instead of the entire
drawable.

(cherry picked from commit b846ffed19)
2018-12-30 05:13:30 -05:00
Ell
05f74b6f40 app: add gimp_drawable_filter_set_crop()
Add gimp_drawable_filter_set_crop(), which allows setting an output
crop rectangle for the filter; anything outside the rectangle
doesn't get filtered.  The crop area is combined with the preview
area to determine the filtered area during preview, however, unlike
the preview area, the crop area remains in effect while committing
the filter.

Consequently, when merging a drawable filter, if the filter has a
crop, only process the cropped area.

(cherry picked from commit 5c27d14fdf)
2018-12-30 05:13:29 -05:00
Ell
81bef8cd50 app: rename gimp_applicator_set_preview() to _set_crop(); add _get_crop()
We're going to use GimpApplicator's output crop for more than just
split previews.  Rename gimp_applicator_set_preview() to
gimp_applicator_set_crop(), and add gimp_applicator_get_crop(),
which returns the output crop rectangle, or NULL if cropping is
disabled.

(cherry picked from commit 7534ae53d6)
2018-12-30 05:13:29 -05:00
Ell
0685c05cfb app: in GimpFilterTool, make region combo insensitive when selection is empty
(cherry picked from commit 093e017df8)
2018-12-29 20:55:43 -05:00
Ell
3e1a631583 app: in GimpFilterTool, show region combo for non-point ops
In GimpFilterTool, show the region combo when applying a non-point
op, as well as when applying a position-dependent point op.  The
result of non-point ops may depend on the choice of input region,
even if the op is not position-dependent.

(cherry picked from commit 7949fd9a28)
2018-12-29 20:27:46 -05:00
Ell
bb039c8401 app: use GimpDrawableFilter in gimp_drawable_apply_operation()
In gimp_drawable_apply_operation(), use a temporary
GimpDrawableFilter to apply the operation, instead of using a
shadow buffer.  This renders and composits the op directly into the
drawable buffer, avoiding an intermediate buffer, requiring less
space and speeding up processing.

(cherry picked from commit b201f73562)
2018-12-29 14:28:51 -05:00
Ell
b4c1c94db0 app: in GimpApplicator, allow enabling cache/preview after construction; remove preview cache
Remove the use_split_preview and use_result_cache parameters of
gimp_applicator_new(), and allow enabling/disabling the cache
(through gimp_applicator_set_cache()) and the preview crop (through
gimp_applicator_set_preview()) after construction.

Move the preview crop node after the result cache, and remove the
separate preview cache node.  This eliminates an extra cache
buffer, reducing the space consumed by filters, and speeds up split
preview, since the cached result now includes the output
compositing.

(cherry picked from commit ab52dc6bca)
2018-12-29 14:28:50 -05:00
Ell
c650c51cbc app: in gimp_drawable_merge_filter(), align undo rect to tile grid
In gimp_drawable_merge_filter(), align the region copied to the
undo buffer to the drawable buffer's tile grid, so that the copied
tiles are COWed.

(cherry picked from commit cba4bc4781)
2018-12-28 08:31:05 -05:00
Ell
96a16b8db7 Revert "Bug 796090 - (wrong) true-color preview of GEGL filter ops, ..."
We now perform the conversion of filter output to the drawable
format as part of the individual filter nodes (see the last few
commits), so there's no need for another conversion after the
filter stack.

This reverts commit d6e0ca5054.

(cherry picked from commit 95393722cc)
2018-12-28 03:57:35 -05:00
Ell
8415bc7d94 app: cache result of floating selections
Use an output cache for floating-selection filters, to speed up
anchoring.

(cherry picked from commit 3f45e893bf)
2018-12-28 03:56:54 -05:00
Ell
20d6db79c2 app: use drawable format as floating-sel applicator output format
Set the output format of floating-selection applicators to the
target drawable format.  We're going to remove the global
GipDrawable convert-format node, which we use to get correct
previews for indexed drawables, so that each filter now has to do
its own format conversion.

(cherry picked from commit 0560c5a6fe)
2018-12-28 03:56:54 -05:00
Ell
37b0832c2d app: in GimpDrawableFilter, use the drawable format as the cache format
In GimpDrawableFilter, set the applicator's output format to the
drawable format, so that the cache uses the drawable format, and so
copying the cached result to the drawble's buffer when comitting
the filter becomes much cheaper, and, in particular, doesn't
require reading tiles out of the swap.  This notably improves
commit speed in large images, at the expense of requiring a few
extra conversions during preview.

(cherry picked from commit 8e57ee2265)
2018-12-28 03:56:53 -05:00
Ell
ad6fff33b6 app: add gimp_applicator_set_output_format()
In GimpApplicator, add gimp_applicator_set_output_format(), which
can be used to explicitly set the format of the result.  In
particular, this allows controlling the output cache format, which
can speed up the merging of cached filters.

(cherry picked from commit b93df0311f)
2018-12-28 03:56:52 -05:00
Ell
7c1d5b7a3e app: add GimpDrawable::format-changed signal
... which is emitted when the drawable's format is changed.

(cherry picked from commit 85e454bae8)
2018-12-28 03:56:52 -05:00
Ell
13c6fe5db6 app: in GimpLineArt, use "invalidate-preview" signal of input viewable
In GimpLineArt, use the "invalidate-preview" signal of the input
viewable, instead of its "painted" or "rendered" signals, for
asynchronously computing the line art.  Subsequently, remove the
aforementioned signals from GimpDrawable and GimpProjection,
respectively.  This simplifies the code, and reduces the number of
signals.

(cherry picked from commit ef9b1f6694)
2018-12-27 17:14:34 -05:00
Ell
cbffd9dfb6 app: remove gimp_applicator_dup_apply_buffer()
... nothing uses it after last commit.

(cherry picked from commit 12e83350bf)
2018-12-27 14:01:50 -05:00
Ell
23ae869f21 app: remove "Edit -> Fade..."
This commit completely removes the "Edit -> Fade..." feature,
because...

- The main reason is that "fade" requires us to keep two buffers,
  instead of one, for each fadeable undo step, doubling (or worse,
  since the extra buffer might have higher precision than the
  drawable) the space consumed by these steps.  This has notable
  impact when editing large images.  This overhead is incurred even
  when not actually using "fade", and since it seems to be very
  rarely used, this is too wasteful.

- "Fade" is broken in 2.10: when comitting a filter, we copy the
  cached parts of the result into the apply buffer.  However, the
  result cache sits after the mode node, while the apply buffer
  should contain the result of the filter *before* the mode node,
  which can lead to wrong results in the general case.

- The same behavior can be trivially achieved "manually", by
  duplicating the layer, editing the duplicate, and changing its
  opacity/mode.

- If we really want this feature, now that most filters are GEGL
  ops, it makes more sense to just add opacity/mode options to the
  filter tool, instead of having this be a separate step.

(cherry picked from commit ed7ea51fb7)
2018-12-27 11:45:11 -05:00
Jehan
e001f344e5 app: rename and merge the spline and segment length properties...
... in GimpBucketFillOptions for the line art algorithm.

Inside GimpLineArt, there are still 2 properties, but we don't show them
anymore in the Bucket Fill tool options. One of the main reason is
probably that it's hard to differentiate their usage. One is to close
with curved lines, the other with straight segments. Yet we don't
actually have any control on one or the other. All one knows is that you
can have "holes" in your drawing of a given size and you want them
close-like for filling. Only reason I can see to have 2 types of closure
is whether you'd want to totally disable one type of closure (then you
set it to 0). But this is a very limited reason for making the options
less understandable overall, IMO.
So for the time being, let's show up only a single option which sets
both properties in GimpLineArt. As patdavid says "it makes sense as a
first pass".

Also rename the option to shorter/simpler "Maximum gap length". Thanks
to patdavid and pippin for helping on figuring out this better label!

Finally I am bumping the default for the gaps to 100px. The original
values were ok for the basic small images used in demos, but not for
real life image where it was always too short (even 100px may still be
too short actually, but much better than the 20 and 60px from before!).

(cherry picked from commit 503775a5a0)
2018-12-24 13:35:32 +01:00
Michael Natterer
769a6f73cc app: fix capitalization of the "Line Art Detection" frame
(cherry picked from commit 822f1b9090)
2018-12-22 21:08:06 +01:00
Alexandre Prokoudine
3d9ad63c34 Unified transform: enable Constraint:Scale by default 2018-12-21 01:49:44 +03:00
Ell
d70aeea550 app: improve gradient color-sampling speed
Improve the speed of gimp_gradient_get_color_at(), which is used by
gimp:gradient during processing when the gradient cache is too big,
by disabling type checking, and inlining and avoiding some function
calls.

(cherry picked from commit 93f4b18704)
2018-12-20 08:32:23 -05:00
Jehan
3ef6c2fb96 app, pdb: more gimp-2-10 only tweak for the smart-colorization.
Again some changes because of the different PDB file organization
between branches.
2018-12-19 16:25:04 +01:00
Jehan
487c01f8d1 app: fix type warning.
I missed this warning when reviewing commit a9a979b2d0.
My bad!

(cherry picked from commit 182786b4fb)
2018-12-19 16:24:50 +01:00
Jehan
ef12064655 app: allow setting line art spline and segment length to 0.
Practically it means that the algorithm won't close line art anymore
with both settings at 0. This can nevertheless still be a very useful
tool when you have a drawing style with well-closed lines. In such a
case, you will still profit from the color flooding under the line art
part of the algorithm.
Moreover with such well-closed zones from start, you don't get the
over-segmentation anymore and the threaded processing will be faster
obviously.

(cherry picked from commit 0a2d066168)
2018-12-19 16:24:23 +01:00
Jehan
2d409f2d0e Issue #2664: add a tooltip to "better compression" checkbox.
Zlib is a "better" compression in the meaning that it is a more advanced
and complex algorithm than RLE. And in most cases, it should end up in
smaller file sizes. But as any algorithm, there may be cases when the
expectations are not met (worst cases or such). That's the nature of the
maths. Still we should not make the checkbox text over-complicated (it
is not the place to teach algorithmic), yet we can at least add a small
tooltip text.

(cherry picked from commit c3ac722995)
2018-12-19 16:24:10 +01:00
Jehan
86b9738286 app: do not make line art bucket fill a GimpSelectCriterion anymore.
This was my initial choice, but the more I think about it, the less I am
sure this was the right choice. There was some common code (as I was
making a common composite bucket fill once the line art was generated),
but there is also a lot of different code and the functions were filled
of exception when we were doing a line art fill. Also though there is a
bit of color works (the way we decide whether a pixel is part of a
stroke or not, though currently this is basic grayscale threshold), this
is really not the same as other criterions. In particular this was made
obvious on the Select by Color tool where the line art criterion was
completely meaningless and would have had to be opted-out!

This commit split a bit the code. Instead of finding the line art in the
criterion list, I add a third choice to the "Fill whole selection"/"Fill
similar colors" radio. In turn I create a new GimpBucketFillArea type
with the 3 choices, and remove line art value from GimpSelectCriterion.

I am not fully happy yet of this code, as it creates a bit of duplicate
code, and I would appreciate to move some code away from gimpdrawable-*
and gimppickable-* files. This may happen later. I break the work in
pieces to not get too messy.
Also this removes access to the smart colorization from the API, but
that's probably ok as I prefer to not freeze options too early in the
process since API needs to be stable. Probably we should get a concept
of experimental API.

(cherry picked from commit cd924f453a)
2018-12-19 16:23:26 +01:00
Jehan
7ea2ca26ff Issue #2495: different code for Windows and Linux on duplicate devices.
After discussing with Mitch, it turn out commit 717c183a3e was fixing
(or rather working around) actual issues of broken device/usb stack
issues on Linux, as expected.
Nevertheless on Windows, this broke in turn many tablets (see commit
ce24e16083). Therefore we do a very ugly #ifdef to bail from duplicate
devices on Windows whereas we continue on Linux. This fix and difference
of behavior is completely empirical, rather than based on actual good
logics, so that's quite annoying, but well… not much choice here.

Also note that since we had no report of breakage on other OSes (such as
macOS/BSD), at least that I know of, I let them with the Linux code
path.

(cherry picked from commit 74a7a5d3e2)
2018-12-19 16:23:16 +01:00
Jehan
fec11389cb app: allow switching fill type with Alt even when Pattern fill selected.
Currently in bucket fill tool, the modifier was only switching fg to bg
and bg to fg, and was doing nothing when pattern was set. I make it
switch to fg as well (and remember which was the original value).

(cherry picked from commit 5a157bf1ba)
2018-12-19 16:21:37 +01:00
Jehan
a68524d43b app: reorganize the line art code inside a GimpLineArt object.
The code was too much spread out, in core and tool code, and also it was
made too specific to fill. I'll want to reuse this code at least in the
fuzzy select tool. This will avoid code duplication, and also make this
new process more self-contained and simpler to review later (the
algorithm also has a lot of settings and it is much cleaner to have them
as properties rather than passing these as parameters through many
functions).

The refactoring may not be finished; that's at least a first step.

(cherry picked from commit db18c679f3)
2018-12-19 16:14:11 +01:00
Ell
4937d1d8d3 app: use gimp_async_add_callback_for_object() in the bucket-fill tool
... for the same reason as commit
7c00cf498a.

(cherry picked from commit 6103f0e5d0)
2018-12-19 16:06:37 +01:00
Jehan
b1236403cf app: add the segment and spline max length options for line art.
We can't just hardcode this. On huge images in particular, you'll want
to increase this value.

(cherry picked from commit d71efdec20)
2018-12-19 16:05:30 +01:00
Jehan
1471da20b7 app: some code cleaning in gimplineart.
In particular, make simpler code in a few places, taking abyss value
into account (rather than checking the position).

(cherry picked from commit f7a4ce1051)
2018-12-19 16:05:05 +01:00
Jehan
21e776b911 app, pdb: more gimp-2-10 only tweak for smart colorization.
Because of the file organization of PDB different between the 2.10 and
master branches.
2018-12-19 16:05:05 +01:00
Jehan
73b348de1c app: make GimpBucketFillTool a GimpColorTool.
In particular, it allows to easily color pick. This just makes sense as
the bucket fill is definitely what one could call a "color tool", and
being able to easily change color without having to constantly switch to
color picker tool nor open a color chooser dialog is a must.

The fill type option (FG/BG/Pattern) was already mapped to the common
toggle behavior key (Ctrl on Linux), which is commonly used for
switching to color picker on paint tools. So I decided to remap the fill
type switch to GDK_MOD1_MASK (Alt on Linux) to keep consistent with
other tools (at the price of a change for anyone used to this modifier,
though I doubt it was that much used).
I also made possible to combine the 2 modifiers (so you could pick the
foreground or background color with ctrl and ctrl-alt).

(cherry picked from commit 5d4281944f)
2018-12-19 15:54:12 +01:00
Jehan
439a44a613 app: flood isolated pixels in smart colorization fill.
The smart colorization was leaving irritating single pixels in between
colorized regions, after growing and combining. So let's just flood
these. We don't flood bigger regions (and in particular don't use
gimp_gegl_apply_flood()) on purpose, because there may be small yet
actual regions inside regions which we'd want in other colors. 1-pixel
regions is the extreme case where chances that one wanted it filled are
just higher.

(cherry picked from commit 744d67939d)
2018-12-19 15:53:46 +01:00
Jehan
4fe5dc5d42 app: radius map actually not useful during smart colorization grow step.
The distance map has all the information we need already. Also we will
actually grow up to the max radius pixel (middle pixel of a stroke).
After discussing with Aryeom, we realized it was better to fill a stroke
fully (for cases of overflowing, I already added the "Maximum growing
size" property anyway).

(cherry picked from commit 6bec0bc82d)
2018-12-19 15:53:05 +01:00
Jehan
c4988efdb0 app: add possibility to antialias line art colorization.
(cherry picked from commit d2f9549c9f)
2018-12-19 15:51:27 +01:00
Jehan
53fdd19d84 app: simpler code with gegl_node_blit().
No need to go through an intermediate GeglBuffer when unneeded.

(cherry picked from commit c32b0ecc92)
2018-12-19 15:51:14 +01:00
Jehan
b00580d4b1 app: add "line-art-max-grow" property to the bucket fill options.
When flooding the line art, we may overflood it in sample merge (which
would use color in the line art computation). And if having all colors
on the same layer, this would go over other colors (making the wrong
impression that the line art leaked).
This new option is mostly to keep some control over the mask growth.
Usually a few pixels is enough for most styles of drawing (though we
could technically allow for very wide strokes).

(cherry picked from commit eb042e6c87)
2018-12-19 15:48:47 +01:00
Jehan
706fe079c2 app: make sure we reset tool modifier state before saving options.
I had this funny behavior when I was quitting GIMP with the active tool
using modifiers (for instance bucket fill). Each time I'd quit with
ctrl-q (and if the image is not dirty), the options would use the value
from the modifier state and be saved as-is. Hence at next restart, the
default value was always different!

(cherry picked from commit dd3d9ab3dd)
2018-12-19 15:48:26 +01:00
Jehan
19c1f2654e app: properly (bucket) fill created splines and segments in line art.
For this, I needed distmap of the closed version of the line art (after
splines and segments are created). This will result in invisible stroke
borders added when flooding in the end. These invisible borders will
have a thickness of 0.0, which means that flooding will stop at once
after these single pixels are filled, which makes it quick, and is
perfect since created splines and segments are 1-pixel thick anyway.
Only downside is having to run "gegl:distance-transform" a second time,
but this still stays fast.

(cherry picked from commit 5a4754f32b)
2018-12-19 15:48:15 +01:00
Jehan
e5bea42b6f app: replace gegl:watershed-transform with custom algorithm.
We don't really need to flow every line art pixel and this new
implementation is simpler (because we don't actually need over-featured
watershedding), and a lot lot faster, making the line art bucket fill
now very reactive.
For this, I am keeping the computed distance map, as well as local
thickness map around to be used when flooding the line art pixels
(basically I try to flood half the stroke thickness).

Note that there are still some issues with this new implementation as it
doesn't properly flood yet created (i.e. invisible) splines and
segments, and in particular the ones between 2 colored sections. I am
going to fix this next.

(cherry picked from commit 3467acf096)
2018-12-19 15:48:04 +01:00
Jehan
e9b8122e18 app: fix a line art leak in bucket fill tool.
Introduced in commit b4e12fbbbb:
gimp_pickable_contiguous_region_prepare_line_art_async() was running
gimp_pickable_flush(), which provokes the "rendered" signal on the
image projection when a change occured. As a result, it was calling
gimp_bucket_fill_compute_line_art() within itself and since
tool->priv->async was not set yet, none of the call were canceled. Hence
the same line art is computed twice, but one is leaked.
Make sure we block this signal handler as a solution.

(cherry picked from commit 36c885a6df)
2018-12-19 15:47:48 +01:00
Jehan
2934293664 app: priority map now unneeded for gegl:watershed-transform.
This commit is based on GEGL master as I just made the auxiliary buffer
of gegl:watershed-transform optional for basic cases.
It doesn't necessarily makes the whole operation that much faster
according to my tests, but it makes the code simpler as creating this
priority map was quite unnecessary.

(cherry picked from commit 963eef8207)
2018-12-19 15:47:34 +01:00
Ell
3c0f1307cc app: add gimp_pickable_contiguous_region_prepare_line_art_async() ...
... and use in bucket-fill tool

Add gimp_pickable_contiguous_region_prepare_line_art_async(), which
computes a line-art asynchronously, and use it in the bucket-fill
tool, instead of having the tool create the async op.

This allows the async to keep running even after the pickable dies,
since we only need the pickable's buffer, and not the pickable
itself.  Previously, we reffed the pickable for the duration of the
async, but we could still segfault when unreffing it, if the
pickable was a drawable, and its parent image had already died.

Furthermore, let the async work on a copy of the pickable's buffer,
rather than the pickable's buffer directly.  This avoids some race
conditions when the pickable is the image (i.e., when "sample
merged" is active), since then we're using image projection's
buffer, which is generally unsafe to use in different threads
concurrently.

Also, s/! has_alpha/has_alpha/ when looking for transparent pixels,
and quit early, at least during this stage, if the async in
canceled.

(cherry picked from commit b4e12fbbbb)
2018-12-19 15:36:10 +01:00
Ell
3e5e0e2d37 app: in bucket-fill tool, cancel async on tool destruction
When computing line-art, don't ref the bucket-fill tool in the
async data, and rather cancel any ongoing async upon tool
destruction, so that the async callback doesn't attept to touch the
now-dead tool.  This avoids segfaulting in the async callback when
switching to a different tool, while a line-art async operation is
active.

Additionally, always cancel any previous async operation in
gimp_bucket_fill_compute_line_art(), even if not starting a new
one.

(cherry picked from commit 663a6c7011)
2018-12-19 15:35:43 +01:00
Ell
1778943152 app: in bucket-fill tool, fix potential leak when computing line-art
In the line-art async function, pass ownership over the resulting
buffer to the async object, so that the buffer is properly freed in
case the async in canceled after line-art computation is complete,
but before the completion callback is called.

Also, clear the tool's async pointer in the completion callback, to
avoid leaking the last issued async.

(cherry picked from commit 2e45c4c8c8)
2018-12-19 15:34:38 +01:00
Ell
e996020e19 app: in the bucket-fill tool, avoid CRITICALs when computing line-art ...
... when the current image/drawable are NULL.

(cherry picked from commit 4575949cdf)
2018-12-19 15:34:24 +01:00
Jehan
a83bbf8249 app: end point detection uses both the end point rate and clamped value.
(cherry picked from commit 79571231c5)
2018-12-19 15:34:01 +01:00
Jehan
4c3fcdb6bb app: better handle drawable and image update for line art computation.
The "update" signal on drawable or projection can actually be emitted
many times for a single painting event. Just add new signals ("painted"
on GimpDrawable and "rendered" on GimpProjection) which are emitted once
for a single update (from user point of view), at the end, after actual
rendering is done (i.e. after the various "update" signals).

Also better support the sample merge vs current drawable paths for
bucket fill.

(cherry picked from commit 047265333c)
2018-12-19 15:33:40 +01:00
Jehan
6155889315 app: remove now useless erosion size option.
Since commit b00037b850, erosion size is not used anymore, as this step
has been removed, and the end point detection now uses local thickness
of strokes instead.

(cherry picked from commit 3f58a38574)
2018-12-19 15:33:28 +01:00
Jehan
c1c544f882 app: improve end point detection for smart colorization.
Previous algorithm was relying on strokes of small radius to detect
points of interest. In order to work with various sizes of strokes, we
were computing an approximate median stroke thickness, then using this
median value to erode the binary line art.

Unfortunately this was not working that well for very fat strokes, and
also it was potentially opening holes in the line art. These holes were
usually filled back later during the spline and segment creations. Yet
it could not be totally assured, and we had some experience where color
filling would leak out of line art zones without any holes from the
start (which is the opposite of where this new feature is supposed to
go)!

This updated code computes instead some radius estimate for every border
point of strokes, and the detection of end points uses this information
of local thickness. Using local approximation is obviously much more
accurate than a single thickness approximation for the whole drawing,
while not making the processing slower (in particular since we got rid
of the quite expensive erosion step).
This fixes the aforementionned issues (i.e. work better with fat strokes
and do not create invisible holes in closed lines), and also is not
subject to the problem of mistakenly increasing median radius when you
color fill in sample merge mode (i.e. using also the color data in the
input)!
Also it is algorithmically less intensive, which is obviously very good.

This new version of the algorithm is a reimplementation in GIMP of new
code by Sébastien Fourey and David Tschumperlé, as a result of our many
discussions and tests with the previous algorithm.

Note that we had various tests, experiments and propositions to try and
improve these issues. Skeletonization was evoked, but would have been
most likely much slower. Simpler erosion based solely on local radius
was also a possibility but it may have created too much noise (skeleton
barbs), with high curvature, hence may have created too many new
artificial endpoints.
This new version also creates more endpoints though (and does not seem
to lose any previously detected endpoints), which may be a bit annoying
yet acceptable with the new bucket fill stroking interaction. In any
case, on simple examples, it seems to do the job quite well.

(cherry picked from commit b00037b850)
2018-12-19 15:32:58 +01:00
Jehan
ee582784b7 app: force the image flush after a selection fill.
Other bucket fills are now done as filter until committed, but basic
selection fill is still done automatically. So let's make sure the
canvas is updated immediately (as it used to be before my changes).

(cherry picked from commit 287d90ba9e)
2018-12-19 15:32:13 +01:00
Jehan
8fb83d7751 app: fix uninitialized variables.
(cherry picked from commit 255f2e1cdf)
2018-12-19 15:31:30 +01:00
Jehan
fd0f5c50a5 app: recompute line art if needed after a bucket fill commit.
(cherry picked from commit 969143c436)
2018-12-19 15:30:26 +01:00
Jehan
b6227b2787 app: update gimp-2-10 for bucket fill changes for smart colorization.
Some differences in PDB between gimp-2-10 and master branches.
2018-12-19 15:28:54 +01:00
Jehan
6b1d7969ed app: edit the bucket fill tool options with new line art options.
I have not added all the options for this new tool yet, but this sets
the base. I also added a bit of TODO for several places where we need to
make it settable, in particular the fuzzy select tool, but also simply
PDB calls (this will need to be a PDB context settings.

Maybe also I will want to make some LineArtOptions struct in order not
to have infinite list of parameters to functions. And at some point, it
may also be worth splitting a bit process with other type of
selection/fill (since they barely share any settings anyway).

Finally I take the opportunity to document a little more the parameters
to gimp_lineart_close(), which can still be improved later (I should
have documented these straight away when I re-implemented this all from
G'Mic code, as I am a bit fuzzy on some details now and will need to
re-understand code).

(cherry picked from commit 824af12438)
2018-12-19 15:26:42 +01:00
Jehan
808cdc9880 app: bucket fill tool with a "paint-style" interaction.
Rather than just having a click interaction, let's allow to "paint" with
the bucket fill. This is very useful for the new "line art" colorization
since it tends to over-segment the drawing. Therefore being able to
stroke through the canvas (rather than click, up, move, click, etc.)
makes the process much simpler. This is also faster since we don't have
to recompute the line art while a filling is in-progress.
Note that this new behavior is not only for the line art mode, but also
any other fill criterion, for which it can also be useful.

Last change of behavior as a side effect: it is possible to cancel the
tool changes the usual GIMP way (for instance by right clicking when
releasing the mouse button).

(cherry picked from commit e1c4050617)
2018-12-19 15:26:42 +01:00
Jehan
0e1d8ef695 app: make line art pre-computation in threads.
This makes the speed sensation of the tool much faster as line art can
be computed in dead time when you start the tool or when you move the
pointer.

(cherry picked from commit a3cda4abbe)
2018-12-19 15:26:41 +01:00
Jehan
32f0a49ecc app: compute line art in advance.
Right now, this is mostly meaningless as it is still done sequentially.
But I am mostly preparing the field to pre-compute the line art as
background thread.

(cherry picked from commit f246f40494)
2018-12-19 15:26:38 +01:00
Jehan
0cf524e351 app: fix line art labellization.
The older labelling based off CImg code was broken (probably because of
me, from my port). Anyway I realized what it was trying to do was too
generic, which is why we had to fix the result later (labeling all
non-stroke pixels as 0, etc.). Instead I just implemented a simpler
labelling and only look for stroke regions. It still over-label a bit
the painting but a lot less, and is much faster.

(cherry picked from commit 93a49951a0)
2018-12-19 15:20:19 +01:00
Jehan
4da35468bc app: better use GeglBufferIterator!
I don't actually need to loop through borders first. This is what the
abyss policy is for, and I can simply check the iterator position to
verify I am within buffer boundaries or not.
This simplifies the code a lot.

(cherry picked from commit c4ff81540d)
2018-12-19 15:20:19 +01:00
Jehan
8557cd8cfb app: directly update the mask buffer with gegl_node_blit_buffer().
No need to create a temporary buffer for this.

(cherry picked from commit f02993fb9c)
2018-12-19 15:20:18 +01:00