1
1
mirror of https://gitlab.gnome.org/GNOME/gimp.git synced 2025-10-06 05:22:40 +02:00

Compare commits

...

740 Commits

Author SHA1 Message Date
Jehan
c682d27c54 etc: make the new bash-completion file work for all variants of our executables.
In particular make it also work with the `gimp-console` and with all
symlink names.

Also rename the bash completion file using the full application version
so that it will be possible to install several such completion files
side by side.
2025-05-14 09:20:20 -03:00
Jehan
277e5124d2 etc: fix unknown meson option.
This fixes:

> […]/gimp/etc/meson.build:31:39: ERROR: dependency.get_variable got unknown keyword arguments "define_variable"

This MR was years-old. Maybe this option got renamed since that time.
2025-05-14 09:20:20 -03:00
Niels De Graef
a9053603fa Add a Bash completion file 2025-05-14 09:20:20 -03:00
Bruno Lopes
84c4e0b639 gitlab-ci, devel-docs: Update to new "Package:" labels
A common prefix makes easier to use these dist pipelines.
2025-05-14 09:13:40 -03:00
Idriss Fekir
f0dc96caf1 GimpText:Partially Revert some of the changes in commit b2eb374aaacd0c8054234c4fa2b785da0007355f
I accidently commited 2 calls to g_assert in the previous commit.

Reverting.
2025-05-14 09:16:28 +02:00
Idriss Fekir
9d43b2cfc2 GimpText: Fix crash when serializing text with missing font.
For some reason pango returns a FontDescription with name "Normal" when called
with empty string. This caused crashes in pango markup serialization. This
patch checks if the font before serialization is a valid font object, otherwise fallback to the fallback font.

Also font's reference count wasn't increased in one case when opening xcf file with a text layer.
2025-05-14 01:51:58 +02:00
lloyd konneker
12806b2830 ScriptFu: tests: add tests of selection semantics
No changes except to tests.
2025-05-13 11:22:25 -04:00
Alx Sa
60891765a5 core: Update filter size when image is rotated
Resolves #13981
The dimensions of NDE filters were being updated
when a drawable was resized or scaled, but not when
the drawable was rotated. Since this transform also
affects the dimensions of the filter, the filter refresh
code should be called there as well.
2025-05-13 14:28:29 +00:00
Bruno Lopes
e68cc824c1 devel-docs: Restore one paragraph from icons section 2025-05-13 06:54:36 -03:00
Bruno Lopes
fb2167c8ad devel-docs: Restore gitlab-mr reference but on Core Contributors section 2025-05-12 22:36:02 -03:00
Bruno Lopes
478ec9014f devel-docs: Remove outdated info about icons (again) 2025-05-12 22:32:59 -03:00
Bruno Lopes
35bde24daa devel-docs: Remove outdated CI explanation in favor of gitlab-ci.yml
This is already documented and updated on gitlab-ci.yml's
"There are five "TYPES" of pipelines on our CI" section so
maintaining two explanations is pointless and not future-proof.
2025-05-12 22:15:56 -03:00
Alx Sa
db040ce9e0 display: Connect path on click in design mode
Rather than having to hold Ctrl to switch to edit mode, users can now
just click the start point from the end node to create a connected path.
This makes the Path tool consistent with similar tools in GIMP
(such as Free Select, Scissor Select, and Cage Transform tools) as well
as other programs with a Path tool.
2025-05-13 00:11:05 +00:00
Bruno Lopes
a6d7bf1a8a devel-docs: Remove sparse plug-in content in favor of Jehan nice tutorials
Despite the fact a tutorial have a different nature than a formal wiki-like text with
topics, the plug-in subject is undoubtedly well documented after Jehan and others work:

#### Basics -> https://developer.gimp.org/resource/writing-a-plug-in/tutorial-c-basic/#theory-introduction

#### Procedural DataBase (PDB) -> https://developer.gimp.org/resource/writing-a-plug-in/tutorial-pdb/

#### libgimp and libgimpui -> https://developer.gimp.org/resource/writing-a-plug-in/tutorial-c-basic/#theory-library-organization

### Programming Languages -> https://developer.gimp.org/resource/writing-a-plug-in/tutorial-python/#theory-what-about-other-bindings

### Tutorials -> https://developer.gimp.org/resource/writing-a-plug-in/#tutorial-for-gimp-30-plug-ins

### Debugging -> https://developer.gimp.org/resource/debug-plug-ins/

## Script-fu development -> https://developer.gimp.org/resource/writing-a-plug-in/tutorial-script-fu/

### Porting from GIMP 2 scripts -> https://developer.gimp.org/resource/script-fu/

## TODO: GEGL operation development -> https://developer.gimp.org/resource/writing-a-filter/

The few omissions I found were ported with:
fbf60dc5c2
2025-05-12 20:18:10 -03:00
Alx Sa
2db5875e28 tools, widgets: Don't show Fx icon for Cage Tool
Resolves #13982
This tool was missed in cc50ef99
2025-05-12 17:25:29 +00:00
Bruno Lopes
0c10e6cb98 devel-docs: Update Directory structure in gimp-data era 2025-05-12 10:08:42 -03:00
Bruno Lopes
c4e9af88bb devel-docs: Move icons.md to gimp-data
See: e35194222b
2025-05-11 14:34:32 -03:00
Alx Sa
c92071fd28 tools: Close iscissors curve on pressing Enter
This better aligns the tool with the path tool, which also closes on 
Enter if it is not already a connected path.
2025-05-11 16:23:12 +00:00
Alx Sa
cb0f8a0282 libgimp, libgimpwidgets: Let string widgets expand horizontally
This makes GimpProcedureDialog string argument widgets expand
horizontally by default.
2025-05-11 05:50:49 +00:00
Bruno Lopes
4290f3dc7b build/linux: Update flatpak SDK and runtime install commands
Ported from: 25ba247a96
2025-05-10 13:23:37 -03:00
Bruno Lopes
53f5a3dfd6 build/windows: Fix .hpp headers not being distributed on installer
They are rare but exist on GEGL.
2025-05-10 13:00:14 -03:00
Alx Sa
258344031c widgets: Allow color dialogues to not match the image mode
For some GUI elements, we may not want to restrict
the color options to the image mode (for instance,
grid colors on a grayscale or indexed image).

This patch adds a "user_context_aware" boolean
to GimpColorPanel so it can be passed on to set
the same boolean already in GimpColorDialog.
This allows GUI elements like GimpGridEditor to
optionally give full color choices to users,
independent of the image mode.
2025-05-10 14:18:41 +00:00
Bruno Lopes
2f7209482b build/windows: Fix Python detection on Installer script
Following 1d5c3cbd
2025-05-10 10:27:50 -03:00
Idriss Fekir
f9de30fd6d app/tools: Always push an undo step not just when a single property changes
The behavior of the text tool was such that an undo is pushed only when a single property changes, which is obviously not expected, because, e.g. if part of the text uses a different font this means that the markup changed and all "properties" stayed the same, so an undo wouldn't be pushed.
2025-05-10 02:22:29 +00:00
Bruno Lopes
d917aef7c4 docs: Remove old 2.X series references on gimptool manpage 2025-05-09 21:40:06 -03:00
Bruno Lopes
63d2e1f871 build/windows: Set timeout for Restore Point creation
See: #13874

The process is managed by WMI so we need to
prevent stuckness that can happen in rare scenarios.
2025-05-09 21:25:12 -03:00
Bruno Lopes
1d5c3cbd43 gitlab-ci, build/windows: Standardize use of env:PATH 2025-05-09 21:24:38 -03:00
Bruno Lopes
41e8f49720 build/windows: Fix file-raw distribution on Installer 2025-05-09 21:24:33 -03:00
Bruno Lopes
ddf9d57ab6 build/linux: Fix bundling of GEGL json modules 2025-05-09 21:22:27 -03:00
Alx Sa
60fb3baa1a widgets: Update index in color-map selection when...
...color-picking on the image.

In GIMP 3.0, we now show a GimpColormapSelection when
users open a color dialogue. However, unlike the RGB color
selector it does not respond to color-picking, instead always
defaulting to index 0.
This patch adds code to get the index of the currently selected
color from the palette, and set the ColormapSelection's selected
index to that.
2025-05-09 23:07:11 +00:00
Bruno Lopes
e1efba413d gitlab-ci: Implement "inputs:" for easier custom GUI pipelines
This new feature enables a nice panel with options on:
https://gitlab.gnome.org/GNOME/gimp/-/pipelines/new

We will still support GitLab variables.
2025-05-09 08:06:23 -03:00
Anders Jonsson
2d8fe8dbed Update Swedish translation 2025-05-08 13:07:48 +00:00
Anders Jonsson
25022abfe1 Update Swedish translation 2025-05-08 13:04:25 +00:00
Anders Jonsson
1c28093e58 Update Swedish translation 2025-05-08 13:00:54 +00:00
Øyvind Kolås
eeed283da2 build, app: depend on babl-0.1.114 and GEGL 0.4.62 2025-05-08 12:30:10 +02:00
Ondřej Míchal
3988b76e33 build/linux: Sync dependencies with Flathub flatpak
OpenEXR     - 3.3.2   -> 3.3.3
Poppler     - 25.03.0 -> 25.05.0
Ghostscript - 10.04.0 -> 10.05.1
libheif     - 1.19.7  -> 1.19.8
libde265    - 1.0.15  -> 1.0.16
SuiteSparse - 7.10.1  -> 7.10.3
2025-05-08 11:46:35 +03:00
Alx Sa
0b6fd06e19 widgets: Fix horizontal spacing of toolbox widgets
47224ba1 set the number of children in the GtkFlowBox
that holds the toolbox widgets to a constant 3. However,
this means if you only have one or two widgets shown,
there was still a horizontal imbalance.
This patch adds up the number of visible widgets whenever
that is changed, and adjust the maximum number of flowbox
children accordingly. It does add a small amount of padding at
the bottom since the invisible widgets are moved below.
2025-05-07 19:40:12 +00:00
Jacob Boerema
548bc3a46d plug-ins: CWE-190: Integer Overflow or Wraparound in Despeckle
As reported by Seungho Kim our despeckle filter doesn't check for
integer overflow when allocating buffers, nor do we check for failed
allocations.

A potential integer overflow vulnerability exists in the GIMP
"Despeckle" plug-in. The issue occurs due to unchecked multiplication
of image dimensions (width, height) and bytes-per-pixel (img_bpp),
which can result in allocating insufficient memory and subsequently
performing out-of-bounds writes. This could lead to heap corruption and
potential denial-of-service (DoS) or arbitrary code execution in
certain scenarios.

Vulnerability Details
•width and height are of type guint (signed 32-bit int).
•Multiplying width * height * img_bpp can result in a value exceeding
the bounds of gsize.
•g_new() does not perform overflow protection; if the size wraps around,
less memory than needed will be allocated.
•Subsequent pixel processing loops write beyond the allocated memory
region (src, dst).

Proof of Concept (PoC)
Open a specially crafted image with very large dimensions (e.g.,
70,000 x 70,000 pixels) and apply the Despeckle filter. GIMP may crash
due to heap corruption, or undefined behavior may occur.

We applied the suggested changes and in addition adjusted the despeckle
function to be able to set error messages, and check for NULL
allocations.
2025-05-07 14:50:11 -04:00
Jacob Boerema
d7901a8890 plug-ins, testing: add two tests for fli and ico...
based on the ZDI-CAN poc images
2025-05-07 17:57:38 +00:00
Bruno Lopes
7ead87df1e gitlab-ci: Mention 'Image File Formats' page on feature.md
This should make file format requests less "noisy" as Jehan describes them.
2025-05-07 13:59:59 -03:00
Jehan
47e69fd4b5 NEWS: update. 2025-05-07 15:44:09 +02:00
Jehan
ae14e623a6 plug-ins: just use TRUE/FALSE instead of new macros.
Small follow-up from !2097. To be fair, looking at this plug-in's code,
we should also go much further, because so many useful types are defined
while we could use GLib types.

But I don't want to get into this cleanup rabbit hole right now.
2025-05-07 15:27:32 +02:00
Alx Sa
fb577f1833 plug-ins: Prevent infinite signal loop in legacy grid
Selecting a color in GimpColorSelection triggers
gimp_color_selection_color_changed (). In the legacy
Grid plug-in, this led to an infinite signal loop (and crash)
when changing colors when the chain link is active. Changing
one button's color would trigger the other to change, which
would trigger the first one to change again and so on.

This patch resolves the issue by blocking the signal in color_callback ()
when the other button is changed in response to the first, so that
there's no infinite chain of callbacks.
2025-05-06 17:57:55 +00:00
Nils Philippsen
85bdad2b2c Avoid type names and keywords
This fixes various errors when compiling with current toolchains and/or
-std=c23.

Signed-off-by: Nils Philippsen <nils@tiptoe.de>
2025-05-06 15:31:55 +00:00
Jehan
16fe79a45f app: replace the mutex by a RW lock.
It would be more performant since it allows concurrent access as long as
you only need read access (i.e. as long as the cache won't change, which
is the most common case).
2025-05-06 14:18:09 +00:00
Jehan
7125d2c52d Issue #13617: segmentation fault when painting. 2025-05-06 14:18:09 +00:00
Bruno Lopes
01ffbd064b themes: Fix system theme leak of selected menubar item 2025-05-06 11:12:53 -03:00
Jehan
15d2e25404 libgimp: further cleanup in GimpGradientChooser code.
- No need of local_grad_data_new(). Just set default variables in init()
  as it should be.
- Also move gimp_gradient_chooser_draw_interior() to the init()
  function, so that the new() function is only a wrapper of
  g_object_new() which is the proper way to implement new classes.
- Get rid of wrong comment.
2025-05-06 15:33:05 +02:00
lloyd konneker
2d7a1a5d6d libgimp: some code reorganization.
This commit message has been rewritten by the reviewer (Jehan) because
the original message was not right. It was originally meant to fix #13189
but it was only doing so as a side effect of getting rid of the slice
API.

We still push it as a second step (with updated message) because it's
not a bad idea to stop using the slice API where we can as it's anyway
no more than a malloc/free synonym since GLib 2.76 and might get
deprecated some day.
2025-05-06 15:33:05 +02:00
Bruno Lopes
3f36a16f6d themes: Fix system theme leak of progress bar color on Dark themes 2025-05-06 10:21:54 -03:00
Jehan
cbd013d7b2 Issue #13189: free the slice with g_slice_free().
Even though this is mostly the same thing now, it's only true since GLib
2.76, yet our AppImage uses GLib 2.74.6. This explains why the chooser
finalization was crashing plug-ins.
2025-05-06 14:59:19 +02:00
André Dazereix
b56c59c92e Update French translation 2025-05-06 11:23:22 +00:00
Jehan
2fa5967f21 Issue #1486: invalid disconnected monitor on exit.
Note that I also tried to set the monitor as a weak pointer, but it was
not properly finalized by GDK at disconnection apparently. Anyway
processing the "invalidate" signal is a correct way to do this too.

A further possible improvement may be to store the description of the
monitor in the sessionrc file, and keep these in the GimpSessionInfo
too, so that we can easily retrieve a monitor which is often
disconnected and reconnected.
2025-05-06 01:25:48 +02:00
Jehan
83e213d770 app: initial monitor information is only needed at display shell construction.
Making sure that it's private then NULLified at end of construction so
that none tries to use this again later on during the life of the
display shell (it may have become invalid since then, cf. #12542).

Also NULLifying a similar variable stored in GimpImageWindow (though it
was already a private variable not used outside in this case).
2025-05-06 01:25:48 +02:00
Jehan
07f9402f82 app: do not store the initial monitor when starting and restoring.
Setting NULL monitor to file_open_with_display() and
file_open_from_command_line() work just as well to use the monitor under
the pointer which is what gui_get_display_name() was also doing anyway.
2025-05-06 01:25:48 +02:00
Jacob Boerema
fedb647cb4 app: fix #12542 crash due to invalid monitor
We store an `initial_monitor` in several places, not taking into
consideration that a monitor object can become invalid, e.g. when
disconnecting or turning off a monitor. When the monitor is invalid,
it can cause a crash in `gimp_display_shell_set_initial_scale`.

Instead of referencing the initial monitor, we request the monitor for
our display shell. Since at that point we already know that shell is
valid, we should get a valid monitor too.
2025-05-06 01:25:48 +02:00
Jehan
2fc1fdd400 modules: partially revert commit 41ba9b31.
We don't need to build modules as .so files with the last 2 commits.
Just keep using shared_module() from commit 41ba9b31.
2025-05-05 23:07:53 +00:00
Jehan
1c696ae646 libgimpmodule: properly close module opened only for testing. 2025-05-05 23:07:53 +00:00
mkmo
b0562cf0a5 issue #13149: libgimpmodule: using g_module_open() instead of G_MODULE_SUFFIX 2025-05-05 23:07:53 +00:00
Bruno Lopes
8a6a651688 build/windows: Go back to Inno 6.4.2 to fix broken Task Dialog
Inno 6.4.3 changed the install-mode task dialog in a way that
makes our installer pretty ugly to see. See the report:
https://groups.google.com/g/innosetup/c/g0V_QE3Zf5Y/m/Daki-eb8EQAJ
2025-05-05 19:34:59 -03:00
Jehan
b24d10cfe0 app: (show-tooltips) settings removed before GIMP 3.0.
This was removed in commit b3620517 though we missed it when making our
GIMP 2 to 3 migration rules. A bit late now, but better than never.

I realized this thanks to MR !2240.
2025-05-05 23:05:16 +02:00
Andi Chandler
0f9c47ae10 Update British English translation 2025-05-05 19:00:35 +00:00
Andi Chandler
05cf8fbb2d Update British English translation 2025-05-05 18:57:22 +00:00
Jehan
9d9265f099 desktop: preparing GIMP 3.0.4 metadata. 2025-05-05 15:31:32 +02:00
Alx Sa
ba9a6d0dce plug-ins: Refresh Fractal Explorer gradient display
Whenever we change the colormap colors in the
Fractal Explorer plug-in, we call set_cmap_preview ()
to update the gradient widget. However, this only changes
the colors if the total number is different than the previous
one, since the only time we change the colors is via a
size reallocation. As a result, most of the time the GUI
display doesn't change.
This patch adds an initial size request of 0, 0, to ensure
the second resize actually triggers the size reallocation
code.
2025-05-05 10:33:46 +00:00
Alx Sa
2c31c0e34d libgimp, plug-ins: Prevent GFig crash with NULL brush
The GFig plug-in assumes that there is always
a valid brush selected when creating its
dialogue. However, a NULL brush is possible,
and GFig's assumption can cause a crash
in GIMP by attempting to get a buffer from
a NULL brush.
This patch adds conditional checks for the
brush to not be NULL before using it.
2025-05-05 09:36:04 +00:00
Bruno Lopes
373e46f871 build: Fix pkgconfig files not being fully bundled (e.g. gimpui*.pc) 2025-05-04 14:36:29 -03:00
Bruno Lopes
eff825c1a7 Issue #6378: tools: Don't auto-quote filenames on gimptool for Windows
Fixes #6378

This will break Cygwin workflows (aka when the dev use 'sh' instead
of native cmd or PowerShell) but we were already not supporting that
due to 'win32_command' which redirects Unixish commands to cmd.
2025-05-04 11:54:03 -03:00
Alx Sa
7af987d31b plug-ins: Convert screenshot dropdowns to radios
This restores the GUI design from 2.10, which requires
less clicks to update settings. It also aligns with
proposed design guidelines to use radio buttons for
parameters with only a few options.
2025-05-04 13:48:21 +00:00
Alx Sa
afc1fa5250 core: Resize clip image when copying
In 1b64fdf5, when copying a selection we resize the
layers but leave the image itself the same size. This
allows us to paste the image in-place if requested by
the user. When pasting as a new image, we retrieved
the stored offsets and use them to resize the image
and shift the layers in the opposite direction of the
offset to align them in the image.

This process works fine within GIMP. However, when
pasting outside of GIMP, we don't go through the
resizing process - so we paste an area the size of the
original image instead of only the selection.

This patch inverts the logic to resolve this regression.
The image is resized on copy, but the original offsets
are still stored. When pasting in place, we retrieve the
offsets to shift the layers over, since we still control
the data inside GIMP. This allows us to send the
correctly cropped image when pasting to outside
applications.
2025-05-04 00:55:51 +00:00
Jehan
9ebc1f2126 desktop: make sure "GIMP" (original acronym) stays in the list of keywords.
Some languages may **add** localized variants of the acronym (in
particular when the language system is different, usually when it's not
latin script), but the original acronym should stay a valid keyword
because many people will still use it to search the software.
2025-05-03 18:42:35 +02:00
Alx Sa
c855d1df60 plug-ins: ZDI-CAN-26752 mitigation
Resolves #13910
Since ICO can store PNGs, it's possible to create an
icon that's much larger than the stated image size and
cause a buffer overflow.
This patch adds a check to make sure the width * height * 4
calculation does not overflow in addition to making sure it
doesn't exceed the maximum allowed size for that icon.
2025-05-03 14:13:46 +00:00
Rupert
ec03ef1a41 Fix #13900: bmp export warning dialog not showing under Linux/gdm
swapping the order of the calls to gtk_widget_show() and
calling gimp_window_set_transient() seems to fix the problem of the
dialog not showing with recent versions of gdm.
2025-05-03 01:14:14 +02:00
Alx Sa
61e5721067 display: Don't pan with spacebar if option is off
Resolves #13903
Our code was set to pan the screen if the user had the
space bar held, even if they had the space bar set to
"no action" or "switch to move tool" in Canvas Interactions
in Preferences. This patch adds a check to make sure we
have the action set to pan before continuing to pan when
the mouse moves.
2025-05-02 18:28:55 +00:00
Alx Sa
a937a229c2 themes: Add padding for radio icons in tool selection options
Resolves issue #13901
Some system themes did not add sufficient padding around
radio icons in our Tool options (like Move and Rectangle Selection).
This made it more difficult to see what was selected.
This patch defines padding to ensure there is enough space to see
which option is currently selected.
2025-05-02 12:16:42 +00:00
Jacob Boerema
dc873c18c4 plug-ins: fix #13642 crash when loading PSD...
while we are looking for the end of a clipping group. We did not take
into account that (non-clipping) groups can be nested multiple levels
deep. In that case the parent last_index will also be -1 which
caused a crash because we used it as an index into the layer array.

To fix this test if parents last_index is -1. In that case the we
keep looking for the end of the clipping group, so no change to
use_clipping_group, just output optional debug info.
2025-05-01 14:57:43 +00:00
Alx Sa
81c416e3d5 core: Fix linear conversion for Sample Average picks
In gimp_pickable_pick_color (), we get RGBA values using
the pickable's babl format, but then create a linear format
to convert it when Sample Average is enabled. As a result,
non-linear encodings are always converted to linear, and
the displayed pixel values are shown incorrectly in the
color frame.

This patch removes the code that changes the pickable's
format to RaGaBaA double, since gimp_gegl_average_color ()
already does this and handles the conversion to and from the
original pickable format.
2025-05-01 04:47:22 +00:00
Jehan
c90cc40735 app: style "You installed GIMP X.Y.Z!" text as "title-3" rather than pango markup.
Cf. discussion with rangelovd. I'll let others take care of actually
styling properly with CSS updates.
2025-05-01 00:26:50 +02:00
Jehan
a6103b677d NEWS: update. 2025-04-30 23:56:14 +02:00
Jehan
4ec3268c78 clang-format: uncomment rule not usable yet.
BinPackParameters is looking for a boolean right now, which was changed
to the enum we were using, but only for LLVM 20 (not yet available in
our CI). Comment this line for now.

Fixes failure in "clang-format" job in CI:

> Debian clang-format version 14.0.6
> /builds/GNOME/gimp/.clang-format:22:20: error: invalid boolean
> BinPackParameters: AlwaysOnePerLine
>                    ^~~~~~~~~~~~~~~~
> Error reading /builds/GNOME/gimp/.clang-format: Invalid argument

See: https://github.com/llvm/llvm-project/issues/117830
2025-04-30 23:36:15 +02:00
Akkana Peck
7a961cf4a4 window hints: fix transient-for keep-above behavior
Fixes issue 5176.
In GIMP2, the window hint preference controlled whether the image
window was allowed to draw on top of the Toolbox and docks.
In GIMP3/GTK3, apparently that hint does nothing; it's transient-for
that controls that behavior. This patch uses the transient-for
setting only if dock_window_hint is set to GIMP_WINDOW_HINT_KEEP_ABOVE.
2025-04-30 16:33:03 +00:00
Bruno Lopes
8fb6d64415 gitlab: In the screenshots text on Default.md, suggest full screenshots
We waste a lot of time requesting this to reporters.
2025-04-30 11:45:45 -03:00
Bruno Lopes
9d78ba0845 gitlab: Make a bit more clear what is "GIMP version" on Default.md
Very often reporters were giving package info on gimp version.
2025-04-30 11:40:28 -03:00
Bruno Lopes
afd8d7c73e gitlab: Mention gimp-ux repo on feature.md
I uppercased some words because the
Default.md template does this too so
seems to be legitimate and not rude.
2025-04-30 11:11:01 -03:00
Alx Sa
33485d7e6d tools: Use NDE filter name for undo history
Resolves #13711
This patch replaces the generic "Add filter" undo history
for NDE filters with the filter's name. This makes the label
consistent with destructive filters, and is more descriptive.
We may consider adding some indicator that filters are
NDE or not in a future patch.
2025-04-30 03:28:09 +00:00
Ondřej Míchal
e6bef93d73 .clang-format: Adjust bin-packing of parameters and arguments
As per GIMP's style documentation [0]:

- put function parameters on their own lines,
- pack function arguments to fit line and only then wrap.

[0] https://developer.gimp.org/core/coding_style/
2025-04-29 21:39:18 +03:00
Dirk Stöcker
7849f8cedb Update German translation 2025-04-29 16:51:13 +00:00
Dirk Stöcker
5dbfc48872 Update German translation 2025-04-29 16:50:57 +00:00
Alx Sa
d83d5929ad tools: Standardize MyPaint Brush tool layout
MyPaint Brushes have their own custom sliders for brush
options, so they were displayed lower in the dockable
compared to other paint tools like Pencil and Paintbrush.
This patch moves them up so options are in the same place
across all standard paint tools.
2025-04-27 23:18:28 +00:00
Alx Sa
8c14e432b7 actions: Hide Layer Attributes for floating selections
Resolves #13850

While layer-actions.c blocks showing the Layer Attributes
dialogue if the layer is a floating selection, it was still
possible to show it if the preview icon was activated.
This is because that calls the "layers-edit" action, which
bypasses the "layers-edit-attributes" block and shows
the dialogue anyway.
This patch adds a check for floating selections in
layers_edit_attributes_cmd_callback (), and returns if the
layer is a floating selection.
2025-04-27 16:44:34 +00:00
Bruno Lopes
a2aedc789b build/linux: Improve a bit the comments of Flatpak dist script 2025-04-26 22:11:48 -03:00
Bruno Lopes
a89d7aeccc build/windows: Do not ship orphan .pdb files
Actually babl.pdb and gegl-imgcmp.pdb
2025-04-26 18:19:42 -03:00
Bruno Lopes
e8e32375d4 build/windows: Do not hardcode python executable on bundling script 2025-04-26 17:41:38 -03:00
Bruno Lopes
10979fb031 build/windows: Cosmetic change on deps cloning script 2025-04-26 16:00:44 -03:00
Bruno Lopes
00ff3831e4 build/linux: Fix indentation on Flatpak scripts after c2771753 2025-04-26 14:13:27 -03:00
Bruno Lopes
72f80d5331 build/linux: Make Flatpak scripts POSIX-compliant 2025-04-26 11:08:29 -03:00
Bruno Lopes
c2771753db build/linux: Add org.flatpak.Builder support for Flatpak .sh scripts 2025-04-26 10:52:38 -03:00
Bruno Lopes
d59bb64ffa build/windows: Set solidbreak for 32-bit binaries
Mitigates #13801
2025-04-25 20:18:41 -03:00
Alx Sa
1d640b3e47 plug-ins: Make sure CMYK profile is exported for TIFF
Unlike PSD and JPEG, our TIFF plug-in's color profile export
code only ran if the user had enabled the Save Color Profile
option. The CMYK option alone did not trigger the profile code,
so it was possible to accidently export a CMYK TIFF without
including its color profile. Since this is rarely desired, the CMYK
boolean was added to the profile export conditional code, so that
it runs if either option is selected.
2025-04-25 21:02:18 +00:00
Bruno Lopes
2ccc4be050 data: Make environ meson.build file a bit more readable 2025-04-25 16:02:31 -03:00
Bruno Lopes
fa6854a896 build/windows: Fix buttons bar glitch on Installer /SILENT mode 2025-04-25 13:10:34 -03:00
Bruno Lopes
1d2add6606 build/windows: Do not add CYGWIN binaries to PATH
Since we don't (and shouldn't, see: #11385) use them. Now, our
Windows builds are 100% native (aka not using Unix-only binaries) so
on par with Linux, which completes a process starded in 9ab48164.
2025-04-25 10:23:45 -03:00
Bruno Lopes
806694f04d build/windows: Port file use on 2_bundle-gimp-uni_dep.py to Python 2025-04-25 10:16:01 -03:00
Alx Sa
2371c04758 widgets: Don't show hidden tools on tooltip
The tool group tooltip was not updated when users
toggled the visibility of tools in Preferences. This patch
adds a check before adding a tool to the tooltip, to make
sure it's visible first. It also clears out tool group tooltips
on mouse over to ensure the tooltip is updated.
2025-04-25 00:51:28 +00:00
Bruno Lopes
d164d713d7 gitlab: Check for platform-specific bins on .py files too
Since .py files are normally called by meson .build files.
2025-04-24 10:43:45 -03:00
Bruno Lopes
8ef096373f gitlab: Check for 'diff' and 'cmp' on meson-health job 2025-04-24 10:28:49 -03:00
Bruno Lopes
7ba10e73d9 pdb: Port echo use on groups.pl generation to Python 2025-04-24 09:52:36 -03:00
Alx Sa
aa94975003 pdb: Make gimp-plug-ins-query public
The Plug-in Browser plug-in makes a call
to gimp-plug-ins-query to get plug-in
information. Since this PDB was made
private, the browser could no longer load
plug-in information.
This patch makes gimp-plug-ins-query
public again so it can be used.
2025-04-23 14:05:16 +00:00
Bruno Lopes
3dca11596b gitlab-ci: Prevent build system from becoming Windows-centric too
Following: 89dfd0161a

Even if some script/tool is common on Windows, it's not wise to
use Win-specific things on Meson if they are avaiable on Python,
since that non-Python code will be too hard to mantain without the
Windows maintainer. So, let's make life easier for non-Win devs.
2025-04-23 10:22:16 -03:00
Bruno Lopes
89dfd0161a gitlab-ci: Add Meson linter job to prevent performance degradation
Meson broadly uses one of the few languages that it is available on
all platforms so let's take advantage of it on internal scripts.

This way, we have only one build language to care (aside Perl, which
have its own purpose) and avoid terrible bugs like: #11385.
2025-04-23 10:15:07 -03:00
Jehan
73b57a9914 etc: removing singular and plural fields from default unitrc.
We forgot to edit the default unitrc when removing these fields in
commit 2a00a9e60a. It's OK since our code can still read these fields
for backward compatibility anyway, but better clean up the file.
2025-04-23 13:41:43 +02:00
Bruno Lopes
3e439868fa build/windows: Port meson.build check of test-installer-langs.sh to Python 2025-04-22 14:33:41 -03:00
Bruno Lopes
ae514268b5 build/windows: Port .po tests of test-installer-langs.sh to Python
Also, they are now run on list-installer-langs.py before ninja test,
since this was technically possible to implement.
2025-04-22 11:35:56 -03:00
Alx Sa
8e81ed9572 widgets: Remove size restrictions on Display Filters
The "Available Filters" scrolled window was locked to
200px by 100px when the Display Filters dialogue is
opened. Since this size restriction is unnecessary and
makes it difficult to see the actual filters, it was removed.
The "Active Filters" still restricts the height (with scrolling),
since you can add multiple copies of the same filter
to the display.
2025-04-22 03:05:53 +00:00
Bruno Lopes
0fe938939c libgimp/tests: Bump timeout to 90s (because 60 is not enough on Windows) 2025-04-21 12:30:50 -03:00
Bruno Lopes
f158cc2b6e libgimp/tests: Port libgimp-run-python-test.sh to Python 2025-04-21 12:30:46 -03:00
Bruno Lopes
54697c1d3c app/tests: Drop dangling create_test_env.sh
Before the "fix" on 941fc000, everything was working fine, which
is a sign that it wasn't even being used. Also, after Jehan own
investigation and my tests, I confirmed that it isn't used anymore.
2025-04-21 12:30:42 -03:00
Jehan
41660fcf7d NEWS: update. 2025-04-21 15:49:03 +02:00
Jehan
8a3e0cfcee gimp-data: use splash with no-micro version in it. 2025-04-21 15:13:08 +02:00
Lukas Oberhuber
e8a9f5bab0 gimp-data: updated with macos fix #13761 2025-04-21 00:57:40 +01:00
Bruno Lopes
49249d35bd build/windows: Build with not-CYGWIN Perl 2025-04-20 19:05:42 -03:00
Alx Sa
cc50ef99a6 tools, widgets: Don't show Fx icon for tool-based filters
We use GEGL filters for some of our currently destructive
editing only tools, like Warp and Bucket Fill.
While eventually these will have non-destructive options,
for now it's confusing to show an Fx icon briefly when
the tools are active.
This patch sets these filters as temporary, and updates
the GimpItemTreeView code to not show the Fx icon
if there is only one filter and it is temporary.
Temporary filters can not be deleted from the NDE
pop-up, only from their tools, preventing another set
of reported crashes.
2025-04-20 15:26:07 +00:00
Lukas Oberhuber
d46b6e4e0e app: Partial fix for #13702 infinite loop on startup
If somehow an image is not passed when opened from the command line, this avoids an infinite loop
as was seen in #13702

This still does not solve the issue of how a bad image was passed in in the first place.
2025-04-20 15:51:49 +01:00
Lukas Oberhuber
994cb2b21f Fix #13761: Broken macos build 2025-04-20 15:32:27 +01:00
Bruno Lopes
278946f767 build/windows: Port fix_msg.sh to Python
This port made clear that it is almost impossible to
do the langs patching with PowerShell alone.

The new output of the patching will display the encoding.
2025-04-19 17:15:21 -03:00
Bruno Lopes
1fe8db7a94 data: Workaround for macOS broken Python 2025-04-19 12:06:31 -03:00
Bruno Lopes
23b8867115 libgimp: Port libgimp-run-c-test.sh to Python 2025-04-18 21:53:22 -03:00
Bruno Lopes
8ef7bf3553 desktop: Port test-appdata.sh to Python
This works on Windows too so let's make it cross platform.
2025-04-18 20:56:07 -03:00
Bruno Lopes
941fc0000b apps/tests : Fix IconsRoot path on gimp-data era 2025-04-18 19:41:19 -03:00
Bruno Lopes
72cb81f6a7 meson: Default ICC directory is Linux-specific 2025-04-18 14:32:00 -03:00
Bruno Lopes
5281804a5c gitlab-ci: Reduce Windows jobs timeout to 40m thanks to pythonization
Let's test a shorter timeout since our scripts were improved.
2025-04-18 14:09:43 -03:00
Bruno Lopes
f88ca87ca9 build/windows: Restrict clean() output of bundling script
This is the python version of c748b3d2
2025-04-18 14:01:26 -03:00
Bruno Lopes
a683495b09 build/windows: Port 2_bundle-gimp-uni_sym.sh to Python 2025-04-18 13:36:35 -03:00
Bruno Lopes
00ab5e3a19 .gitlab: Move cp-plug-in-subfolder.py to build/meson
It is not a CI-specific file.
2025-04-18 13:36:31 -03:00
Gabriele Barbero
9989dfe933 Issue #13752 - Handle GTK_RESPONSE_HELP in about dialog
Previously, the Help button triggered the default dialog close behavior, without showing any help.
This change ensures that pressing Help triggers the expected help function.
2025-04-18 16:36:33 +02:00
Bruno Lopes
4e00c87ff5 gimp-data: Bump commit regarding Python module 2025-04-17 16:19:52 -03:00
Bruno Lopes
ddcc51204b libgimp: Port from cat to Python 2025-04-17 15:32:20 -03:00
Bruno Lopes
547abb038e meson: Fix testing option of authors.md being accidentally pushed 2025-04-17 15:10:12 -03:00
Bruno Lopes
30f1a34750 meson: Get date with Python on authors.md generation 2025-04-17 14:49:01 -03:00
Bruno Lopes
d88966b272 app, app-tools, data, plug-ins, tools: Do not hardcode python executable
Use 'python' module instead.
2025-04-17 14:32:06 -03:00
Bruno Lopes
49065eb635 plug-ins: Port echo use on gresource generation to Python 2025-04-17 13:57:25 -03:00
Bruno Lopes
cbad5f4bb7 gimp-data: Bump commit to latest Python changes 2025-04-17 13:28:40 -03:00
Bruno Lopes
160ec3d0d7 meson: Port meson_dist_script.sh to Python
It's not used by Windows right now, but it can be so let's port it.
2025-04-17 11:18:30 -03:00
Bruno Lopes
42049493cb tools: Port meson-mkenums.sh to Python 2025-04-17 09:39:08 -03:00
Bruno Lopes
c7308335a5 data: Port share/gimp/*/fonts creation to Python 2025-04-17 09:39:04 -03:00
Bruno Lopes
455dc1faa6 app, app-tools, tools: Port Windows's enable_default_bin to Python 2025-04-17 09:39:00 -03:00
Bruno Lopes
b95c78fdbd build/windows: Port list-installer-langs.sh to Python 2025-04-17 09:38:55 -03:00
Bruno Lopes
dea5e2414a tools: Fix 'in-build-gimp.py' indentation to conform with Coding Style 2025-04-16 16:44:22 -03:00
Bruno Lopes
99bf8defe7 tools: Port in-build-gimp.sh to Python
Both .sh and .py versions take 2:15 minutes to generate all the
assets but the more cross platform the better so Python wins.
2025-04-16 13:41:16 -03:00
Bruno Lopes
f5ee454098 build/meson: Port check-gimp-data.sh to Python
It is not faster than using 'wc' but it is cross platform.
2025-04-16 07:05:08 -03:00
Bruno Lopes
231b89537e pdb: Port meson-*.sh to Python
This avoids using CYGWIN-linked binaries from $MSYS_ROOT/usr,
which are extremely slow. Python is cross-platform and faster.
2025-04-15 13:55:19 -03:00
Bruno Lopes
9abc42933a build/windows: Port 2_bundle-gimp-uni_base.sh to Python
This avoids using CYGWIN-linked binaries from $MSYS_ROOT/usr,
which are extremely slow. Python is cross-platform and faster.
2025-04-15 11:45:15 -03:00
Bruno Lopes
c4309ee0ce Issue #11677: Add fractional scaling support to Installer welcome image 2025-04-14 09:08:24 -03:00
Bruno Lopes
63f5ea9dc5 build, meson, gitlab: Generate native .pdb CodeView symbols on Windows
Reverts dc21fb76

The CodeView format introduces some advantages to our Windows build:
- It is way smaller than DWARF, reducing the .exe installer. With
  the strip of COFF symbols too, the installation is 120MB smaller.
- Can be uploaded as .appxsym to be used on demand by MSIX (in thesis)
- Works better with DIA and DbgHelp debuggers like WinDbg and DrMingW,
  respectively. LLDB also works by using LLDB_USE_NATIVE_PDB_READER=1

Context: that was not working before because DrMingw and LLDB seems to
only search for the build-time .pdb path in '.buildid' section of bins.
See: https://github.com/jrfonseca/drmingw/issues/91 and
https://github.com/llvm/llvm-project/issues/125355. So, we will set
_NT_SYMBOL_PATH at least for $PREFIX/bin for now as workaround.
2025-04-14 07:50:43 -03:00
Alx Sa
19bb4a5251 paint: Prevent crash on out-of-bounds smudge tool
The Smudge Tool gets accumulated buffers from its
history via g_list_nth_data (). However, this function can
return NULL if we go out of bounds. We did not check for
this before trying to use it as a GeglBuffer, which caused
crashes if we ran out of accumulated buffers (e.g. if we
were partially smudging off-canvas).
This patch adds NULL checks to prevent the crashes.
2025-04-13 22:55:12 +00:00
Alx Sa
c3814125e3 display: Verify GtkWidget is a GimpCanvas object...
...before trying to get its GimpColorConfig.
Resolves #13691

After the color space invasion, various GimpCanvas
functions are now aware of color management settings.
However, these public GimpCanvas functions do not
require the user to pass in a GimpCanvas, just a GtkWidget.
This can lead to crashes if we pass in a different kind of
GtkWidget, since it may not have a GimpColorConfig property.

One example is the Navigation Dockable, which crashes when
it tries to draw boundaries around the image when "Show All"
is turned on, because it passes a GimpView widget instead of
a GimpCanvas.

This patch adds a check if the "canvas" parameter is actually a
GimpCanvas, and sets the config to NULL otherwise.
2025-04-13 15:31:48 +00:00
Bruno Lopes
ea89353fd7 gitlab-ci, build: Drop crossbuilds since they only make sense on Fedora
With grave on heart I am dropping crosbuilds. Always liked them but
actually our crossbuids on Debian are flawed on either GCC or Clang
(with linking either to UCRT or MSVCRT, I tested all possibilities).

The main problem is that Debian does not provide the runtime deps
(unlike Fedora) so we use from MSYS2. This fact tends to cause:
- Linking problems due to undefined references on compiler: #11756
- Clash between Windows runtime and Linux build-time deps: #12970

Worst, these bugs historically are rarely spotted or fixed at all.
Some of them took weeks and even months(!) to be reported by us and,
in the end, there is only one or two guys to do this: me and Jehan.
I do rather prefer to improve native builds than spending more and
more time on fixing crossbuilds without effectively using them.
2025-04-13 11:07:27 -03:00
Alx Sa
2ed959ed7c themes: Keep menubar color consistent when out of focus
Same issue as 484b9cfe, just applied to the
non-merged menubar instead.
2025-04-13 01:04:53 +00:00
Bruno Lopes
2cedc9fc96 build/linux: Do not allow library preloading on AppImage
Closes: #13527
2025-04-12 19:20:29 -03:00
Alx Sa
f58ac5f6cd themes: Define merged titlebar icon colors
Resolves #11552
We did not explicitly define the colors for the Minimize,
Maximize, and Close button icons for merged titlebars.
On some system themes, the color used blends into
the titlebar and makes the icon look invisible.
This patch makes sure we always define the icon color
for the Default theme.
2025-04-12 20:59:45 +00:00
Emin Tufan Çetin
a5de79e3b2 Update Turkish translation 2025-04-12 16:12:10 +00:00
Emin Tufan Çetin
7d3d041bae Update Turkish translation 2025-04-12 16:07:26 +00:00
Alx Sa
a331caa9f2 core: Enable resize for GUI layer duplication
Resolves #13633 (for now)
Same rationale as 975d1a4a, as diagnosed by Thomas Manni.

During 3.2 development, we can review and likely just set this as
the default value inside GimpDrawable.
For now, this is a limited bugfix for 3.0.x.
2025-04-12 14:27:51 +00:00
Bruno Lopes
44e3655536 build/windows: Improve Repair mode to check parent dir
Following eab5e061

This avoids curious users cheating the mode to make multiple installs, which
is unsupported by us since we only allow for different mutexes. See: #1382
2025-04-11 08:20:31 -03:00
Jehan
23d4c6fda9 INSTALL: more info about HEIF support.
It looks like packagers have regular issues with this support. Also I
added info about the fact we also support JPEG2000-in-HEIF (HEJ2) now.
And I made clearer that there may be other encoders/decoders possible
for a given format (though for AV1, we have a clear AOM preference in
our code).

Finally I add info about an environment variable which may be useful
probably in cases when the run prefix differs from the build prefix.
Cf. a case which was recently happening in the Snap package.
See: https://github.com/snapcrafters/gimp/issues/390
2025-04-11 11:25:05 +02:00
Alx Sa
93c3d83dd0 tools: Hide Force slider for Pencil Tool
The Force option does not affect the Pencil Tool's painting.
While Force is already set to be insensitive, hiding the
option entirely makes it even clearer that it can not
be used with this tool.
2025-04-11 02:58:42 +00:00
Jacob Boerema
5273f26ef0 app, pdb: fix #13480 inconsistent use of maximum radius...
for generated brushes.
The maximum radius we allowed for generated brushes was not used
consistently everywhere.
In the API call we clamped it to 0.0-32767.0, while the param_spec
set min and max to 0.1 and 4000.0, and the brush editor used a
maximum of 1000.0.
Using a large value (probably anything larger than 4000) would
sooner or later lead to a crash.

Instead of manual changes everywhere, let's define a maximum and
minimum in one place and use that wherever we need the min/max values.
Use the values as set in the param_spec for the defines.
The only place we can't easily do that is in brush.pdb, so we add
a comment above our defines that the values need updating there too.

Actually we should probably use more defines for other values too,
that way there is less chance of min/max values getting out of synch
throughout our code.
2025-04-11 02:02:40 +00:00
Bruno Lopes
e67a99b275 build/windows: Add some comments regarding InstallType and other things
This makes a bit more clear changes introduced by:

itInstall, itReinstall, itUpdate: cbe2f6bec2
itRepair: eab5e0615d
itDowngrade: e447b1244b

Unninstall (settings): b6069baa04
Unninstall (restore): 22e3ae24c7
2025-04-10 15:03:55 -03:00
Bruno Lopes
822981d209 build/windows: Clarify DefaultIcon/uap:Logo "policy" for .ico files 2025-04-10 13:22:29 -03:00
Bruno Lopes
d3501ffc35 build/linux: Make AppImage script tool-agnostic (part 3) 2025-04-10 07:33:01 -03:00
Bruno Lopes
4070cfb9ee build/linux: Add some comments to AppRun
And make APPDIR output clearer.
2025-04-10 07:27:36 -03:00
Alx Sa
5b822032c8 widgets: Include filters in GimpBufferSourceBox buffer
Updates the code to use gimp_pickable_get_buffer_with_effects ()
which copies over the filters that the user sees when choosing
an Aux Input option.
2025-04-09 12:13:37 +00:00
Bruno Lopes
f2bdf03b9a build/linux: Do not set uneeded GIMP3_* dirs on (relocatable) AppImage
Relocatable builds do not need them.

Also, remove comments about the inspiration for the scripts since
they are now so refined that make no sense to link 3P sources.
2025-04-09 08:58:03 -03:00
Bruno Lopes
6d9a9d3d7b build/windows: Log downgrade message when Installer is silent
Following: e447b124
2025-04-08 20:10:28 -03:00
Jehan
884353ed3d plug-ins: fix relocatability of the Python Console.
If we were running Gimp.locale_directory() at the very start of the
script, it would append before _gimp_reloc_init_lib() had happened, and
therefore the returned value would be the non-relocated locale
directory.

Calling this inside set_i18n() happens later, and also feels like the
proper place for this code.
2025-04-09 00:20:03 +02:00
Bruno Lopes
64d63cd937 build/windows: Use native icon from 'imageres.dll' on Installer dir page 2025-04-08 13:58:13 -03:00
Ekaterine Papava
cef5ab3992 Update Georgian translation 2025-04-08 02:33:05 +00:00
Kolbjørn Stuestøl
14b1c11273 Update Norwegian Nynorsk translation 2025-04-07 19:17:57 +00:00
Alx Sa
8b0185ba8f tools: Don't crash when reading invalid Curves preset
When reading a gimp:curves preset file, we assume
that we read in at least 64 bytes for the header. If the
invalid preset file is smaller than that, g_input_stream_read_all ()
can read it just fine but the code fails when comparing the
bytes read in to the size of the header.

This means that the GError object is still NULL, so g_prefix_error ()
has no effect - and thus the calling code crashes when it tries
to get "message" from a NULL GError object.

To resolve this issue, we check if error or *error are NULL.
If so, we set the error with g_set_error () instead.
2025-04-07 18:57:31 +00:00
Bruno Lopes
43ae9fced5 build/linux: Prevent LD_LIBRARY_PATH leaking on AppImage
Closes #13603

Following 8fe7ddf3
2025-04-07 09:23:45 -03:00
Martin
e4bf961cbb Update Slovenian translation 2025-04-07 10:29:51 +00:00
Yuri Chornoivan
7a242913fd Update Ukrainian translation 2025-04-07 06:26:01 +00:00
Bruno Lopes
abeac94e8e build/linux: Fix '--no-expand' param of conf_app function on AppImage script 2025-04-06 22:05:21 -03:00
Luming Zh
b2493f4273 Update Chinese (China) translation 2025-04-07 00:52:13 +00:00
Bruno Lopes
b303b6e20b Issue #13367: set Mesa drivers on Continuous appimage from stable series.
Partially reverts 3bbcdbd325
2025-04-06 20:19:31 +00:00
Bruno Lopes
87cfc65ab6 Issue #13367: use correct python*.exe on insider MSIX from stable series 2025-04-06 20:19:31 +00:00
Jehan
c893a96298 Issue #13367: show commit in about dialog in all non-release builds.
The commit hash is not that useful on releases, even for unstable
releases, because a release is always at a known tagged commit anyway.

Note that I only change this for the About dialog where it's less
visible, and not on the canvas, because I do appreciate that stable
series show with a clean empty canvas. I like stable series to be closer
to a release state (even though it's true that having the commit hash
accessible somewhere for dev/continuous build is a useful feature).

Sorry to translators too! I break the string freeze during the stable
series. It's a string only visible on dev builds anyway, so it's not a
very urgent string anyway. Thanks for all the hard translation work! 🤗
2025-04-06 20:19:31 +00:00
Jehan
9d6f80c9dc Issue #13367: show devel warning on Windows installer even in dev build of stable series.
Also, set correct python interpreter (which attachs to debug console).
2025-04-06 20:19:31 +00:00
Jehan
afa152ea54 Issue #13367: use correct AppImage and MSIX IDs for continuous builds.
Also make sure we ship the relevant graphviz runtime dependencies when
the debug menu is visible.
2025-04-06 20:19:31 +00:00
Bruno Lopes
b2bf83a6bd build/linux: Make AppImage script tool-agnostic (part 2) 2025-04-06 16:04:49 -03:00
Danial Behzadi
e5c2791378 Update Persian translation 2025-04-06 18:01:41 +00:00
Bruno Lopes
30d7631d34 build/linux: Make AppImage script tool-agnostic (part 1) 2025-04-06 13:39:15 -03:00
Emin Tufan Çetin
b514fa3338 Update Turkish translation 2025-04-06 16:25:03 +00:00
Emin Tufan Çetin
5c9e28634e Update Turkish translation 2025-04-06 16:19:17 +00:00
Jacob Boerema
257ac87e9f app: fix #13288 crash when opening a recently closed dock
When at least 3 recently closed docks were present in the Windows ->
Recently Closed Docks submenu, then clicking the middle one caused
a crash. Clicking the top or bottom one didn't cause a crash, but
the submenu was then removed so the other closed docks were not
visible anymore (until restarting GIMP).

It turns out we were removing the whole recent menu, instead of
picking the specific action that needed removing. So now we change
this to get the action_name and use that in the remove call.

Although this already fixes the crash, I added an extra check to
make sure action is valid, and if not we generate a critical. This
way we will notice something is wrong if this happens in the future,
without causing a crash here.
2025-04-04 19:29:04 +00:00
Alx Sa
9a3209844e themes: Fix display of .default response style
The .default style (to show which button is selected by
default) was being overridden by more general CSS styles.
This patch moves it after these general styles so that it
is shown again.
2025-04-04 18:10:12 +00:00
Alx Sa
20cf6d553a tools: Connect MoveOptions and TransformOptions to icon size
Resolves #13044
Same code as 816fb1c6, applied to the Move icon box
in GimpMoveOptions and the Transform icon box
in GimpTransformOptions.
2025-04-04 10:46:23 +00:00
Alx Sa
4dfa4924ff plug-ins: Use viewbox dims if needed for SVG
Starting in librsvg 2.54,
rsvg_handle_get_intrinsic_dimensions ()
always returns TRUE for width and height because
the SVG assumes a width/height of 100%.
This means that SVGs without explicit widths/heights
are loaded as 1px by 1px.
This patch adds a check to see if the width/height is
100%, and if the viewbox exists, we use those values
instead.
2025-04-04 02:09:02 +00:00
Bruno Lopes
d66e58265d Issue #11623: Use icons from imageres.dll for custom installer dialogs 2025-04-03 21:12:57 -03:00
Alx Sa
5201d194fa plug-ins: Read texture map size on DDS import
In 594afaf9, we changed how texture maps were imported.
The array size is now only loaded if we have a valid DX10 compression
set. However, GIMP allows you to export a texture map without
setting a DDS compression. Thus, any DDS images exported with
no compression would only load the first layer on import.

This patch moves the code that copies over the array items size to
be unconditional once the header is loaded.
2025-04-03 00:54:15 +00:00
Alx Sa
5a43663f09 paint: Prevent crash on expanding with pattern fill
Resolves #13501
When painting with "Expand Layers" on, we call gimp_get_fill_params ()
to get the color to fill in the new area. However, if the user has set the
fill type to Pattern, the color is NULL. This caused a crash because we
immediately try to set the alpha channel of the color to 1.0 if the layer
has no transparency - and if the color is NULL, that's not possible.
This patch checks if we received a valid GeglColor before trying to
set its alpha channel.
2025-04-02 13:57:24 +00:00
Bruno Lopes
e447b1244b build/windows: Prevent users from downgrading without uninstalling GIMP
That's not supported by Inno and our (confusing) custom code to
remove previous "old" GIMP versions seems to not support that.
2025-04-02 09:41:46 -03:00
Anders Jonsson
0486b11d5c plug-ins: fix dds volume map export with more than 2 layers
In 10b798c198 g_list_next always was used from the beginning of
the layer list for each call for volume map and array export, so
all layers after the first were the same.
2025-04-01 19:00:24 +00:00
Bruno Lopes
e975c1625a meson, app, build: Fix Inno wrongly allowing to unninstall with GIMP running
Inno needs an AppMutex to be aware of GIMP execution so
prevent unninstalling or installing GIMP if still running.

(Unninstalling with GIMP running was making GIMP to not be
fully unninstaled since gimp*.exe process file was opened.
It also could cause problems with settings unninstall.)

(Installing with GIMP running was already not possible
since Inno code in that part is more refined but
that check isn't done before deleting .debug files)
2025-04-01 16:25:47 +00:00
Alx Sa
b2b0ad7536 widgets: Set default response to GimpViewableDialog
Resolves #13504
Similar to c997349e, 2.10 users expect that pressing Enter
on dialogues such as Fill/Stroke Path should immediately commit
the operation. This default response may have been lost during the
GTK3 port, so we need to explicitly set the default response with
gtk_dialog_set_default_response () if a GTK_RESPONSE_OK has been
set.
2025-04-01 14:20:22 +00:00
Philipp Kiemle
812d43b278 Update German translation 2025-04-01 13:15:16 +00:00
Alexander Shopov
d960c6c29c Update Bulgarian translation 2025-03-31 13:48:51 +00:00
Alexander Shopov
ab847e6577 Update Bulgarian translation 2025-03-31 13:45:58 +00:00
Alexander Shopov
8acff211c6 Update Bulgarian translation 2025-03-31 13:42:09 +00:00
Alx Sa
e494538393 pdb: Pass GIMP object when creating text layer via API
After discussing with Idriss, we found that if you create
a GimpTextLayer via the public API, the GIMP object
was not being stored in the GimpText object.
If markup like bold/italics was then applied, GIMP
would crash on saving as XCF because the serialization
code tried to access text->gimp_font_factory.
This patch resolves the issue by passing the GIMP
object into GimpText when we create it via the
API.
2025-03-31 11:07:14 +00:00
Bruno Lopes
089f98f795 build/windows: Use special fileicon for XCF on Installer and MSIX
Closes: #issue_sha
2025-03-31 10:50:49 +00:00
Alx Sa
76dccc32b1 themes: Another round of System Theme leak fixes
Based on user reports after the 3.0 release.
These leaks were most visible in the Preferences dialogue,
and cover too large checkboxes and radio boxes, wrong colors
for scrolled window backgrounds, sliders, scales, and
Preference Dialog headers.
2025-03-30 18:35:26 +00:00
Bruno Lopes
78b1377488 gitlab-ci: Do not set MSYS_ROOT in 'before_script' 2025-03-30 15:03:25 -03:00
Alx Sa
68c7329988 dialogs: "You Installed GIMP" text no longer selectable...
...in Welcome Dialog.
Resolves #13468

Per Jehan, there is no need for this text to be selectable,
especially as the other text on the Welcome Dialog is not.
This patch removes gtk_label_set_selectable () for the
"You installed GIMP x.y.z" text to keep it consistent.
2025-03-30 17:34:50 +00:00
Jordi Mas i Hernandez
8636aa4ec6 Update Catalan translation 2025-03-30 17:26:53 +00:00
Kolbjørn Stuestøl
c791360b8c Update Norwegian Nynorsk translation 2025-03-30 16:12:02 +00:00
Kolbjørn Stuestøl
2966dbe547 Update Norwegian Nynorsk translation 2025-03-30 16:08:49 +00:00
Kolbjørn Stuestøl
83c78c3275 Update Norwegian Nynorsk translation 2025-03-30 16:03:18 +00:00
Alx Sa
238d0b3d31 plug-ins: Fix check for DDS cubemap option
Our DDS plug-in checks to see if we have six layers
with certain labels in their name to create a cubemap,
and if we don't, that option is locked.
When porting to GIMP 3 API, we accidentally kept checking
only the first layer's name instead of all six+ layers, thus
making it impossible to verify we had layers with the right labels.

This patch adjusts the iteration code to ensure we check all layers
in the image and not just the name of the first one.
2025-03-30 12:49:07 +00:00
Yuri Chornoivan
1918259ef6 Update Ukrainian translation 2025-03-30 10:45:44 +00:00
Alx Sa
f6b87826d6 plug-ins: Use selected layer for DDS export option
When we removed the drawables parameter for image exports,
we switched to using gimp_image_list_layers () to retrieve the
layers from the image parameter inside the function.
However, for DDS, this provided all layers rather than the selected
ones, so we always exported the top layer. This patch switches
to using gimp_image_get_selected_layers () to only retrieve the
subset of selected layers.
2025-03-30 01:38:18 +00:00
Luming Zh
031a80a981 Update Chinese (China) translation 2025-03-29 23:34:02 +00:00
Martin
d9b4e4d3e8 Update Slovenian translation 2025-03-29 22:20:42 +00:00
Bruno Lopes
a09405d0ae build/linux: Make .pc files on AppImage relocatable
Following: c29be7ba
2025-03-29 17:46:43 -03:00
Bruno Lopes
c29be7ba5f build/linux: Bundle correct Resource dev files on AppImage
Similarly to 73c7d468
2025-03-29 15:38:31 -03:00
Bruno Lopes
73c7d46829 build/windows: Ship babl, gegl and gimp development files on Windows
Partly inspired by Infrastructure/gimp-macos-build#69

Now, we ship headers, static libraries and (relocatable) pkg-config files of
babl, gegl and gimp to make a bit easier building filters and plug-ins.

Developers will still need MSYS2 to install the compiler and the
other many dependencies.
2025-03-29 13:41:32 -03:00
Jehan
8719e231fd NEWS: update. 2025-03-29 10:57:39 +01:00
Bruno Lopes
ad155fd545 build/linux: Do not include .debug symbols
Shipping .debug symbols is not a common practice on Linux distros.
Also, backtrace() API seems to not be able to read them separetely.

So, there is no use for them. Who wants top tier debugging can set:
export DEBUGINFOD_URLS="https://debuginfod.debian.net"
2025-03-28 21:10:44 -03:00
Alx Sa
d138453795 script-fu: Restore GUI to Difference Clouds script
Difference Clouds displayed a GUI in GIMP 2.8, which came
from the Solid Noise plug-in. When Solid Noise was converted to
a GEGL operation, it no longer showed a GUI when called from a script.

This patch adds custom parameters to the Difference Cloud so that it will
auto-generate a GUI, restoring the ability to configure most settings for
Solid Noise. Because of commit f92f7d42, script-writers can still call
Difference Clouds without the new parameters to retain the GIMP 2.10
behavior.
2025-03-28 19:18:16 +00:00
Bruno Lopes
0ab3037e78 build/windows: Fix comnent syntax on util_uninst.isi 2025-03-27 09:59:01 -03:00
Alx Sa
6f50061eff plug-ins: Use GimpExportOptions for ICO export
Since the ICO plug-in did not process the image with
gimp_export_options_get_image () before export,
filters were not being merged down and thus not
included in the final image.
This patch adds that feature to ICO, CUR, and ANI
exports.
2025-03-27 03:05:49 +00:00
Bruno Lopes
d17684734f build/windows: Make a copy of settings on Settings unninstall
This middle term adresses a major concern of non-Windows devs on IRC:
the hypothesis of some user removing its settings by accident.
2025-03-26 21:33:02 -03:00
Alx Sa
083cd67c87 plug-ins: Remove unused variable in file-tiff-load.c
Resolves #13411
While implementing the Sketchbook layers import
code in TIFF, we originally used a procedure to do
part of the processing. This code was replaced, but
the unused variable was left behind. This patch
removes it to reduce warnings on compile.
2025-03-26 23:22:21 +00:00
Alx Sa
befc8ed444 widget, themes: Highlight selected device in GimpDeviceStatus
Gives GimpDeviceStatus a CSS class so
we can apply custom styling to the
selected device, similar to GIMP 2.10's
style.
2025-03-26 14:35:37 +00:00
Bruno Lopes
d3645edfdf build/windows: Fix broken fontconfig cache
Closes: #1366
2025-03-26 11:30:12 -03:00
Bruno Lopes
f6c8c29553 build/windows: Make Settings unninstall wording a bit more "scary"
As per feedback on IRC.
2025-03-26 09:47:42 -03:00
Bruno Lopes
fa6e880e20 build/windows: Use IDI_WARNING icon on Settings unninstall dialog
That's the right way to use it:
https://learn.microsoft.com/en-us/windows/win32/uxguide/vis-std-icons
2025-03-26 09:19:38 -03:00
Ekaterine Papava
eb9f9794b9 Update Georgian translation 2025-03-26 06:55:34 +00:00
Bruno Lopes
8b5ddf53aa build/linux: Sync with Beta manifest
Ported from: 7d7e018d0f
2025-03-25 13:32:39 -03:00
Bruno Lopes
3a476aa62b build/windows: Fix wrong revisioning [Code] on DebugMsg
This wasn't creating any bugs but making debugging obscure.
2025-03-25 12:30:01 -03:00
Bruno Lopes
e7a7a7974c build/windows: Fix 'set' conjugation on Installer revisioning log
Closes: #13384
2025-03-25 12:24:43 -03:00
Hugo Carvalho
772caae144 Update Portuguese translation 2025-03-25 14:25:55 +00:00
Luming Zh
f38e0a51bc Update Chinese (China) translation 2025-03-25 10:21:50 +00:00
Bruno Lopes
5614f04f9a build/windows: Windows DLLs are not on /lib dir! (fix d58e6911) 2025-03-25 06:24:14 -03:00
Martin
2dee263016 Update Slovenian translation 2025-03-25 09:15:00 +00:00
Bruno Lopes
eab5e0615d build/windows: Add Repair mode to our Installer
Closes: #1382

We do not allow multiple installs under the same GIMP_MUTEX_VERSION.
That is a good thing but depends on the partition of the install dir.
Otherwise, if the partition is lost, this become a registry nightmare.

That nightmare is a more 5 years old issue that tormented even one of
our past maintainers, Michael Natterer.

So, let's make possible to fix GIMP installation when the previous
install dir can't be accessed.
2025-03-24 18:37:14 -03:00
Bruno Lopes
cbe2f6bec2 build/windows: Make Installer aware of Install, Reinstall and Update modes
Closes #12998.

On Install mode, we correctly allow users to customize the installation.
This is the expected use case of the "Customize" button: the first user be
able to decide if the installation will be system-wide or on local user,
to see the license, to choose the install dir, to select components etc.

On Reinstall and Update mode, however, some options choosen byf the first
user can't be undone, mainly components, since Inno never had support to
"modify" installs (it can only not install the unchecked components).
So, in our current scenario (before this commit):
- If python support was installed but on the update the user uncheck it,
  the old python and all old gimp python plug-ins will remain installed
- The same applies for postscript (.ps) component and 32-bit TWAIN

So, the chances of breaking the install are very high. Inno knows that
and displays a built-in warning, but even that dialog have limitations.
So, let's not keep that false impression of being able to modify the
install, let's fix that by hidding "Customize" on Reinstall and Update.
2025-03-24 18:37:10 -03:00
Yuri Chornoivan
423b1b567c Update Ukrainian translation 2025-03-24 21:05:00 +00:00
Sabri Ünal
eebc40ebb6 Fix a typo 2025-03-24 16:46:26 +00:00
Alan Mortensen
24a1dea3e3 Update Danish translation 2025-03-24 16:23:59 +00:00
Alan Mortensen
1a70759309 Update Danish translation 2025-03-24 16:20:15 +00:00
Jehan
e9b6ef67ab Post-release version bump to 3.0.3. 2025-03-24 17:00:37 +01:00
Jehan
3d4503e82c Release GIMP 3.0.2. 2025-03-23 23:47:58 +01:00
Jehan
67067f9ffa NEWS: list of changes for 3.0.2. 2025-03-23 23:07:12 +01:00
Idriss Fekir
ea5fff1b3f app: Keep the current font in use if the font searched for doesn't exist
Whenever the font in the Context (e.g. through selecting another font
from the fonts list) changes, a signal is emitted to propagate the
change to the active text layer, but if the font is set to NULL in
Context, we don't want that to propagate (because this would change the
current text's font to some fallback font).

In other similar codepaths (e.g. brushes) this is not a problem because
selecting a brush that doesn't exist will prevent painting until an
existing brush is selected.
2025-03-23 21:35:53 +00:00
Muhammet Kara
20138edff8 Update Turkish translation 2025-03-23 21:33:29 +00:00
Bruno
22e3ae24c7 build/windows: Create Restore Point on system-wide install
Closes: #11666

Creating restore points when admin is common on .msi installers.
We will use PowerShell's 'Checkpoint-Computer' cmdlet which will
automatically evaluate if the Restore point should be created.
2025-03-23 17:34:19 -03:00
Denis Rangelov
292220ff97 app/widgets: Replace confusing Search Actions icons with toggles 2025-03-23 18:56:22 +00:00
Jehan
cb79353b96 gimp-data: bumping so that gimp-data!23 and !2027 are synced. 2025-03-23 19:37:39 +01:00
Alx Sa
7d8b8c113d themes: Change the pane separator to outline only
As suggested by Jehan, Aryeom, and
Denis, this makes the separator feel less
heavy while still indicating the difference
between sections.
2025-03-23 18:24:21 +00:00
Jacob Boerema
5f7a136685 Revert "app: fix #12475 Eraser tip uses same tool as pen tip"
This reverts commit 68422e3c70.
2025-03-23 17:49:45 +00:00
Jethro Beekman
b3e3241c6f screenshot: Don't consider X11 to be available when running under XWayland 2025-03-23 17:20:51 +00:00
Jehan
0e7c4fec14 libgimpwidgets: slightly better form.
Previous code was right and equivalent because
gdk_wayland_window_export_handle() works asynchronously in the same
thread (so phandle can't get overridden by mistake). Nevertheless a
quick code scan felt surprising, so to avoid any such future surprise,
let's just switch the order of statements.
2025-03-23 18:10:25 +01:00
Jehan
bb6b2e395f plug-ins: use proper Window type for X11. 2025-03-23 18:09:38 +01:00
Lukas Oberhuber
41ba9b315c meson: fix 13146
This is probably a temporary fix until 13149 is tackled. And we need to make sure it works on all platforms.
The problem has been patched on macOS so we could also skip this change until the proper fix is done.
2025-03-23 15:02:59 +00:00
Alx Sa
a5c35fb244 theme: Invert GimpSpinScale slider colors in dark mode
While the slider colors match GIMP 2.10's light and
grey themes, the colors in 3.0 were inverted compared
to 2.10's dark mode. This patch inverts the dark mode
colors to better match 2.10's version.
2025-03-23 14:39:47 +00:00
Alx Sa
47224ba1a6 widgets: Improve spacing between toolbox widgets
The default value of the number of
children in a GtkFlowBox row is 7.
Since we only have 3 widgets in the toolbox
area, this caused them to be scrunched
over to the left. This patch improves the
spacing to match the widget count.
2025-03-23 14:37:45 +00:00
Øyvind Kolås
aac8656039 meson, app: depend on GEGL 0.4.58 2025-03-23 15:33:25 +01:00
Bruno Lopes
d58e69119a build/windows: Alternative approach to broken PyGobject bundling (#13170)
Reverts: 093f31dc

My approach avoids bundling build-time deps (that increase about 100MB and
creates expectancy of support of some not-used things like 'Tcl/Tk').

However, this hardcoded approach of mine is more fragile.
2025-03-23 09:18:00 -03:00
Rodrigo Lledó
7cfb94b1d5 Update Spanish translation 2025-03-23 11:13:44 +00:00
Rodrigo Lledó
7a1add73ef Update Spanish translation 2025-03-23 11:05:50 +00:00
Alx Sa
aa773e618b themes: Plug system theme leak for menu hover
Some system themes add additional padding or borders
to menu items when hovered over, which causes
the menu to jitter or shake. This patch attempts
to mitigate the issue by defining those values in the
Default CSS theme.
2025-03-23 01:35:32 +00:00
Jehan
093f31dc40 Issue #13170: Python Plugins crashes and don't show up.
Per discussions in #13170, `.pyd` files are just renamed `.dll`. So
let's also look their DLL dependencies the same was as any other DLL.
2025-03-22 23:58:56 +00:00
Jacob Boerema
73341ebdbd plug-ins: fix gradient-flare crash in Selector editor.
In the Selector editor dialog, on the Glow tab, Changing the Size (%)
and then sliding it back to 0, causes a crash when reaching 0.
When the Size is 0, the pos in `calc_get_gradient` is NAN, which we
do no check for.
This could be issue #13282, but until we hear back and see a crashlog,
we can't be sure.

There might be other issues earlier on, but the whole plug-in could
probably use a revision since a lot of code is unchanged from 1999.
So let's just add a check for `isnan` and additionally change the
< 0 check to < 0.0001, since I saw it not catching very small values
near zero.
2025-03-22 22:44:27 +00:00
Jehan
a705e0fec3 .gitlab: update default templates.
Adding some excerpt from our Code of Conduct to be "Considerate and
Respectful". Negative emotions are only making things worse and make
some contributors not even want to interact anymore with some reports.

Also in our MR template, add the mention that we don't want anything
AI-generated in or even anywhere near our project.

Both these topics are things which were recently discussed within the
team (mostly on IRC).
2025-03-22 23:04:07 +01:00
Anders Jonsson
916f282d30 Update Swedish translation 2025-03-22 14:26:01 +00:00
Alx Sa
c997349eec libgimpwidgets: Add default response for GimpQueryBox dialogues
Resolves #13293
This patch fixes a regression from 2.10. The OK button
was not set to be the default response for certain
Selection dialogues like Shrink/Grow/Border, so
users could not just press Enter to apply if they were
fine with the default values. This patch adds a call to
gtk_dialog_set_default_response () to restore this
behavior.
2025-03-22 02:10:46 +00:00
Alx Sa
61d38cf9c1 themes: Improve separation between panels in dark theme
In collaboration with Denis Rangelov, the separator between
panes has been updated to use the same colors and thinner border
in all three theme variants.
Note that the border is created with box-shadow CSS, and is only
shown on one side of the horizontal separators to suggest that
it is a continuation of the bottom section.
2025-03-21 17:56:43 +00:00
Alx Sa
b1d1699f14 widgets: Use different color for Histogram borders
GimpHistogramView uses the widget's foreground color
to draw both the histogram and its border. This causes
clipped values to blend into the sides of the border,
preventing the user from seeing them.

This patch gets the luminance value of the foreground
color, then uses that as a threshold to lighten or
darken the border color for contrast.
2025-03-21 13:25:20 +00:00
Nathan Follens
25b423d094 Update Dutch translation 2025-03-21 12:53:09 +00:00
Alx Sa
484b9cfe62 themes: Keep headerbar color consistent when out of focus
On some system themes, the background color of
menu items on a merged headerbar would be a
different color from the rest of the menu when
GIMP's main window was out of focus.
This patch defines those items as clear so they become
whatever color the rest of the headerbar is instead.
2025-03-21 12:02:11 +00:00
Jehan
af754df863 desktop: add AppStream metadata to prepare for GIMP 3.0.2.
See #13266.
2025-03-20 23:52:35 +01:00
Wyatt Radkiewicz
b6691e5394 plug-ins/metadata: fix buffer overflow in date picker 2025-03-20 21:46:34 +00:00
Bruno
b6069baa04 build/windows: Make possible to unninstall user settings
Closes: #4544

This adds a dialog (after GIMP files unninstall) that prompts about
deleting GIMP config files only: %AppData%\GIMP\${GIMP_APP_VERSION}

Doing that at admin mode would be too convoluted so that feature is
exclusive of user-mode install (which is the default since: 08019d95)
2025-03-20 13:05:35 -03:00
Alx Sa
72964efb29 app/tools: Reorder Line Art Detection options
This patch moves the Stroke Threshold spin scale to
be on top, like similar tool option groupings such as
Dynamics Fade Options.
2025-03-20 14:25:59 +00:00
Luming Zh
b0d9fb80cd Update Chinese (China) translation 2025-03-20 10:50:24 +00:00
Ekaterine Papava
cfb30a4e94 Update Georgian translation 2025-03-20 03:11:04 +00:00
Jehan
187bb014d7 Issue #13138: crash when choosing a brush. 2025-03-20 02:41:33 +01:00
Bruno Lopes
d79122d5ef build/windows: Remove Windows XP SP3 string too!
Following 4de439d1
2025-03-19 20:27:11 -03:00
Bruno Lopes
0d327aa3eb build/windows: Add '[package]' to Installer gimp-release generation
Otherwise, the gimp-release file is invalid
2025-03-19 20:21:19 -03:00
Bruno Lopes
4de439d1b1 build/windows: Clean dead Installer strings 2025-03-19 20:05:34 -03:00
Yuri Chornoivan
c62323e6aa Update Ukrainian translation 2025-03-19 21:10:01 +00:00
Martin
3cd3fe93c8 Update Slovenian translation 2025-03-19 20:56:01 +00:00
Anders Jonsson
9b708c3f7f app: mark rendering intent strings for translation 2025-03-19 19:06:10 +00:00
Alx Sa
6af4c13139 python: Set error color based on theme
This patch changes the color of the error text in the
Python console based on the luminance of the
background-color (using GIMP_RGB_LUMINANCE
values).
2025-03-19 12:42:17 +00:00
Sveinn í Felli
02ec393b2c Update Icelandic translation 2025-03-18 12:02:26 +00:00
Yuri Chornoivan
fa068d08c9 Update Ukrainian translation 2025-03-18 06:13:48 +00:00
Jehan
36d8a63004 NEWS: move to NEWS.pre-3-0 and prepare for the new stable series. 2025-03-17 23:43:19 +01:00
Bruno Lopes
5efb09fb2c build/windows: Fix crazy rebase done by
2983c0ac
2025-03-17 19:34:57 -03:00
Bruno Lopes
2983c0ac61 build/windows: Fix MSIX script failure at .msixupload making
This was a regression introduced by b285cfd3
2025-03-17 19:22:51 -03:00
Bruno Lopes
bfad4aba8e build/windows: Add Stable MSIX Product ID
It wasn't needed for the first submission, but
the following automatic ones will need it.
2025-03-17 14:31:34 -03:00
Jehan
07e0345b5f meson.build: post-release version bump to 3.0.1. 2025-03-17 13:06:36 +01:00
Alexander Shopov
fb10438965 Update Bulgarian translation 2025-03-17 11:06:33 +00:00
Luming Zh
a0876355ff Update Chinese (China) translation 2025-03-17 10:57:18 +00:00
Luming Zh
8cecce1081 Update Chinese (China) translation 2025-03-17 10:34:11 +00:00
Martin
1282293b18 Update Slovenian translation 2025-03-17 01:09:59 +00:00
Jehan
9785099e5a Release GIMP 3.0.0. 2025-03-17 01:44:19 +01:00
Bruno Lopes
8cb3f0ff66 build/linux: Ensure that 'ld-linux' have .debug symbols
x86_64 have a peculiar path so this trick is needed.
2025-03-16 19:27:31 -03:00
Bruno Lopes
4e073a6788 build/linux: Do not bundle 'gdk-pixbuf-query-loaders' .debug symbol 2025-03-16 19:27:27 -03:00
Jehan
599f209238 desktop: update release date. 2025-03-16 23:06:32 +01:00
Jehan
60119602be desktop: fourth screenshot, by Liam! 2025-03-16 22:58:52 +01:00
Jehan
8ae4c9d066 NEWS: update. 2025-03-16 22:03:56 +01:00
Bruno Lopes
4c8c64aa46 build/linux: Remove leftover from previous try of .debug on AppImage
It is not needed because the .debug files are bundled.
2025-03-16 17:43:01 -03:00
Yuri Chornoivan
492e429881 Update Ukrainian translation 2025-03-16 20:20:41 +00:00
Bruno Lopes
958e82d5e9 build/linux: Bundle deps .debug symbols on AppImage with 'debuginfod' 2025-03-16 17:14:54 -03:00
Jehan
ba4dae9cd9 desktop: update the screenshots. 2025-03-16 20:32:04 +01:00
Jehan
8c077d50d1 plug-ins: revert the multi-threading code.
The whole multi-threading changes in the help plug-in seem to badly
break on macOS. See discussion in reopened #12898.
We decided to get rid of it for now and see later if we need to
reimplement this (after understanding what is going on).

Revert "plug-ins: fix #13049 Calling help on unknown help-id causes..."

This reverts commit 7d153bcc6d.

Revert "plug-ins/help: fix thread unnecessarily waiting when locale_parse failed"

This reverts commit fd0ccfa16c.

Revert "plug-ins/help: fix crash when locale is NULL"

This reverts commit 4075add5b4.

Revert "plug-ins: fix failing to access help from within GIMP"

This reverts commit 38f0527ebc.

Revert "plug-ins: add some better error handling when the docs XML request/parsing fails."

This reverts commit 543bb374a8.

Revert "plug-ins: try to load the gimp-help.xml file in a thread."

This reverts commit f2d47e910b.
2025-03-16 19:30:47 +01:00
Kolbjørn Stuestøl
34e35f3fd5 Update Norwegian Nynorsk translation 2025-03-16 17:09:44 +00:00
Øyvind Kolås
fc35864880 meson, app: depend on GEGL-0.4.56 2025-03-16 15:38:41 +01:00
Bruno Lopes
dc53786acd build/linux: Update README regarding versioning 2025-03-16 07:02:44 -03:00
Bruno Lopes
b0b4c513ff build/linux: Make gimp module a bit more alike the one on Beta manifest 2025-03-15 21:30:50 -03:00
Bruno Lopes
d4f51fdd77 build/linux: No need to set PYTHONHOME on AppImage
Closes: #13050
2025-03-15 20:45:11 -03:00
Bruno Lopes
ce33dab5f1 build/linux: Add error message to runtime version check 2025-03-15 17:13:15 -03:00
Bruno Lopes
5b3ffcb64e build/windows: Auto instruct MSIX maintainer about self-sign certificate
Partially reverts dd4b687d
2025-03-15 16:26:06 -03:00
Alx Sa
206273c6b5 core: Add version 23 to XCF switch statement
Resolves #13124
In 3f3b29ba we bumped XCF version to 23 due to
new blending spaces. However, we did not update
the version check switch statement to accept this
version. This patch adds a new case to handle version
23.
2025-03-15 18:23:07 +00:00
Alx Sa
a723fe27b3 plug-ins: Fix crash when exporting indexed ICNS images
Resolves #12880
Same problem as in 4cd3360d, just applied to exported ICNS icons instead.
2025-03-15 17:34:03 +00:00
Alx Sa
a034283cb0 plug-ins: Import/Export color profiles for PNG-based ICNS files
Resolves #12880
Since ICNS stores full PNGs for some icon types, it's
possible for them to have a color profile stored in
their iCCP chunk. This patch enables the existing
metadata option to save color profiles, then passes
that choice to the PNG procedure when exporting. Since the new widget affects the existing flowbox,
we also define a minimum height to prevent cutting
off the first row.

Loading is trickier since other software could
potentially combine PNGs with different color profiles
in the ICNS. GIMP does not yet support per-layer
profiles, so for now we'll follow the way the TIFF
importer does it and just attach the first color profile
we come across while loading.
2025-03-15 17:34:03 +00:00
Bruno Lopes
36e788abec build/windows: Make MINGW_PACKAGE_PREFIX detection more subtle 2025-03-15 14:04:10 -03:00
Alx Sa
133bd2d432 plug-ins: Fix crash when exporting indexed HTML tables
Resolves #13122
The HTML table code expects RGB or Grayscale pixels
when creating a "BGCOLOR" attribute in the table.
This patch defines the capabilities of the exporter
in GimpExportOptions and retrieves a suitable image
with gimp_export_options_get_image ().
2025-03-15 15:18:14 +00:00
Alx Sa
4cd3360d53 python: Fix crash when exporting indexed ORA images
Exporting ORA images involves first creating PNGs of
the layers. To do this, we create separate images for
each layer with Gimp.Image.new ().
However, if the original image was indexed, we lose
the palette when passing the temporary image to
the PDB call. This caused us to try saving a NULL
palette, which resulted in the crash.

This patch adds a check if the image is indexed, and
copies over the palette to the temporary image.
2025-03-15 02:36:20 +00:00
Bruno Lopes
a091b6b2d8 build/windows: Update MSIX README to mention Stable entry 2025-03-14 19:57:05 -03:00
Jehan
26caad3f3b NEWS: update. 2025-03-14 22:55:41 +01:00
Bruno Lopes
df9f812b59 build/linux: Fix comment style about Lua on AppImage script
Let's put links only about toolkit (go-appimage and appimagetool) issues
2025-03-14 18:04:48 -03:00
Jehan
c381390615 Issue #12636: _gimp_gp_param_def_to_param_spec throws WARNING on…
… a build of type "release".

Thanks to Lloyd Konneker for their original diagnosis of this issue!
2025-03-14 21:52:19 +01:00
Bruno Lopes
6adc6aa23f gitlab-ci: Add build-id to AppImage
This is needed to proper update check.
2025-03-14 16:01:09 -03:00
Jehan
5272618512 app: fix wrong offset of layer buffer with pass-through groups. 2025-03-14 18:53:57 +01:00
Jacob Boerema
3ee85e422b plug-ins: fix #13107 failure to read exported grayscale DDS image
When exporting a grayscale image with alpha channel as DDS while
choosing "default" format, we did not set the DDPF_LUMINANCE flag,
but instead used DDPF_RGB, on loading in the 3.0 branch this caused
a failure to read this format due to unrecognized combination of
settings.

First we make sure that on exporting to also set DDPF_LUMINANCE for
grayscale with alpha.
Second we also make sure to zero the blue and green mask fields,
since that is the expected value when these fields are not used.

To support this type of older exported DDS images, we add an extra
format definition for this unusual combination of DDS settings,
that way we recognize them when opening and are able to load them.
2025-03-14 12:23:42 -04:00
Alx Sa
4d8073a3a0 widgets: Prevent crash when converting to indexed image
Resolves #13092
GIMP crashed when converting an image to indexed mode,
if the user first changed the color in the Configure Grid
Dialogue. This was because signals were not being
properly disconnected from GimpColorMapSelection
after the dialogue was closed.

Jehan found the solution, to replace 
g_signal_connect_swapped () calls with
g_signal_connect_object () and flags set to
G_CONNECT_SWAPPED to retain the original
behavior. This ensures the signals are disconnected
after the widget is destroyed on dialogue close.
2025-03-14 15:18:48 +00:00
Bruno Lopes
e139e016a5 gitlab-ci: Install 'python3-gi-cairo' for full introspection
Closes #13105

Differently from MacPorts and MSYS2 packages, this isn't auto installed.
2025-03-13 21:11:21 -03:00
Jehan
bf144eba1b Issue #13057: partly rendered passthrough layer group inside passthrough layer group.
So the problem was that the duplicated image (as returned by
gimp_export_options_get_image()) was not fully rendered. I think it is
related to the computed size of pass-through group layers (whose borders
may show actually smaller than their actual render which is in fact
composited with below layers).

I am not perfectly happy with my solution as I'd have prefered fixing
the source issue, but it is good enough, just a few before GIMP 3.0
release.
2025-03-14 00:54:31 +01:00
Jehan
8bf314f47a app: use the mode node output on a pass-through group with no filter.
The call to gimp_drawable_merge_filters() on a group set a buffer to the
group layer (a bit like when we rasterize text layer) which was why it
worked fine. But when the group had no filter, we didn't have this side
effect.
So let's make sure we use the mode node output as our merged layer's
buffer in such case.

Also when the bottom layer (to merge) is a pass-through group, we don't
want to disconnect its input.
2025-03-14 00:54:31 +01:00
Alx Sa
40fe4fc62f plug-ins: Convert Print Preview for images with higher bit depth
Resolves #13104
print_preview_get_thumbnail () crashes when trying
to display thumbnails where the image's precision is
higher than 8 BPC. While the plan is to rewrite/replace
this plug-in, for now, we'll duplicate the drawable's
image and convert to 8BPC to prevent issues.
2025-03-13 23:22:51 +00:00
Alx Sa
f576531bec plug-ins: Fix palette being blacked out on indexed ICO export
Resolves #13099
For indexed ICO images, we get the palette from a
temporary image during export. Since the palette is
tied to the image, when we convert the temp image to
RGB and then delete it, the GimpPalette is lost and
the image is exported as pure black.

This patch resolves the issue by calling
gimp_palette_get_colors () to get the actual GeglColors,
then adding them to a new palette with
gimp_palette_new (). As this is separate from the
temporary image, it is retained after the call to
ico_image_get_reduced_buf ().
2025-03-13 03:25:26 +00:00
Jacob Boerema
acead5642e plug-ins, tests: add tests for more file formats...
using example files from the nomacs testset.
2025-03-12 21:51:19 +00:00
Alx Sa
731766e9bc vectors: Remove debug printout when Snap to Active Path on
Resolves #13096
In 5a43a464, some debug output was added to help
diagnosis a problem when Snap to Active Path was
turned on. The issue seemed mostly resolved in e57ad0f8,
but the print statements were left in. This leads to
slowdown when moving layers while Snap is enabled
(due to the continuous print statements).

As it's been 19 years since the original commit, it
should be fine to remove these debug statements
to boost performance.
2025-03-12 20:29:54 +00:00
Alx Sa
8fd1d229dc plug-ins: Fix reading/writing NULL clipping paths for PSD
Previously, we did not check if the clipping path name
was properly converted to ISO-8859-1 from UTF-8
before saving. g_convert can return NULL if it fails,
which means we wrote NULL (causing a crash on load).

To resolve, this patch adds a check if the clipping path
name is NULL on load, warns the user, and then
stops loading the clipping path resource.
On export, we fall back to ASCII instead if the conversion
to ISO-8859-1 fails.
2025-03-12 20:06:25 +00:00
Bruno Lopes
4497c906c1 build/linux: Fix AppImage crashing due to lack of Xapp gschemas
Closes: #13082
2025-03-12 13:24:32 -03:00
Jehan
f628b1715f Issue #13058: passthrough layer groups with filters don't merge correctly. 2025-03-11 17:18:42 +01:00
Jehan
388e346a5c app: further fix merging a pass-through group when opacity < 1.0.
Just using the output of the group is not enough since the pass-through
mode cannot be reused for the normal layer (and anyway all below layers
will have been removed). This still works out with a full-opacity
pass-through, but for lesser opacity, what we want is to replace with
not just the group's render, but in fact the render after the
compositing node.

As far as my tests go, we should now have exactly the same render before
and after merging a pass-through group, whatever the group opacity.
2025-03-11 17:18:42 +01:00
Alx Sa
7013fad34d core: Use selection when updating GimpBrushClipboard...
...and GimpPatternClipboard

Resolves #10046
After 1b64fdf5, gimp_get_clipboard_object () no longer
returns a merged version of the selected area.
This affected the Clipboard Brush, Clipboard Mask,
and Clipboard Pattern, causing them to always use the
entire image instead.

To restore the 2.10 behavior, we check if the pasted
image has a selection. If so, then we call 
gimp_selection_extract () to get the buffer of the
selected area. We also need to unreference this
buffer afterwards, so a boolean check is added once
the buffer has been copied over to the brush and
pattern.
2025-03-11 12:40:08 +00:00
Jehan
f3eb02b2f0 app: merging a pass-through group should merge all visible layers below it.
Existing logic to merge a pass-through group layer was wrong because it
was changing the global rendering of the image as though the group was
in fact in Normal mode.

Instead a pass-through group can be kinda considered as a Normal group
which would contain not only its children, but also all visible sister
layers below it. Therefore the new pass-through group merging will be
taking the real pass-through group render into the new layer (we don't
change the original group's mode before copying the render anymore), set
to Normal mode, then we remove not only the pass-through group but all
its big sister layers below it on same level.

Organizational-wise, it may seem unexpected because "merging" this group
leaks outside it (getting rid of not only the children but also the big
sisters and cousins). Nevertheless this is exactly how this group mode
works after all. So let's go full-in.

After discussing on IRC with Wormnest and NikcDC, we decided that it was
worth doing this specific merge the technically proper way, and we would
just educate people through the docs on why this group mode is very
particular this way.
After all, if someone absolutely wants the old-style merge, they can
always manually change the group to Normal mode first before merging.
But if they let to "Pass-Through", we should assume this is the render
they want.
2025-03-11 12:43:43 +01:00
Jehan
db8be0c28c app: fix order of context reset when exitting.
Some data in a GimpContext may have a reference to a GimpImage. In
particular there may be a GimpLineArt when the bucket fill tool is ON
when exiting GIMP.

In such a case, gimp_exit_idle_cleanup_stray_images() would see a
remaining GimpImage, would believe it's a stray image left by a plug-in,
output an INFO message and free it, which would in turn produce various
CRITICALs when actually finalizing the GimpContext.

Therefore we move gimp_contexts_exit() into gimp_exit(), and not when
disposing of the Gimp object (which happens too late).
2025-03-11 12:43:43 +01:00
Bruno Lopes
6484c7ed11 gitlab-ci: Fix failing git tag of babl and gegl 2025-03-10 14:42:50 -03:00
Bruno Lopes
412e33a638 build/windows: Fix 6fcf3c954b 2025-03-10 12:27:23 -03:00
Bruno Lopes
6fcf3c954b build/windows: Create nightly MSIX identity: "GIMP (Insider)"
This avoids crashes from non-release branches being sent to Partner Center.
2025-03-10 12:21:26 -03:00
Bruno Lopes
ca0afabbf9 gitlab-ci: Proper fix to 'connection reset by peer' error
142de1c4 was wrong
2025-03-10 10:16:43 -03:00
Bruno Lopes
142de1c41b gitlab-ci: Try to mitigate 'connection reset by peer' error 2025-03-10 09:09:34 -03:00
Øyvind Kolås
9f73ecaa6d meson, app: depend on babl-0.1.112 2025-03-10 12:59:12 +01:00
Nathan Follens
87ff181a3a Update Dutch translation 2025-03-10 11:56:42 +00:00
Jehan
b7b2516350 gimp-data: update to stable splash image. 2025-03-10 12:26:32 +01:00
Alx Sa
0806bc76ca plug-ins: Fix ZDI-CAN-25100 for FLI plug-in
Resolves #13073
This patch adds a check to make sure we're not
writing beyond the bounds of the "pos" array.
This is the same check that we do earlier when
writing pos[xc++], but it was left off of the last
write command. Since "n" will be 0 if we get to the
end of the array, it prevents us from writing beyond
that.
2025-03-10 04:07:44 +00:00
Alx Sa
121a997af5 app/tools:
Resolves #12967

In cdd51740, we added a destructive option
for filters. Since toggling this moves the filter
to the bottom of the stack, we refresh the
layer.
However, layer masks and channels can not
yet have filters applied non-destructively,
so this code created unnecessary undo history
items when commited. This patch adds a
check so that we only refresh layers and
layer groups for now. Once we have NDE
filters for layer masks/channels, we should
revisit this code.
2025-03-10 01:22:12 +00:00
Jehan
7aac6507ad AUTHORS: update generated file. 2025-03-10 00:29:43 +01:00
Jehan
dbe4aa0e37 README: update for release. 2025-03-10 00:26:44 +01:00
Jehan
9fc83f03c6 desktop: GIMP 3.0.0 AppStream <release> tag. 2025-03-10 00:20:37 +01:00
Idriss Fekir
5782643b5c GimpFontFactory: Fix exporting to pdf
Adding xml configs for bold/italic broke exporting to pdf (all fonts
were fallback) because fontconfig considered the xml malformed.
2025-03-09 23:05:07 +01:00
Idriss Fekir
2392709d06 GimpFontFactory: Use family+style as display when possible
Fullname might not be suitable for display (e.g. if contains family and
style with no whitespace between them), so when available,
use "family style" for display instead.
2025-03-09 23:05:07 +01:00
Idriss Fekir
06d2af7b35 GimpFontFactory: Fix display name of some fonts
Sometimes there is more than one name in the font file, the heuristic to
use the second name instead of the first assumed that the first name is
in english and the second is in the font's primary language, but that's
not the case.
e.g. on Windows "Times New Roman Italic" second name is "Times New Roman Cursiva".
2025-03-09 23:05:07 +01:00
Idriss Fekir
1609197792 GimpFontFactory:Fix bold/italic custom xml config
Previously buttons in the style editor meant just "faux" bold/italic,
which is different from the behaviour of 2.10, where real bold/italic
was used if available.

Unfortunately this might break in some cases if fontconfig doesn't return the correct face,
but at least it's consistent with 2.10.
2025-03-09 23:05:07 +01:00
Anders Jonsson
13e821bba5 Update Swedish translation 2025-03-09 19:21:10 +00:00
Alx Sa
975d1a4aa3 core, display: Enable resize for GUI layer copying
Resolves #12428 (for now)

As noted by Thomas Manni, GimpDrawable
does not initialize its push_resize_undo value
except via gimp_drawable_new ().
If the drawable is created in some other way,
it defaults to FALSE and does not save the
original size in history when resized or cropped.

Thomas proposed initializing it to TRUE in
the init () function. This is likely the correct
approach, but could cause some new bugs
right before the 3.0 release.

For now, this patch calls 
gimp_drawable_enable_resize_undo () for
GUI-specific operations (like opening as
layers or dragging and dropping layers) to
fix the regression for 3.0. Afterwards, we
can spend time confirming the init ()
approach and switch over to that.
2025-03-09 16:06:35 +00:00
Bruno Lopes
f63dfe8ec0 build/windows: Add stable GIMP identity to MSIX script 2025-03-08 10:04:43 -03:00
Bruno Lopes
2ad8aa8a56 build/linux: Update Flatpak modules preparing to 3.0 RC3
Ported from:

4006f0fcf5
8d6a68748b
fd3926baac
2025-03-08 08:04:44 -03:00
Jehan
96514d51a8 NEWS: update. 2025-03-08 02:06:42 +01:00
Jehan
691a3d2478 app: fix some memory usage bugs.
- One leak when returning early.
- One possible usage after free in a specific case.
2025-03-08 01:53:36 +01:00
Jacob Boerema
7d153bcc6d plug-ins: fix #13049 Calling help on unknown help-id causes...
progress on statusbar to not finish

When we returned early we did not call `_gimp_help_progress_finish`.
We fix this by adding those calls in relevant places.
2025-03-06 19:03:19 -05:00
Jacob Boerema
fd0ccfa16c plug-ins/help: fix thread unnecessarily waiting when locale_parse failed
If `gimp_help_locale_parse` failed due to a locale not having a
manual available, we always waited for a 10 seconds timeout because
we depended on the value of success to decide if we should exit
the thread.

When the call finishes we should always stop, so add a `done` parameter
and depend on that to decide if we can exit instead of using success.
2025-03-06 20:29:41 +00:00
Jacob Boerema
4075add5b4 plug-ins/help: fix crash when locale is NULL
Due to recent changes locale could become NULL when no manual for a
certain locale was found.
We fix this by always checking locale first.

While working at this, I realized that nowadays we don't need a second
loop when the specified help-id was not found. Even if a certain
help-id is not translated, an untranslated page is always available
when an English page is present.
So just reference the help_missing page for the locale we found instead
of doing another loop over the locales.
2025-03-06 20:29:41 +00:00
dimspingos
fb1ff560c8 Updated Greek translation 2025-03-06 17:54:41 +02:00
Alx Sa
49f0a1d408 plug-ins: Reduce JPEG dialogue height
Because of all the options, the JPEG export dialogue is too tall
on smaller displays or resolutions and goes off-screen.
This patch attempts to mitigate the problem by putting some options
in a two column layout.
2025-03-06 12:30:42 +00:00
Alx Sa
69e57b6dc3 actions: Ellipsize long file names in menu
To prevent long file names from stretching
the menu across the screen, we set a max
character limit and ellipsize them in the middle
in both the File and Windows submenus.
2025-03-06 00:09:03 +00:00
Jacob Boerema
68422e3c70 app: fix #12475 Eraser tip uses same tool as pen tip
This Windows specific error seems to be a reversal of previous issue
#2495 where we had to add an exception due to many issue of breaking
tablet support.

Now, many years later, it seems the reverse is happening, and people
are reporting not being able to separate between eraser and stylus,
and that there is no differentiation in different pointing devices.
Removing this old "hack" fixes this.

However, we don't know for certain if there are still other devices
where this will cause issues. Let's hope that all drivers for old
devices have been updated by now.
2025-03-05 23:11:49 +00:00
Bruno Lopes
d86d1f8d9e gitlab-ci: Make CI aware of jobs stuckness
According to my experience, Debian jobs never surpass 20min.
So, if they take more than that, they are likely stuck at:
- Deps job: when pulling Kaniko docker image
- Test job: when running some problematic plug-in test

Regarding Flatpak jobs, they can reach up to 40min at:
- Deps job: when building deps not present on GNOME runtime

Similarly, if Windows jobs surpass 60min, they are stuck at:
- Gimp job: when generating things from gimp-data or bundling
2025-03-05 20:03:48 -03:00
Bruno Lopes
b74c7d1b8a gitlab-ci, build/windows: Unify env collapsible section verbosity 2025-03-05 19:06:48 -03:00
Bruno Lopes
a988a3cbf6 gitlab-ci: Set CLICOLOR_FORCE inside Docker image
0f425554 should be enough, but Docker or Kaniko don't pass it.
2025-03-05 12:03:29 -03:00
Alx Sa
de41deb5c9 themes: System theme leak definitions
Defines the background color behind
GtkNotebook tabs, removes the background
image from GimpSpinScale progressbar,
and specifies the padding and border width
for toolbuttons to prevent offset issues when
hovered over.
2025-03-05 03:40:18 +00:00
Bruno Lopes
2f4c9adf1c gitlab-ci: Drop 'prepare' stage
Now, we create the Debian packages image and build babl and GEGL in the
same job. That's not only more consistent with other pipelines but also:

- First, we reduce queues to runners and the chances of they being busy
- Finally, we can cache more "layers" while in Kaniko container (this
  will be useful specially to crossbuilds, when they get fixed, and
  could be even more to flatpak too if its Docker image wasn't RO).
2025-03-04 18:49:31 -03:00
lloyd konneker
15be032786 ScriptFu: test: add tests
Add tests of named args.

Add more tests of file exporters.
2025-03-04 12:36:27 +00:00
lloyd konneker
7bec0168f5 ScriptFu: test: test load-thumbnail 2025-03-04 12:36:27 +00:00
Alx Sa
8c209f05a2 themes: Define GimpScaleEntry slider color
This patch prevents a system theme leak
for the "highlight" slider on GimpScaleEntry
widgets. Future work can be done to
improve the appearance of the slider.
2025-03-04 05:01:55 +00:00
Alx Sa
d2889d5a00 widgets: Prevent CRITICAL introduced in b7e9634d
When used outside of the dockable dialogues,
GimpEditor objects might not have a label
widget assigned. This patch adds a check
to make sure it does before trying to
change its text.
2025-03-04 00:21:02 +00:00
Jehan
4012f93e62 Issue #11251: Edit -> Clear (Undo) does not clear the effects which extend…
… outside the drawable's boundary.
2025-03-03 20:51:34 +01:00
Jehan
5d6e1ec889 app: also make sure that we run filters-changed when an operation's argument is updated.
While this was already working when updating a filter through the GUI,
we could see the weakness in the code when updating through the plug-in
API (there, we could again reproduce problematic not-updated bounding
box, similar to #12294).
2025-03-03 20:51:34 +01:00
Jacob Boerema
38f0527ebc plug-ins: fix failing to access help from within GIMP
Since commit 543bb374a8 when
`gimp_help_domain_lookup_locale` returned NULL, we returned with
an error condition.

However, when a user with locale en_CA, or sv_SE tries to access our
help, it should not return, but try again with en and sv respectively.

Instead of returning, only call `gimp_help_locale_map` when locale is
not NULL. Then after that we continue with second pass processing
which will handle the above cases.
2025-03-03 14:06:55 -05:00
Jehan
cd1aa23ede Issue #12294: drawable bounding box not recomputed when needed.
The bounding box of a drawable must be recomputed when the filters
changed. And a filter's "active" property change must trigger a
"filters-changed".
2025-03-03 18:31:21 +01:00
Bruno Lopes
c63419ee7f build/linux: Fix AppDir detection on AppImage script
It wasn't making possible to create one AppDir per arch locally.
2025-03-03 11:18:46 -03:00
Alx Sa
b7e9634de3 widgets: Restore GimpContainerEditor label
At some point, the code to show the label
for grids in dockable dialogues was removed.
(Possibly when GimpContainerGridView
was removed around 10e3a968).
This patch restores that code to
GimpContainerEditor to display the label
when selecting items in gridview in the
dockable dialogues.
2025-03-02 21:28:59 +00:00
Bruno Lopes
b72c289413 gitlab-ci: Do not trigger crossbuilds (again)
Similar to b3b466dcbc, our
builds are constantly red due to these quasi-msys2 bugs:

https://github.com/HolyBlackCat/quasi-msys2/issues/18
https://github.com/HolyBlackCat/quasi-msys2/issues/33
2025-03-02 18:11:02 -03:00
Jehan
71aff49750 Issue #11592: do not strength-reduce pass-through groups with filters.
While the pass-through group can be skipped in some specific conditions,
this won't work with filters (then the effect would only apply to the
one layer child instead of applying to the result of the child
blended/composited with the bottom layers).

This inconsistency was quite visible because people had to create 2
layers and have one as non-Normal mode for it to behave as actual
pass-through group.
2025-03-01 22:32:33 +01:00
Bruno Lopes
a1e5049f9f build/linux: Make AppImage deps download and revisioning work locally 2025-03-01 18:02:25 -03:00
Alx Sa
78d1e517d4 dialogs: Compress undos for multiple Open as Layer calls
Currently, if you open multiple files at once via the Open as Layers
dialog, it creates a new Undo History entry for each layer. As we
compress multiple layer operations elsewhere (such as deleting
or duplicating multiple layers), it makes sense to compress them
here as well.
2025-03-01 16:21:24 +00:00
Alx Sa
af96e64d9c plug-ins: Fix support for loading 12 and 16 bit JPEGs
12 bpc JPEGs currently load a blank image with a warning
that 12 bit precision is not supported.
libjpeg-turbo supports loading 8, 12, and 16 bpc JPEGs without
separate builds as of 3.0, so this patch adds support for loading
them and normalizing to 16 bit precision if needed.
Since we don't enforce a minimum libjpeg-turbo version, macros are
used to prevent this enhancement from being compiled if not supported.
2025-03-01 15:40:21 +00:00
Alx Sa
a74287c5cc libgimpwidgets: Shrink width of GimpSizeEntry
In 2baa518a, to avoid a critical we use
the resolution as the width of GimpScaleEntry
when the unit is set to pixels.
This had the side-effect of making the
width of the GimpSizeEntry very long when
the unit is initially set to pixels.
Since GimpUnit is now an object, the original
critical no longer displays. Therefore, we
partially revert 2baa518a and refer to the
value as entry_width instead for clarity.
The minimum width is set to 7 to match
the minimum width of GimpSpinButton.
2025-03-01 03:45:13 +00:00
Balázs Meskó
9e03e45f8f Update Hungarian translation 2025-02-28 19:41:58 +00:00
Balázs Úr
2e39e3dae1 Update Hungarian translation 2025-02-28 19:35:48 +00:00
Balázs Meskó
c1813e2d03 Update Hungarian translation 2025-02-28 19:24:47 +00:00
Balázs Meskó
5a8694d742 Update Hungarian translation 2025-02-28 19:16:45 +00:00
Balázs Meskó
ad0b5d128f Update Hungarian translation 2025-02-28 18:57:14 +00:00
Jehan
a7a390f82a Issue #12996: CRITICAL on the "keep the embedded working space" dialog. 2025-02-28 15:00:57 +01:00
Jehan
57a51994a3 app: use g_signal_connect_object().
Otherwise we may end up in cases when the handler is called while the
manager object is already freed.
2025-02-28 14:37:30 +01:00
Jehan
ee2a479f7d app: fix converting a layer to group layer by mistake when dnd between images.
This would happen when dragging several layers and one of them is a
group layer. Then any successive "normal" layers were converted to layer
groups.
2025-02-28 13:05:05 +01:00
Jehan
2bf25d8487 app: fix not-finding correct container when dnd across images. 2025-02-28 12:05:06 +01:00
Jehan
99b2ef9564 app: when dropping items containing groups and descendants, just consider the item group.
If you were to select a layer group and some/all its children, current
implementation was "flattening" all these at the same level, which is
weird.

Now the whole questioning of what to do in this situation is a very good
UX discussion to have, in particular when you only select *some* (not
all) of the children. Does it mean something? Does it mean you want to
copy part of the tree structure with only part of the children? What
when it's not a copy, but a move (e.g. a dnd in the same image). You
can't move part of the children (what do you do with the rest?).

Anyway that's many questions which I prefer to leave for a real gimp-ux
discussion and specification. For the time being, at least not
flattening a whole tree structure seems a better behavior.
2025-02-28 11:08:35 +01:00
Jehan
37f49e1a27 app: fixes uninitialized variable sometimes used.
Fixes:

> warning: variable 'n_children' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
2025-02-28 11:08:35 +01:00
Alx Sa
6279d7b70b core: Consider filters when selecting by color
When selecting by color with the Fuzzy Selection, Color Selection,
or Bucket Fill tool, we use gimp_pickable_get_buffer (). This only looks
at the raw pixels and not any active filters, which can result in some
unexpected selections (for example, an NDE offset filter will make it
appear as if you are selecting the wrong area).

There are plans to let users decide whether to select the raw
pixels or the filtered layer. For now, this sets the default action to
consider the layer as seen by the user, with filters included in the
calculation.
2025-02-28 01:06:41 +00:00
Jehan
414c0132e3 NEWS: update. 2025-02-27 18:59:59 +01:00
Jehan
09ebc2042a app: just needed to close that parenthese! 2025-02-27 18:18:54 +01:00
Jehan
b3acda1839 Issue #12950: undoing a deleted layer group loses filters. 2025-02-27 18:14:43 +01:00
Jehan
39d0925b86 plug-ins: in non-v3, return in fact (0) or (1), not just an integer.
Comparing with other functions returning boolean, this seems to be the
actual "standard" for these in Script-Fu v2.
2025-02-27 17:34:43 +01:00
Bruno Lopes
ada2bbeb57 gitlab-ci: Catch GIMP's 'meson-log.txt' artifact on AppImage builds
As we do in other GIMP jobs.
2025-02-27 08:37:01 -03:00
Anders Jonsson
8f6c6867c8 plug-ins: restrict GIH max dimensions to GIMP_PIXPIPE_MAXDIM
In 06bd1f1289 the max number of
dimensions was set to 1000, but the plug-in runs into a
segfault when dimension >4. The rest of the plug-in uses
GIMP_PIXPIPE_MAXDIM as max (4), so use it for the dimension argument
as well.
2025-02-27 03:13:25 +00:00
Jehan
d7cfc441e0 Issue #12948: make (gimp-pdb-procedure-exists) Script-Fu v3 compliant.
In particular, in v3, we want to return #t or #f, not an integer.
2025-02-26 22:31:28 +01:00
Jacob Boerema
f87ecbe0db plug-ins: add a reminder to the main plug-in tests configuration...
about adding any new ini files to meson.build,
since that is what I often keep forgetting.
2025-02-26 20:31:17 +00:00
Jacob Boerema
321e0a545f plug-ins, tests: add tests for loading xcf images 2025-02-26 20:31:17 +00:00
Jacob Boerema
eae1d5f9b6 app/xcf: fix #12980 protection against invalid xcf offset 2025-02-26 20:30:05 +00:00
Jehan
63e6065197 Issue #12948: only report progression for "extension-script-fu" scripts.
In particular, we want the new Script-Fu plug-in to be able to handle
their progress status themselves, which is possible with
(gimp-progress-set-text) except that it is far too quickly overriden
because each procedure call generates a new progress message.
2025-02-26 15:16:05 +01:00
Jehan
ad136c1ab9 plug-ins: more accurate error message when using named argument syntax for…
… internal procedures.

See #13003.
2025-02-26 14:12:25 +01:00
Jehan
61c1014ba6 app, pdb: (gimp-pdb-proc-exists) should only return TRUE for public procedures. 2025-02-26 14:12:25 +01:00
Alx Sa
7a72a30e3a themes: Define slider padding values in System theme
Resolves #12999
Ports the padding and margin definitions
for GimpSpinScale from 6a820e94 to the
System theme.
2025-02-26 02:09:09 +00:00
Jehan
1df9dc5751 Issue #12948: implement (gimp-pdb-procedure-exists) in Script-fu.
I hesitated to make (gimp-pdb-proc-exists) public but I don't think it's
a good idea as it would be redundant with gimp_pdb_procedure_exists() in
the C API.

Instead, just implement (gimp-pdb-procedure-exists) specifically for
Script-Fu, with a name mapped to the C function.
2025-02-25 23:04:00 +01:00
Jehan
6a5fe88e29 plug-ins: fix a forgotten debug test. 2025-02-25 22:40:43 +01:00
Jehan
711be6db8c app, libgimp, pdb: clean up some more code redundancy. 2025-02-25 20:17:05 +01:00
Jehan
1e869b9ce0 libgimp: cleanup and adding missing doc-comment.
The comment about temporary API was added in commit 244b52bf0d for
functions long gone.
2025-02-25 20:01:29 +01:00
Jehan
269463389e app, pdb: internal procedures are simply ones with type GIMP_PDB_PROC_TYPE_INTERNAL.
Adding an is_internal value was a mistake, or rather it was redundant.
We already had a procedure type and all internal procedure are set as
GIMP_PDB_PROC_TYPE_INTERNAL.

I also double-checked that it is not possible for a plug-in to create a
procedure with this type (it is rejected), so it's very fine.
2025-02-25 20:01:29 +01:00
Jehan
ad0b02d2b7 app, libgimp, pdb, plug-ins: rename gimp_procedure_is_core() to…
… gimp_procedure_is_internal().

I realized we were already naming these "internal procedures" in the
Procedure Browser and this is in fact a better naming than "core
procedure".
2025-02-25 20:01:29 +01:00
Sveinn í Felli
d774ba8d1a Update Icelandic translation 2025-02-25 16:25:29 +00:00
Jehan
77d296f95b app: some code cleanup.
This was not a bug, but having the same name for 2 variables (with an
inner-scope variable hiding the outer-scope one) is confusing.
2025-02-25 00:56:11 +01:00
Jehan
58a7fd09cb Issue #12304: make sure the GMenuModel triggers appropriate updates when a label changes.
This was working fine in our custom menu widget, but not with menus
generated by GTK (GIMP_GTK_MENUBAR codepath).
2025-02-25 00:53:19 +01:00
Jehan
8c0e979808 app: fix a crash in GIMP_GTK_MENUBAR codepath.
When closing the last image, it seems that we'd remove twice the
"windows-display-0001" item, first when making the action invisible,
then when gimp_ui_manager_remove_ui() is called on emptying the display.

And gtk_menu_tracker_remove_items() doesn't handle correctly a NULL
list.
2025-02-25 00:53:19 +01:00
Jehan
0d98500984 Issue #12789: make sure gimp-debug-tool is correctly found on Windows. 2025-02-24 18:37:58 +01:00
Jehan
c3bc4e5336 Issue #12904: make debugging self with gdb optional with -Ddebug-self-in-build.
Some people reported cases where gdb doesn't even seem to understand
Python scripts (the error in #12904 implies it is looking for standard
gdb commands, because apparently -x option allows both styles).
Others had issues in sandbox building (#12956).

I don't really want to spend too much time understanding each case,
especially as it's a self-debugging tool, not absolutely necessary for a
successful compilation.

So let's just make this optional, and default to "false".
2025-02-24 18:13:09 +01:00
Bruno
0ec94aef5b build/windows: Fix auto repair of unreleased official and unofficial langs
b450bf92 was enough only to official langs present on Inno releases.
2025-02-24 10:37:10 -03:00
Andi Chandler
4aac3c8362 Update British English translation 2025-02-24 12:22:52 +00:00
Bruce Cowan
c4ff1b47eb Update British English translation 2025-02-24 12:20:51 +00:00
Bruce Cowan
c597d016d7 Update British English translation 2025-02-24 12:20:41 +00:00
Bruce Cowan
ac81284376 Update British English translation 2025-02-24 12:17:10 +00:00
Bruno
b285cfd310 build/windows: Extend local compatibility layer to .NET and msstore-cli download
The original code from 9eec33ba was wrong because it was not downloading at
CI_PROJECT_DIR. Now, it does, and only downloads on parent dir if locally.

Also, fix .NET Runtime download URL.
2025-02-23 16:37:57 -03:00
Bruno
f1c51c1169 build/windows: Prevent calling Store-MSIX script from wrong CWD
Similar to 333499265d,
since we need 'AppxManifest.xml' and 'data_associations.list'.

Also, fix build_dir code when script is called from 'installer' or
'store' dir.
2025-02-23 15:53:59 -03:00
Bruno
333499265d build/windows: Prevent calling Installer script from wrong CWD
Since we need 'iso_639_custom.xml' from source, let's ensure it can be found.
2025-02-23 14:24:28 -03:00
Bruno
f69dd75a17 build/windows: Move all Installer versioning code to Inno .iss script
Now, we don't need to set a lot of params when calling 'issc' anymore.
The version vars will be taken from Meson, being more future-proof.

This is not 100% future-proof, however, because we unfortunately can not
take 'config.h' vars directly due to Meson limitations:
https://github.com/mesonbuild/meson/issues/14260
2025-02-23 13:32:16 -03:00
Bruno
13d2751446 build/windows: Update .isl patching situation regarding PowerShell capabilities 2025-02-23 08:15:01 -03:00
Lukas Oberhuber
9042486dac plugin, macos: Fix #12711, #12898
This fix does not cause the problems that the alternative fix caused (as detailed in #12898).
2025-02-22 17:32:51 +00:00
lloyd konneker
ff5e3fdab6 libgimpbase and core: fix #12711 plugin hang on MacOS
This a bandaid for an issue on MacOS:
an IO event is received that says a read pipe from a plugin has data,
but the pipe is actually empty and reads hang, and hang the app.

Possibly this is an issue with GLib and could be fixed there,
to not send such a spurious IO event.

Possibly an alternative fix is to determine whether the app side of the
plugin protocol is in a state where no messages from the plugin
are expected.  In that case, the read pipe should be flushed
i.e. data discarded, with non-blocking reads, until a read returns nothing.
2025-02-22 17:32:51 +00:00
Lukas Oberhuber
3a9dbbd4b0 Revert "app/plug-in: fix #12711 app hang on MacOS IO event on empty pipe"
This reverts commit 4b71ca6e44.

Breaks on MacOS, see #12711.
2025-02-22 17:32:51 +00:00
Jehan
70843915d3 NEWS: update. 2025-02-22 13:52:20 +01:00
Jordi Mas
9b59e54457 Fixes to Catalan translation 2025-02-22 11:18:58 +01:00
Alx Sa
ca6ea27c3e python: Update suggestion for GimpCoreObjectArray parameters
Resolves #12973
Since the standard 'drawables' argument for procedures
is now a GimpCoreObjectArray, the suggested syntax for
setting it in a Python call was incorrect. This impacts other
parameters as well, so we add a check for the argument type
being Gimp.ParamCoreObjectArray and then provide the
correct Python code to set them.
2025-02-22 03:45:55 +00:00
Jehan
6076c4d4a6 Issue #12825: generate a help ID for any operation with "gimp:menu-path" key.
This is an alternative implementation for issue #12825, replacing commit
424ef17bac, after further discussion with Jacob.

Basically we don't need a new key "gimp:help-id" anymore. Instead, for
every action we add through a "gimp:menu-path" key AND when its name is
prefixed with "gegl:", we generate a help ID from the operation name.

The first few operations in such case already have a help page for them,
with corresponding help ID, in gimp-help repository.

In the future, we may expand this help ID generation rule to any
core operation (i.e. any operation prefixed with "gegl:") but for the
time being, we only do for the ones with a menu path, otherwise we'd
have too many missing pages.

Also fix again gimp_gegl_procedure_get_help_id() so that it searches a
help ID within all existing operations in the "filters" group, as I
realized that this was still broken in some cases.
2025-02-21 22:53:37 +01:00
Jehan
29ba885985 app: fix help ID of hardcoded filters.
Help ID of filters with an explicit help ID got broken with commit
8c0fdb9cf0 (which was fixing help ID for filters added to menus with a
GEGL key).
2025-02-21 21:41:16 +01:00
Jehan
b146b6255e Issue #12751: get rid of the direct exit() call in stable builds.
I pondered a lot about this one. In particular I wished we saw the leaks
earlier so that this change were in a RC (really unsure we'll have any
more RCs now).

On the one hand, I could tweak signal callbacks so that the callback
gui_exit_after_callback() is called before the fast exit(). But it feels
more and more like a hack over a hack.

Having 2 code paths depending on whether we are in a release or not is
ugly and would only hide bugs during the whole development cycle (as
proven here). Now when I read the comment, the part about speeding up
the quit process doesn't seem like it makes much sense these days (maybe
back then when this was implemented?). GIMP is fast to quit with or
without this.
Now the part where I worry is the problem of plug-in possibly still
running. Does it mean there used to be cases where GIMP would be stuck
at exit because of buggy plug-ins? I don't think I ever saw one of these
during the whole unstable cycle, and pretty sure we have code able to
kill plug-ins when needed. Even if not, by now, my preference would be
that, if ever someone were to report a similar case, we should just
improve our exiting code to kill (SIGKILL, without any chance of
avoiding it) any guitly plug-in.

This is why I finally decided to just get rid of this very old code.
For reference, the last time it was added was commit cdc2f0ded6 in
2004, though we can actually find older commits where it was removed
(921f00c13d), added (1db2ada311)… Looks like it used to be quite a
dance, but this is hopefully not needed anymore.
2025-02-21 21:15:48 +01:00
Jehan
614fdfcd70 app: fix a CRITICAL when cutting when there is a floating layer.
Fixes:

> app/gimp-3.0: Gimp-Core-CRITICAL: gimp_image_remove_layer: assertion 'gimp_item_is_attached (GIMP_ITEM (layer))' failed
2025-02-21 18:45:28 +01:00
Jehan
a435bc98e7 Issue #12851: crashed with seg fault using gimp-edit-cut. 2025-02-21 18:33:56 +01:00
Jehan
543bb374a8 plug-ins: add some better error handling when the docs XML request/parsing fails.
In particular, we don't want to return/store a bogus GimpHelpLocale for
which the parsing actually failed.
2025-02-21 18:33:56 +01:00
Bruno
b36787894f gitlab-ci, build/windows: Take simplier approach on ccache drop
The result is the same but more pleasant to see.
2025-02-20 21:31:06 -03:00
Bruno
cbfd1152ad build/windows: Prettify MSYSTEM_PREFIX condition 2025-02-20 21:30:20 -03:00
Jordi Mas
ca70bce088 Update Catalan translation 2025-02-20 21:48:41 +01:00
Jehan
8c0fdb9cf0 Issue #12825: implement a get_help_id() for GimpGeglProcedure.
This fixes the second part of #12825, which is that the help ID was even
wronger when editing a filter.
2025-02-20 20:21:56 +01:00
Jehan
424ef17bac Issue #12825: new custom GEGL key "gimp:help-id". 2025-02-20 20:21:56 +01:00
Jehan
f2d47e910b plug-ins: try to load the gimp-help.xml file in a thread.
I had a case where the GIO API ended just stuck and never returning.
This API is made to work in a thread so that you can cancel loading URIs
from the main thread. Let's make use of that.
2025-02-20 20:21:56 +01:00
Bruno
87a22a7401 gitlab-ci: Re-order Universal and Windows vars respecting build-time and runtime 2025-02-20 16:12:26 -03:00
Bruno
67827f8597 gitlab-ci: Fix 'apt' warnings on crossbuilds by seting TERM and DEBIAN_FRONTEND
Seems that Debian Testing 'apt' defaults to 'dialog' mode by default, which
produces warnings since the Docker image don't come with 'noninteractive' set.

These warnings are inoffensive but they pollute the job output. Indeed,
they were making some GIMPers a bit worried on IRC.

---

Also, added a comment about why we always use Debian Testing for crossbuilds.
2025-02-20 11:52:15 -03:00
Bruno
d27828c00f build/windows: Improve MSYSTEM_PREFIX AND MINGW_PACKAGE_PREFIX detection 2025-02-20 09:11:57 -03:00
Bruno
693f95a25c build/windows: Detect local MSYS_ROOT with PowerShell wizardry
This is useful only for local runs. There is no registry key on runners.
2025-02-20 09:11:53 -03:00
Bruno
128b0b81cc gitlab-ci: Organize Windows variables puting GIMP_PREFIX on the front
That's how we do in the other platforms.
2025-02-20 09:11:49 -03:00
Bruno
9e8f1b3a38 gitlab-ci, build/windows: Organize MSYS variables naming
Let's call 'C:\msys64' $MSYS_ROOT as vcpkg guys do (since
it is not a prefix, the real MSYS prefix is $MSYS_ROOT/usr)
and call the various shells by MSYSTEM_PREFIX.
2025-02-20 09:11:46 -03:00
Alx Sa
127cd67118 plug-ins: Fix crash when loading CMYK JPEG 2000 images
When converting a CMYK JPEG 2000 image to RGB, we freed
the Key array. Since it is still in use, this caused the
plug-in to crash. This patch replaces this with lowering
the component content and letting the OpenJPEG clean up
process handle this work instead.
2025-02-19 19:00:57 +00:00
Alx Sa
535d0183be core: Data security improvements per Wormnest 2025-02-19 16:47:54 +00:00
Alx Sa
3a01b90c2d core: Add support for uncompressed 16 bit ABR brushes
Some ABR brush files have 16 bit grayscale masks, which fail to load.
This patch adds support for uncompressed versions of these brushes,
based on a provided sample file.
2025-02-19 16:47:54 +00:00
Jordi Mas
421186ecee Update Catalan translation 2025-02-19 07:30:37 +01:00
Jehan
4a1dee4651 plug-ins: improve the progress notification for Script-Fu.
First of all, let's init with the main procedure label (stripped of
leading/traling spaces, of mnemonic underscore and of ellipsis) as
progress status for gimp_progress_init().

Then reuse this main label for all subsequent progress updates by the
same top procedure.

Finally "pulse" the progress at each update to make it more like
progression actually happens.

This is a first experiment to see if not having progress API in
Script-Fu is fine (#12948), by having better progression defaults.
2025-02-18 21:09:22 +01:00
Jehan
9d7bfb4669 Issue #12940: GimpProcedure base class should default to GIMP_PROCEDURE_SENSITIVE_ALWAYS.
Note that I don't touch the GimpFileProcedure and children because they
are special-cased anyway. As for GimpBatchProcedure, ALWAYS is a good
default too.
2025-02-18 16:50:37 +01:00
Bruno
7a2537de9a build/linux : Fix unwanted character in AppImage revisioning
Completing 57e91450
2025-02-17 21:03:58 -03:00
Jehan
9ef88f3c88 app: re-add "gegl:hstack" to blacklist.
This was removed by commit 38b18de709 because this operation doesn't
exist anymore and was replaced years ago. Even though it was not wrong,
let's be over-cautious rather than not enough. What if someone had still
a binary of this old operation lying around?

This doesn't cost much to keep it in the list, so let's just do it (with
a comment to still document it doesn't even exist anymore).
2025-02-17 22:33:38 +01:00
Jehan
f7b0a82cf3 NEWS: update. 2025-02-17 22:28:16 +01:00
Jehan
5861be8d2b plug-ins: support GimpUnit type in Script-Fu.
Since the move of GimpUnit from some weird int/enum mixed type into a
proper object type, this was not usable anymore in Script-Fu.

Functions like (gimp-text-layer-new) were therefore broken. It now works
again.
2025-02-17 22:21:24 +01:00
Jehan
4f44ef6ed1 app, pdb: add parameter validation for (gimp-text-layer-new).
Even though the libgimp wrapper has annotations, it is still possible to
pass a NULL font through, in Script-Fu for instance by not passing all
arguments (and very likely in a plug-in by calling the PDB procedure
directly rather). And unfortunately this would crash GIMP when it tries
to work on the NULL font.

Let's do some sanity check!
2025-02-17 22:21:24 +01:00
Bruno
57e914507d build/linux: Complete AppImage revisioning code
It was first introduced in 131834d3 but was incomplete.
2025-02-17 16:01:23 -03:00
Marco Ciampa
62bd4b30cb Update Italian translation 2025-02-17 16:33:41 +00:00
Bruno
79568e3094 build/windows: Patch only the needed Inno lang files
The previous code was inconditionally patching all the lang files, even
the ones which we don't use. Let's fix that using the "langs*" arrays.
2025-02-17 12:32:31 -03:00
Bruno
27a01b5ca8 build/windows: Supress noisy .gitignore creation on MSIX script 2025-02-17 10:10:24 -03:00
Bruno
5e287e8bbe meson, build: Auto parse full 'config.h' for future-proof scripts
Now, we can use whatever variable we want from 'config.h' with its
value, unlike the previous code which was hardcoded and did not
worked at all for variables with custom values like GIMP_RC_VERSION.

(Note: there are still work to do with Inno scripts)
2025-02-17 09:51:19 -03:00
Danial Behzadi
322002e389 Update Persian translation 2025-02-17 10:10:40 +00:00
Bruno
1473a52704 build/windows: Do revisioning stuff with Inno scripting
Also, fixes CUSTOM_GIMP_VERSION format.
2025-02-16 18:58:11 -03:00
Anders Jonsson
0fa421d874 po: update POTFILES.in 2025-02-16 18:33:33 +01:00
Bruno
fd3fcf68a5 build/linux: Fix 'undefined symbol: gtk_module_display_init' error on AppImage
It was caused by GTK finding host's canberra or others modules, which
is goappimage fault: https://github.com/probonopd/go-appimage/issues/332

This bug will remain if the distro have some uncommon module (e.g.
appmenu, colorreload), since we don't ship them.
2025-02-16 10:49:58 -03:00
Jordi Mas
10e6642786 Update Catalan translation 2025-02-16 07:07:08 +01:00
Jordi Mas
626af9990f Update Catalan translation 2025-02-15 21:57:36 +01:00
Bruno
29209fa219 Issue #12937: Bundle 'gio-launch-desktop' to fix AppImage unable to open links
Closes #12937
2025-02-15 16:57:43 -03:00
Kolbjørn Stuestøl
f6fb61f5fe Update Norwegian Nynorsk translation 2025-02-15 17:39:38 +00:00
Jehan
61f380789e libgimp: all blurbs to GimpProcedure arguments are nullable.
Without this, we cannot set NULL (or equivalent, such as None in Python
3) when calling these functions in bindings.
2025-02-15 17:42:52 +01:00
Jehan
1a794ad77c app, pdb: gimp_text_layer_set_font_size() allows the pixel unit. 2025-02-15 17:42:52 +01:00
Alx Sa
c548ca5dfd core: Display image previews in original format
In 9e8499bb, we forced image and drawable
previews to be 8 bit integer for compatibility.
However, this affects image previews when
in higher precisions, leading to banding
and other conversion issues.
Since the color space invasion, the original
problem should have less of an impact
as GIMP now handles conversions between
profiles much better. Therefore, we will
just grab the existing format for Grayscale
and RGB images, rather than forcing a
precision change to 8 bit.
2025-02-15 15:01:43 +00:00
Bruno
f1f529ce5d build/windows: Fix .gitignore patching done by MSIX script
4b15d3d6 showed that the script was imperfect in that point
2025-02-15 11:44:49 -03:00
Jacob Boerema
e589b8a3da app: blacklist json:dropshadow and json:grey2 gegl ops
As discussed on IRC these ops mostly duplicate other gegl ops and
have some shortcomings: range and gui-range, among other things,
are currently not supported. This causes some issues changing values
of parameters in GIMP, see e.g.
https://gitlab.gnome.org/GNOME/gegl/-/issues/403

Since they bring nothing new, and have issues, we will blacklist them
from the GEGL tools interface in GIMP, at least until they have
better support in GEGL.
2025-02-14 16:13:36 -05:00
Emin Tufan Çetin
173ece82a8 Update Turkish translation 2025-02-14 19:45:14 +00:00
Emin Tufan Çetin
2f850dd9e3 Update Turkish translation 2025-02-14 19:39:22 +00:00
Emin Tufan Çetin
cd220944b3 Update Turkish translation 2025-02-14 19:13:29 +00:00
Jehan
e74759184c app, libgimp: change the default sensitivity mask.
After discussing with NikcDC and Wormnest on IRC, we agreed that maybe a
default of being sensitive when one or more drawables are selected seems
better, since the run() signature now has an array of drawables. So most
plug-in developers will consider the case when there are several
selected drawables as an obvious possible case.

And if someone really doesn't want to handle this case, they can always
set the sensitivity mask explicitly.
2025-02-14 20:08:43 +01:00
Jehan
059e9344a1 app: fix plug-in procedure sensitivity with no image types set.
In particular, when setting a sensitivity mask but no image types, the
procedure was always sensitive.
Also make gimp_plug_in_procedure_get_sensitive() more robust.
2025-02-14 19:52:39 +01:00
Jehan
c4c3a2f25d libgimp: improve annotations. 2025-02-14 19:52:39 +01:00
Jehan
2c3e56a6aa libgimp: fixing annotation formatting.
This is markup format where the asterisk has some special meaning.
2025-02-14 19:52:39 +01:00
Jehan
f1c1a869a9 gimp-data: bump to latest commit. 2025-02-14 19:52:39 +01:00
Jehan
7e7281b888 libgimp: add a links to gimp_main() docs from GIMP_MAIN(). 2025-02-14 19:52:39 +01:00
Alx Sa
0b7123ed2b xcf: Use filter's own mask when loading from XCF
Resolves #12854
Previously when loading filters, we used gimp_drawable_filter_apply ().
If there was also an active selection, it affected the recreation of the filter
and distorted the display.
This patch switches to using gimp_drawable_filter_apply_with_mask () so
that the filter's mask is always used instead, no matter if there is an active
selection or not.
2025-02-14 17:45:05 +00:00
Jacob Boerema
38b18de709 app: add gegl:pack to blacklist (replacement of gegl:hstack)
gegl:pack replaced gegl:hstack almost 5 years ago, but the blacklist
for not showing it in our list of ops in Gegl tool was never updated.

Since Pack is also causing issues in GIMP, see #12890 and #12902,
let's update the blacklist add it there and remove the old gegl:hstack
that has been removed from GEGL.
2025-02-14 11:32:21 -05:00
Bruno
4b15d3d667 .gitignore: Delete last unused exception
Following e653535e

The meson-generated 'compile_commands.json' file added by 793c9588 shows an
assumption that we are building in-source, and assumptions are not welcome in
this general file, according to Jehan comment: !1021 (comment 1801018)
2025-02-14 09:40:44 -03:00
Emin Tufan Çetin
55b05ec32e Update Turkish translation 2025-02-14 12:12:13 +00:00
Bruno
332b07f414 build/windows: Add a bit of verbosity to .appxsym and .msixupload creation 2025-02-14 06:23:16 -03:00
Sabri Ünal
d2b80f7c3e Update Turkish translation 2025-02-14 06:06:53 +00:00
Alx Sa
8d53675d9f libgimp: Convert floating selection to layer on export
On export, when GIMP_EXPORT_CAN_HANDLE_LAYERS is not set
but GIMP_EXPORT_NEEDS_ALPHA is, we merge all layers in the image.
If there's a floating selection however, its attached layer is not included
in the exported image.

This patch converts the floating selection to a regular layer so that both
are included in the final export.
2025-02-14 00:56:22 +00:00
Bruno
3d6a27570f build/windows: Try to fix quasi-msys2 deps download failing like crossroad
Ported from 81db76ea
2025-02-13 19:39:11 -03:00
Bruno
f5088b8915 build/linux: Support 'updateinformation' on AppImage
This makes possible to easily update the .appimage file with
tools compliant with AppImage spec (e.g.: AppImageUpdate)
2025-02-13 16:48:10 -03:00
Bruno
74a05bc967 gitlab-ci: Do not build GEGL workshop for AppImage while we are stable 2025-02-13 14:44:37 -03:00
Bruno
131834d34f build: Get rid of "CI_COMMIT_TAG" in favor of GIMP_* vars from config.h
This makes the scripts more consistent and easier to understand.
2025-02-13 09:24:57 -03:00
Bruno
0c1d11dc86 build: Unify checksumming behavior
As a rule, dist scripts will always output sha-256 and sha-512 sums but
the checksums files will be generated only on releases.
2025-02-13 09:24:19 -03:00
Alx Sa
095727b074 widgets: Prevent rearranging floating selection as filter
While we blocked rearranging a floating selection in the NDE GUI,
we did not add a check to prevent another filter from being moved
into it. Since a floating selection is considered a GimpLayer, applying
GimpDrawableFilter operations to it caused a crash. This patch adds
more safeguards to prevent this.
2025-02-12 19:03:12 +00:00
Jiri Grönroos
0b4eb271d1 Update Finnish translation 2025-02-12 18:20:07 +00:00
Jiri Grönroos
75a3bde06f Update Finnish translation 2025-02-12 17:46:40 +00:00
Rūdolfs Mazurs
395ef3c8cb Update Latvian translation 2025-02-11 19:43:57 +00:00
Kolbjørn Stuestøl
3253d88b8d Update Norwegian Nynorsk translation 2025-02-10 22:04:17 +00:00
Kolbjørn Stuestøl
e43d547755 Update Norwegian Nynorsk translation 2025-02-10 21:59:50 +00:00
Jeremy Bícha
4c63f41517 extensions: remove executable permission from vala file 2025-02-09 21:21:24 -05:00
Jehan
ed243e3829 meson.build: post-release version bump to 3.0.0-RC3+git. 2025-02-10 00:47:18 +01:00
Bruno
c69f050d2c build/windows: Document maintenance of GITLAB_CI's client secret 2025-02-09 18:37:56 -03:00
Bruno
180ec6ad4b Revert "build/windows: Try to diagnose Submission API failure"
This reverts commit 490c8e7dc4.

Actually, I forgot to add 'GITLAB_CI' as an authorized MS Entra app on
Partner Center. So, I just done that and submission from our CI worked.
2025-02-09 18:22:25 -03:00
Bruno
490c8e7dc4 build/windows: Try to diagnose Submission API failure 2025-02-09 17:15:35 -03:00
Jehan
9130eb8152 Release GIMP 3.0.0 RC3. 2025-02-09 19:52:36 +01:00
Jehan
3970300e9e NEWS: update. 2025-02-09 19:52:36 +01:00
Bruno
e496a1ce4f build/linux: Complete 827961ca (regarding CI_COMMIT_TAG check on AppImage) 2025-02-09 15:48:29 -03:00
Jehan
bffe766fc3 Issue #12883: fix incompatible pointer type.
The GimpLayer is a GimpDrawable. Cast it properly for strict compilers.
2025-02-09 19:41:56 +01:00
Jehan
b01ecf80e6 app, libgimp, pdb: allow NULL input drawable to the new crop procedures.
Cropping relatively to the full image contents is a common usage (it is
in fact the "Crop to Content" feature we have in the Image menu) so I
found it a bit frustrating that these 2 functions only allow to crop
relatively to a single drawable.

Therefore, I make NULL an acceptable input which will default to
cropping to the full image content instead.
2025-02-09 19:24:41 +01:00
Jehan
d7b6647647 app, pdb: fix implementation of gimp_image_autocrop_selected_layers()…
… taking into account drawable's offsets.
2025-02-09 18:50:19 +01:00
Jehan
3c21b768c5 app, libgimp, pdb: improve docs and names of autocrop functions.
- Clean up a bit the 2 procedures' descriptions and add more info in
  gimp_image_autocrop() description to explain how the input drawable is
  used.
- Rename gimp_image_autocrop_layer() to gimp_image_autocrop_selected_layers(),
  which makes it clearer.
2025-02-09 18:23:42 +01:00
lloyd konneker
9e2d8e4e16 API: fix #12860 autocrop is internal, not a compatibility plugin
Rename plug_in_compat.pdb to image_autocrop.pdb so we retain commit history.

All procedures defined there are related to autocrop.
   - made internal, not plugins
   - renamed from plug-in- to gimp-image-
   - exposed in libgimp

If we need plugin compatibility PDB group in the future,
a starting template can be recovered from plug_in_compat.pdb 2.10 or late 2.99.

Fixed plugins that call.  The C plugin now calls libgimp instead of a PDB procedure.
2025-02-09 16:51:13 +00:00
Jehan
d5f730d589 desktop: set release date for 3.0.0 RC3. 2025-02-09 17:25:54 +01:00
Jehan
3540cb73c1 gimp-data: fix downgraded gimp-data hash by mistake. 2025-02-09 17:24:29 +01:00
Jehan
0e8bbd6463 NEWS: update. 2025-02-09 17:24:04 +01:00
Bruno
827961cae3 build/linux: Generate checksums for released AppImages
This is used by our release scripts on gimp-web.

Let's not generate for other pipelines, however, since they
don't have long life on GitLab and there is no permalinks yet.
2025-02-09 11:41:47 -03:00
Øyvind Kolås
b32ce25526 meson,app: depend on GEGL-0.4.54 2025-02-09 14:36:06 +01:00
Jehan
a6d269d94f Issue #12875: fix WARNING about gegl:nop not having width and height properties. 2025-02-09 13:25:10 +01:00
Bruno
ca3880b205 build/windows: Add GitLab collapsible section to MSIX submitting
I forgot about it in 9eec33ba
2025-02-09 08:35:36 -03:00
Alx Sa
e58527b8bb plug-ins: Fix bug with pre-OSX ICNS with no masks
The 'ICON' type of ICNS is a 1 bit black and
white image without a mask. The current
code assumes all pre-OSX ICNS types
have a mask, which caused a crash when
we tried to access it. This patch adds an
additional check if the mask type is 0
before trying to access it.
2025-02-09 04:17:15 +00:00
Bruno
9eec33ba13 gitlab-ci, build: Auto send .msixupload to MS Store using Submisison API
Closes #11397

Now, the .msixupload submission will be done from our CI with 'msstore-cli'.

Unfortunately, we can't easily update the changelog due to problems of
Submission API regarding '\b' and '\u0008' backspaces, but it's better to
not have a changelog than to keep using the painfully slow Partner Center.
2025-02-08 22:41:42 -03:00
Jehan
95d47b9390 NEWS: update. 2025-02-09 02:36:47 +01:00
Jehan
ac0a722bf6 Issue #12569: clip issue with new filter API.
It was not a bug per-say. Simply the filters were set as having "clip"
set by default. We should add a libgimp function to let people choose
instead, but I want to think a bit better how we handle clip and masks
in filters before creating more API. Cf. #12874.

So for now, let's just set clip to FALSE. If we have to choose a single
possible clip value for filters made by the libgimp API, I believe this
is the nicer value.
2025-02-09 02:07:08 +01:00
Jacob Boerema
9a2709213d script-fu: use named parameters
Since named parameters were added for script-fu, we get a warning if
we don't use named parameters.
This adds named parameters to GIMP's own scripts.
Incidentally it also fixes an issue with Spinning globe when the
image was not the first one opened in GIMP and changes that script to
the new interface too.
2025-02-09 00:47:29 +00:00
Alx Sa
0b301f2fd0 plug-ins: Support loading ARGB ICNS icons 2025-02-09 00:38:43 +00:00
Jehan
18719a5e90 app: finally fix the crop bug with several filters.
This is a new attempt at fixing the issue with cropped effects when
stacking them. The previous attempt was reverted as commit c1c38228a2.

Instead of trying to find the bounding box for the previous effect's
output, just drop the crop_before node (i.e. make it a "gegl:nop") when
it's not the bottom effect.

I don't think this would create any undesirable behavior. In fact, the
only case which I could think of would be when the previous filter
creates an infinite plane (e.g. "gegl:color"). But when such case
happens, filter_clip is forced to TRUE anyway, which triggers crop_after
to be set. Therefore we don't need a crop_before anyway in this case,
because the previous filter necessarily has a crop_after.
2025-02-09 00:58:42 +01:00
Jehan
f69e98d44f gimp-data: update to latest. 2025-02-09 00:14:33 +01:00
Jehan
3ae90906d9 app: in image graph, only demote data back to storage format after a filter when…
… this filter is meant to be merged.

In commit 2c066afff9, I made so that we had a "gegl:convert-format" only
at the latest filter over a drawable. While this was already a huge
improvement, it was still "too much".

Basically the only time when we want to convert to drawable format
(which means usually demote the output to lower bit depth) is when the
filter was just created and is meant to be merged.

This also means that from now on, during preview time, when checking and
unchecking the "Merge filter" checkbox, the preview may be slightly
different. A very good test to see the difference more obviously would
be with indexed images, because "Merge filter" preview would map to
allowed colors only.
2025-02-09 00:08:54 +01:00
Bruno
57169f32df gitlab-ci: Fix non-triggered AppImage releases 2025-02-08 16:13:10 -03:00
Bruno
85a14735c8 build/windows: 'libiff' is not a direct babl, GEGL or GIMP dependency
Despite what f947109f implies, 'file-iff' plug-in don't link to libiff.
2025-02-08 10:35:33 -03:00
Bruno
6c879b8cb8 build/linux: Only 'Nimbus' and 'StandardSymbols' fonts are needed for WMF
Following e1294fec

This makes the AppImage's WMF bundling consistent with Windows and macOS.
See also: https://github.com/caolanm/libwmf/tree/master/fonts
2025-02-08 09:36:25 -03:00
Alx Sa
2e41fde7b1 plug-ins: Use older ICNS format to export small icons
It has been reported that ipc4, ipc5, and ipc6 type ICNS icons do not render well
when included in an app as part of a bundle.
This patch uses the older is32, il32, and ih32 24-bit RGB formats (with 8 bit masks)
instead of the newer PNG formats for those sized icons, to avoid the issue.
2025-02-08 05:29:46 +00:00
Bruno
5b84d17ec1 gitlab-ci, build/linux: Make AppImage releases
Closes: #7661 (for now)
2025-02-07 15:29:15 -03:00
Alan Mortensen
c62bf0ff69 Update Danish translation 2025-02-07 18:22:07 +00:00
Anders Jonsson
56f05c85d9 app: don't expand file dialog
Fixes #10612
2025-02-07 16:56:07 +00:00
lloyd konneker
cdf7a58dd1 libgimp: GimpFileChooser: fix #12847 inf loop in signal handler 2025-02-07 07:23:42 -05:00
Jacob Boerema
5ea45737e5 app: add separate help ids for View -> Color Management
The help ids for the View Color management commands all pointed to
the same id.
Let's use more specific ids, so that help will arrive at a more
specific location in the manual (once we have added the ids there too).
2025-02-06 15:50:45 -05:00
Jacob Boerema
c31ca5cd4c app: better help ids for soft-proofing related Image commands
The help ids for the Image Color management related to soft-proofing
were all pointing to the View color management submenu.
Let's use more specific ids for the Image menu, so that help will
arrive at a better location in the manual (once we have added the
ids there too).
2025-02-06 11:45:34 -05:00
Bruno
e1294fecc1 build/linux: Bundle PS fonts for WMF support on AppImage 2025-02-06 10:41:44 -03:00
Marco Ciampa
f384280962 Update Italian translation 2025-02-05 19:43:45 +00:00
Marco Ciampa
df12f06a9e Update Italian translation 2025-02-05 19:43:32 +00:00
lloyd konneker
3ee7ca9d56 ScriptFu: delete extra copies of init.scm
Cleanup cruft, unused files.

script-fu/scripts/init/init.scm
is the only copy that GIMP uses.
It is more or less upstream TinyScheme init.scm v1.42,
that K. Cozens occasionally patches with upstream changes.
But upstream has been at 1.42 for several years.

/scripts/script-fu.init is an unused copy of upstream TinyScheme init.scm v1.40
It should have been deleted on the earlier commit
that moved the file in the repo to /scripts/init/init.scm
and the installed init files to /scripts/scriptfu-init.

/tinyscheme/init.scm is an unused copy of upstream TinySche init.scm 1.41
Deleting it means that the tinyscheme dir can no longer be built by itself
into TinyScheme standalone binary, but we don't support that anyway.
2025-02-05 18:49:40 +00:00
Jacob Boerema
af5fc77a24 script-fu: fix crash when incorrectly using named parameters
The array of strings representing the Scheme types wasn't updated
after adding named parameters. This caused a crash when trying to
use named parameters where that isn't possible.
2025-02-05 13:33:46 -05:00
Alx Sa
bcbdf970a6 widgets: Don't check for operation when merging filters
Resolves #12855
Since tool-based filters like Warp Tool do not have operations,
checking them when merging down the active filter stack throws
a CRITICAL. The check was not needed, so it was removed.
2025-02-05 12:58:43 +00:00
lloyd konneker
dd59ee088c ScriptFu: test: add tests of gimp-file- methods and image exporters
Tests API not tested previously.

Tests ScriptFu, and more generally, that GIMP can roundtrip read the files it creates.
2025-02-05 06:58:39 -05:00
Sabri Ünal
ccb4d81ea2 Update Turkish translation 2025-02-04 17:30:49 +00:00
Sabri Ünal
efe839447b Update Turkish translation 2025-02-04 17:28:11 +00:00
Kolbjørn Stuestøl
419ed163ab Update Norwegian Nynorsk translation 2025-02-03 20:58:28 +00:00
Kolbjørn Stuestøl
9353e5f1c4 Update Norwegian Nynorsk translation 2025-02-03 20:54:40 +00:00
lloyd konneker
eaa703b8c8 ScriptFu: test: restore to working condition
After recent changes to API:
  some PDB procs now private
  some PDB procs signature changed, arguments reordered

New testing framework functions: testing:layer-new and testing:layer-new-inserted

No changes except to tests.
2025-02-03 09:19:50 -05:00
Jose Riha
dd1653e0ff Update Slovak translation 2025-02-02 18:39:28 +00:00
Lloyd Konneker
4b71ca6e44 app/plug-in: fix #12711 app hang on MacOS IO event on empty pipe
This is a bandaid for a situation on MacOS.

When plugin facade in core receives IO event on read pipe from
remote plugin process, check the plugin is in a state where
an IO event is expected i.e. sane.
Otherwise, ignore the event and assume the read pipe is empty.
2025-02-02 17:37:17 +00:00
Anders Jonsson
fee4b3f8bb script-fu: fix limit in bump-map calls
Clothify calls gegl:bump-map which has lower limit 0.5 for
elevation, so use the same limit in the plug-in.
2025-02-02 11:59:51 +01:00
Anders Jonsson
f715b54015 script-fu: fix modulo error in Waves plug-in
Resolves #12844

As suggested by Alx Sa, rounding the phase argument in waves-anim
is enough to fix the argument error the plug-in would run into when
using certain values for "Number of frames".
2025-02-01 22:31:41 +01:00
Nathan Follens
dd8da1e26f Update Dutch translation 2025-02-01 15:20:21 +00:00
Nathan Follens
c293704aad Update Dutch translation 2025-02-01 15:20:08 +00:00
Nathan Follens
e004841f01 Update Dutch translation 2025-02-01 15:19:55 +00:00
Nathan Follens
33c7325712 Update Dutch translation 2025-02-01 15:19:43 +00:00
Nathan Follens
eb08ca2f38 Update Dutch translation 2025-02-01 15:15:00 +00:00
Alan Mortensen
ecf33b8113 Update Danish translation 2025-02-01 14:59:51 +00:00
Alx Sa
dccc473eb4 script-fu: Update plug-in call to use vectors
Resolves #12842.
Due to API changes, the call to plug-in-animationoptimize in burn-in.scm
requires a vector to be sent rather than an individual layer. This affected the
script when "Prepare for GIF" was selected.
Therefore, the blended-layer argument was converted to a vector.
2025-02-01 14:30:39 +00:00
Alx Sa
7d363d125f python: Use context Palette/Gradient in GUI
Interactive scripts should use the context
palette or gradient rather than the saved
one, as the user is more likely wanting to
edit the gradient or palette they have
actively selected. This is also in line with
how 2.10 operated.
This patch clears out the palette or
gradient property of Python scripts
when the GUI is created, so that it
uses the context version. It does not
affect non-interactive usage.
2025-02-01 02:59:51 +00:00
Alx Sa
553aacbb19 actions: Add timestamp to default performance log filename
ISO 8601 basic format was used for standardization. Windows
does not support colons in filenames, so the more human-readable
extended format could not be used.
2025-01-31 03:46:41 +00:00
Hugo Carvalho
70a065eada Update Portuguese translation 2025-01-31 01:01:55 +00:00
Alx Sa
ebc4a245e4 python: Fix Autoslice in Sort Palette after Color Space Invasion
Resolves #12827.
The Autoslice option was not updated to expect GeglColors instead of GimpRGB
arrays after the Color Space invasion. This patch updates the find_index() and
hexcolor() functions accordingly.
2025-01-30 01:52:26 +00:00
Nathan Follens
f8cc2ff416 Update Dutch translation 2025-01-29 23:37:18 +00:00
Nathan Follens
e154267462 Update Dutch translation 2025-01-29 23:36:59 +00:00
Anders Jonsson
255e942087 python, libgimp: rename gimp_palette_entry_[gs]et_*()
Followup to 151cb9c40c
to make the palette offset and sort scripts work again.
2025-01-29 21:02:22 +01:00
Daniel Novomeský
29c9747222 plug-ins: simplify JXL export options
CMYK is saved with lossless compression. Lossy CMYK is
not recommended by libjxl developers.

libjxl API allows possibility to use lossy compression in original
profile but the compression in this combination of settings
is ineffective, with visible artifacts and discouraged
by libjxl developers. We removed this option.
2025-01-29 14:43:33 +00:00
Alx Sa
1bbf9518de themes: Explicitly define spinbutton and combobox hover colors
Resolves #12821.
GimpSpinButtons (CSS spinbutton class) did not inherit the hover colors of
other buttons, so they did not highlight when hovered over. While comboboxes
mostly did inherit, there were a few odd instances where they were not in the
same hierarchy as other elements with hover colors defined. This patch defines
both explicitly to prevent one-off issues.
2025-01-29 14:40:13 +00:00
Hugo Carvalho
5d241d39e0 Update Portuguese translation 2025-01-28 22:09:03 +00:00
Hugo Carvalho
3ae4db9e71 Update Portuguese translation 2025-01-28 22:06:05 +00:00
Hugo Carvalho
5b791691f5 Update Portuguese translation 2025-01-28 22:03:09 +00:00
Hugo Carvalho
b197cc08f2 Update Portuguese translation 2025-01-28 22:00:14 +00:00
Hugo Carvalho
7c9d1ac6e5 Update Portuguese translation 2025-01-28 21:54:55 +00:00
James Addison
f1ee6bf1ab .gitlab: omit Container Registry note in Merge Request template 2025-01-28 10:15:09 +00:00
Jordi Mas
b504ed47ac Update Catalan translation 2025-01-28 11:03:41 +01:00
Jehan
ccdb73d804 README: update. 2025-01-27 22:12:28 +01:00
Jehan
50a248d54e INSTALL, meson: update a bit installation docs. 2025-01-27 22:10:35 +01:00
Alan Mortensen
1b34a13535 Update Danish translation 2025-01-27 18:09:30 +00:00
Jehan
68947df3f1 desktop: AppStream update. 2025-01-27 17:50:39 +01:00
Jehan
1980dcd0bc NEWS: update. 2025-01-27 17:45:45 +01:00
Jehan
679220d8f5 Issue #12568: support GIMP's GEGL operations with a custom config argument…
… in new filter API.
2025-01-27 16:34:11 +01:00
lloyd konneker
79b200335c ScriptFu: interpreter: fix #12810
Interpreter should not override GimpPlugin.set_i18n,
so that translations are found in the interpreted plugin's directory.
2025-01-27 11:45:26 +00:00
Alx Sa
952da49058 widgets: Commit GEGL-based tools before merging
In the initial NDE implementation, we
prevented merging filters if the Warp, Cage,
or Gradient Tool were active to prevent
active tool-based filters from crashing
when cleared.

This patch removes this limitation by
automatically committing the tool before
merging the rest of the filter stack.
This applies the tool-based filter correctly
and then merges the rest of the filter
stack as normal.
2025-01-27 05:42:41 +00:00
Alx Sa
af4bf60477 core, tools, widget: Lock filters when editing
When editing a filter, the NDE UI is set to
insensitive so they can't be deleted.
However, closing and reopening the
popover re-enables the options.

This patch adds a new "temporary" boolean
to GimpDrawableFilter. It is only set to
TRUE if the filter is a temporary "editing"
filter. When we reopen the NDE UI, this
checks if the filter stack contains a
temporary filter, and if so, once again locks
the options.
2025-01-27 05:15:12 +00:00
Jehan
a353618d53 libgimp: make sure alignment and margin are same for all argument labels.
While fixing individual widget's labels to have proper default is good,
let's also have a centralized re-setting of alignment and margins for
all the labels which we set in the same GtkSizeGroup. This makes nice
and consistent dialogs.

Additionally I set a 4px margin at the end of label (0 elsewhere),
otherwise the longer label in the size group end up sticking too close
to its control widget and it's ugly.
2025-01-26 21:29:21 +01:00
Jehan
dd15b6a9a3 libgimpwidgets: GimpFileChooser should also be start-aligned. 2025-01-26 21:17:33 +01:00
Jehan
995329ac25 Issue #11261: unify argument widget alignment. 2025-01-26 21:10:29 +01:00
Bruno
4464537a38 build/linux: Do not distribute 'gegl-imgcmp' on Flatpak nightly
Similarly to 188deedb
2025-01-26 16:22:52 -03:00
Bruno
f61b98dd98 build/linux: Complete c45a4eed (regarding cfitsio update) 2025-01-26 14:46:12 -03:00
Bruno
188deedb98 build/windows: Bundle only 'gegl', not 'gegl-imgcmp'
'gegl-imgcmp' seems to be used only for ninja tests.
2025-01-26 14:37:33 -03:00
Jehan
10808f2830 libgimp, plug-ins: create automatically a GimpFileChooser for GimpParamSpecFile arguments.
This new widget is much nicer, with proper label to document the GUI and
also with support to save files or create folders. It also has mnemonic
support and the label is put into the same size group as other so that
it's nicely aligned.

As a consequence, I remove bad support of object arguments with a GFile
value. People should just create proper GimpParamSpecFile arguments
(also GimpProcedure API now has a function only for such type of file
argument).

I also remove gimp_procedure_dialog_get_file_chooser() which was only
useful when we didn't know what action a file argument was for. Now it's
part of the param spec definition.

libscriptfu was updated too because SF-DIRNAME arguments don't need
special casing anymore.

Finally I change gradients-save-as-css to just make use of the new
automatic widget creation (more than 60 lines of plug-in code replaced
by… 0 lines because it's automatic!).

This whole commit is mostly a lot of code removal now that we have
proper automatization for file arguments! \o/
2025-01-26 18:13:55 +01:00
Jehan
db2d3cffa2 libgimpwidgets: new GimpFileChooser widget.
This widget will replace our usage of GtkFileChooserButton, except that
it has a title label and also it contains GUI implementation for the
SAVE and CREATE_FOLDER actions (unlike the GTK button). Moreover this
widget was removed in GTK4. So it is a good idea to start encapsulating
such GTK widget anyway.

I'm also adding a propwidget function to create such a widget bound to a
GimpParamSpecFile property.

New functions:

- gimp_file_chooser_get_action
- gimp_file_chooser_get_file
- gimp_file_chooser_get_label
- gimp_file_chooser_get_label_widget
- gimp_file_chooser_get_title
- gimp_file_chooser_get_type
- gimp_file_chooser_new
- gimp_file_chooser_set_action
- gimp_file_chooser_set_file
- gimp_file_chooser_set_label
- gimp_file_chooser_set_title
- gimp_prop_file_chooser_new
2025-01-26 18:13:55 +01:00
Jehan
ed0d528bdc libgimpbase: add gimp_param_spec_file_set_action().
Ability to change a file param spec action will be useful in the next
commit.
2025-01-26 18:13:55 +01:00
Bruno
ec4fee282a build/windows: Check for 'sudo' mode when MSIX script is run targeting WACK
https://github.com/microsoft/sudo/issues/108
2025-01-26 11:36:51 -03:00
Bruno
94938affe6 gitlab-ci: Fix custom Windows pipelines being interrupted
This was a regression introduced by 3da281c4
2025-01-25 22:21:53 -03:00
Bruno
c45a4eed48 build/linux: Update cfitsio module to 4.5.0 preparing to RC3 2025-01-25 22:13:06 -03:00
Bruno
1c00380f56 build/linux: Workaround go-appimagetool failing to find 'file' util 2025-01-25 22:03:34 -03:00
Bruno
8e6e3546a2 gitlab-ci: Do not download 'deps-debian-x64' artifact on plugin tests
babl and gegl binaries are already present on 'gimp-debian-x64' artifact
2025-01-25 22:02:35 -03:00
Bruno
4065d92972 build/windows: Fix wrong prefix of exiv2 and gexiv2 headers 2025-01-25 19:06:45 -03:00
Bruno
7b11fe8dba build: Include all headers for use of gimptool 2025-01-25 19:03:55 -03:00
Bruno
c0cd664fdd gitlab-ci: 'libtool' is not a direct GIMP dependency 2025-01-25 18:57:46 -03:00
Alx Sa
0097d34a8f libgimpwidgets, plug-in: Reduce height of Load PDF dialog
This patch does the following to reduce the
height of the Load PDF GUI:
* Hides the title label if the PDF does not
have a title.
* Reduce the padding around elements
* Reduces the requested height of the
GimpPageSelector widget.
* Alter the GimpPageSelector widget so
that the layer/image combobox and the
range entry are on the same line.
2025-01-25 17:27:55 +00:00
Jehan
fa16da8ef0 NEWS: update. 2025-01-25 16:49:03 +01:00
Jehan
094414186b libgimp: also hide structs for GimpParamSpec(Display|Drawable|Image|Item).
New libgimp functions:

- gimp_param_spec_display_none_allowed()
- gimp_param_spec_drawable_filter_none_allowed()
- gimp_param_spec_image_none_allowed()
- gimp_param_spec_item_none_allowed()

I believe that now all param spec strucs which needed to be hidden are
effectively hidden!
2025-01-25 16:42:26 +01:00
Bruno
ae6ab8bc57 gitlab-ci: Move global variables to '.default' hidden job
This makes easier to understand and maintain the default job settings.
2025-01-25 11:01:34 -03:00
Bruno
0fbfc16da2 gitlab-ci: Organize Debian x64 and AppImage sections 2025-01-25 10:22:38 -03:00
Bruno
6a57853f7c gitlab-ci: Remove redundant 'needs'
Now, by default, jobs do not depend on any job and
will only depend when expressely configured to.
This reduces some some few lines of redundancy.
2025-01-25 09:44:19 -03:00
Alexander Shopov
edbbb60ea3 Update Bulgarian translation 2025-01-25 11:02:13 +00:00
Jehan
b1acb256e1 libgimp*, plug-ins: now hide GimpParamSpecChoice struct.
New libgimpbase functions:

- gimp_param_spec_choice_get_choice
- gimp_param_spec_choice_get_default

Now the only GParamSpec in libgimpbase whose struct is visible is
GimpParamSpecObject. This can't change since it is derived into param
specs defined in libgimp and therefore needs to be visible.
2025-01-25 01:28:19 +01:00
Jehan
080b09bb96 libgimp*: GimpParamSpecValueArray struct also hidden away!
New libgimpbase function: gimp_param_spec_value_array_get_element_spec()
2025-01-25 01:28:19 +01:00
Jehan
f09d97b9a5 app, libgimp*: GimpParamSpecCoreObjectArray struct hidden too.
New libgimpbase function: gimp_param_spec_core_object_array_get_object_type()
2025-01-25 01:28:19 +01:00
Bruno
b51f2b5252 gitlab-ci, build: Give up of build caching (ccache)
Actually it does more harm than good on CI, causing inconsistency and work.

The plan was to use it in all jobs but it is simply impossible for Flatpak
(https://gitlab.gnome.org/Infrastructure/Infrastructure/-/issues/1502)
and seems that for Crossbuilds too (tested both crossroad and quasi-msys2).
Actually, only Windows jobs can use it, but started to fail on x86 runners.

On the other hand, sometimes the build is faster without ccache and we do
not have the burden of contacting managers etc. Just pkg caching is fine.
2025-01-24 21:04:35 -03:00
Jehan
6e777c861b app, app, libgimp*: hide struct for several GParamSpec based off GimpParamSpecObject.
As a consequence, here are needed new functions:

* libgimp:
  - gimp_param_spec_resource_defaults_to_context()
  - gimp_param_spec_resource_none_allowed()

* libgimpbase:
  - gimp_param_spec_file_get_action()
  - gimp_param_spec_file_none_allowed()
  - gimp_param_spec_unit_percent_allowed()
  - gimp_param_spec_unit_pixel_allowed()
2025-01-24 23:44:43 +01:00
Jehan
40aa78ac10 libgimp: add support for GimpParamSpecUnit to gimp_procedure_dialog_get_widget(). 2025-01-24 22:09:40 +01:00
Jehan
23c9503bfa app, libgimp, libgimpbase: use GimpParamSpecObject infrastructure for…
… GimpParamSpecUnit's default value.

When I reparented GimpParamSpecUnit to GimpParamSpecObject in commit
ba3da3d338, I clearly forgot to get rid of the redundant default value.
2025-01-24 22:06:56 +01:00
Jehan
af53dfab75 Issue #12722: force-query when system language change was not working with LANGUAGE.
It was working with LC_ALL or LANG but not with LANGUAGE which is an
additional system above the locale system AFAIU.
Concatenating both LANGUAGE environment variable and the locale-set
language, we get a more resilient opaque string value to compare.
2025-01-24 20:54:44 +01:00
Alx Sa
4ceec875c9 script-fu: Fix parameter typo in chrome-it.scm
Resolved by @Nizhile
In 4bdb8792, a patch porting chrome-it.scm to not rely on
removed brushes included an apparent typo. A decimal
was left off a curve point, resulting in incorrect outcomes.
This patch by @Nizhile fixes the problem.
2025-01-24 13:26:51 +00:00
Alx Sa
eb8076526d python: Update Spyro-Plus after GEGL Color update
Resolves #12795
After the Color Space Invasion, gimp_gradient_get_uniform_samples ()
returns an array of GeglColors rather than GimpRGB values and a status
variable. This patch fixes the Spyro-Plus plug-in to expects the new
return values.
It also restores code that utilized the second color gradient in the output
when the Gradient's Repeat Mode is Triangular Wave. This appears to
have been lost during the port from GIMP 2.10.
2025-01-24 02:51:34 +00:00
Jehan
bb2181b194 NEWS: update. 2025-01-23 23:53:28 +01:00
Jehan
6cc7d90744 libgimpbase: add a values_cmp() implementation for GimpParamSpecFile.
Without a proper way to compare GFile, gimp_config_reset_properties()
does not reset the config argument to default. This breaks the "Reset to
Factory Defaults" feature in particular.
2025-01-23 23:36:34 +01:00
Jehan
cb9227a6a1 libgimp: do not call gimp_procedure_dialog_get_file_chooser() from within…
… gimp_procedure_dialog_get_widget().
2025-01-23 23:36:34 +01:00
Jehan
3115d97248 libgimpwidgets: fix crashing prop file chooser button with GFile arg.
This same widget is used for GFile args and GimpParamSpecConfigPath
specs. The latter are string-based. So we need different code to handle
both types of arguments.

This was crashing when a change was coming from the config object,
rather than from the GUI, such as when doing a reset to factory values.
2025-01-23 23:36:34 +01:00
Nathan Follens
f4f68c686f Update Dutch translation 2025-01-23 20:06:51 +00:00
Nathan Follens
2e2c672544 Update Dutch translation 2025-01-23 20:00:54 +00:00
Bruno
a2cb96c250 build/windows: Comment situation of some versioning code on Installer .ps1 2025-01-23 16:53:20 -03:00
Jehan
042d3051c6 app, libgimpbase: do not try to open a non existing file.
Now that GimpParamSpecFile makes file validation depending on the action
set in the param spec, when trying to open a non-existing file (which
can happen through GUI, for instance when opening through the Document
History dockable or Open Recent menu), we had a quite obscure error
about a value "out of range" used "for argument 'file' (#2, type
GFile)", which is because core tried to set the GFile for a non-existing
file into the second parameter of the plug-in PDB. This is not a very
nice error for end-users.

The old error was much nicer as it used to say things like:

> Could not open '/path/not/existing.png' for reading: No such file or directory

But in fact, this string came from the plug-in, which means:

* first that the error can be different depending on the format
  (inconsistency of error message);
* depending on bugs in plug-ins, it may just crash or return no error
  messages;
* finally we were making a useless call to a load plug-in while we
  should already know from core that it won't work.

The new message is something like:

> Error when getting information for file "/path/not/existing.png: No such file or directory

This error is generated by core, so it will always be consistently the
same, is understandable too and the plug-in won't even be called.

As a side related fix, I updated the GimpParamSpecFile validation to
only validate local files, just like we do in core. Remote files can
always be set (and we let plug-ins handle them), at least for the time
being.
2025-01-23 20:04:54 +01:00
Bruno
f9203916c0 gitlab-ci: Workaround lack of common 'x86_64' runner tag
This way, we can use OSUL and Canonical runners on some Debian jobs.
2025-01-23 13:49:16 -03:00
Alan Mortensen
7f3741957e Update Danish translation 2025-01-23 16:26:55 +00:00
Alan Mortensen
7ad02976c4 Update Danish translation 2025-01-23 16:24:21 +00:00
Bruno
38277a1fee gitlab-ci: More g-ir-doc remnants removal (not at dist job)
Following 55d0745b

This one was a bit more hard to catch since
the devel-docs dir is heavily disorganized.
2025-01-23 09:34:18 -03:00
Bruno
55d0745bc0 gitlab-ci: Fix broken Debian jobs after removal of g-ir-doc option
26a079bd lacked a bit of CTRL + F
2025-01-23 09:18:31 -03:00
Bruno
c57b10aff4 gitlab-ci: Do not install yelp-tools since we got rid of g-ir-doc in 26a079bd 2025-01-23 09:15:08 -03:00
Jehan
26a079bd57 devel-docs: get rid of g-ir-doc.
Per the (quite off-topic) discussion in #12772, the fact it's quite
broken on Windows, apparently not too maintained anymore and its syntax
clashes with gi-docgen syntax…
2025-01-23 13:07:03 +01:00
Bruno
9821d91745 app: Make possible to 'gimp-debug-tool' work relocatable
Following 50b6ba63

This is specially useful for AppImage and Snap
2025-01-23 08:53:13 -03:00
Jehan
d25c97e7c9 libgimp, libgimpbase: fix passing a file spec action through the wire.
I forgot to set meta.m_file.action into the GPParamDef! 🤦

As a side update, let's store the action as gint32 in GPParamDefFile. I
realized that otherwise, depending on the actual size of an enum type,
when casting to a (guint32 *), we crop the value! This works out in
Little Endian because we are only in small number territory, but in Big
Endian, we would always crop any action value to 0!
This was not the bug in this specific case, but it could become the
exact same bug (always passing action 0, i.e. OPEN, through the wire) on
Big Endian hardware.
2025-01-23 00:52:18 +01:00
Alx Sa
8db404516e python: Fix file arguments after 161b3c53
We accidentally missed updating the
Python file parameters after 161b3c53.
This patch updates the API as well.
2025-01-22 21:29:16 +01:00
Jehan
e752687321 libgimp: fix introspection.
The variable name was not the same on function declaration and
definition/annotations and this was confusing GIR scanner.
2025-01-22 21:29:16 +01:00
Kolbjørn Stuestøl
c975c1d19b Update Norwegian Nynorsk translation 2025-01-22 18:30:57 +00:00
Kolbjørn Stuestøl
915be5ce33 Update Norwegian Nynorsk translation 2025-01-22 18:28:30 +00:00
Jacob Boerema
8b50f186b9 plug-ins: fix incorrect loading of psd cmyk merged images
I don't know what I was seeing when I added this several years ago,
but I can't find any psd CMYK images where the merged image is RGB.

It is wrong for the CMYK images we have and there are none so far
that do conform to it, so let's remove this code.
2025-01-22 18:25:16 +00:00
Jacob Boerema
4203761708 plug-ins, psd: fix #12745 invalid merged image when selecting cmyk
The merged psd image we create when writing psd's is incorrect when
we selected cmyk at export.
The problem is that we are only saving the 3 channels of our RGB
input image, or 1 for a grayscale image.
Move the channel count up and compute it separately for cmyk, then
reuse the count instead of computing it again.
2025-01-22 18:25:16 +00:00
Bruno
50b6ba6366 build/linux: Include 'gimp-debug-tool' on AppImage
It works, but do not work well if 'gdb' or 'lldb' are installed.
2025-01-22 14:26:09 -03:00
Jehan
161b3c5331 Issue #12045: no defaults for plugin args of type File.
libgimpbase:

  - Mew GimpFileChooserAction enum type: basically a near-mapping of
    GtkFileChooserAction (GTK is not accessible from libgimpbase) with
    an added GIMP_FILE_CHOOSER_ACTION_ANY.
  - New GimpParamSpecFile param spec type: based off
    GimpParamSpecObject, it has a default value, but also a none_ok and
    action argument. This way, we can also know from the argument type
    if this is a file argument meant for selecting a normal file or a
    folder, or for saving into a file, or for creating a directory.

libgimp, plug-ins:

  - All existing file arguments (until now using a standard
    GParamSpecObject param with GFile value type) were moved to the new
    GimpParamSpecFile.
  - Script-Fu in particular will now generate the appropriate param type
    depending on whether it is an SF-FILENAME or SF-DIRNAME.
  - File arguments are now stored between runs as a URI rather than as a
    path. As far as I can tell, a GFile always has a URI, but not always
    a path (in particular remote file won't have a path).
2025-01-22 17:53:21 +01:00
Alx Sa
b6d6ccecc7 plug-ins: Make PSD compatibility messages selectable
For diagnosis purposes, it is useful for people to be able to copy and paste
the compatibility warning text that GIMP shows when loading a PSD with
unsupported features. This patch makes that label selectable, which allows
for copying.
2025-01-21 23:07:12 +00:00
Jehan
a64c46b830 Issue #12776: Underscored .isl langs (pt_BR, zh_CN and zh_TW) lost translation on Installer.
This is again a change in gettext 0.23 whose release notes say:

> The value of the xml:lang attribute, inserted by msgfmt, now conforms to W3C standards.

Our xpath selection now recognizes both the old and new (proper) format
so that it works both with older and new versions of msgfmt.
2025-01-21 20:41:57 +00:00
Alx Sa
f58d36a942 script-fu: Further API fixes to Render Font Map
f4582d97 uses gimp-font-get-lookup-name, which is now
marked as private PDB. This patch replaces that usage with
gimp-resource-get-name, which is public and standardized.
2025-01-21 20:24:49 +00:00
Jehan
6dfc9f96c5 app, libgimp, pdb, plug-ins: improve and rename gimp_file_save_thumbnail() to…
… gimp_file_create_thumbnail().

One more case where "save" is misleading, and even more as it's not a
procedure where we control where an image is stored. We only say
basically "make a thumbnail which maps to this file according to my
platform's rules".

As a side fix, I also improved a bit the logic so that it allows @file
to be the exported or — as last fallback — the imported file.

And finally improve the function's docs.
2025-01-21 20:31:27 +01:00
Jacob Boerema
66aacf9633 plug-ins: add support for loading 16-bit per channel LAB psd's 2025-01-21 19:28:25 +00:00
Alx Sa
f4582d97dd script-fu: Fix Render-Font-Map after API updates
Resolves #12753
gimp-fonts-get-list now returns a vector rather than a list,
so we needed to change calls for length to vector-length
and replace car with vector-ref.
2025-01-21 16:41:52 +00:00
Jehan
602e8f71c7 app, libgimp, pdb: reword some save/export API documentation.
Followup of the save/export difference, plug-ins can only register
"export" handler procedure (save handlers are registered by core). Also
rename _gimp_pdb_set_file_proc_save_handler() though it's private so it
doesn't matter much.

Now gimp_file_save() is a special case, because it can indeed "save" to
XCF or "export" to any other format. So I just leave it named this way,
but I make the function's documentation more exhaustive.
2025-01-21 17:40:11 +01:00
Kolbjørn Stuestøl
f98c9a851b Update Norwegian Nynorsk translation 2025-01-21 15:52:35 +00:00
Kolbjørn Stuestøl
a2a6bda810 Update Norwegian Nynorsk translation 2025-01-21 15:51:56 +00:00
Kolbjørn Stuestøl
adef456236 Update Norwegian Nynorsk translation 2025-01-21 15:48:15 +00:00
Jehan
6726372464 Issue #12729: copy-paste into a path is lost. 2025-01-21 15:15:07 +01:00
Jehan
9f204e7441 Issue #12772: fix annotations. 2025-01-21 15:04:34 +01:00
lillolollo
efdd0b76ef plug-ins: Remove unused variables in Gradient Flare 2025-01-21 01:51:19 -05:00
Jehan
2b8c4ff0de NEWS: update. 2025-01-20 22:45:30 +01:00
Jehan
18d88c207c app, libgimp, pdb, plug-ins: PDB (gimp-group-layer-new) made public. 2025-01-20 22:38:01 +01:00
Jehan
957d76fd14 app, libgimp, pdb, plug-ins: PDB (gimp-layer-copy) made public.
Not sure what I had in mind with the class method copy() in libgimp
GimpLayer. The core duplicate code already takes care of returning an
object of the right type. Also the GimpTextLayer implementation was not
a perfect copy (only text, font and font size were copied). Now it is
because, again, core has all the duplication code necessary.

Finally this makes this function visible to PDB, hence Script-Fu, again.
2025-01-20 22:38:01 +01:00
Jacob Boerema
92330f7b3c plug-ins, psd: Allow exporting of metadata, color profile and thumbnail
The PSD export dialog did not allow you to choose what metadata to
export, nor whether the color profile and thumbnail should be exported.
The metadata and thubmnail were not exported at all.

A recent commit changed this export dialog to GimpExportProcedureDialog,
which now allows us to easily add support for these types by
indicating we support these for psd, which is what this commit does.
2025-01-20 15:54:14 -05:00
Jacob Boerema
250932caa4 plug-ins, psd: fix two issues with debug output
When using GIMP_DEBUG=file-psd to have debug output in the terminal,
there are two issues:
1. When exporting there is a critical because nowadays we work on a
copy of the image, which doesn't have a filename attached to it, so
let's just remove this debug statement.
2. When loading the merged image, we do not load all layer resources,
since we don't need them. In this case it is expected that the layer
offset isn't at the end of the resources. We now skip writing this
debug statement in this specific case. The offset will be adjusted
in the lines below this.
2025-01-20 15:14:17 -05:00
Jehan
65635e8a0c app, libgimp, pdb: also get rid of gimp_text_layer_new() wrapper.
See previous commit.
2025-01-20 20:55:48 +01:00
Jehan
e125c30cfd Issue #12771: (gimp-layer-new) is missing.
The libgimp wrapper was just calling the PDB procedure. Get rid of the
wrapper and make the PDB proc public. Also reorder the name argument to
be in the second place, just like it was for the wrapper.
2025-01-20 20:55:48 +01:00
Jehan
305303330c app, libgimp, pdb: fix a null_ok/none_ok mixup.
We had 2 flags to indicate that a PDB argument could be nullable:
null_ok and none_ok. That was a huge mixup and the PDB generation code
was using sometimes one, sometimes the other. Let's settle for only
none_ok.

This fixes a bunch of annotations.
2025-01-20 20:55:48 +01:00
Alx Sa
d8df72869f core: Copy simulation settings when duplicating images
Among other issues, this bug impacted exporting images with CMYK
simulation profiles. Because the image was duplicated for export, we
lose the simulation profile information after
gimp_export_options_get_image () is called.
This patch ensures the profile, simulation intent, and simulation
black point compensation toggles are carried over to the new image.
2025-01-20 18:28:36 +00:00
Alx Sa
54c92db299 plug-ins: Use GimpExportProcedureDialog for PSD export
Previously we used GimpProcedureDialog,
rather than the specialized export dialog.
2025-01-20 17:29:06 +00:00
Jehan
6e3c60dd66 Issue #12760: make the metadata PDB arguments public. 2025-01-20 17:58:30 +01:00
Jehan
d511efb822 libgimp, plug-ins: rename the various "save-*" metadata arguments…
… per discussion with Liam on IRC.

I should have done this sooner, not in a RC, but it's better to do it
now, rather than after 3.0 is released!
2025-01-20 17:58:30 +01:00
Bruno
beecc7b723 gimp-data: Update to have proper Installer right-top icon size 2025-01-20 13:01:27 -03:00
Jehan
f17a42be75 plug-ins: add type check for the argument names in filter configuration too.
After the few specific args (drawable/filter ID, opacity, blend mode, op
name…), the op argument names can be passed either as string or with the
new argument name syntax. The error message though focus on argument
name type.

Also fix the argument count for the various possible cases (when
configuring with (gimp-drawable-filter-configure) or
(gimp-drawable-merge|append-new-filter), the start arg count is
different).
2025-01-20 15:28:15 +01:00
Jehan
6a85288723 NEWS: update. 2025-01-20 01:09:01 +01:00
Jehan
f92f7d425c plug-ins: new named argument syntax in Script-Fu.
This syntax is now the official syntax for non-core PDB procedures.

I.e. that while core procedures will still use ordered arguments (e.g.:
`(gimp-image-get-layers 1)`), plug-in PDB procedures called from
Script-Fu will have named arguments in any order.

Say for instance that you want to call python-fu-foggify from Script-Fu.
Whereas we used to run:

> (python-fu-foggify RUN-NONINTERACTIVE 1 (car (gimp-image-get-layers 1)) "Clouds" '(50 4 4) 1.0 50.0)

Now we should call:

> (python-fu-foggify #:image 1 #:drawables (car (gimp-image-get-layers 1)) #:opacity 50.0 #:color '(50 4 4))

Now we can note:

* Every argument is preceded by a #:label which is the argument name.
  This makes these calls much more readable (some plug-in procedures can
  have dozen of arguments and these end up as list of integers, floats
  and strings, which are hard to read and hard to debug) and semantic.
* Order doesn't matter anymore. For instance here, I put #:opacity
  before #:color.
* As a direct consequence, we can drop any argument which we wish to
  keep with default value. E.g. in the old style, we had to put the
  #:run-mode, #:name ("Clouds") and #:turbulence (1.0) because we were
  changing the last argument #:opacity (50.0). Now we can drop all 3
  default arguments.

Having non-ordered argument is in fact the starter of this feature,
because it is already the case for calling PDB procedures in the libgimp
API (and therefore in all GIR bindings). By saying that the order of PDB
procedures is not part of the API, we actually allow to add arguments
and even to reorder them in the future without breaking existing scripts
in the 3.0 series.

This became even more serious when I was considering to make the generic
metadata arguments public. Since they are appended to the end, after all
plug-in-specific arguments, if I do this, adding any argument in an
export plug-in would break order. It won't matter anymore!

Note that it doesn't matter for core PDB procedures (where this syntax
is not used) because these are also C functions and therefore order and
number of arguments matter anyway. Also these don't have dozens of
arguments.

As a helper for Script-Fu developer, in particular as we already
released 2 RCs and therefore some people already started to port their
scripts, the old syntax will still work yet will produce a warning
showing how to call the same thing with the new syntax. For instance,
with the above first call, the warning will be:

> (script-fu:2059912): scriptfu-WARNING **: 22:54:47.507: Calling Plug-In PDB procedures with arguments as an ordered list is deprecated.
> Please use named arguments: (python-fu-foggify #:run-mode 1 #:image 1 #:drawables (2) #:name "Clouds" #:color '(50 4 4) #:turbulence 1.000000 #:opacity 50.000000)

Note that the argument name syntax is coming from the Racket scheme
variant: https://docs.racket-lang.org/arguments/index.html

Common Lisp has a similar syntax, either with just a colon, or also a
sharp + colon (it's unclear to me the difference, something about
interned vs. uninterned symbols).
After discussion with Liam on IRC, we decided to go with the #: syntax
of Racket.
2025-01-20 00:01:23 +01:00
Jehan
751665a7bd app: gimp_pdb_query() in libgimp doesn't return private procedures anymore.
A main consequence of this is that the Procedure Browser plug-in in GIMP
doesn't show now private PDB procedures. I was always finding this
annoying as their presence in the procedure browser would encourage
people to use these in plug-ins and scripts (even when sometimes we
added explicit description that these should not be used).

Now it's clearer. The procedure are much more hidden to plug-in
developers (and if they still use them, it's at their own risk,
especially of having broken plug-ins when we change signature of these
as they are not meant to be used, and therefore we don't promise
stability for these).
2025-01-20 00:01:23 +01:00
Jehan
45af19e917 app, libgimp, pdb: adding concept of core and private PDB procedures.
Core procedures are all the procedures created for libgimp basically. In
opposition, procedures created by plug-ins are not core procedures.

GimpProcedure class in libgimp now has a gimp_procedure_is_core() which
will tell you if a procedure is core or not.

Private procedures already existed, except that they were only marked as
"private" in libgimp (e.g. _gimp_font_get_lookup_name()) starting with
an underscore and marked as G_GNUC_INTERNAL. Now we also store this
information in the procedure object itself for reuse.
2025-01-20 00:01:23 +01:00
Bruno
b53d88a6ac gimp-data: New Installer assets size 2025-01-19 16:58:40 -03:00
Alx Sa
2e69cbb980 core: Use basename rather than URI for file loading
Certain cloud providers return a blobname
rather than the actual filename with
g_file_get_uri (). Since our code only checks
the suffix and extension of non-native files,
we received "Unknown File Type" when
trying to load images from those providers.

This patch replaces g_file_get_uri () so that
we get the display-name instead, which
should always have the extension. This
may be changed in the future when we
switch to a FileChooser portal.

This same pattern is also used on the
GimpThumbBox so we see the display-name
rather than the blob name.

Thanks to Khalid Abu Shawarib for the
additional information!
2025-01-19 18:28:32 +00:00
Bruno
99fa22939a Issue #12424: properly disable gjs requirement at build time 2025-01-19 11:35:36 -03:00
Bruno
6b13a9fff2 build/linux: Fix dangling "gimp-console*" and "gimptool*" symlinks on Flatpak
Ported from: 323972fdf5
2025-01-17 16:20:00 -03:00
Alx Sa
0a94d27bef themes: Additional system theme leak fixes
While testing an AppImage, I noticed a thick border around the
"Show All Files" in the File Open dialogue. This is because the
background color for the actionbar is not defined, and if the internal
padding is increased by the system theme, it's visible. Therefore
we define the color.

I also noticed that the GtkSwitch had a rectangle border rather than
a rounded one. This patch defines the border radius as well.
2025-01-17 16:47:30 +00:00
Bruno
44c0fc2bfd build/windows: Move 'toolchain' to unified deps list
'toolchain' package is out of the list since the earlier days of the
unified deps list (5f164ef9) to not break commands of crossroads
(https://gitlab.freedesktop.org/crossroad/crossroad/-/issues/3)
and quasi-msys2 (https://github.com/HolyBlackCat/quasi-msys2/issues/30)

Both do not support package groups, but there is a better workaround.
2025-01-16 19:02:47 -03:00
Bruno
744c022791 build/windows: MSYS2/Cygwin 'base-devel' is not needed
Our Windows builds are MinGW oriented
2025-01-16 18:44:43 -03:00
Bruno
c39600fcf0 build/windows: Build vanilla babl
babl docs building doesn't fail with Clang at all (ce57e91e).
2025-01-16 18:37:20 -03:00
Bruno
046d79c227 build/windows: 'gpgv' is a quasi-msys2 dependency
See: https://github.com/HolyBlackCat/quasi-msys2/issues/31

As I thought in b6fb472a and 41b3dfb7, this is mostly related to apt.
2025-01-16 06:14:04 -03:00
Bruno
ef8dedd109 build/linux: Complete d479eab2 (regarding Lua for AppImage) 2025-01-15 21:53:00 -03:00
Bruno
d479eab25e build/linux: Add Lua support to AppImage (but not enable it, see 78665ca3)
This is one of the last pending items on GNOME/gimp!1440 checklist.
It took time because LUA_CPATH and LUA_PATH are exotic and Lua docs not good.
2025-01-15 21:21:48 -03:00
Jehan
14cb6451dd Issue #12308: [macOS] dockable dialogues disabled on Windows menu.
Using the app. prefix/group for the top menu works better for the
GIMP_GTK_MENUBAR variant of the menubar (which is what is used on macOS
to get the macOS-style menu).

The whole action group code should be reviewed and straightened up
eventually!
2025-01-15 23:46:31 +01:00
Jacob Boerema
6b10cce682 app, libgimpbase: add creation date/time metadata...
when creating a new image.

We add a new function `gimp_metadata_set_creation_date` to
`libgimpbase/gimpmetadata` to handle setting all relevant
metadata tags.

We add a local function `gimp_image_new_add_creation_metadata` to
add the creation date metadata to relevant functions that create
new images.
We write tags for both the creation date and several modified dates
for IPTC, XMP and Exif metadata. All these use different ways to
express date/time and timezones and I can already see we need to have
another look at other places where we handle modified dates.

This solves the second part of #7287, adding metadata about the
date/time a new image was created.
2025-01-15 16:54:22 -05:00
Jacob Boerema
4ff4ce2870 app: fix #7287 failure to save metadata when creating a new image
When starting from an image we created in GIMP, saving/exporting with
metadata and/or thumbnail (thumbnails are part of the exif metadata)
failed, because our metadata was not initialized for newly created
images.

To fix this, create a metadata object in `gimp_create_image`, that way
when creating a new image in the gui, but also when creating an
image programmatically, gets metadata attached at the start.

We need to do that here, because we need to have metadata available
even for images that we import that do not have metadata attached.
2025-01-15 16:54:21 -05:00
Jehan
f373186dfd app: fix a crash when closing an image.
A flush happens when closing image displays, and with the idle code, it
means that the actual flush may happen once the image is already freed.

When I was saying that multi-threading is always full of surprises…
2025-01-15 18:43:36 +01:00
lloyd konneker
a00fee46af libgimp: fix #12631 set can_recurse on watch on msgs from core
So plugins don't block on second wire msgs for callbacks from remote
core chooser dialogs.
Makes libgimp/plug-in more similar to core/plug-in
2025-01-15 17:20:05 +00:00
Jehan
b931f177d3 desktop: prepare RC3 AppStream metadata. 2025-01-15 17:22:02 +01:00
Jehan
de0c08ace8 NEWS: new section for 3.0.0 RC3.
It became clear we need a RC3, mainly for 3 reasons (ordered with first
ones being more serious issues) for which I think more testing would be
better:

1. The changes in the image graph, regarding filters (#12614), and
   possibly more than I am thinking of doing before RC3.
2. The change in multi-threading code for paint (#11389). I want to be
   sure not to create new crashes (multi-threading is always full of
   surprises!).
3. The change to a central plug-in API implementation (!2058) and I want
   to make sure it doesn't bite us back with more testing (though it is
   only for persistent plug-ins so it is fortunately not touching every
   plug-in).
2025-01-15 16:59:50 +01:00
Jehan
c237b12d12 Issue #11389: crash when using layer auto-expansion.
The fix is basically to make gimp_projection_flush() thread-safe, so
that it can be called from any thread.

The actual rendering was actually already run in the main thread since
it was in an idle function, but update_region could be touched both from
the main thread and another thread (e.g. the "paint" thread). An
alternative could have been to put some mutex to protect usage, but then
I realized that iter variable was also to be protected, and there was
some code where I am unsure if we had to protect larger parts of code
(in particular with gimp_projection_projectable_bounds_changed() which
was touching update region through gimp_projection_chunk_render_stop()
then directly). The nice headaches of multi-threading!

Moving the whole actual logic of gimp_projection_flush() in the main
thread seems much more robust and maintainable.
2025-01-15 13:07:17 +01:00
Jehan
0c7168bf32 Issue #12732: fix "libxml2 error: unterminated entity reference" errors.
xgettext changed its default behavior since version 0.23 regarding
escaping of special characters into XML entities. Now we need to change
the gt:escapeRule value, differently depending on xgettext version (it
will fail in both cases with the wrong value, except the "wrong" value
is the opposite before and after).
2025-01-15 11:09:00 +00:00
Bruno
41b3dfb70f Revert "gitlab-ci, build/windows: Try to fix Debian Testing 'apt'"
This reverts commit b6fb472ae2.

We need to always have apt output since Debian Testing is tricky.
2025-01-15 06:20:25 -03:00
Jehan
135935c448 Revert "Issue #7539: Opening some images lock GIMP."
This reverts commit 9b94e347bc.

I leave a comment though, because we are not 100% sure that the issue is
gone. In fact, the upstream report is still opened.

The good point is that on stable code, we only debug crashes by default,
while the specific hang we had was happening with debugging metadata
warnings. So hopefully we won't have random people reporting GIMP
hanging (only people explicitly trying to help debugging GIMP).
2025-01-15 01:48:02 +01:00
Bruno
b6fb472ae2 gitlab-ci, build/windows: Try to fix Debian Testing 'apt' 2025-01-14 21:44:54 -03:00
Jehan
728b9cdd28 Issue #12707: CRITICAL on choosing gimp-drawable-filter-update. 2025-01-14 17:58:40 +01:00
Rodrigo Lledó
f75f585ed3 Update Spanish translation 2025-01-14 13:29:39 +00:00
Bruno
9600f3cc68 build/windows: Remove unneeded line on crossbuild script 2025-01-14 07:58:46 -03:00
Luming Zh
493fdce6ce Update Chinese (China) translation 2025-01-14 06:54:37 +00:00
Alx Sa
150f3a3274 dialogs: Don't show Releases Notes if none exist
If the generated `gimp_welcome_dialog_n_items` variable
is 0, there are no release notes to show (likely because
this is a development version). Therefore, we don't create
the Release Notes tab in the Welcome Dialogue.
2025-01-14 04:02:56 +00:00
cheesequake
84e58c5704 widgets: Confirm color map selection before...
...trying to get index.
When changing images or detaching a Colormap dockable,
we may temporarily not have a selection when the GUI
actions update. This patch adds a check to confirm we
have a valid selection before trying to get an index
from it.
2025-01-14 03:01:14 +00:00
Jehan
4448b1054a plug-ins: remove GIMP_PARAM_NO_VALIDATE for resource arguments.
We validate arguments for a reason. This special flag must only be used
in special cases (when it's harder/not possible or not implemented yet
to validate properly).

In fact #12039 would have been much simpler to diagnose and debug if
this flag had not been there from the start, because we would have had
an error earlier, on core side, which we could have traced back much
more simply!
2025-01-14 00:49:33 +01:00
Jehan
d42c76cf09 Issue #12039: do not set NULL to the first non-standard plug-in arg.
We had special code to pass around a special config object for some
filters but it was just looking if this first "non-standard" (after run
mode, image, drawables…) was an object and inserting the settings
object, which turns out to be NULL in most case (except for these
special filters from the filters_settings_actions list).

This is not right, first because we may override the default value in
such case, second because, even if this arg may be overrided later
depending on run mode, it is possible that this random other
(non-config) argument may not even allow NULL to begin with. This was
what was happening in #12039.
2025-01-14 00:13:21 +01:00
Rupert
e51b84e77b Issue #12717: file-bmp plugin broke cross-build with generated source
- build 'generate-huffman' natively when cross-building
- also reenable build of file-bmp for cross-builds
2025-01-13 22:36:41 +00:00
663 changed files with 127373 additions and 110986 deletions

View File

@@ -15,9 +15,13 @@ AlignConsecutiveBitFields: AcrossComments
AlignConsecutiveMacros: AcrossComments
AlignEscapedNewlines: Left
AllowAllArgumentsOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AlwaysBreakAfterReturnType: AllDefinitions
BinPackParameters: false
BinPackArguments: true
# Uncomment when our CI uses LLVM 20.
# See: https://github.com/llvm/llvm-project/issues/117830
# BinPackParameters: AlwaysOnePerLine
BreakBeforeBinaryOperators: None
BreakBeforeBraces: GNU
BreakBeforeTernaryOperators: false

2
.gitignore vendored
View File

@@ -1,2 +0,0 @@
# Meson
/compile_commands.json

View File

@@ -1,11 +1,32 @@
# Our pipelines are auto cancelable when explicity set in 'rules'.
# GitLab is quite sensitive about rules 'if' order so be careful.
spec:
inputs:
distribution_pipeline:
description: 'Pipelines that creates installable GIMP'
options:
- GIMP_CI_APPIMAGE #trigger the appimage making.
- GIMP_CI_FLATPAK #trigger the flatpak build and publishing (base but slow)
- GIMP_CI_WIN_INSTALLER #trigger all native MSYS2 builds then creates Inno Windows installer (base but slow)
- GIMP_CI_MS_STORE #trigger arm64 and x64 native MSYS2 builds then creates a .msixbundle (base but slow)
- none
default: 'none'
test_pipeline:
description: 'Pipelines used only for testing'
options:
- GIMP_CI_MESON_GCC #trigger the Debian GCC build (rare usefulness)
- GIMP_CI_RASTER_ICONS #trigger the Debian Clang build without vector icons (rare usefulness)
- GIMP_CI_CPPCHECK #trigger cppcheck (static code analysis)
- none
default: 'none'
---
workflow:
auto_cancel:
on_new_commit: interruptible
# There are five "TYPES" of pipelines on our CI:
##################################################
# There are five "TYPES" of pipelines on our CI: #
##################################################
## 1. On MERGE REQUESTS, the following are triggered:
## - Abbreviated Linux Clang build (base & fast)
@@ -16,8 +37,9 @@ workflow:
interruptible: true
variables: {}
## 2. LABELED MERGE REQUESTS (search for 'CI_MERGE_REQUEST_LABELS').
#'interruptible: true' needs to be hardcoded on job
## 2. LABELED MERGE REQUESTS (search for $CI_MERGE_REQUEST_LABELS =~ /.*Package).
#'interruptible: true' needs to be hardcoded on job rules
# GitLab is quite sensitive about rules 'if' order so be careful
## 3. On COMMITS except tags.
## - Linux Clang build (base & fast)
@@ -41,22 +63,9 @@ workflow:
.default:
## 5. On CUSTOM builds though web GUI, API or schedules.
## Scheduled CI ($CI_PIPELINE_SOURCE == "schedule") will run regularly:
## - GIMP_CI_MESON_GCC: trigger the Debian GCC build (rare usefulness).
## - GIMP_CI_RASTER_ICONS: trigger the Debian Clang build without vector icons (rare usefulness).
## - GIMP_CI_CPPCHECK: trigger cppcheck (static code analysis).
## - GIMP_CI_APPIMAGE: trigger the appimage making (experimental).
## - GIMP_CI_FLATPAK: trigger the flatpak build and publishing (base but slow).
## - GIMP_CI_WIN_INSTALLER: trigger all native MSYS2 builds then creates Inno Windows installer (base but slow).
## - GIMP_CI_MS_STORE: trigger arm64 and x64 native MSYS2 builds then creates a .msixbundle (base but slow).
## In addition to the variables above, to force step-specific pipelines
## without waiting for commits and/or schedules, these you should set on GUI:
## - GIMP_CI_MESON_CLANG: trigger the Debian Clang build.
## - GIMP_CI_CROSSROAD_WIN64: trigger the crossroad build for Win 64-bit.
## - GIMP_CI_MSYS2_WIN_AARCH64: trigger the native MSYS2 build for Win Aarch64.
## - GIMP_CI_MSYS2_WIN64: trigger the native MSYS2 build for Win 64-bit.
## - GIMP_CI_MSYS2_WIN32: trigger the native MSYS2 build for Win 32-bit.
## - GIMP_CI_SOURCES: trigger the Debian Clang build and the source tarball job.
## Scheduled CI ($CI_PIPELINE_SOURCE == "schedule") will run regularly all
## the 'distribution_pipeline' and 'test_pipeline' above. To run them without
## waiting for schedules: https://gitlab.gnome.org/GNOME/gimp/-/pipelines/new
interruptible: false
@@ -66,45 +75,36 @@ workflow:
when:
- 'runner_system_failure'
- 'scheduler_failure'
needs: []
# Default Docker image (unless otherwise defined)
image: debian:${DEB_VERSION}
# Caching support
variables:
CCACHE_BASEDIR: "$CI_PROJECT_DIR"
CCACHE_DIR: "$CI_PROJECT_DIR/_ccache"
cache:
key: ${CI_JOB_NAME_SLUG}${VARIANT}
paths:
- _ccache/
DEB_VERSION: "bookworm"
# Common cloning procedure
GIT_DEPTH: "1"
GIT_SUBMODULE_STRATEGY: none
# Enable colorful output when supported (e.g. ninja, cppcheck)
CLICOLOR_FORCE: "1"
# Common artifacts behavior
artifacts:
name: "${CI_JOB_NAME_SLUG}${VARIANT}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
variables:
DEB_VERSION: "bookworm"
# Common cloning procedure
GIT_DEPTH: "1"
GIT_SUBMODULE_STRATEGY: none
# Enable colorful output when supported (e.g. ninja, cppcheck)
CLICOLOR_FORCE: "1"
stages:
- prepare
- dependencies
- gimp
- analysis
- distribution
## prepare build-oriented Docker images ##
## AppImage CI (Debian) ##
.debian:
extends: .default
rules:
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*5. AppImage package.*/'
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:AppImage.*/'
interruptible: true
- if: '$GIMP_CI_APPIMAGE != null'
- if: '$GIMP_CI_APPIMAGE != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_APPIMAGE.*/'
- <<: *CI_RELEASE
parallel:
matrix:
- RUNNER: [aarch64, x86_64_v2]
@@ -118,62 +118,43 @@ stages:
CXX_LD: lld
before_script:
- export GIMP_PREFIX="${CI_PROJECT_DIR}/_install-${RUNNER}"
- echo -e "\e[0Ksection_start:`date +%s`:environ[collapsed=true]\r\e[0KPreparing build environment"
- export PATH="$GIMP_PREFIX/bin:$PATH"
- gcc -print-multi-os-directory 2>/dev/null | grep ./ && export LIB_DIR=$(gcc -print-multi-os-directory | sed 's/\.\.\///g') || export LIB_DIR="lib"
- gcc -print-multiarch 2>/dev/null | grep . && export LIB_SUBDIR=$(echo $(gcc -print-multiarch)'/')
- export PKG_CONFIG_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"
- export LD_LIBRARY_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
- export XDG_DATA_DIRS="${GIMP_PREFIX}/share:/usr/share${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}"
- export GI_TYPELIB_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}girepository-1.0${GI_TYPELIB_PATH:+:$GI_TYPELIB_PATH}"
- echo -e "\e[0Ksection_end:`date +%s`:environ\r\e[0K"
timeout: 20m
.debian-x64:
extends: .debian
rules:
- <<: *CI_MERGE
- <<: *CI_COMMIT
- if: '$GIMP_CI_MESON_CLANG != null'
variables: {}
- if: '$GIMP_CI_MESON_GCC != null'
variables:
CC: "ccache cc"
CXX: "ccache c++"
CC_LD: bfd
CXX_LD: bfd
VARIANT: "-gcc"
- if: '$GIMP_CI_RASTER_ICONS != null'
variables:
MESON_OPTIONS: "-Dvector-icons=false"
VARIANT: "-raster"
- if: '$GIMP_CI_CROSSROAD_WIN64 != null'
- if: '$GIMP_CI_SOURCES != null'
- <<: *CI_RELEASE
parallel:
matrix:
- RUNNER: x86_64_v2
.debian_environ: &ENVIRON
- echo -e "\e[0Ksection_start:`date +%s`:environ[collapsed=true]\r\e[0KPreparing build environment"
- gcc -print-multi-os-directory 2>/dev/null | grep ./ && export LIB_DIR=$(gcc -print-multi-os-directory | sed 's/\.\.\///g') || export LIB_DIR="lib"
- gcc -print-multiarch 2>/dev/null | grep . && export LIB_SUBDIR=$(echo $(gcc -print-multiarch)'/')
## Build-time vars
- export PKG_CONFIG_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"
- export XDG_DATA_DIRS="${GIMP_PREFIX}/share:/usr/share${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}"
## Runtime vars
- export PATH="${GIMP_PREFIX}/bin:$PATH"
- export LD_LIBRARY_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
- export GI_TYPELIB_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}girepository-1.0${GI_TYPELIB_PATH:+:$GI_TYPELIB_PATH}"
- echo -e "\e[0Ksection_end:`date +%s`:environ\r\e[0K"
image-debian:
deps-debian:
extends: .debian
stage: prepare
stage: dependencies
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
variables:
GIT_STRATEGY: none
UMFPACK: libumfpack5
cache: []
before_script: []
PKGCONF_RELOCATABLE_OPTION: '-Dpkgconfig.relocatable=true'
script:
- export container=docker
- mkdir -p /kaniko/.docker
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
# Install deps
- echo "FROM debian:${DEB_VERSION}" > Dockerfile
- echo "RUN apt-get update" >> Dockerfile
# 'ca-certificates' is NOT a gimp dep, it is installed only to our Docker image work
- echo "RUN apt-get install -y --no-install-recommends ca-certificates" >> Dockerfile
# Build-time only dependencies
- echo "RUN apt-get install -y --no-install-recommends \\" >> Dockerfile
- echo "RUN echo -e \"\e[0Ksection_start:0000000001:deps_install[collapsed=true]\r\e[0KInstalling dependencies provided by Debian $DEB_VERSION\"" >> Dockerfile
- echo "RUN apt-get update -qq" >> Dockerfile
## 'ca-certificates' is NOT a gimp dep, it is installed only to our Docker image work
- echo "RUN apt-get install -qq -y --no-install-recommends ca-certificates" >> Dockerfile
## Build-time only dependencies
- echo "RUN apt-get install -qq -y --no-install-recommends \\" >> Dockerfile
- echo "appstream
ccache
clang
@@ -182,16 +163,14 @@ image-debian:
git
gobject-introspection
libgtk-3-bin
libtool
lld
meson
valac
xauth
xsltproc
xvfb
yelp-tools" >> Dockerfile
# Dependencies
- echo "RUN apt-get install -y --no-install-recommends \\" >> Dockerfile
xvfb" >> Dockerfile
## Runtime dependencies
- echo "RUN apt-get install -qq -y --no-install-recommends \\" >> Dockerfile
- echo "at-spi2-core
ffmpeg
gettext
@@ -238,65 +217,39 @@ image-debian:
mypaint-brushes
poppler-data
python3
python3-gi" >> Dockerfile
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:build-debian-${DEB_VERSION}-${RUNNER} --cache=true --cache-ttl=120h
image-debian-x64:
extends: .debian-x64
stage: !reference [image-debian, stage]
image: !reference [image-debian, image]
variables: !reference [image-debian, variables]
cache: !reference [image-debian, cache]
before_script:
- !reference [image-debian, before_script]
script:
- !reference [image-debian, script]
## GNU/Linux 64-bit CIs (Debian) ##
deps-debian:
extends: .debian
needs: ["image-debian"]
stage: dependencies
variables:
GIT_STRATEGY: none
CCACHE_MAXSIZE: 0.25G
script:
# Clone and build babl
- echo -e "\e[0Ksection_start:`date +%s`:babl_build[collapsed=true]\r\e[0KBuilding babl"
- if [ "$CI_COMMIT_TAG" != "" ]; then
repo=https://gitlab.gnome.org/GNOME/babl.git;
babl_tag=$(git ls-remote --tags --exit-code --refs "$repo" |
grep -oi "BABL_[0-9]*_[0-9]*_[0-9]*" |
sort --version-sort | tail -1);
babl_branch="--branch=$babl_tag";
fi
- git clone $babl_branch --depth=${GIT_DEPTH} https://gitlab.gnome.org/GNOME/babl.git
- cd babl
- meson setup _build-${RUNNER} -Dprefix="${GIMP_PREFIX}"
- cd _build-${RUNNER}
- ninja
- ninja install
- ccache --show-stats
- cd ../..
- echo -e "\e[0Ksection_end:`date +%s`:babl_build\r\e[0K"
# Clone and build gegl
- echo -e "\e[0Ksection_start:`date +%s`:gegl_build[collapsed=true]\r\e[0KBuilding gegl"
- if [ "$CI_COMMIT_TAG" != "" ]; then
repo=https://gitlab.gnome.org/GNOME/gegl.git;
gegl_tag=$(git ls-remote --tags --exit-code --refs "$repo" |
grep -oi "GEGL_[0-9]*_[0-9]*_[0-9]*" |
sort --version-sort | tail -1);
gegl_branch="--branch=$gegl_tag";
fi
- git clone $gegl_branch --depth=${GIT_DEPTH} https://gitlab.gnome.org/GNOME/gegl.git
- cd gegl
- meson setup _build-${RUNNER} -Dprefix="${GIMP_PREFIX}" -Dworkshop=true
- cd _build-${RUNNER}
- ninja
- ninja install
- ccache --show-stats
- echo -e "\e[0Ksection_end:`date +%s`:gegl_build\r\e[0K"
python3-gi
python3-gi-cairo" >> Dockerfile
- echo "RUN echo -e \"\e[0Ksection_end:0000000002:deps_install\r\e[0K\"" >> Dockerfile
# Prepare environ
- echo "FROM $CI_REGISTRY_IMAGE:build-debian-${DEB_VERSION}-${RUNNER}" > Dockerfile2;
- echo "RUN echo -e \"\e[0Ksection_start:`date +%s`:environ[collapsed=true]\r\e[0KPreparing build environment\"" >> Dockerfile2;
- export LIB_DIR="lib";
- export LIB_SUBDIR=$([ "$(uname -m)" = 'aarch64' ] && echo "aarch64-linux-gnu/" || echo "x86_64-linux-gnu/");
- echo "ENV PKG_CONFIG_PATH=\"${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}\"" >> Dockerfile2;
- echo "ENV XDG_DATA_DIRS=\"${GIMP_PREFIX}/share:/usr/share${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}\"" >> Dockerfile2;
- echo "ENV CC=\"$CC\"" >> Dockerfile2;
- echo "ENV CXX=\"$CXX\"" >> Dockerfile2;
- echo "ENV CC_LD=\"$CC_LD\"" >> Dockerfile2;
- echo "ENV CXX_LD=\"$CXX_LD\"" >> Dockerfile2;
- echo "ENV CLICOLOR_FORCE=\"1\"" >> Dockerfile2;
- echo "RUN echo -e \"\e[0Ksection_end:`date +%s`:environ\r\e[0K\"" >> Dockerfile2;
# Build some dependencies
## Build babl
- echo "RUN echo -e \"\e[0Ksection_start:`date +%s`:babl_build[collapsed=true]\r\e[0KBuilding babl\"" >> Dockerfile2;
- echo "RUN git clone --branch \"\$([ \"$CI_COMMIT_TAG\" ] && echo \"\$(git ls-remote --tags --exit-code --refs https://gitlab.gnome.org/GNOME/babl.git | grep -oi \"BABL_[0-9]*_[0-9]*_[0-9]*\" | sort --version-sort | tail -1)\" || echo \"master\")\" --depth=${GIT_DEPTH} https://gitlab.gnome.org/GNOME/babl.git" $CI_PROJECT_DIR/babl >> Dockerfile2;
- echo "RUN meson setup $CI_PROJECT_DIR/babl/_build-${RUNNER} $CI_PROJECT_DIR/babl -Dprefix=\"${GIMP_PREFIX}\" $PKGCONF_RELOCATABLE_OPTION" >> Dockerfile2;
- echo "RUN ninja -C $CI_PROJECT_DIR/babl/_build-${RUNNER}" >> Dockerfile2;
- echo "RUN ninja -C $CI_PROJECT_DIR/babl/_build-${RUNNER} install" >> Dockerfile2;
- echo "RUN echo -e \"\e[0Ksection_end:`date +%s`:babl_build\r\e[0K\"" >> Dockerfile2;
## Build GEGL
- echo "RUN echo -e \"\e[0Ksection_start:`date +%s`:gegl_build[collapsed=true]\r\e[0KBuilding gegl\"" >> Dockerfile2;
- echo "RUN git clone --branch \"\$([ \"$CI_COMMIT_TAG\" ] && echo \"\$(git ls-remote --tags --exit-code --refs https://gitlab.gnome.org/GNOME/gegl.git | grep -oi \"GEGL_[0-9]*_[0-9]*_[0-9]*\" | sort --version-sort | tail -1)\" || echo \"master\")\" --depth=${GIT_DEPTH} https://gitlab.gnome.org/GNOME/gegl.git" $CI_PROJECT_DIR/gegl >> Dockerfile2;
- echo "RUN meson setup $CI_PROJECT_DIR/gegl/_build-${RUNNER} $CI_PROJECT_DIR/gegl -Dprefix=\"${GIMP_PREFIX}\" $PKGCONF_RELOCATABLE_OPTION $WORKSHOP_OPTION" >> Dockerfile2;
- echo "RUN ninja -C $CI_PROJECT_DIR/gegl/_build-${RUNNER}" >> Dockerfile2;
- echo "RUN ninja -C $CI_PROJECT_DIR/gegl/_build-${RUNNER} install" >> Dockerfile2;
- echo "RUN echo -e \"\e[0Ksection_end:`date +%s`:gegl_build\r\e[0K\"" >> Dockerfile2;
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:build-debian-${DEB_VERSION}-${RUNNER} --cache=true --cache-ttl=120h --image-fs-extract-retry 1 --verbosity=warn
- if [ -f 'Dockerfile2' ]; then /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile2 --destination build-debian-${DEB_VERSION}-${RUNNER}-temp --cache=false --no-push --verbosity=warn; fi
artifacts:
paths:
- _install-${RUNNER}/
@@ -312,15 +265,17 @@ gimp-debian:
stage: gimp
variables:
GIT_SUBMODULE_STRATEGY: recursive
CCACHE_MAXSIZE: 0.75G
script:
- *ENVIRON
# Build GIMP
- echo -e "\e[0Ksection_start:`date +%s`:gimp_build[collapsed=true]\r\e[0KBuilding GIMP"
- meson setup _build-${RUNNER} -Dprefix="${GIMP_PREFIX}"
-Dpkgconfig.relocatable=true
-Drelocatable-bundle=yes
-Dcheck-update=yes
-Dbuild-id=org.gimp.GIMP_official.AppImage.$(uname -m)
- cd _build-${RUNNER}
- ninja
- ccache --show-stats
- echo -e "\e[0Ksection_end:`date +%s`:gimp_build\r\e[0K"
# Create bundle
- echo -e "\e[0Ksection_start:`date +%s`:gimp_bundle[collapsed=true]\r\e[0KCreating bundle"
@@ -332,14 +287,44 @@ gimp-debian:
paths:
- AppDir*/
- appimageignore*
- _build-${RUNNER}/meson-logs/meson-log.txt
- _build-${RUNNER}/config.h
expire_in: 2 days
## GNU/Linux 64-bit CIs (Debian) ##
.debian-x64:
extends: .debian
rules:
- <<: *CI_MERGE
- <<: *CI_COMMIT
- if: '$GIMP_CI_MESON_CLANG != null'
variables: {}
- if: '$GIMP_CI_MESON_GCC != null || "$[[ inputs.test_pipeline ]]" =~ /.*GIMP_CI_MESON_GCC.*/'
variables:
CC: "cc"
CXX: "c++"
CC_LD: bfd
CXX_LD: bfd
VARIANT: "-gcc"
- if: '$GIMP_CI_RASTER_ICONS != null || "$[[ inputs.test_pipeline ]]" =~ /.*GIMP_CI_RASTER_ICONS.*/'
variables:
MESON_OPTIONS: "-Dvector-icons=false"
VARIANT: "-raster"
- if: '$GIMP_CI_SOURCES != null'
- <<: *CI_RELEASE
parallel:
matrix:
- RUNNER: x86_64_v2
tags: []
deps-debian-x64:
extends: .debian-x64
needs: ["image-debian-x64"]
stage: !reference [deps-debian, stage]
variables: !reference [deps-debian, variables]
image: !reference [deps-debian, image]
variables:
GIT_STRATEGY: none
WORKSHOP_OPTION: '-Dworkshop=true'
script:
- !reference [deps-debian, script]
artifacts: !reference [deps-debian, artifacts]
@@ -350,15 +335,14 @@ gimp-debian-x64:
stage: !reference [gimp-debian, stage]
variables: !reference [gimp-debian, variables]
script:
- *ENVIRON
# Check building
- echo -e "\e[0Ksection_start:`date +%s`:gimp_build[collapsed=true]\r\e[0KBuilding GIMP"
- meson setup _build-${RUNNER} -Dprefix="${GIMP_PREFIX}"
-Dg-ir-doc=true
-Dfile-plug-ins-test=true
$MESON_OPTIONS
- cd _build-${RUNNER}
- ninja
- ccache --show-stats
- echo -e "\e[0Ksection_end:`date +%s`:gimp_build\r\e[0K"
# Check execution
- echo -e "\e[0Ksection_start:`date +%s`:gimp_test[collapsed=true]\r\e[0KTesting GIMP execution"
@@ -385,38 +369,33 @@ gimp-debian-x64:
- _build-${RUNNER}/meson-logs/meson-log.txt
- _build-${RUNNER}/meson-dist/
- _build-${RUNNER}/config.h
- _build-${RUNNER}/devel-docs/
reports:
junit: "_build-${RUNNER}/meson-logs/testlog.junit.xml"
expire_in: 2 days
## Flatpak CI ##
## Flatpak CI ##
.flatpak-x64:
extends: .default
rules:
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*5. Flatpak package.*/'
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Flatpak.*/'
interruptible: true
- if: '$GIMP_CI_FLATPAK != null'
- if: '$GIMP_CI_FLATPAK != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_FLATPAK.*/'
tags:
- flatpak
image: 'quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master'
before_script:
- export GIMP_PREFIX="${CI_PROJECT_DIR}/_install"
timeout: 40m
deps-flatpak-x64:
extends: .flatpak-x64
needs: []
stage: dependencies
# FIXME: GitLab CI caching does NOT work with flatpak
# See: https://gitlab.gnome.org/Infrastructure/Infrastructure/-/issues/1502
cache: []
# key: ${CI_JOB_NAME}-pkg
# paths:
# .flatpak-builder/
# key: $CI_JOB_NAME
# paths:
# _ccache/
#https://gitlab.gnome.org/Infrastructure/Infrastructure/-/issues/1502
#cache:
#key: ${CI_JOB_NAME_SLUG}
#paths:
#- .flatpak-builder/
script:
- bash build/linux/flatpak/1_build-deps-flatpak.sh
artifacts:
@@ -431,12 +410,6 @@ gimp-flatpak-x64:
extends: .flatpak-x64
needs: ["deps-flatpak-x64"]
stage: gimp
# FIXME: GitLab CI caching does NOT work with flatpak
# See: https://gitlab.gnome.org/Infrastructure/Infrastructure/-/issues/1502
cache: []
# key: $CI_JOB_NAME
# paths:
# _ccache/
variables:
GIT_SUBMODULE_STRATEGY: recursive
script:
@@ -447,80 +420,34 @@ gimp-flatpak-x64:
- gimp-meson-log.tar
expire_in: 2 days
## WINDOWS 64-bit CI (cross-build crossroad) ##
.win-cross:
extends: .debian-x64
rules:
- <<: *CI_MERGE
- <<: *CI_COMMIT
- if: '$GIMP_CI_CROSSROAD_WIN64 != null'
variables:
DEB_VERSION: testing
MSYSTEM_PREFIX: clang64
cache: []
image-debian-x64-cross:
extends: .win-cross
stage: !reference [image-debian, stage]
image: !reference [image-debian, image]
variables:
GIT_STRATEGY: none
UMFPACK: libumfpack6
cache: !reference [image-debian, cache]
before_script:
- !reference [image-debian, before_script]
script:
- !reference [image-debian, script]
deps-win-x64-cross:
extends: .win-cross
needs: ["image-debian-x64-cross"]
stage: dependencies
before_script: []
script:
- bash build/windows/1_build-deps-quasimsys2.sh
artifacts:
paths:
- quasi-msys2/
- _install-$MSYSTEM_PREFIX-cross/
- babl/_build-$MSYSTEM_PREFIX-cross/meson-logs/meson-log.txt
- gegl/_build-$MSYSTEM_PREFIX-cross/meson-logs/meson-log.txt
expire_in: 2 hours
gimp-win-x64-cross:
extends: .win-cross
needs: ["deps-win-x64-cross", "gimp-debian-x64"]
stage: gimp
variables:
GIT_SUBMODULE_STRATEGY: recursive
script:
- bash build/windows/2_build-gimp-quasimsys2.sh
artifacts:
expose_as: 'Windows zip'
paths:
- gimp-clang64/
- _build-clang64-cross/meson-logs/meson-log.txt
- _build-clang64-cross/done-dll.list
expire_in: 2 days
## WINDOWS pipelines (native MSYS2) ##
.win:
extends: .default
rules:
- if: ($CI_MERGE_REQUEST_LABELS =~ /.*5. Windows Installer.*/ && $CI_MERGE_REQUEST_LABELS =~ /.*5. Microsoft Store.*/) || ($GIMP_CI_WIN_INSTALLER != null && $GIMP_CI_MS_STORE != null)
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Windows Installer.*/ && $CI_MERGE_REQUEST_LABELS =~ /.*Package:Microsoft Store.*/'
interruptible: true
variables:
INSTALLER_OPTION: '-Dwindows-installer=true'
STORE_OPTION: '-Dms-store=true'
- if: $CI_MERGE_REQUEST_LABELS =~ /.*5. Windows Installer.*/ || $GIMP_CI_WIN_INSTALLER != null
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Windows Installer.*/'
interruptible: true
variables:
INSTALLER_OPTION: '-Dwindows-installer=true'
- if: ($CI_MERGE_REQUEST_LABELS =~ /.*5. Microsoft Store.*/ || $GIMP_CI_MS_STORE != null) && $CI_JOB_NAME !~ /.*86.*/ && $CI_JOB_NAME !~ /.*installer.*/
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Microsoft Store.*/ && $CI_JOB_NAME =~ /.*64.*/ && $CI_JOB_NAME !~ /.*installer.*/'
interruptible: true
variables:
STORE_OPTION: '-Dms-store=true'
- if: '$GIMP_CI_WIN_INSTALLER != null && $GIMP_CI_MS_STORE != null'
variables:
INSTALLER_OPTION: '-Dwindows-installer=true'
STORE_OPTION: '-Dms-store=true'
- if: '$GIMP_CI_WIN_INSTALLER != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_WIN_INSTALLER.*/'
variables:
INSTALLER_OPTION: '-Dwindows-installer=true'
- if: '$GIMP_CI_MS_STORE != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_MS_STORE.*/ && $CI_JOB_NAME =~ /.*64.*/ && $CI_JOB_NAME !~ /.*installer.*/'
variables:
STORE_OPTION: '-Dms-store=true'
- <<: *CI_RELEASE
variables:
INSTALLER_OPTION: '-Dwindows-installer=true'
@@ -533,26 +460,30 @@ gimp-win-x64-cross:
MSYSTEM_PREFIX: clang64
tags:
- $RUNNER
variables:
MSYS_ROOT: 'C:/msys64'
CC: cc
CXX: c++
#meson.build forces non-relocatable .pc. See: https://github.com/mesonbuild/meson/issues/14346
PKGCONF_RELOCATABLE_OPTION: '-Dpkgconfig.relocatable=true'
before_script:
# MSYS2 config
- $MSYS2_PREFIX = 'C:/msys64'
- $env:Path = "$MSYS2_PREFIX/$MSYSTEM_PREFIX/bin;$MSYS2_PREFIX/usr/bin;" + $env:Path
# Build-time vars
# FIXME:'gimpenv' have buggy code about Windows paths. See: https://gitlab.gnome.org/GNOME/gimp/-/issues/12284
- $GIMP_PREFIX = "$PWD\_install-$MSYSTEM_PREFIX".Replace('\', '/')
- Write-Output "$([char]27)[0Ksection_start:$(Get-Date -UFormat %s -Millisecond 0):win_environ[collapsed=true]$([char]13)$([char]27)[0KPreparing build environment"
- $env:Path = $env:Path + ";$GIMP_PREFIX/bin"
- $env:PKG_CONFIG_PATH = "$MSYS2_PREFIX/$MSYSTEM_PREFIX/lib/pkgconfig;$MSYS2_PREFIX/$MSYSTEM_PREFIX/share/pkgconfig;$GIMP_PREFIX/lib/pkgconfig"
- $env:XDG_DATA_DIRS = "$MSYS2_PREFIX/$MSYSTEM_PREFIX/share;$GIMP_PREFIX/share"
- $env:GI_TYPELIB_PATH = "$MSYS2_PREFIX/$MSYSTEM_PREFIX/lib/girepository-1.0;$GIMP_PREFIX/lib/girepository-1.0"
- Write-Output "$([char]27)[0Ksection_end:$(Get-Date -UFormat %s -Millisecond 0):win_environ$([char]13)$([char]27)[0K"
timeout: 40m
.win_environ: &WIN_ENVIRON
- Write-Output "$([char]27)[0Ksection_start:$(Get-Date -UFormat %s -Millisecond 0):win_environ[collapsed=true]$([char]13)$([char]27)[0KPreparing build environment"
## Build-time vars
- $env:PKG_CONFIG_PATH = "$GIMP_PREFIX/lib/pkgconfig;$MSYS_ROOT/$MSYSTEM_PREFIX/lib/pkgconfig;$MSYS_ROOT/$MSYSTEM_PREFIX/share/pkgconfig"
- $env:XDG_DATA_DIRS = "$GIMP_PREFIX/share;$MSYS_ROOT/$MSYSTEM_PREFIX/share"
## Runtime vars
- $env:PATH = "$GIMP_PREFIX/bin;$MSYS_ROOT/$MSYSTEM_PREFIX/bin;" + $env:PATH
- $env:GI_TYPELIB_PATH = "$GIMP_PREFIX/lib/girepository-1.0;$MSYS_ROOT/$MSYSTEM_PREFIX/lib/girepository-1.0"
- Write-Output "$([char]27)[0Ksection_end:$(Get-Date -UFormat %s -Millisecond 0):win_environ$([char]13)$([char]27)[0K"
deps-win:
extends: .win
needs: []
stage: dependencies
variables:
CCACHE_MAXSIZE: 0.25G
script:
- build/windows/1_build-deps-msys2.ps1
artifacts:
@@ -568,7 +499,6 @@ gimp-win:
stage: gimp
variables:
GIT_SUBMODULE_STRATEGY: recursive
CCACHE_MAXSIZE: 0.75G
script:
- build/windows/2_build-gimp-msys2.ps1
artifacts:
@@ -582,6 +512,7 @@ gimp-win:
- _build-$MSYSTEM_PREFIX/build/windows/store/
expire_in: 2 days
## WINDOWS x86 legacy CI (native MSYS2) ##
.win-x86:
extends: .win
@@ -592,12 +523,14 @@ gimp-win:
matrix:
- RUNNER: win32-ps
MSYSTEM_PREFIX: mingw32
variables:
MINGW_PACKAGE_PREFIX: mingw-w64-i686
CC: cc
CXX: c++
deps-win-x86:
extends: .win-x86
needs: []
stage: !reference [deps-win, stage]
variables: !reference [deps-win, variables]
script:
- !reference [deps-win, script]
artifacts: !reference [deps-win, artifacts]
@@ -606,11 +539,10 @@ gimp-win-x86:
extends: .win-x86
needs: ["deps-win-x86"]
stage: !reference [gimp-win, stage]
variables: !reference [gimp-win, variables]
variables:
GIT_SUBMODULE_STRATEGY: recursive
script:
- !reference [gimp-win, script]
# We split 32-bit DWARF symbols here because LLVM-objcopy do NOT support them
- bash build/windows/installer/3_dist-gimp-inno_sym.sh gimp-$MSYSTEM_PREFIX
artifacts: !reference [gimp-win, artifacts]
@@ -624,7 +556,7 @@ file-plug-in-tests:
# Don't run on release since the plug-in doesn't get installed in releases
- <<: *CI_MERGE
- <<: *CI_COMMIT
needs: ["deps-debian-x64", "gimp-debian-x64"]
needs: ["gimp-debian-x64"]
stage: analysis
variables:
GIT_STRATEGY: none
@@ -632,12 +564,13 @@ file-plug-in-tests:
GIMP_TESTS_LOG_FILE: "$CI_PROJECT_DIR/_log/import-tests.log"
REGRESSION_STRING: "Total number of regressions: 0"
cache:
- key: $CI_JOB_NAME
paths:
- _data
key: $CI_JOB_NAME
paths:
- _data
script:
- API_VER=$(grep GIMP_PKGCONFIG_VERSION _build*/config.h | head -1 | sed 's/^.*"\([^"]*\)"$/\1/')
- APP_VER=$(grep GIMP_APP_VERSION _build*/config.h | head -1 | sed 's/^.*"\([^"]*\)"$/\1/')
- *ENVIRON
- pkg-config --variable=gimplibdir gimp-${API_VER} 2>/dev/null | grep . && PLUG_IN_DIR=$(echo $(pkg-config --variable=gimplibdir gimp-${API_VER})'/plug-ins/')
- export PYTHONPATH="${PLUG_IN_DIR}test-file-plug-ins"
- export GIMP_TESTS_CONFIG_FILE="${PLUG_IN_DIR}test-file-plug-ins/tests/batch-config.ini"
@@ -659,13 +592,22 @@ file-plug-in-tests:
junit: "_log/import-tests.xml"
expire_in: 2 days
meson-health:
extends: .default
rules:
- <<: *CI_MERGE
- <<: *CI_COMMIT
stage: analysis
script:
- apt-get update
- apt-get install -y git
- bash .gitlab/run_meson_health_diff.sh
clang-format:
extends: .default
rules:
- <<: *CI_MERGE
needs: []
stage: analysis
cache: []
script:
- apt-get update
- apt-get install -y clang-format
@@ -682,15 +624,13 @@ clang-format:
cppcheck:
extends: .default
rules:
- if: '$GIMP_CI_CPPCHECK != null'
needs: []
- if: '$GIMP_CI_CPPCHECK != null || "$[[ inputs.test_pipeline ]]" =~ /.*GIMP_CI_CPPCHECK.*/'
stage: analysis
cache: []
script:
- apt-get update
- apt-get install -y cppcheck
- cppcheck -q -j8 --enable=all --force --output-file=cppcheck.xml --xml --xml-version=2
-i _build -i _build-cross -i babl -i gegl -i _install -i .local -i .cache -i _ccache -i gimp-x64 .
-i _build -i babl -i gegl -i _install -i .local -i .cache -i gimp-x64 .
- mkdir report
- cppcheck-htmlreport --source-dir=. --title=gimp --file=cppcheck.xml --report-dir=report
artifacts:
@@ -709,7 +649,6 @@ sources-debian:
- <<: *CI_RELEASE
needs: ["gimp-debian-x64"]
stage: distribution
cache: []
variables:
GIT_STRATEGY: none
script:
@@ -732,7 +671,6 @@ dev-docs:
- <<: *CI_RELEASE
needs: ["deps-debian-x64", "gimp-debian-x64"]
stage: distribution
cache: []
variables:
GIT_STRATEGY: none
script:
@@ -765,7 +703,6 @@ dev-docs:
DIR_NAME=gimp-api-docs-$GIMP_VER &&
mkdir $DIR_NAME &&
mv "${GIMP_PREFIX}/share/doc/gimp-$APP_VER" $DIR_NAME/reference &&
mv _build*/devel-docs/g-ir-docs $DIR_NAME/ &&
TAR_NAME="$DIR_NAME.tar.xz" &&
tar --dereference -cJf ${TAR_NAME} $DIR_NAME &&
sha256sum $TAR_NAME > ${TAR_NAME}.SHA256SUMS &&
@@ -789,9 +726,8 @@ dist-appimage-weekly:
- !reference [.debian, rules]
needs: ["gimp-debian"]
stage: distribution
cache: []
script:
- bash build/linux/appimage/3_dist-gimp-goappimage.sh _build-x86_64_v2
- bash build/linux/appimage/3_dist-gimp-goappimage.sh
artifacts:
expose_as: 'Linux appimage'
paths:
@@ -804,18 +740,17 @@ dist-flatpak-weekly:
- .default
- .publish_nightly
rules:
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*5. Flatpak package.*/'
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Flatpak.*/'
interruptible: true
- if: '$GIMP_CI_FLATPAK != null'
- if: '$GIMP_CI_FLATPAK != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_FLATPAK.*/'
needs: ["gimp-flatpak-x64"]
stage: distribution
cache: []
script:
- bash build/linux/flatpak/3_dist-gimp-flatpak.sh
artifacts:
expose_as: 'Linux flatpak'
paths:
- org.gimp.GIMP.Nightly.flatpak
- build/linux/flatpak/_Output/
expire_in: 8 days
dist-installer-weekly:
@@ -826,7 +761,8 @@ dist-installer-weekly:
stage: distribution
tags:
- windows-aarch64
cache: []
variables:
MSYS_ROOT: 'C:/msys64'
script:
- build/windows/installer/3_dist-gimp-inno.ps1
artifacts:
@@ -839,15 +775,14 @@ dist-installer-weekly:
dist-store-weekly:
extends: .default
rules:
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*5. Microsoft Store.*/'
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Microsoft Store.*/'
interruptible: true
- if: '$GIMP_CI_MS_STORE != null'
- if: '$GIMP_CI_MS_STORE != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_MS_STORE.*/'
- <<: *CI_RELEASE
needs: ["gimp-win"]
stage: distribution
tags:
- win32-ps
cache: []
script:
- build\windows\store\3_dist-gimp-winsdk.ps1
artifacts:

View File

@@ -6,11 +6,15 @@ It is important that you fill all the fields of the template.
There are a few issues we get reports about quite frequently. If you want to check if what you have encountered is among these, please see:
https://gitlab.gnome.org/GNOME/gimp/-/issues/?sort=updated_desc&state=all&label_name%5B%5D=Duplication%20target&first_page_size=100
**Code of Conduct**: "Be considerate and respectful" is our main rule.
E.g. avoid negative emotional writing which only generates more upsetting
interactions. Thanks!
-->
### Environment/Versions
- GIMP version:
- GIMP version number:
- Package: <!--[flatpak? Installer from gimp.org? If another installer, tell us where from] (write it after the > symbol)-->
- Operating System: <!--[Windows? macOS? Linux? All? Add OS versions too] (write it after the > symbol) -->
- (if Linux) Display system: <!--[X11? Wayland? Which compositor and version?] (write it after the > symbol) -->
@@ -22,7 +26,7 @@ either in the last stable version of GIMP or on updated development code
### Description of the bug
<!--Please describe your issue with details.
Add screenshot or other files if needed.(write it after the > symbol)-->
Add full (not cropped) screenshots or other files if needed.(write it after the > symbol)-->
### Reproduction

View File

@@ -3,8 +3,11 @@
### Description of the feature
<!-- Please describe your feature with details. Also:
- If the feature is UI-related, add screenshots, mockups or videos;
- If the feature is about some standard or API, link relevant resources;
- If the feature is UI-related, please DO NOT REPORT HERE but on
gimp-ux: https://gitlab.gnome.org/Teams/GIMP/Design/gimp-ux/-/issues;
- If the feature is about some image file format on GIMP, first check if it
is not already listed on https://developer.gimp.org/core/standards/images,
then you can make the request, ideally linking relevant resources (e.g. specs);
- If you have a patch, see: https://developer.gimp.org/core/submit-patch/ -->
### Use cases

View File

@@ -8,8 +8,5 @@
- Check the following option when making your request:
"*Allow commits from members who can merge to the target branch.*"
- Enable the container registry for your repository by following this
documentation, but enabling the feature instead of disabling it
(unlike what the docs says, Container Registry is disabled by default
on our Gitlab instance):
https://docs.gitlab.com/ee/user/packages/container_registry/#disable-the-container-registry-for-a-project -->
- No AI-generated contents allowed (neither code nor text, images…).
Only human created works please! -->

View File

@@ -0,0 +1,167 @@
#!/bin/bash
source .gitlab/search-common-ancestor.sh
diff=$(git diff -U0 --no-color "${newest_common_ancestor_sha}" -- '*.build' '*.py' | grep -E '^\+[^+]' | sed 's/^+//')
#List of commonly used utilities on Unix world
#See the context: https://gitlab.gnome.org/GNOME/gimp/-/issues/11385
coreutils_array=(
".sh"
"'sh'"
"'bash'"
"'\['"
"'arch'"
"'awk'"
"'b2sum'"
"'base32'"
"'base64'"
"'basename'"
"'basenc'"
"'cat'"
"'chcon'"
"'chgrp'"
"'chmod'"
"'chown'"
"'chroot'"
"'cksum'"
"'cmp'"
"'comm'"
"'cp'"
"'csplit'"
"'cut'"
"'date'"
"'dd'"
"'df'"
"'diff'"
"'dir'"
"'dircolors'"
"'dirname'"
"'du'"
"'echo'"
"'env'"
"'expand'"
"'expr'"
"'factor'"
"'false'"
"'find'"
"'fmt'"
"'fold'"
"'gkill'"
"'grep'"
"'groups'"
"'head'"
"'hostid'"
"'hostname'"
"'id'"
"'install'"
"'join'"
"'link'"
"'ln'"
"'logname'"
"'ls'"
"'md5sum'"
"'mkdir'"
"'mkfifo'"
"'mknod'"
"'mktemp'"
"'mv'"
"'nice'"
"'nl'"
"'nohup'"
"'nproc'"
"'numfmt'"
"'od'"
"'paste'"
"'pathchk'"
"'pinky'"
"'pr'"
"'printenv'"
"'printf'"
"'ptx'"
"'pwd'"
"'readlink'"
"'realpath'"
"'rm'"
"'rmdir'"
"'runcon'"
"'sed'"
"'seq'"
"'sha1sum'"
"'sha224sum'"
"'sha256sum'"
"'sha384sum'"
"'sha512sum'"
"'shred'"
"'shuf'"
"'sleep'"
"'sort'"
"'split'"
"'stat'"
"'stdbuf'"
"'stty'"
"'sum'"
"'sync'"
"'tac'"
"'tail'"
"'tee'"
"'test'"
"'timeout'"
"'touch'"
"'tr'"
"'true'"
"'truncate'"
"'tsort'"
"'tty'"
"'uname'"
"'unexpand'"
"'uniq'"
"'unlink'"
"'users'"
"'vdir'"
"'wc'"
"'who'"
"'whoami'"
"'yes'"
)
for coreutil in "${coreutils_array[@]}"; do
if echo "$diff" | grep -q "$coreutil"; then
found_coreutils+=" $coreutil"
fi
done
if [ "$found_coreutils" ]; then
echo -e '\033[31m(ERROR)\033[0m: Seems that you are trying to add an Unix-specific dependency to be called by Meson.'
echo " Please, port to Python (which is crossplatform), your use of:${found_coreutils}."
fi
#Limited list of commonly used utilities on Windows world
ntutils_array=(
".bat"
".cmd"
".ps1"
"'cmd'"
"'powershell'"
)
for ntutil in "${ntutils_array[@]}"; do
if echo "$diff" | grep -q "$ntutil"; then
found_ntutils+=" $ntutil"
fi
done
if [ "$found_ntutils" ]; then
echo -e '\033[31m(ERROR)\033[0m: Seems that you are trying to add a NT-specific dependency to be called by Meson.'
echo " Please, port to Python (which is crossplatform), your use of:${found_ntutils}."
fi
if [ "$found_coreutils" ] || [ "$found_ntutils" ]; then
exit 1
fi
echo 'Meson .build files are alright regarding crossplatform.'
exit 0

View File

@@ -24,13 +24,13 @@ git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%
# fall back to `${CI_DEFAULT_BRANCH}` or `${CI_COMMIT_BRANCH}` respectively
# otherwise.
# add mr-origin
git remote add mr-origin ${CI_MERGE_REQUEST_SOURCE_PROJECT_URL}
# add patch-origin
git remote add patch-origin ${CI_MERGE_REQUEST_SOURCE_PROJECT_URL:-${CI_PROJECT_URL}}
source_branch="${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME:-${CI_COMMIT_BRANCH}}"
git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%d)" mr-origin "${source_branch}" &> ./fetch_origin.log
git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%d)" patch-origin "${source_branch}" &> ./fetch_origin.log
newest_common_ancestor_sha=$(diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "upstream/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_DEFAULT_BRANCH}}") <(git rev-list --first-parent "mr-origin/${source_branch}") | head -1)
newest_common_ancestor_sha=$(diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "upstream/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_DEFAULT_BRANCH}}") <(git rev-list --first-parent "patch-origin/${source_branch}") | head -1)
if [ -z "${newest_common_ancestor_sha}" ]; then
echo "Couldnt find common ancestor with upstream main branch. This typically"
echo "happens if you branched from main a long time ago. Please update"

View File

@@ -61,6 +61,7 @@ The following people have contributed code to GIMP:
Jay Cox
Kevin Cozens
Jeremiah Darais
Shubham Daule
Michael Deal
Alexia Death
Brian Degenhardt
@@ -81,6 +82,7 @@ The following people have contributed code to GIMP:
Morton Eriksen
Larry Ewing
Dirk Farin
Idriss Fekir
Pedro Alonso Ferrer
Nick Fetchak
Piotr Filiciak
@@ -170,6 +172,7 @@ The following people have contributed code to GIMP:
Tobias Lenz
Frederic Leroy
Raph Levien
Bruno Lopes
Wing Tung Leung
Dave Lichterman
Adrian Likins
@@ -352,7 +355,9 @@ The following people have contributed art to GIMP:
Karl La Rocca
Andreas Nilsson
Ville Pätsi
Denis Rangelov
Mike Schaeffer
Sevenix
Carol Spears
Klaus Staedtler
Jakub Steiner

View File

@@ -1,6 +1,6 @@
---------------------------------------
--------------------------------------
Installation instructions for GIMP @GIMP_APP_VERSION@
---------------------------------------
--------------------------------------
There are some basic steps to building and installing GIMP.
@@ -103,7 +103,7 @@ help in that regard:
be installed. All these libraries are required dependencies.
8. For metadata access GIMP requires the gexiv2 @GEXIV2_REQUIRED_VERSION@ or newer library.
It is hosted at: https://wiki.gnome.org/Projects/gexiv2
It is hosted at: https://gitlab.gnome.org/GNOME/gexiv2/
9. libpng, libjpeg, libtiff, librsvg and lcms are hard dependencies
that can not be disabled. poppler is also a hard dependency because
@@ -175,7 +175,7 @@ help in that regard:
For HTTP support (and many other schemes), on Linux at least, you
should install `gvfs`:
https://wiki.gnome.org/Projects/gvfs
https://gitlab.gnome.org/GNOME/gvfs/
It is unclear whether `gvfs` can be built and installed on other
platforms such as Windows and macOS.
@@ -200,10 +200,22 @@ help in that regard:
https://github.com/strukturag/libheif
Make sure you build libheif with libde265 and libx265 support (for
respectively decoding and encoding of HEVC, i.e. HEIC files), and
libaom decoder and encoder (for AV1, i.e. AVIF files), otherwise
the plug-in is mostly useless.
GIMP supports several HEIF variants (different coding formats in
the HEIF container), so you should make sure you build libheif with
proper encoders and decoders for these:
* HEIC: e.g. libde265 and libx265 support (for
respectively decoding and encoding of HEVC).
* AVIF: e.g. libaom decoder and encoder (for AV1 encoding and
decoding), prefered over rav1e.
* HEJ2: OpenJPEG (for JPEG2000 inside HEIF).
If you don't compile libheif with the correct flags (see libheif
README which has a table of supported codecs), the plug-in is
mostly useless.
If HEIF support doesn't look like it works on relocatable
environments, the environment variable LIBHEIF_PLUGIN_PATH may be
what you are looking for.
15. GObject Introspection requires the following dependencies to be
built and installed with introspection as well: babl, cairo,
@@ -345,9 +357,10 @@ These are:
a convenience for developers.
-Dgimpdir=DIR. This option changes the default directory GIMP uses to
search for its configuration files from ~/.config/GIMP/@GIMP_APP_VERSION@ (the
directory .config/GIMP/@GIMP_APP_VERSION@ in the user's home directory) to
~/.config/DIR/@GIMP_APP_VERSION@.
search for its configuration files from $XDG_CONFIG_HOME/GIMP/@GIMP_APP_VERSION@/
(per XDG Base Directory Specification, $XDG_CONFIG_HOME defaults to
the directory .config/ in the user's home directory) to
$XDG_CONFIG_HOME/DIR/@GIMP_APP_VERSION@/.
If DIR is an absolute path, the directory will be changed to DIR.
-Dshmem-type=[none|sysv|posix|win32|auto]. This option allows you to
@@ -386,10 +399,6 @@ These are:
-Dgi-docgen=enabled|disabled This option controls whether the libgimp
C API references will be created using gi-docgen.
-Dg-ir-doc=true This option controls whether the libgimp API
references for some binding languages will be created using
g-ir-doc-tool and yelp-build.
-Denable-multiproc=false This option allows you to disable support for
multiple processors. It is enabled by default.

3349
NEWS

File diff suppressed because it is too large Load Diff

3519
NEWS.pre-3-0 Normal file

File diff suppressed because it is too large Load Diff

20
README
View File

@@ -1,16 +1,14 @@
------------------------------
GNU Image Manipulation Program
3.0 Release Candidate
3.0 Stable Branch
------------------------------
This is a release candidate for upcoming version 3.0.0 of GIMP.
This is not considered stable yet, unless testing tell us it is.
Therefore save your work early and often. If you want a stable
version, please use GIMP 2.10 instead.
This is a stable release in the GIMP 3.0 series.
If you think you found a bug in this version, please report it! We are
at the verge of releasing the next major version of GIMP, so any report
helps.
If you think you found a bug in this version, please make sure that it
hasn't been reported earlier and that it is not just new stuff that is
still being worked on and obviously not quite finished yet. If neither
of these, please report it!
If you want to hack on GIMP, please read the file devel-docs/README.md.
For detailed installation instructions, see the file INSTALL.
@@ -24,7 +22,7 @@ GIMP's home page is at:
https://www.gimp.org/
Please be sure to visit this site for information, documentation,
tutorials, news, etc. All things GIMP-ish are available from there.
tutorials, news, etc. All things GIMP-ish are available from there.
The latest version of GIMP can be found at:
@@ -81,11 +79,11 @@ also included in that page.
The look of GIMP's interface can be customized like any other GTK+ app
by editing files in `${XDG_CONFIG_HOME}/gtk-3.0/` (settings.ini and
gtk.css in particular) or by using "themes" (ready-made customizations).
Additionally, GIMP reads `${XDG_CONFIG_HOME}/GIMP/2.99/gimp.css` so you
Additionally, GIMP reads `${XDG_CONFIG_HOME}/GIMP/3.0/gimp.css` so you
can have settings that only apply to GIMP.
You can also manually change the keybindings to any of your choice by
editing: `${XDG_CONFIG_HOME}/GIMP/2.99/shortcutsrc`.
editing: `${XDG_CONFIG_HOME}/GIMP/3.0/shortcutsrc`.
Have fun,

View File

@@ -32,11 +32,9 @@ if enable_default_bin
pointing_to: fs.name(gimp_debug_tool.full_path()),
install_dir: gimp_debug_tool_dir)
else
meson.add_install_script('sh', '-c',
'cp -f "@0@" "$MESON_INSTALL_DESTDIR_PREFIX/bin/@1@"'.format(gimp_debug_tool.full_path(),
fs.name(gimp_debug_tool.name()).replace(exec_ver, '.exe')))
meson.add_install_script('sh', '-c',
'cp -f "@0@" "$MESON_INSTALL_DESTDIR_PREFIX/bin/@1@"'.format(gimp_debug_tool.full_path(),
fs.name(gimp_debug_tool.name()).replace(exec_ver, '-@0@.exe'.format(api_version_major))))
meson.add_install_script(python, '-c', 'from shutil import copy2; from pathlib import Path; from sys import argv; copy2(argv[1], str(Path(argv[2]) / "bin" / argv[3]))',
gimp_debug_tool.full_path(), get_option('prefix'), fs.name(gimp_debug_tool.name()).replace(exec_ver, '.exe'))
meson.add_install_script(python, '-c', 'from shutil import copy2; from pathlib import Path; from sys import argv; copy2(argv[1], str(Path(argv[2]) / "bin" / argv[3].replace("@0@", argv[4])))',
gimp_debug_tool.full_path(), get_option('prefix'), fs.name(gimp_debug_tool.name()).replace(exec_ver, '-@0@.exe'), api_version_major.to_string())
endif
endif

View File

@@ -719,7 +719,7 @@ context_brush_radius_cmd_callback (GimpAction *action,
radius = action_select_value (select_type,
radius,
min_radius, 4000.0, min_radius,
min_radius, GIMP_BRUSH_GENERATED_MAX_RADIUS, min_radius,
0.1, 1.0, 10.0, 0.05, FALSE);
gimp_brush_generated_set_radius (generated, radius);

View File

@@ -111,6 +111,9 @@ dashboard_log_record_cmd_callback (GimpAction *action,
GtkWidget *label;
GtkWidget *spinbutton;
GtkWidget *toggle;
GDateTime *datetime;
gchar *timestamp;
gchar *default_filename;
dialog = gtk_file_chooser_dialog_new (
"Record Performance Log", NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
@@ -168,8 +171,19 @@ dashboard_log_record_cmd_callback (GimpAction *action,
GTK_FILE_CHOOSER (dialog), info->folder, NULL);
}
datetime = g_date_time_new_now_local ();
/* Since Windows doesn't allow colons in filenames,
* we use ISO 8601 basic format for the timestamp */
timestamp = g_date_time_format (datetime, "%Y%m%dT%H%M%SZ");
default_filename = g_strdup_printf ("gimp-performance-%s.log",
timestamp);
g_date_time_unref (datetime);
g_free (timestamp);
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog),
"gimp-performance.log");
default_filename);
g_free (default_filename);
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (dialog), hbox);

View File

@@ -403,7 +403,7 @@ edit_paste_cmd_callback (GimpAction *action,
GIMP_PASTE_TYPE_NEW_LAYER :
GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE;
edit_paste (display, converted_type, merged, FALSE);
edit_paste (display, converted_type, merged, TRUE);
}
g_list_free (drawables);

View File

@@ -309,14 +309,34 @@ file_actions_update (GimpActionGroup *group,
if (export)
{
gchar *label = file_actions_create_label (_("Export to %s"), export);
GimpAction *action;
gchar *label = file_actions_create_label (_("Export to %s"),
export);
gimp_action_group_set_action_label (group, "file-export", label);
action = gimp_action_group_get_action (group, "file-export");
g_object_set (action,
"ellipsize", PANGO_ELLIPSIZE_MIDDLE,
"max-width-chars", 40,
NULL);
g_free (label);
}
else if (show_overwrite)
{
gchar *label = file_actions_create_label (_("Over_write %s"), source);
GimpAction *action;
gchar *label = file_actions_create_label (_("Over_write %s"),
source);
gimp_action_group_set_action_label (group, "file-overwrite", label);
action = gimp_action_group_get_action (group, "file-overwrite");
g_object_set (action,
"ellipsize", PANGO_ELLIPSIZE_MIDDLE,
"max-width-chars", 40,
NULL);
g_free (label);
}
else
@@ -381,11 +401,13 @@ file_actions_last_opened_update (GimpContainer *container,
label = g_strdup_printf (_("Open \"%s\""), escaped);
g_object_set (action,
"label", label,
"short-label", escaped,
"tooltip", name,
"visible", TRUE,
"viewable", imagefile,
"label", label,
"short-label", escaped,
"tooltip", name,
"visible", TRUE,
"viewable", imagefile,
"ellipsize", PANGO_ELLIPSIZE_MIDDLE,
"max-width-chars", 40,
NULL);
g_free (label);
@@ -395,10 +417,12 @@ file_actions_last_opened_update (GimpContainer *container,
else
{
g_object_set (action,
"label", name,
"tooltip", NULL,
"visible", FALSE,
"viewable", NULL,
"label", name,
"tooltip", NULL,
"visible", FALSE,
"viewable", NULL,
"ellipsize", PANGO_ELLIPSIZE_MIDDLE,
"max-width-chars", 40,
NULL);
}

View File

@@ -804,7 +804,6 @@ filters_actions_setup (GimpActionGroup *group)
g_free (action_name);
action_name = g_strdup_printf ("filters-%s-%d", formatted_op_name, i++);
}
g_free (formatted_op_name);
title = gegl_operation_class_get_key (op_class, "title");
op_name = op_class->name;
@@ -824,6 +823,13 @@ filters_actions_setup (GimpActionGroup *group)
entry.value = op_class->name;
entry.help_id = GIMP_HELP_TOOL_GEGL;
if (gegl_operation_class_get_key (op_class, "gimp:menu-path") &&
g_str_has_prefix (op_class->name, "gegl:"))
/* We automatically create an help ID from the operation name
* for all core GEGL operations with a menu path key.
*/
entry.help_id = formatted_op_name;
gimp_action_group_add_string_actions (group, "filters-action",
&entry, 1,
filters_apply_interactive_cmd_callback);
@@ -856,6 +862,7 @@ filters_actions_setup (GimpActionGroup *group)
g_free (label);
g_free (action_name);
g_free (formatted_op_name);
}
g_object_set_data_full (G_OBJECT (group),
@@ -1259,12 +1266,26 @@ filters_actions_history_changed (Gimp *gimp,
sensitive = gimp_action_get_sensitive (actual_action, NULL);
g_object_set (action,
"visible", TRUE,
"sensitive", sensitive,
"procedure", proc,
"label", label,
"icon-name", gimp_viewable_get_icon_name (GIMP_VIEWABLE (proc)),
"tooltip", gimp_procedure_get_blurb (proc),
/* It is very important that "visible" is set at the
* end, because the docs says that:
*
* > "notify" signals are queued and only emitted (in reverse order) after all properties have been set.
*
* If "visible" is set before "label" in particular,
* we end up in the inconsistent situation where the
* "visible" callbacks have not been run yet, so
* menus don't have the corresponding item whereas
* the action already shows as visible. In
* particular, g_menu_model_items_changed() may
* crash on an empty item list in GIMP_GTK_MENUBAR
* codepath.
*/
"visible", TRUE,
NULL);
}

View File

@@ -48,6 +48,12 @@
#include "core/gimpsettings.h"
#include "core/gimptoolinfo.h"
#include "widgets/gimpaction.h"
#include "widgets/gimpactiongroup.h"
#include "widgets/gimphelp-ids.h"
#include "widgets/gimpstringaction.h"
#include "widgets/gimpuimanager.h"
#include "tools/gimpoperationtool.h"
#include "tools/tool_manager.h"
@@ -64,6 +70,7 @@ static gint64 gimp_gegl_procedure_get_memsize (GimpObject *object,
static gchar * gimp_gegl_procedure_get_description (GimpViewable *viewable,
gchar **tooltip);
static const gchar * gimp_gegl_procedure_get_help_id (GimpProcedure *procedure);
static const gchar * gimp_gegl_procedure_get_menu_label (GimpProcedure *procedure);
static gboolean gimp_gegl_procedure_get_sensitive (GimpProcedure *procedure,
GimpObject *object,
@@ -103,6 +110,7 @@ gimp_gegl_procedure_class_init (GimpGeglProcedureClass *klass)
viewable_class->default_icon_name = "gimp-gegl";
viewable_class->get_description = gimp_gegl_procedure_get_description;
proc_class->get_help_id = gimp_gegl_procedure_get_help_id;
proc_class->get_menu_label = gimp_gegl_procedure_get_menu_label;
proc_class->get_sensitive = gimp_gegl_procedure_get_sensitive;
proc_class->execute = gimp_gegl_procedure_execute;
@@ -153,6 +161,41 @@ gimp_gegl_procedure_get_description (GimpViewable *viewable,
return g_strdup (gimp_procedure_get_label (procedure));
}
static const gchar *
gimp_gegl_procedure_get_help_id (GimpProcedure *procedure)
{
GimpGeglProcedure *proc = GIMP_GEGL_PROCEDURE (procedure);
GList *managers;
GimpActionGroup *group;
const gchar *help_id = NULL;
managers = gimp_ui_managers_from_name ("<Image>");
group = gimp_ui_manager_get_action_group (managers->data, "filters");
if (procedure->help_id)
{
return procedure->help_id;
}
else if (group)
{
GList *actions;
GList *iter;
actions = gimp_action_group_list_actions (group);
for (iter = actions; iter; iter = iter->next)
if (GIMP_IS_STRING_ACTION (iter->data) &&
g_strcmp0 (GIMP_STRING_ACTION (iter->data)->value, proc->operation) == 0)
{
help_id = gimp_action_get_help_id (iter->data);
break;
}
g_list_free (actions);
}
return help_id == NULL ? GIMP_HELP_TOOL_GEGL : help_id;
}
static const gchar *
gimp_gegl_procedure_get_menu_label (GimpProcedure *procedure)
{

View File

@@ -85,7 +85,7 @@ static const GimpActionEntry image_actions[] =
NC_("image-action", "_Soft-proof Profile..."), NULL, { NULL },
NC_("image-action", "Set the soft-proofing profile"),
image_softproof_profile_cmd_callback,
GIMP_HELP_VIEW_COLOR_MANAGEMENT },
GIMP_HELP_IMAGE_SOFT_PROOF_PROFILE_ASSIGN },
{ "image-color-profile-save", NULL,
NC_("image-action", "_Save Color Profile to File..."), NULL, { NULL },
@@ -176,7 +176,7 @@ static const GimpToggleActionEntry image_toggle_actions[] =
NC_("image-action", "Use black point compensation for soft-proofing"),
image_softproof_bpc_cmd_callback,
TRUE,
GIMP_HELP_VIEW_COLOR_MANAGEMENT }
GIMP_HELP_IMAGE_SOFT_PROOF_BLACK_POINT }
};
static const GimpRadioActionEntry image_convert_base_type_actions[] =
@@ -299,25 +299,25 @@ static const GimpRadioActionEntry image_softproof_intent_actions[] =
NC_("image-action", "_Perceptual"), NULL, { NULL },
NC_("image-action", "Soft-proofing rendering intent is perceptual"),
GIMP_COLOR_RENDERING_INTENT_PERCEPTUAL,
GIMP_HELP_VIEW_COLOR_MANAGEMENT },
GIMP_HELP_IMAGE_SOFT_PROOF_RENDERING_INTENT },
{ "image-softproof-intent-relative-colorimetric", NULL,
NC_("image-action", "_Relative Colorimetric"), NULL, { NULL },
NC_("image-action", "Soft-proofing rendering intent is relative colorimetric"),
GIMP_COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC,
GIMP_HELP_VIEW_COLOR_MANAGEMENT },
GIMP_HELP_IMAGE_SOFT_PROOF_RENDERING_INTENT },
{ "image-softproof-intent-saturation", NULL,
NC_("image-action", "_Saturation"), NULL, { NULL },
NC_("image-action", "Soft-proofing rendering intent is saturation"),
GIMP_COLOR_RENDERING_INTENT_SATURATION,
GIMP_HELP_VIEW_COLOR_MANAGEMENT },
GIMP_HELP_IMAGE_SOFT_PROOF_RENDERING_INTENT },
{ "image-softproof-intent-absolute-colorimetric", NULL,
NC_("image-action", "_Absolute Colorimetric"), NULL, { NULL },
NC_("image-action", "Soft-proofing rendering intent is absolute colorimetric"),
GIMP_COLOR_RENDERING_INTENT_ABSOLUTE_COLORIMETRIC,
GIMP_HELP_VIEW_COLOR_MANAGEMENT }
GIMP_HELP_IMAGE_SOFT_PROOF_RENDERING_INTENT }
};

View File

@@ -271,6 +271,9 @@ layers_edit_attributes_cmd_callback (GimpAction *action,
layer = layers->data;
if (gimp_layer_is_floating_sel (layer))
return;
#define EDIT_DIALOG_KEY "gimp-layer-edit-attributes-dialog"
dialog = dialogs_get_dialog (G_OBJECT (layer), EDIT_DIALOG_KEY);
@@ -832,6 +835,7 @@ layers_duplicate_cmd_callback (GimpAction *action,
gimp_layer_get_parent (iter->data),
gimp_item_get_index (iter->data),
TRUE);
gimp_drawable_enable_resize_undo (GIMP_DRAWABLE (new_layer));
new_layers = g_list_prepend (new_layers, new_layer);
/* Import any attached layer effects */
@@ -943,11 +947,47 @@ layers_merge_group_cmd_callback (GimpAction *action,
for (iter2 = layers; iter2; iter2 = iter2->next)
{
if (iter->data == iter2->data)
continue;
/* Do not merge a layer when we already merge one of its
* ancestors.
*/
if (gimp_viewable_is_ancestor (iter2->data, iter->data))
break;
/* Do not merge a layer which has a little sister (same
* parent and smaller index) or a little cousin (one of
* its ancestors is a little sister) of a pass-through
* group layer.
* These will be rendered and merged through the
* pass-through by definition.
*/
if (gimp_viewable_get_children (GIMP_VIEWABLE (iter2->data)) &&
gimp_layer_get_mode (iter2->data) == GIMP_LAYER_MODE_PASS_THROUGH)
{
GimpLayer *pass_through_parent = gimp_layer_get_parent (iter2->data);
GimpLayer *cousin = iter->data;
gboolean ignore = FALSE;
do
{
GimpLayer *cousin_parent = gimp_layer_get_parent (cousin);
if (pass_through_parent == cousin_parent &&
gimp_item_get_index (GIMP_ITEM (iter2->data)) < gimp_item_get_index (GIMP_ITEM (cousin)))
{
ignore = TRUE;
break;
}
cousin = cousin_parent;
}
while (cousin != NULL);
if (ignore)
break;
}
}
if (iter2 == NULL)
@@ -999,7 +1039,7 @@ layers_delete_cmd_callback (GimpAction *action,
removed_layers = g_list_copy (layers);
/* Removing children layers (they will be removed anyway by removing
* the parent.
* the parent).
*/
for (iter = removed_layers; iter; iter = iter->next)
{

View File

@@ -117,9 +117,7 @@ plug_in_actions_update (GimpActionGroup *group,
{
GimpPlugInProcedure *proc = list->data;
if (proc->menu_label &&
! proc->file_proc &&
proc->image_types_val)
if (proc->menu_label && ! proc->file_proc)
{
GimpProcedure *procedure = GIMP_PROCEDURE (proc);
gboolean sensitive;

View File

@@ -24,6 +24,8 @@
#include "actions-types.h"
#include "operations/gimpoperationsettings.h"
#include "core/gimp.h"
#include "core/gimpimage.h"
#include "core/gimpdrawable.h"
@@ -309,9 +311,13 @@ procedure_commands_get_display_args (GimpProcedure *procedure,
}
}
/* Some filters have a settings object (see filters_settings_actions
* list), which we want to pass around, but we don't want to pass
* other types of object data.
*/
if (gimp_value_array_length (args) > n_args &&
g_type_is_a (G_PARAM_SPEC_VALUE_TYPE (procedure->args[n_args]),
GIMP_TYPE_OBJECT))
GIMP_TYPE_OPERATION_SETTINGS))
{
g_value_set_object (gimp_value_array_index (args, n_args), settings);
n_args++;

View File

@@ -146,7 +146,7 @@ static const GimpActionEntry view_actions[] =
NC_("view-action",
"Reset color management to what's configured in preferences"),
view_color_management_reset_cmd_callback,
GIMP_HELP_VIEW_COLOR_MANAGEMENT },
GIMP_HELP_VIEW_COLOR_MANAGEMENT_RESET },
{ "view-shrink-wrap", GIMP_ICON_VIEW_SHRINK_WRAP,
NC_("view-action", "Shrink _Wrap"), NULL, { "<primary>J", NULL },
@@ -183,21 +183,21 @@ static const GimpToggleActionEntry view_toggle_actions[] =
NC_("view-action", "Use color management for this view"),
view_color_management_enable_cmd_callback,
TRUE,
GIMP_HELP_VIEW_COLOR_MANAGEMENT },
GIMP_HELP_VIEW_COLOR_MANAGE_VIEW },
{ "view-color-management-softproof", NULL,
NC_("view-action", "_Proof Colors"), NULL, { NULL },
NC_("view-action", "Use this view for soft-proofing"),
view_color_management_softproof_cmd_callback,
FALSE,
GIMP_HELP_VIEW_COLOR_MANAGEMENT },
GIMP_HELP_VIEW_SOFT_PROOF_VIEW },
{ "view-display-black-point-compensation", NULL,
NC_("view-action", "_Black Point Compensation"), NULL, { NULL },
NC_("view-action", "Use black point compensation for image display"),
view_display_bpc_cmd_callback,
TRUE,
GIMP_HELP_VIEW_COLOR_MANAGEMENT },
GIMP_HELP_VIEW_SOFT_PROOF_BLACK_POINT },
{ "view-softproof-gamut-check", NULL,
NC_("view-action", "_Mark Out Of Gamut Colors"), NULL, { NULL },
@@ -205,7 +205,7 @@ static const GimpToggleActionEntry view_toggle_actions[] =
"be represented in the target color space"),
view_softproof_gamut_check_cmd_callback,
FALSE,
GIMP_HELP_VIEW_COLOR_MANAGEMENT },
GIMP_HELP_VIEW_MARK_OUT_OF_GAMUT },
{ "view-show-selection", NULL,
NC_("view-action", "Show _Selection"), NULL, { "<primary>T", NULL },
@@ -522,25 +522,25 @@ static const GimpRadioActionEntry view_display_intent_actions[] =
NC_("view-action", "_Perceptual"), NULL, { NULL },
NC_("view-action", "Display rendering intent is perceptual"),
GIMP_COLOR_RENDERING_INTENT_PERCEPTUAL,
GIMP_HELP_VIEW_COLOR_MANAGEMENT },
GIMP_HELP_VIEW_SOFT_PROOF_RENDERING_INTENT },
{ "view-display-intent-relative-colorimetric", NULL,
NC_("view-action", "_Relative Colorimetric"), NULL, { NULL },
NC_("view-action", "Display rendering intent is relative colorimetric"),
GIMP_COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC,
GIMP_HELP_VIEW_COLOR_MANAGEMENT },
GIMP_HELP_VIEW_SOFT_PROOF_RENDERING_INTENT },
{ "view-display-intent-saturation", NULL,
NC_("view-action", "_Saturation"), NULL, { NULL },
NC_("view-action", "Display rendering intent is saturation"),
GIMP_COLOR_RENDERING_INTENT_SATURATION,
GIMP_HELP_VIEW_COLOR_MANAGEMENT },
GIMP_HELP_VIEW_SOFT_PROOF_RENDERING_INTENT },
{ "view-display-intent-absolute-colorimetric", NULL,
NC_("view-action", "_Absolute Colorimetric"), NULL, { NULL },
NC_("view-action", "Display rendering intent is absolute colorimetric"),
GIMP_COLOR_RENDERING_INTENT_ABSOLUTE_COLORIMETRIC,
GIMP_HELP_VIEW_COLOR_MANAGEMENT }
GIMP_HELP_VIEW_SOFT_PROOF_RENDERING_INTENT }
};
static const GimpEnumActionEntry view_padding_color_actions[] =

View File

@@ -451,6 +451,11 @@ windows_actions_update_display_accels (GimpActionGroup *group)
gchar *tooltip;
gchar *accel;
g_object_set (action,
"ellipsize", PANGO_ELLIPSIZE_MIDDLE,
"max-width-chars", 40,
NULL);
if (i < 9)
accel = gtk_accelerator_name (GDK_KEY_1 + i, GDK_MOD1_MASK);
else

View File

@@ -88,8 +88,6 @@ static void app_init_update_noop (const gchar *text1,
gdouble percentage);
static void app_activate_callback (GimpCoreApp *app,
gpointer user_data);
static void app_restore_after_callback (Gimp *gimp,
GimpInitStatusFunc status_callback);
static gboolean app_exit_after_callback (Gimp *gimp,
gboolean kill_it,
GApplication *app);
@@ -106,11 +104,6 @@ GType gimp_convert_dither_type_compat_get_type (void); /* compat cruft */
#endif
/* local variables */
static GObject *initial_monitor = NULL;
/* public functions */
void
@@ -306,14 +299,6 @@ app_run (const gchar *full_prog_name,
/* initialize lowlevel stuff */
gimp_gegl_init (gimp);
/* Connect our restore_after callback before gui_init() connects
* theirs, so ours runs first and can grab the initial monitor
* before the GUI's restore_after callback resets it.
*/
g_signal_connect_after (gimp, "restore",
G_CALLBACK (app_restore_after_callback),
NULL);
g_signal_connect_after (gimp, "exit",
G_CALLBACK (app_exit_after_callback),
app);
@@ -439,7 +424,7 @@ app_activate_callback (GimpCoreApp *app,
NULL,
file,
gimp_core_app_get_as_new (app),
initial_monitor,
NULL,
&status, &error);
if (image)
{
@@ -494,7 +479,7 @@ app_activate_callback (GimpCoreApp *app,
file_open_from_command_line (gimp, file,
gimp_core_app_get_as_new (app),
initial_monitor);
NULL);
g_object_unref (file);
}
@@ -554,20 +539,6 @@ app_activate_callback (GimpCoreApp *app,
}
}
static void
app_restore_after_callback (Gimp *gimp,
GimpInitStatusFunc status_callback)
{
gint dummy;
/* Getting the display name for a -1 display returns the initial
* monitor during startup. Need to call this from a restore_after
* callback, because before restore(), the GUI can't return anything,
* after after restore() the initial monitor gets reset.
*/
g_free (gimp_get_display_name (gimp, -1, &initial_monitor, &dummy));
}
static gboolean
app_exit_after_callback (Gimp *gimp,
gboolean kill_it,
@@ -576,29 +547,8 @@ app_exit_after_callback (Gimp *gimp,
if (gimp->be_verbose)
g_print ("EXIT: %s\n", G_STRFUNC);
/*
* In releases, we simply call exit() here. This speeds up the
* process of quitting GIMP and also works around the problem that
* plug-ins might still be running.
*
* In unstable releases, we shut down GIMP properly in an attempt
* to catch possible problems in our finalizers.
*/
#ifdef GIMP_RELEASE
gimp_gegl_exit (gimp);
gegl_exit ();
exit (gimp_core_app_get_exit_status (GIMP_CORE_APP (app)));
#else
g_application_quit (G_APPLICATION (app));
#endif
return FALSE;
}

View File

@@ -506,15 +506,13 @@ dump_describe_param (GParamSpec *param_spec)
}
else if (GIMP_IS_PARAM_SPEC_UNIT (param_spec))
{
GimpParamSpecUnit *uspec = GIMP_PARAM_SPEC_UNIT (param_spec);
if (uspec->allow_pixel && uspec->allow_percent)
if (gimp_param_spec_unit_pixel_allowed (param_spec) && gimp_param_spec_unit_percent_allowed (param_spec))
values = "The unit can be one inches, millimeters, points or picas plus "
"those in your user units database. Pixel And Percent units are allowed too.";
else if (uspec->allow_pixel)
else if (gimp_param_spec_unit_pixel_allowed (param_spec))
values = "The unit can be one inches, millimeters, points or picas plus "
"those in your user units database. Pixel unit is allowed too.";
else if (uspec->allow_percent)
else if (gimp_param_spec_unit_percent_allowed (param_spec))
values = "The unit can be one inches, millimeters, points or picas plus "
"those in your user units database. Percent unit is allowed too.";
else

View File

@@ -136,8 +136,9 @@ gimp_edit_cut (GimpImage *image,
/* Remove layers from source image. */
for (iter = drawables; iter; iter = iter->next)
gimp_image_remove_layer (image, GIMP_LAYER (iter->data),
TRUE, NULL);
if (! gimp_layer_is_floating_sel (iter->data))
gimp_image_remove_layer (image, GIMP_LAYER (iter->data),
TRUE, NULL);
g_list_free (drawables);
}
@@ -285,7 +286,6 @@ gimp_edit_copy (GimpImage *image,
clip_image = gimp_image_new_from_drawables (image->gimp, drawables, TRUE, TRUE);
gimp_container_remove (image->gimp->images, GIMP_OBJECT (clip_image));
gimp_set_clipboard_image (image->gimp, clip_image);
g_object_unref (clip_image);
g_list_free (drawables);
clip_selection = gimp_image_get_mask (clip_image);
@@ -339,10 +339,14 @@ gimp_edit_copy (GimpImage *image,
}
g_list_free (all_items);
/* We need to keep the image size as-is, because even after cropping
* layers to selection, their offset stay important for in-place paste
* variants. Yet we also need to store the dimensions where we'd have
* cropped the image for the "Paste as New Image" action.
gimp_image_undo_disable (clip_image);
gimp_image_resize_to_layers (clip_image, context, NULL, NULL, NULL,
NULL, NULL);
gimp_image_undo_enable (clip_image);
/* We need to store the original offsets before the image was
* resized, in order to move it into the correct location for
* in-place pasting.
*/
g_object_set_data (G_OBJECT (clip_image),
"gimp-edit-new-image-x",
@@ -350,15 +354,10 @@ gimp_edit_copy (GimpImage *image,
g_object_set_data (G_OBJECT (clip_image),
"gimp-edit-new-image-y",
GINT_TO_POINTER (selection_bounds.y));
g_object_set_data (G_OBJECT (clip_image),
"gimp-edit-new-image-width",
GINT_TO_POINTER (selection_bounds.width));
g_object_set_data (G_OBJECT (clip_image),
"gimp-edit-new-image-height",
GINT_TO_POINTER (selection_bounds.height));
}
/* Remove selection from the clipboard image. */
gimp_channel_clear (clip_selection, NULL, FALSE);
g_object_unref (clip_image);
return GIMP_OBJECT (gimp_get_clipboard_image (image->gimp));
}
@@ -1062,7 +1061,16 @@ gimp_edit_paste (GimpImage *image,
if (gimp_edit_paste_is_in_place (paste_type))
{
if (GIMP_IS_BUFFER (paste))
offset_x = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (paste),
"gimp-edit-new-image-x"));
offset_y = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (paste),
"gimp-edit-new-image-y"));
if (offset_x != 0 || offset_y != 0)
{
use_offset = TRUE;
}
else if (GIMP_IS_BUFFER (paste))
{
GimpBuffer *buffer = GIMP_BUFFER (paste);
@@ -1101,35 +1109,9 @@ gimp_edit_paste_as_new_image (Gimp *gimp,
g_return_val_if_fail (GIMP_IS_IMAGE (paste) || GIMP_IS_BUFFER (paste), NULL);
if (GIMP_IS_IMAGE (paste))
{
gint offset_x;
gint offset_y;
gint new_width;
gint new_height;
offset_x = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (paste),
"gimp-edit-new-image-x"));
offset_y = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (paste),
"gimp-edit-new-image-y"));
new_width = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (paste),
"gimp-edit-new-image-width"));
new_height = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (paste),
"gimp-edit-new-image-height"));
image = gimp_image_duplicate (GIMP_IMAGE (paste));
if (new_width > 0 && new_height > 0)
{
gimp_image_undo_disable (image);
gimp_image_resize (image, context,
new_width, new_height,
-offset_x, -offset_y,
NULL);
gimp_image_undo_enable (image);
}
}
image = gimp_image_duplicate (GIMP_IMAGE (paste));
else if (GIMP_IS_BUFFER (paste))
{
image = gimp_image_new_from_buffer (gimp, GIMP_BUFFER (paste));
}
image = gimp_image_new_from_buffer (gimp, GIMP_BUFFER (paste));
return image;
}

View File

@@ -952,6 +952,7 @@ user_update_sessionrc (const GMatchInfo *matched_value,
}
#define GIMPRC_UPDATE_PATTERN \
"\\(show-tooltips [^)]*\\)" "|" \
"\\(theme [^)]*\\)" "|" \
"^ *\\(.*-path \".*\"\\) *$" "|" \
"\\(style solid\\)" "|" \
@@ -983,6 +984,8 @@ user_update_gimprc (const GMatchInfo *matched_value,
}
else
{
/* Do not migrate show-tooltips GIMP < 3.0. Cf. #1965. */
/* Do not migrate paths and themes from GIMP < 3.0. */
/* Do not migrate the advanced color options which was the gamma

View File

@@ -745,31 +745,54 @@ gimp_file_is_executable (GFile *file)
gchar *
gimp_file_get_extension (GFile *file)
{
gchar *uri;
gint uri_len;
gchar *ext = NULL;
gint search_len;
GFileInfo *info;
gchar *basename;
gint basename_len;
gchar *ext = NULL;
gint search_len;
g_return_val_if_fail (G_IS_FILE (file), NULL);
uri = g_file_get_uri (file);
uri_len = strlen (uri);
/* Certain cloud providers return a blob name rather than the
* actual file with g_file_get_uri (). Since we don't check
* the magic numbers for remote files, we can't open it. The
* actual name is stored as "display-name" in all cases, so we
* use that instead. */
info = g_file_query_info (file,
G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME,
0, NULL, NULL);
if (g_str_has_suffix (uri, ".gz"))
search_len = uri_len - 3;
else if (g_str_has_suffix (uri, ".bz2"))
search_len = uri_len - 4;
else if (g_str_has_suffix (uri, ".xz"))
search_len = uri_len - 3;
if (info != NULL)
basename =
g_file_info_get_attribute_as_string (info,
G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME);
else
search_len = uri_len;
basename = g_file_get_basename (file);
ext = g_strrstr_len (uri, search_len, ".");
g_clear_object (&info);
/* When making a temporary file for saving/exporting, we may not
* have the display-name yet, so let's fallback to the URI */
if (! basename)
basename = g_file_get_uri (file);
basename_len = strlen (basename);
if (g_str_has_suffix (basename, ".gz"))
search_len = basename_len - 3;
else if (g_str_has_suffix (basename, ".bz2"))
search_len = basename_len - 4;
else if (g_str_has_suffix (basename, ".xz"))
search_len = basename_len - 3;
else
search_len = basename_len;
ext = g_strrstr_len (basename, search_len, ".");
if (ext)
ext = g_strdup (ext);
g_free (uri);
g_free (basename);
return ext;
}

View File

@@ -63,6 +63,7 @@
#include "gimpgradient.h"
#include "gimpidtable.h"
#include "gimpimage.h"
#include "gimpimage-metadata.h"
#include "gimpimagefile.h"
#include "gimplist.h"
#include "gimpmarshal.h"
@@ -373,8 +374,6 @@ gimp_dispose (GObject *object)
g_clear_object (&gimp->edit_config);
g_clear_object (&gimp->config);
gimp_contexts_exit (gimp);
g_clear_object (&gimp->image_new_last_template);
G_OBJECT_CLASS (parent_class)->dispose (object);
@@ -912,6 +911,8 @@ gimp_exit (Gimp *gimp,
if (handled)
return;
gimp_contexts_exit (gimp);
g_idle_add_full (G_PRIORITY_LOW,
(GSourceFunc) gimp_exit_idle_cleanup_stray_images,
gimp, NULL);
@@ -1036,12 +1037,17 @@ gimp_create_image (Gimp *gimp,
GimpPrecision precision,
gboolean attach_comment)
{
GimpImage *image;
GimpImage *image;
GimpMetadata *metadata;
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
image = gimp_image_new (gimp, width, height, type, precision);
metadata = gimp_metadata_new ();
gimp_image_set_metadata (image, metadata, FALSE);
g_object_unref (metadata);
if (attach_comment)
{
const gchar *comment;

View File

@@ -905,9 +905,10 @@ gimp_brush_load_abr_brush_v6 (GDataInputStream *input,
width, height, depth, compress);
#endif
if (width < 1 || width > 10000 ||
height < 1 || height > 10000 ||
depth < 1 || depth > 1 ||
if (width < 1 || width > 10000 ||
height < 1 || height > 10000 ||
(compress && depth != 1) ||
(! compress && (depth < 1 || depth > 2)) ||
G_MAXSIZE / width / height / depth < 1)
{
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
@@ -952,13 +953,43 @@ gimp_brush_load_abr_brush_v6 (GDataInputStream *input,
/* not compressed - read raw bytes as brush data */
gsize bytes_read;
if (! g_input_stream_read_all (G_INPUT_STREAM (input),
mask, size,
&bytes_read, NULL, error) ||
bytes_read != size)
if (depth == 1)
{
g_object_unref (brush);
return NULL;
if (! g_input_stream_read_all (G_INPUT_STREAM (input),
mask, size,
&bytes_read, NULL, error) ||
bytes_read != size)
{
g_object_unref (brush);
return NULL;
}
}
else if (depth == 2)
{
/* TODO: For now, convert to 8 bit representation */
guchar *mask_f = g_new0 (guchar, width * height * depth);
if (! g_input_stream_read_all (G_INPUT_STREAM (input),
mask_f, size,
&bytes_read, NULL, error) ||
bytes_read != size)
{
g_object_unref (brush);
g_free (mask_f);
return NULL;
}
for (gint i = 0; i < size; i += 2)
{
guint16 *temp = (guint16 *) &mask_f[i];
gfloat temp_f = (gfloat) GUINT16_FROM_LE (temp[0]);
temp_f = CLAMP (temp_f / G_MAXUINT16, 0.0, 1.0);
mask[i / 2] = (guchar) (temp_f * 255);
}
g_free (mask_f);
}
}
else

View File

@@ -31,8 +31,11 @@
#include "gimpbuffer.h"
#include "gimpbrush-private.h"
#include "gimpbrushclipboard.h"
#include "gimpchannel.h"
#include "gimpcontext.h"
#include "gimpimage.h"
#include "gimppickable.h"
#include "gimpselection.h"
#include "gimptempbuf.h"
#include "gimp-intl.h"
@@ -203,7 +206,8 @@ gimp_brush_clipboard_changed (Gimp *gimp,
GimpBrush *brush)
{
GimpObject *paste;
GeglBuffer *buffer = NULL;
GeglBuffer *buffer = NULL;
gboolean unref_buffer = FALSE;
gint width;
gint height;
@@ -214,8 +218,37 @@ gimp_brush_clipboard_changed (Gimp *gimp,
if (GIMP_IS_IMAGE (paste))
{
GimpContext *context = gimp_get_user_context (gimp);
gimp_pickable_flush (GIMP_PICKABLE (paste));
buffer = gimp_pickable_get_buffer (GIMP_PICKABLE (paste));
if (context)
{
GimpChannel *mask = gimp_image_get_mask (GIMP_IMAGE (paste));
if (! gimp_channel_is_empty (mask))
{
GList *pickables;
gint offset_x;
gint offset_y;
pickables = g_list_prepend (NULL, GIMP_IMAGE (paste));
buffer = gimp_selection_extract (GIMP_SELECTION (mask),
pickables, context,
FALSE, FALSE, FALSE,
&offset_x, &offset_y,
NULL);
g_list_free (pickables);
unref_buffer = TRUE;
}
else
{
buffer = gimp_pickable_get_buffer (GIMP_PICKABLE (paste));
}
}
else
{
buffer = gimp_pickable_get_buffer (GIMP_PICKABLE (paste));
}
}
else if (GIMP_IS_BUFFER (paste))
{
@@ -280,6 +313,9 @@ gimp_brush_clipboard_changed (Gimp *gimp,
gimp_temp_buf_get_data (brush->priv->pixmap),
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
}
if (unref_buffer)
g_object_unref (buffer);
}
else
{

View File

@@ -141,7 +141,9 @@ gimp_brush_generated_class_init (GimpBrushGeneratedClass *klass)
g_object_class_install_property (object_class, PROP_RADIUS,
g_param_spec_double ("radius", NULL,
_("Brush Radius"),
0.1, 4000.0, 5.0,
GIMP_BRUSH_GENERATED_MIN_RADIUS,
GIMP_BRUSH_GENERATED_MAX_RADIUS,
5.0,
GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
@@ -733,7 +735,7 @@ gimp_brush_generated_set_radius (GimpBrushGenerated *brush,
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
radius = CLAMP (radius, 0.0, 32767.0);
radius = CLAMP (radius, GIMP_BRUSH_GENERATED_MIN_RADIUS, GIMP_BRUSH_GENERATED_MAX_RADIUS);
if (brush->radius != radius)
{

View File

@@ -32,6 +32,10 @@
#define GIMP_BRUSH_GENERATED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_BRUSH_GENERATED, GimpBrushGeneratedClass))
/* When changing these values, also update it in pdb/groups/brush.pdb */
#define GIMP_BRUSH_GENERATED_MIN_RADIUS 0.1
#define GIMP_BRUSH_GENERATED_MAX_RADIUS 4000.0
typedef struct _GimpBrushGeneratedClass GimpBrushGeneratedClass;
struct _GimpBrushGenerated

View File

@@ -194,7 +194,19 @@ gimp_drawable_edit_fill (GimpDrawable *drawable,
{
gimp_drawable_edit_fill_direct (drawable, options, undo_desc);
gimp_drawable_update (drawable, x, y, width, height);
if (gimp_drawable_has_visible_filters (drawable))
{
/* For drawables with filters, update the bounding box then
* let the drawable update everything, because the filtered
* render may be bigger than the filled part.
*/
gimp_drawable_update_bounding_box (drawable);
gimp_drawable_update (drawable, 0, 0, -1, -1);
}
else
{
gimp_drawable_update (drawable, x, y, width, height);
}
}
else
{

View File

@@ -163,13 +163,10 @@ gimp_drawable_get_preview_format (GimpDrawable *drawable)
switch (gimp_drawable_get_base_type (drawable))
{
case GIMP_GRAY:
return gimp_babl_format (GIMP_GRAY,
gimp_babl_precision (GIMP_COMPONENT_TYPE_U8,
trc),
alpha, space);
case GIMP_RGB:
case GIMP_GRAY:
return gimp_drawable_get_format (drawable);
case GIMP_INDEXED:
return gimp_babl_format (GIMP_RGB,
gimp_babl_precision (GIMP_COMPONENT_TYPE_U8,

View File

@@ -167,6 +167,7 @@ static void gimp_drawable_real_update (GimpDrawable *drawable,
gint width,
gint height);
static void gimp_drawable_real_filters_changed (GimpDrawable *drawable);
static gint64 gimp_drawable_real_estimate_memsize (GimpDrawable *drawable,
GimpComponentType component_type,
gint width,
@@ -310,7 +311,7 @@ gimp_drawable_class_init (GimpDrawableClass *klass)
klass->format_changed = NULL;
klass->alpha_changed = NULL;
klass->bounding_box_changed = NULL;
klass->filters_changed = NULL;
klass->filters_changed = gimp_drawable_real_filters_changed;
klass->estimate_memsize = gimp_drawable_real_estimate_memsize;
klass->update_all = gimp_drawable_real_update_all;
klass->invalidate_boundary = NULL;
@@ -763,6 +764,30 @@ gimp_drawable_rotate (GimpItem *item,
new_off_x, new_off_y, FALSE);
g_object_unref (buffer);
}
if (GIMP_IS_LAYER (drawable))
{
GList *list;
gint width = gimp_item_get_width (GIMP_ITEM (drawable));
gint height = gimp_item_get_height (GIMP_ITEM (drawable));
for (list = GIMP_LIST (drawable->private->filter_stack)->queue->tail;
list; list = g_list_previous (list))
{
if (GIMP_IS_DRAWABLE_FILTER (list->data))
{
GimpDrawableFilter *filter = list->data;
GimpChannel *mask = GIMP_CHANNEL (gimp_drawable_filter_get_mask (filter));
GeglRectangle rect = {0, 0, width, height};
/* Don't resize partial layer effects */
if (gimp_channel_is_empty (mask))
gimp_drawable_filter_refresh_crop (filter, &rect);
}
}
if (list)
g_list_free (list);
}
}
static void
@@ -871,6 +896,12 @@ gimp_drawable_real_update (GimpDrawable *drawable,
gimp_viewable_invalidate_preview (GIMP_VIEWABLE (drawable));
}
static void
gimp_drawable_real_filters_changed (GimpDrawable *drawable)
{
gimp_drawable_update_bounding_box (drawable);
}
static gint64
gimp_drawable_real_estimate_memsize (GimpDrawable *drawable,
GimpComponentType component_type,

View File

@@ -38,6 +38,8 @@
#include "core-types.h"
#include "operations/gimp-operation-config.h"
#include "gegl/gimp-babl.h"
#include "gegl/gimpapplicator.h"
#include "gegl/gimp-gegl-utils.h"
@@ -68,6 +70,8 @@ enum
PROP_DRAWABLE,
PROP_MASK,
PROP_CUSTOM_NAME,
PROP_TEMPORARY,
PROP_TO_BE_MERGED,
N_PROPS
};
@@ -110,6 +114,10 @@ struct _GimpDrawableFilter
GeglNode *crop_before;
GeglNode *crop_after;
GimpApplicator *applicator;
gboolean is_temporary;
/* This is mirroring merge_filter option of GimpFilterOptions. */
gboolean to_be_merged;
};
static void gimp_drawable_filter_set_property (GObject *object,
@@ -217,6 +225,15 @@ gimp_drawable_filter_class_init (GimpDrawableFilterClass *klass)
FALSE,
GIMP_PARAM_READWRITE);
drawable_filter_props[PROP_TEMPORARY] = g_param_spec_boolean ("temporary",
NULL, NULL,
FALSE,
GIMP_PARAM_READWRITE);
drawable_filter_props[PROP_TO_BE_MERGED] = g_param_spec_boolean ("to-be-merged",
NULL, NULL,
FALSE,
GIMP_PARAM_READWRITE);
g_object_class_install_properties (object_class, N_PROPS, drawable_filter_props);
}
@@ -273,6 +290,15 @@ gimp_drawable_filter_set_property (GObject *object,
filter->has_custom_name = g_value_get_boolean (value);
break;
case PROP_TEMPORARY:
filter->is_temporary = g_value_get_boolean (value);
break;
case PROP_TO_BE_MERGED:
filter->to_be_merged = g_value_get_boolean (value);
gimp_drawable_filter_sync_format (filter);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -298,6 +324,12 @@ gimp_drawable_filter_get_property (GObject *object,
case PROP_CUSTOM_NAME:
g_value_set_boolean (value, filter->has_custom_name);
break;
case PROP_TEMPORARY:
g_value_set_boolean (value, filter->is_temporary);
break;
case PROP_TO_BE_MERGED:
g_value_set_boolean (value, filter->to_be_merged);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -754,9 +786,12 @@ gimp_drawable_filter_set_preview_split (GimpDrawableFilter *filter,
}
}
/* This function is mostly for usage by libgimp API. The idea is to have
/* This function is **ONLY** for usage by libgimp API. The idea is to have
* a single function which updates a bunch of settings in a single call
* and in particular a single rendering update.
*
* Also it does some funky config object switch for custom operations
* which is only needed libgimp-side.
*/
gboolean
gimp_drawable_filter_update (GimpDrawableFilter *filter,
@@ -771,8 +806,12 @@ gimp_drawable_filter_update (GimpDrawableFilter *filter,
const GimpDrawable **auxinputs,
GError **error)
{
GimpImage *image;
GimpObject *settings = NULL;
GeglNode *node = NULL;
GParamSpec **pspecs;
gchar *opname;
guint n_parent_pspecs = 0;
guint n_pspecs;
gint n_values;
gint n_auxinputs;
@@ -807,14 +846,55 @@ gimp_drawable_filter_update (GimpDrawableFilter *filter,
gegl_node_get (filter->operation, "operation", &opname, NULL);
pspecs = gegl_operation_list_properties (opname, &n_pspecs);
for (gint i = 0; i < n_pspecs; i++)
image = gimp_item_get_image (GIMP_ITEM (filter->drawable));
node = gimp_drawable_filter_get_operation (filter);
if (gimp_operation_config_is_custom (image->gimp, opname))
{
GObjectClass *klass;
GObjectClass *parent_klass;
gegl_node_get (node,
"config", &settings,
NULL);
klass = G_OBJECT_GET_CLASS (settings);
parent_klass = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
g_free (g_object_class_list_properties (parent_klass, &n_parent_pspecs));
pspecs = g_object_class_list_properties (G_OBJECT_GET_CLASS (settings), &n_pspecs);
}
else
{
pspecs = gegl_operation_list_properties (opname, &n_pspecs);
}
for (gint i = n_parent_pspecs; i < n_pspecs; i++)
{
GParamSpec *target_pspec;
GParamSpec *pspec = pspecs[i];
GValue old_value = G_VALUE_INIT;
gint j;
gegl_node_get_property (filter->operation, pspec->name, &old_value);
if (settings)
target_pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (settings), pspec->name);
else
target_pspec = gegl_node_find_property (node, pspec->name);
if (! target_pspec)
{
/* If this ever happens, this is more likely a bug in our
* PDB code, unless someone tried to call the PDB procedure
* directly with bad data.
*/
g_set_error (error, GIMP_ERROR, GIMP_FAILED,
/* TODO: localize after string freeze. */
"GEGL operation '%s' has been called with a "
"non-existent argument name '%s' (#%d).",
opname, pspec->name, i);
break;
}
if (settings)
g_object_get_property (G_OBJECT (settings), pspec->name, &old_value);
else
gegl_node_get_property (node, pspec->name, &old_value);
for (j = 0; j < n_values; j++)
if (g_strcmp0 (pspec->name, propnames[j]) == 0)
@@ -882,7 +962,10 @@ gimp_drawable_filter_update (GimpDrawableFilter *filter,
if (g_param_values_cmp (pspec, new_value, &old_value) != 0)
{
gegl_node_set_property (filter->operation, pspec->name, new_value);
if (settings)
g_object_set_property (G_OBJECT (settings), pspec->name, new_value);
else
gegl_node_set_property (node, pspec->name, new_value);
changed = TRUE;
}
@@ -898,7 +981,10 @@ gimp_drawable_filter_update (GimpDrawableFilter *filter,
g_value_init (&default_value, pspec->value_type);
g_param_value_set_default (pspec, &default_value);
gegl_node_set_property (filter->operation, pspec->name, &default_value);
if (settings)
g_object_set_property (G_OBJECT (settings), pspec->name, &default_value);
else
gegl_node_set_property (node, pspec->name, &default_value);
changed = TRUE;
g_value_unset (&default_value);
@@ -936,7 +1022,7 @@ gimp_drawable_filter_update (GimpDrawableFilter *filter,
GeglNode *src_node;
GeglBuffer *buffer;
if (! gegl_node_has_pad (filter->operation, auxinputnames[i]))
if (! gegl_node_has_pad (node, auxinputnames[i]))
{
g_set_error (error, GIMP_ERROR, GIMP_FAILED,
/* TODO: localize after string freeze. */
@@ -949,18 +1035,22 @@ gimp_drawable_filter_update (GimpDrawableFilter *filter,
buffer = gimp_drawable_get_buffer (GIMP_DRAWABLE (auxinputs[i]));
g_object_ref (buffer);
src_node = gegl_node_new_child (gegl_node_get_parent (filter->operation),
src_node = gegl_node_new_child (gegl_node_get_parent (node),
"operation", "gegl:buffer-source",
"buffer", buffer,
NULL);
g_object_unref (buffer);
gegl_node_connect (src_node, "output", filter->operation, auxinputnames[i]);
gegl_node_connect (src_node, "output", node, auxinputnames[i]);
}
}
if (settings)
gegl_node_set (node, "config", settings, NULL);
g_object_thaw_notify (G_OBJECT (filter));
g_clear_object (&settings);
g_free (pspecs);
g_free (opname);
@@ -1022,11 +1112,7 @@ gimp_drawable_filter_set_add_alpha (GimpDrawableFilter *filter,
if (add_alpha != filter->add_alpha)
{
filter->add_alpha = add_alpha;
gimp_drawable_filter_sync_format (filter);
if (gimp_drawable_filter_is_active (filter))
gimp_drawable_filter_update_drawable (filter, NULL);
}
}
@@ -1298,6 +1384,30 @@ gimp_drawable_filter_sync_clip (GimpDrawableFilter *filter,
static void
gimp_drawable_filter_sync_region (GimpDrawableFilter *filter)
{
GimpContainer *filters;
gboolean first_filter = FALSE;
filters = gimp_drawable_get_filters (filter->drawable);
/* The first test is because the filter might not be added yet. */
if (GIMP_LIST (filters)->queue->tail != NULL &&
filter == GIMP_LIST (filters)->queue->tail->data)
{
GimpDrawableFilter *next_filter = NULL;
if (GIMP_LIST (filters)->queue->head->next)
next_filter = GIMP_LIST (filters)->queue->tail->prev->data;
if (next_filter)
/* If the current filter became the first after a reorder, we
* want to re-sync the next filter which was the first filter
* just before.
*/
gimp_drawable_filter_sync_region (next_filter);
first_filter = TRUE;
}
if (filter->region == GIMP_FILTER_REGION_SELECTION)
{
if (filter->has_input)
@@ -1307,10 +1417,16 @@ gimp_drawable_filter_sync_region (GimpDrawableFilter *filter)
"y", (gdouble) -filter->filter_area.y,
NULL);
gegl_node_set (filter->crop_before,
"width", (gdouble) filter->filter_area.width,
"height", (gdouble) filter->filter_area.height,
NULL);
if (first_filter)
gegl_node_set (filter->crop_before,
"operation", "gegl:crop",
"width", (gdouble) filter->filter_area.width,
"height", (gdouble) filter->filter_area.height,
NULL);
else
gegl_node_set (filter->crop_before,
"operation", "gegl:nop",
NULL);
}
if (filter->filter_clip)
@@ -1347,10 +1463,16 @@ gimp_drawable_filter_sync_region (GimpDrawableFilter *filter)
"y", (gdouble) 0.0,
NULL);
gegl_node_set (filter->crop_before,
"width", width,
"height", height,
NULL);
if (first_filter)
gegl_node_set (filter->crop_before,
"operation", "gegl:crop",
"width", width,
"height", height,
NULL);
else
gegl_node_set (filter->crop_before,
"operation", "gegl:nop",
NULL);
}
if (filter->filter_clip)
@@ -1528,40 +1650,35 @@ gimp_drawable_filter_sync_affect (GimpDrawableFilter *filter)
static void
gimp_drawable_filter_sync_format (GimpDrawableFilter *filter)
{
const Babl *format = NULL;
GimpContainer *filters;
const Babl *format = NULL;
gboolean changed;
filters = gimp_drawable_get_filters (filter->drawable);
g_return_if_fail (GIMP_LIST (filters)->queue->head != NULL);
if (filter == GIMP_LIST (filters)->queue->head->data)
/* We only convert back to drawable format when the filter is planned
* to be merged, to simulate how it would look like once it happens.
*
* On the other hand, when a filter is meant to stay on the stack,
* non-destructively, the output might be higher bit depth and there
* is no reason to demote it back.
*
* XXX: actually we might want to do this after the last layer mode
* node, no? Otherwise the display render might be better in some case
* than when the whole image is actually flattened into a single
* buffer. But maybe that's what some people would want?
*/
if (filter->to_be_merged)
{
/* We only want to convert back to the source format at the very
* end, and keep an as-high-bit-depth as possible format during
* multi-filter processing.
*/
GimpDrawableFilter *next_filter = NULL;
if (GIMP_LIST (filters)->queue->head->next)
next_filter = GIMP_LIST (filters)->queue->head->next->data;
if (filter->add_alpha &&
(gimp_drawable_supports_alpha (filter->drawable) ||
filter->override_constraints))
{
format = gimp_drawable_get_format_with_alpha (filter->drawable);
}
format = gimp_drawable_get_format_with_alpha (filter->drawable);
else
{
format = gimp_drawable_get_format (filter->drawable);
}
if (next_filter)
gimp_drawable_filter_sync_format (next_filter);
format = gimp_drawable_get_format (filter->drawable);
}
gimp_applicator_set_output_format (filter->applicator, format);
changed = gimp_applicator_set_output_format (filter->applicator, format);
if (changed && gimp_drawable_filter_is_active (filter))
gimp_drawable_filter_update_drawable (filter, NULL);
}
static void
@@ -1688,6 +1805,13 @@ gimp_drawable_filter_add_filter (GimpDrawableFilter *filter)
G_CALLBACK (gimp_drawable_filter_reorder),
filter, 0);
g_signal_connect_object (G_OBJECT (filter->operation), "notify",
G_CALLBACK (gimp_drawable_filters_changed),
filter->drawable, G_CONNECT_SWAPPED);
g_signal_connect_object (G_OBJECT (filter), "active-changed",
G_CALLBACK (gimp_drawable_filters_changed),
filter->drawable, G_CONNECT_SWAPPED);
return TRUE;
}
@@ -1703,6 +1827,10 @@ gimp_drawable_filter_remove_filter (GimpDrawableFilter *filter)
GimpDrawable *drawable = filter->drawable;
GimpContainer *filters;
g_signal_handlers_disconnect_by_func (G_OBJECT (filter),
G_CALLBACK (gimp_drawable_filters_changed),
filter->drawable);
filters = gimp_drawable_get_filters (filter->drawable);
g_signal_handlers_disconnect_by_func (filters,
G_CALLBACK (gimp_drawable_filter_reorder),
@@ -1862,7 +1990,14 @@ gimp_drawable_filter_reorder (GimpFilterStack *stack,
g_return_if_fail (GIMP_LIST (stack)->queue->head != NULL);
if (GIMP_LIST (stack)->queue->head->data != filter)
if (GIMP_LIST (stack)->queue->head->data != filter &&
/* When there is a floating selection, there will be a
* GimpFilter (but not a drawable filter) in the stack.
* XXX For now, let's fix the crash (#12851) but eventually we
* really want to clean up this list and understand better how
* it's organized.
*/
GIMP_IS_DRAWABLE_FILTER (GIMP_LIST (stack)->queue->head->data))
gimp_drawable_filter_sync_format (GIMP_LIST (stack)->queue->head->data);
}
}

View File

@@ -27,6 +27,7 @@
#include "gimp-memsize.h"
#include "gimpimage.h"
#include "gimpdrawable.h"
#include "gimpdrawable-filters.h"
#include "gimpdrawableundo.h"
@@ -186,13 +187,17 @@ gimp_drawable_undo_pop (GimpUndo *undo,
GimpUndoAccumulator *accum)
{
GimpDrawableUndo *drawable_undo = GIMP_DRAWABLE_UNDO (undo);
GimpDrawable *drawable = GIMP_DRAWABLE (GIMP_ITEM_UNDO (undo)->item);
GIMP_UNDO_CLASS (parent_class)->pop (undo, undo_mode, accum);
gimp_drawable_swap_pixels (GIMP_DRAWABLE (GIMP_ITEM_UNDO (undo)->item),
gimp_drawable_swap_pixels (drawable,
drawable_undo->buffer,
drawable_undo->x,
drawable_undo->y);
if (gimp_drawable_has_visible_filters (drawable))
gimp_drawable_update (drawable, 0, 0, -1, -1);
}
static void

View File

@@ -172,6 +172,8 @@ static void gimp_group_layer_convert_type (GimpLayer *layer,
GimpProgress *progress);
static GeglNode * gimp_group_layer_get_source_node (GimpDrawable *drawable);
static void gimp_group_layer_filters_changed (GimpDrawable *drawable);
static void gimp_group_layer_opacity_changed (GimpLayer *layer);
static void gimp_group_layer_effective_mode_changed (GimpLayer *layer);
static void
@@ -301,6 +303,7 @@ gimp_group_layer_class_init (GimpGroupLayerClass *klass)
drawable_class->estimate_memsize = gimp_group_layer_estimate_memsize;
drawable_class->update_all = gimp_group_layer_update_all;
drawable_class->get_source_node = gimp_group_layer_get_source_node;
drawable_class->filters_changed = gimp_group_layer_filters_changed;
layer_class->opacity_changed = gimp_group_layer_opacity_changed;
layer_class->effective_mode_changed = gimp_group_layer_effective_mode_changed;
@@ -1182,6 +1185,15 @@ gimp_group_layer_get_source_node (GimpDrawable *drawable)
return g_object_ref (private->source_node);
}
static void
gimp_group_layer_filters_changed (GimpDrawable *drawable)
{
gimp_layer_update_effective_mode (GIMP_LAYER (drawable));
if (GIMP_DRAWABLE_CLASS (parent_class)->filters_changed)
GIMP_DRAWABLE_CLASS (parent_class)->filters_changed (drawable);
}
static void
gimp_group_layer_opacity_changed (GimpLayer *layer)
{
@@ -1275,6 +1287,7 @@ gimp_group_layer_get_effective_mode (GimpLayer *layer,
* cheaper.
*/
if (gimp_layer_get_mode (layer) == GIMP_LAYER_MODE_PASS_THROUGH &&
! gimp_drawable_has_visible_filters (GIMP_DRAWABLE (layer)) &&
! no_pass_through_strength_reduction)
{
/* we perform the strength-reduction if:

View File

@@ -85,6 +85,9 @@ static void gimp_image_duplicate_parasites (GimpImage *image,
GimpImage *new_image);
static void gimp_image_duplicate_color_profile (GimpImage *image,
GimpImage *new_image);
static void gimp_image_duplicate_simulation_profile
(GimpImage *image,
GimpImage *new_image);
GimpImage *
@@ -118,6 +121,9 @@ gimp_image_duplicate (GimpImage *image)
gimp_image_duplicate_parasites (image, new_image);
gimp_image_duplicate_color_profile (image, new_image);
/* Copy the simulation profile settings */
gimp_image_duplicate_simulation_profile (image, new_image);
/* Copy the colormap if necessary */
gimp_image_duplicate_colormap (image, new_image);
@@ -169,6 +175,16 @@ gimp_image_duplicate (GimpImage *image)
/* Explicitly mark image as dirty, so that its dirty time is set */
gimp_image_dirty (new_image, GIMP_DIRTY_ALL);
/* XXX Without flushing the duplicated image, we had at least one case
* where it wouldn't properly render the image (with empty
* pass-through groups with layer effects, which I think is because we
* have code believing the group is smaller that it really is, because
* of the specificity of pass-through groups). See #13057.
* So I'm not entirely happy of calling this here, which feels more
* like a workaround than a real fix. But it will do for now.
*/
gimp_image_flush (new_image);
return new_image;
}
@@ -585,3 +601,20 @@ gimp_image_duplicate_color_profile (GimpImage *image,
gimp_image_set_color_profile (new_image, profile, NULL);
_gimp_image_set_hidden_profile (new_image, hidden, FALSE);
}
static void
gimp_image_duplicate_simulation_profile (GimpImage *image,
GimpImage *new_image)
{
GimpColorProfile *profile;
GimpColorRenderingIntent intent;
gboolean bpc;
profile = gimp_image_get_simulation_profile (image);
intent = gimp_image_get_simulation_intent (image);
bpc = gimp_image_get_simulation_bpc (image);
gimp_image_set_simulation_profile (new_image, profile);
gimp_image_set_simulation_intent (new_image, intent);
gimp_image_set_simulation_bpc (new_image, bpc);
}

View File

@@ -55,13 +55,15 @@
#include "gimp-intl.h"
static GimpLayer * gimp_image_merge_layers (GimpImage *image,
GimpContainer *container,
GSList *merge_list,
GimpContext *context,
GimpMergeType merge_type,
const gchar *undo_desc,
GimpProgress *progress);
static GSList * gimp_image_trim_merge_list (GimpImage *image,
GSList *merge_list);
static GimpLayer * gimp_image_merge_layers (GimpImage *image,
GimpContainer *container,
GSList *merge_list,
GimpContext *context,
GimpMergeType merge_type,
const gchar *undo_desc,
GimpProgress *progress);
/* public functions */
@@ -166,7 +168,8 @@ gimp_image_merge_visible_layers (GimpImage *image,
if (merge_list)
{
GimpLayer *layer;
GimpLayer *layer;
/* if there's a floating selection, anchor it */
if (gimp_image_get_floating_selection (image))
floating_sel_anchor (gimp_image_get_floating_selection (image));
@@ -410,9 +413,12 @@ GimpLayer *
gimp_image_merge_group_layer (GimpImage *image,
GimpGroupLayer *group)
{
GimpLayer *parent;
GimpLayer *layer;
gint index;
GimpLayer *parent;
GimpLayer *layer;
GeglBuffer *pass_through_buffer = NULL;
gboolean is_pass_through = FALSE;
gint index;
GeglRectangle rect;
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
g_return_val_if_fail (GIMP_IS_GROUP_LAYER (group), NULL);
@@ -425,27 +431,18 @@ gimp_image_merge_group_layer (GimpImage *image,
parent = gimp_layer_get_parent (GIMP_LAYER (group));
index = gimp_item_get_index (GIMP_ITEM (group));
/* if this is a pass-through group, change its mode to NORMAL *before*
* duplicating it, since PASS_THROUGH mode is invalid for regular layers.
* see bug #793714.
*/
if (gimp_layer_get_mode (GIMP_LAYER (group)) == GIMP_LAYER_MODE_PASS_THROUGH)
is_pass_through = (gimp_layer_get_mode (GIMP_LAYER (group)) == GIMP_LAYER_MODE_PASS_THROUGH &&
gimp_item_get_visible (GIMP_ITEM (group)));
if (is_pass_through &&
(gimp_layer_get_opacity (GIMP_LAYER (group)) < 1.0 ||
! gimp_drawable_has_visible_filters (GIMP_DRAWABLE (group))))
{
GimpLayerColorSpace blend_space;
GimpLayerColorSpace composite_space;
GimpLayerCompositeMode composite_mode;
GimpDrawable *drawable = GIMP_DRAWABLE (group);
GeglNode *mode_node = gimp_drawable_get_mode_node (drawable);
/* keep the group's current blend space, composite space, and composite
* mode.
*/
blend_space = gimp_layer_get_blend_space (GIMP_LAYER (group));
composite_space = gimp_layer_get_composite_space (GIMP_LAYER (group));
composite_mode = gimp_layer_get_composite_mode (GIMP_LAYER (group));
gimp_layer_set_mode (GIMP_LAYER (group), GIMP_LAYER_MODE_NORMAL, TRUE);
gimp_layer_set_blend_space (GIMP_LAYER (group), blend_space, TRUE);
gimp_layer_set_composite_space (GIMP_LAYER (group), composite_space, TRUE);
gimp_layer_set_composite_mode (GIMP_LAYER (group), composite_mode, TRUE);
rect = gegl_node_get_bounding_box (mode_node);
pass_through_buffer = gegl_buffer_new (&rect, gimp_drawable_get_format (drawable));
gegl_node_blit_buffer (mode_node, pass_through_buffer, &rect, 0, GEGL_ABYSS_NONE);
}
/* Merge down filter effects */
@@ -460,6 +457,68 @@ gimp_image_merge_group_layer (GimpImage *image,
gimp_image_remove_layer (image, GIMP_LAYER (group), TRUE, NULL);
gimp_image_add_layer (image, layer, parent, index, TRUE);
/* Pass-through groups are a very special case. The duplicate works
* only if both these points are true:
* - The group is at full opacity: with lower opacity, what we want is
* in fact the output of the "gimp:pass-through" mode (similar to
* "gimp:replace") because we can't reproduce the same render
* otherwise. This works well, since anyway the merged layer is
* ensured to be the bottomest one on its own level.
* - The group has filters: gimp_drawable_merge_filters() will
* actually set the end-rendering to the drawable (kinda rasterizing
* the group layer).
*/
if (pass_through_buffer)
{
if (rect.x != 0 || rect.y != 0)
{
GeglBuffer *buffer;
buffer = gegl_buffer_new (GEGL_RECTANGLE (0, 0, rect.width, rect.height),
gimp_drawable_get_format (GIMP_DRAWABLE (layer)));
gegl_buffer_copy (pass_through_buffer, &rect, GEGL_ABYSS_NONE,
buffer, GEGL_RECTANGLE (0, 0, rect.width, rect.height));
g_object_unref (pass_through_buffer);
pass_through_buffer = buffer;
}
gimp_drawable_set_buffer_full (GIMP_DRAWABLE (layer), FALSE, NULL,
pass_through_buffer, &rect, TRUE);
g_object_unref (pass_through_buffer);
}
/* For pass-through group layers, we must remove all "big sister"
* layers, i.e. all layers on the same level below the newly merged
* layer, because their render is already integrated in the merged
* layer. Therefore keeping them would change the whole image's
* rendering.
*/
if (is_pass_through)
{
GimpContainer *stack;
GList *iter;
GList *new_selected = g_list_prepend (NULL, layer);
GList *to_remove = NULL;
gboolean remove = FALSE;
if (parent)
stack = gimp_viewable_get_children (GIMP_VIEWABLE (parent));
else
stack = gimp_image_get_layers (image);
for (iter = gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (stack)); iter; iter = iter->next)
{
if (iter->data == layer)
remove = TRUE;
else if (remove && gimp_item_get_visible (iter->data))
to_remove = g_list_prepend (to_remove, iter->data);
}
for (iter = to_remove; iter; iter = iter->next)
gimp_image_remove_layer (image, GIMP_LAYER (iter->data), TRUE, new_selected);
g_list_free (new_selected);
}
gimp_image_undo_group_end (image);
return layer;
@@ -545,6 +604,62 @@ gimp_image_merge_visible_paths (GimpImage *image,
/* private functions */
static GSList *
gimp_image_trim_merge_list (GimpImage *image,
GSList *merge_list)
{
GSList *trimmed_list = NULL;
GSList *pass_through = NULL;
for (GSList *iter = merge_list; iter; iter = iter->next)
{
GimpLayer *layer = iter->data;
gboolean ignore = FALSE;
for (GSList *iter2 = pass_through; iter2; iter2 = iter2->next)
{
GimpLayer *pass_through_parent = gimp_layer_get_parent (iter2->data);
GimpLayer *cousin = layer;
do
{
GimpLayer *cousin_parent = gimp_layer_get_parent (cousin);
if (pass_through_parent == cousin_parent &&
gimp_item_get_index (GIMP_ITEM (iter2->data)) < gimp_item_get_index (GIMP_ITEM (cousin)))
{
/* The "cousin" layer is in the same group layer as a
* pass-through group and below it. We don't merge it
* because it will be rendered already through the
* merged pass-through by definition.
*/
ignore = TRUE;
break;
}
cousin = cousin_parent;
}
while (cousin != NULL);
if (ignore)
break;
}
if (! ignore)
{
trimmed_list = g_slist_append (trimmed_list, layer);
if (gimp_viewable_get_children (GIMP_VIEWABLE (layer)) &&
gimp_layer_get_mode (layer) == GIMP_LAYER_MODE_PASS_THROUGH)
pass_through = g_slist_append (pass_through, layer);
}
}
g_slist_free (pass_through);
return trimmed_list;
}
static GimpLayer *
gimp_image_merge_layers (GimpImage *image,
GimpContainer *container,
@@ -563,19 +678,23 @@ gimp_image_merge_layers (GimpImage *image,
GimpLayer *bottom_layer;
GimpLayer *merge_layer;
gint position;
gint n_bottom_removed = 0;
GeglNode *node;
GeglNode *source_node;
GeglNode *flatten_node;
GeglNode *offset_node;
GeglNode *last_node;
GeglNode *last_node_source;
GeglNode *last_node_source = NULL;
GimpParasiteList *parasites;
GSList *trimmed_list;
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
g_return_val_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress), NULL);
top_layer = merge_list->data;
trimmed_list = gimp_image_trim_merge_list (image, merge_list);
top_layer = trimmed_list->data;
parent = gimp_layer_get_parent (top_layer);
/* Make sure the image's graph is constructed, so that top-level layers have
@@ -600,7 +719,7 @@ gimp_image_merge_layers (GimpImage *image,
/* Get the layer extents */
x1 = y1 = 0;
x2 = y2 = 0;
for (layers = merge_list; layers; layers = g_slist_next (layers))
for (layers = trimmed_list; layers; layers = g_slist_next (layers))
{
gint off_x, off_y;
@@ -616,7 +735,7 @@ gimp_image_merge_layers (GimpImage *image,
{
case GIMP_EXPAND_AS_NECESSARY:
case GIMP_CLIP_TO_IMAGE:
if (layers == merge_list)
if (layers == trimmed_list)
{
x1 = off_x;
y1 = off_y;
@@ -667,7 +786,10 @@ gimp_image_merge_layers (GimpImage *image,
}
if ((x2 - x1) == 0 || (y2 - y1) == 0)
return NULL;
{
g_slist_free (trimmed_list);
return NULL;
}
bottom_layer = layer;
@@ -687,6 +809,7 @@ gimp_image_merge_layers (GimpImage *image,
{
g_warning ("%s: could not allocate merge layer", G_STRFUNC);
g_slist_free (trimmed_list);
return NULL;
}
@@ -713,6 +836,7 @@ gimp_image_merge_layers (GimpImage *image,
{
g_warning ("%s: could not allocate merge layer", G_STRFUNC);
g_slist_free (trimmed_list);
return NULL;
}
}
@@ -751,11 +875,16 @@ gimp_image_merge_layers (GimpImage *image,
gegl_node_link_many (source_node, offset_node, NULL);
}
/* Disconnect the bottom-layer node's input */
last_node = gimp_filter_get_node (GIMP_FILTER (bottom_layer));
last_node_source = gegl_node_get_producer (last_node, "input", NULL);
/* Disconnect the bottom-layer node's input, unless it's a
* pass-through group.
*/
if (gimp_layer_get_mode (bottom_layer) != GIMP_LAYER_MODE_PASS_THROUGH)
{
last_node = gimp_filter_get_node (GIMP_FILTER (bottom_layer));
last_node_source = gegl_node_get_producer (last_node, "input", NULL);
gegl_node_disconnect (last_node, "input");
gegl_node_disconnect (last_node, "input");
}
/* Render the graph into the merge layer */
gimp_gegl_apply_operation (NULL, progress, undo_desc, offset_node,
@@ -782,9 +911,44 @@ gimp_image_merge_layers (GimpImage *image,
gimp_item_set_parasites (GIMP_ITEM (merge_layer), parasites);
g_object_unref (parasites);
/* Remove the merged layers from the image */
for (layers = merge_list; layers; layers = g_slist_next (layers))
gimp_image_remove_layer (image, layers->data, TRUE, NULL);
for (layers = trimmed_list; layers; layers = g_slist_next (layers))
{
/* Remove the sisters below merged pass-through group layers. */
if (gimp_viewable_get_children (GIMP_VIEWABLE (layers->data)) &&
gimp_layer_get_mode (layers->data) == GIMP_LAYER_MODE_PASS_THROUGH)
{
GimpLayer *parent;
GimpContainer *stack;
GList *iter;
gboolean remove = FALSE;
GList *to_remove = NULL;
parent = gimp_layer_get_parent (layers->data);
if (parent)
stack = gimp_viewable_get_children (GIMP_VIEWABLE (parent));
else
stack = gimp_image_get_layers (image);
for (iter = gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (stack)); iter; iter = iter->next)
{
if (iter->data == layers->data)
remove = TRUE;
else if (remove && gimp_item_get_visible (GIMP_ITEM (iter->data)))
to_remove = g_list_prepend (to_remove, iter->data);
}
if (layers->data == bottom_layer)
n_bottom_removed = g_list_length (to_remove);
for (iter = to_remove; iter; iter = iter->next)
gimp_image_remove_layer (image, iter->data, TRUE, NULL);
g_list_free (to_remove);
}
/* Remove the merged layers from the image */
gimp_image_remove_layer (image, layers->data, TRUE, NULL);
}
gimp_item_set_visible (GIMP_ITEM (merge_layer), TRUE, FALSE);
@@ -808,12 +972,13 @@ gimp_image_merge_layers (GimpImage *image,
{
/* Add the layer to the image */
gimp_image_add_layer (image, merge_layer, parent,
gimp_container_get_n_children (container) -
position + 1,
gimp_container_get_n_children (container) +
n_bottom_removed - position + 1,
TRUE);
}
gimp_drawable_update (GIMP_DRAWABLE (merge_layer), 0, 0, -1, -1);
g_slist_free (trimmed_list);
return merge_layer;
}

View File

@@ -43,6 +43,7 @@
#include "gimpimage.h"
#include "gimpimage-color-profile.h"
#include "gimpimage-colormap.h"
#include "gimpimage-metadata.h"
#include "gimpimage-new.h"
#include "gimpimage-undo.h"
#include "gimplayer.h"
@@ -101,6 +102,26 @@ gimp_image_new_set_last_template (Gimp *gimp,
G_OBJECT (gimp->image_new_last_template), 0);
}
void
gimp_image_new_add_creation_metadata (GimpImage *image)
{
GimpMetadata *metadata;
metadata = gimp_image_get_metadata (image);
if (! metadata)
{
g_critical ("Metadata not found. Should not happen!");
}
else
{
GDateTime *datetime;
datetime = g_date_time_new_now_local ();
gimp_metadata_set_creation_date (metadata, datetime);
g_date_time_unref (datetime);
}
}
GimpImage *
gimp_image_new_from_template (Gimp *gimp,
GimpTemplate *template,
@@ -182,6 +203,8 @@ gimp_image_new_from_template (Gimp *gimp,
gimp_image_add_layer (image, layer, NULL, 0, FALSE);
gimp_image_new_add_creation_metadata (image);
gimp_image_undo_enable (image);
gimp_image_clean_all (image);
@@ -285,6 +308,8 @@ gimp_image_new_from_drawable (Gimp *gimp,
gimp_image_add_layer (new_image, new_layer, NULL, 0, TRUE);
gimp_image_new_add_creation_metadata (new_image);
gimp_image_undo_enable (new_image);
return new_image;
@@ -535,6 +560,8 @@ gimp_image_new_from_drawables (Gimp *gimp,
gimp_image_new_copy_drawables (image, drawables, new_image, tag_copies, NULL, NULL, NULL, NULL);
gimp_image_new_add_creation_metadata (new_image);
gimp_image_undo_enable (new_image);
return new_image;
@@ -581,6 +608,8 @@ gimp_image_new_from_component (Gimp *gimp,
gimp_image_add_layer (new_image, layer, NULL, 0, TRUE);
gimp_image_new_add_creation_metadata (new_image);
gimp_image_undo_enable (new_image);
return new_image;
@@ -630,6 +659,8 @@ gimp_image_new_from_buffer (Gimp *gimp,
gimp_image_add_layer (image, layer, NULL, 0, TRUE);
gimp_image_new_add_creation_metadata (image);
gimp_image_undo_enable (image);
return image;
@@ -691,6 +722,8 @@ gimp_image_new_from_pixbuf (Gimp *gimp,
gimp_image_add_layer (new_image, layer, NULL, 0, TRUE);
gimp_image_new_add_creation_metadata (new_image);
gimp_image_undo_enable (new_image);
return new_image;

View File

@@ -46,9 +46,7 @@ gimp_image_get_preview_format (GimpImage *image)
{
case GIMP_RGB:
case GIMP_GRAY:
return gimp_babl_format_change_component_type (
gimp_projectable_get_format (GIMP_PROJECTABLE (image)),
GIMP_COMPONENT_TYPE_U8);
return gimp_projectable_get_format (GIMP_PROJECTABLE (image));
case GIMP_INDEXED:
return babl_format ("R'G'B'A u8");

View File

@@ -289,6 +289,8 @@ static gint gimp_image_layer_stack_cmp (GList *layers1,
static void gimp_image_rec_remove_layer_stack_dups (GimpImage *image,
GSList *start);
static void gimp_image_clean_layer_stack (GimpImage *image);
static void gimp_image_rec_filter_remove_undo (GimpImage *image,
GimpLayer *layer);
static void gimp_image_remove_from_layer_stack (GimpImage *image,
GimpLayer *layer);
static gint gimp_image_selected_is_descendant (GimpViewable *selected,
@@ -2030,6 +2032,50 @@ gimp_image_clean_layer_stack (GimpImage *image)
gimp_image_rec_remove_layer_stack_dups (image, private->layer_stack);
}
static void
gimp_image_rec_filter_remove_undo (GimpImage *image,
GimpLayer *layer)
{
GimpContainer *filters;
if (gimp_viewable_get_children (GIMP_VIEWABLE (layer)))
{
GimpContainer *stack = gimp_viewable_get_children (GIMP_VIEWABLE (layer));
GList *children;
GList *iter;
children = gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (stack));
for (iter = children; iter; iter = iter->next)
{
GimpLayer *child = iter->data;
gimp_image_rec_filter_remove_undo (image, child);
}
}
filters = gimp_drawable_get_filters (GIMP_DRAWABLE (layer));
if (gimp_container_get_n_children (filters) > 0)
{
GList *filter_list;
for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list;
filter_list = g_list_previous (filter_list))
{
if (GIMP_IS_DRAWABLE_FILTER (filter_list->data))
{
GimpDrawableFilter *filter = filter_list->data;
gimp_image_undo_push_filter_remove (image,
_("Remove filter"),
GIMP_DRAWABLE (layer),
filter);
}
}
}
}
static void
gimp_image_remove_from_layer_stack (GimpImage *image,
GimpLayer *layer)
@@ -3141,6 +3187,7 @@ gimp_image_get_xcf_version (GimpImage *image,
case 20:
case 21:
case 22:
case 23:
if (gimp_version) *gimp_version = 300;
if (version_string) *version_string = "GIMP 3.0";
break;
@@ -4901,7 +4948,10 @@ gimp_image_set_selected_layers (GimpImage *image,
/* Make sure the floating_sel always is the active layer */
if (floating_sel && (g_list_length (layers2) != 1 || layers2->data != floating_sel))
return;
{
g_list_free (layers2);
return;
}
selected_layers = gimp_image_get_selected_layers (image);
@@ -4920,21 +4970,26 @@ gimp_image_set_selected_layers (GimpImage *image,
if (selection_changed)
{
GList *layers3;
/* Don't cache selection info for the previous active layer */
if (selected_layers)
gimp_drawable_invalidate_boundary (GIMP_DRAWABLE (selected_layers->data));
layers3 = g_list_copy (layers2);
gimp_item_tree_set_selected_items (private->layers, layers2);
/* We cannot edit masks with multiple selected layers. */
if (g_list_length (layers2) > 1)
if (g_list_length (layers3) > 1)
{
for (iter = layers2; iter; iter = iter->next)
for (iter = layers3; iter; iter = iter->next)
{
if (gimp_layer_get_mask (iter->data))
gimp_layer_set_edit_mask (iter->data, FALSE);
}
}
g_list_free (layers3);
}
else
{
@@ -5333,29 +5388,7 @@ gimp_image_remove_layer (GimpImage *image,
if (push_undo)
{
GimpContainer *filters;
filters = gimp_drawable_get_filters (GIMP_DRAWABLE (layer));
if (gimp_container_get_n_children (filters) > 0)
{
GList *filter_list;
for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list;
filter_list = g_list_previous (filter_list))
{
if (GIMP_IS_DRAWABLE_FILTER (filter_list->data))
{
GimpDrawableFilter *filter = filter_list->data;
gimp_image_undo_push_filter_remove (image,
_("Remove filter"),
GIMP_DRAWABLE (layer),
filter);
}
}
}
gimp_image_rec_filter_remove_undo (image, layer);
gimp_image_undo_push_layer_remove (image, undo_desc, layer,
gimp_layer_get_parent (layer),
gimp_item_get_index (GIMP_ITEM (layer)),
@@ -5465,6 +5498,7 @@ gimp_image_add_layers (GimpImage *image,
gimp_image_add_layer (image, GIMP_LAYER (new_item),
parent, position, TRUE);
gimp_drawable_enable_resize_undo (GIMP_DRAWABLE (new_item));
position++;
}

View File

@@ -937,16 +937,46 @@ gimp_layer_duplicate (GimpItem *item,
GimpLayer *layer = GIMP_LAYER (item);
GimpLayer *new_layer = GIMP_LAYER (new_item);
gimp_layer_set_mode (new_layer,
gimp_layer_get_mode (layer), FALSE);
gimp_layer_set_blend_space (new_layer,
gimp_layer_get_blend_space (layer), FALSE);
gimp_layer_set_composite_space (new_layer,
gimp_layer_get_composite_space (layer), FALSE);
gimp_layer_set_composite_mode (new_layer,
gimp_layer_get_composite_mode (layer), FALSE);
gimp_layer_set_opacity (new_layer,
gimp_layer_get_opacity (layer), FALSE);
/* PASS_THROUGH mode is invalid for regular layers.
* We used to change the mode to NORMAL *before* duplicating (see
* #793714 on bugzilla) but it would change the image's render.
* Instead we first duplicate so that the group's render is used
* as-is for the non-group duplicate layer. Then we set NORMAL
* mode.
*/
if (gimp_layer_get_mode (layer) == GIMP_LAYER_MODE_PASS_THROUGH &&
! GIMP_IS_GROUP_LAYER (new_item))
{
GimpLayerColorSpace blend_space;
GimpLayerColorSpace composite_space;
GimpLayerCompositeMode composite_mode;
/* keep the group's current blend space, composite space, and composite
* mode.
*/
blend_space = gimp_layer_get_blend_space (layer);
composite_space = gimp_layer_get_composite_space (layer);
composite_mode = gimp_layer_get_composite_mode (layer);
gimp_layer_set_mode (new_layer, GIMP_LAYER_MODE_NORMAL, FALSE);
gimp_layer_set_blend_space (new_layer, blend_space, FALSE);
gimp_layer_set_composite_space (new_layer, composite_space, FALSE);
gimp_layer_set_composite_mode (new_layer, composite_mode, FALSE);
gimp_layer_set_opacity (new_layer, 1.0, FALSE);
}
else
{
gimp_layer_set_mode (new_layer,
gimp_layer_get_mode (layer), FALSE);
gimp_layer_set_blend_space (new_layer,
gimp_layer_get_blend_space (layer), FALSE);
gimp_layer_set_composite_space (new_layer,
gimp_layer_get_composite_space (layer), FALSE);
gimp_layer_set_composite_mode (new_layer,
gimp_layer_get_composite_mode (layer), FALSE);
gimp_layer_set_opacity (new_layer,
gimp_layer_get_opacity (layer), FALSE);
}
if (gimp_layer_can_lock_alpha (new_layer))
gimp_layer_set_lock_alpha (new_layer,

View File

@@ -48,12 +48,14 @@ gimp_param_spec_boolean_desc (GParamSpec *pspec)
static gchar *
gimp_param_spec_unit_desc (GParamSpec *pspec)
{
GimpParamSpecUnit *uspec = GIMP_PARAM_SPEC_UNIT (pspec);
GObject *default_value;
default_value = gimp_param_spec_object_get_default (pspec);
return g_strdup_printf ("<i>(default %s%s%s)</i>",
gimp_unit_get_abbreviation (uspec->default_value),
uspec->allow_pixel ? ", pixel allowed": "",
uspec->allow_percent ? ", percent allowed": "");
gimp_unit_get_abbreviation (GIMP_UNIT (default_value)),
gimp_param_spec_unit_pixel_allowed (pspec) ? ", pixel allowed": "",
gimp_param_spec_unit_percent_allowed (pspec) ? ", percent allowed": "");
}
static gchar *

View File

@@ -29,9 +29,11 @@
#include "gimp.h"
#include "gimpbuffer.h"
#include "gimpchannel.h"
#include "gimppatternclipboard.h"
#include "gimpimage.h"
#include "gimppickable.h"
#include "gimpselection.h"
#include "gimptempbuf.h"
#include "gimp-intl.h"
@@ -175,7 +177,8 @@ gimp_pattern_clipboard_changed (Gimp *gimp,
GimpPattern *pattern)
{
GimpObject *paste;
GeglBuffer *buffer = NULL;
GeglBuffer *buffer = NULL;
gboolean unref_buffer = FALSE;
g_clear_pointer (&pattern->mask, gimp_temp_buf_unref);
@@ -183,8 +186,38 @@ gimp_pattern_clipboard_changed (Gimp *gimp,
if (GIMP_IS_IMAGE (paste))
{
GimpContext *context = gimp_get_user_context (gimp);
gimp_pickable_flush (GIMP_PICKABLE (paste));
buffer = gimp_pickable_get_buffer (GIMP_PICKABLE (paste));
if (context)
{
GimpChannel *mask = gimp_image_get_mask (GIMP_IMAGE (paste));
if (! gimp_channel_is_empty (mask))
{
GList *pickables;
gint offset_x;
gint offset_y;
pickables = g_list_prepend (NULL, GIMP_IMAGE (paste));
buffer = gimp_selection_extract (GIMP_SELECTION (mask),
pickables, context,
FALSE, FALSE, FALSE,
&offset_x, &offset_y,
NULL);
g_list_free (pickables);
unref_buffer = TRUE;
}
else
{
buffer = gimp_pickable_get_buffer (GIMP_PICKABLE (paste));
}
}
else
{
buffer = gimp_pickable_get_buffer (GIMP_PICKABLE (paste));
}
}
else if (GIMP_IS_BUFFER (paste))
{
@@ -204,6 +237,9 @@ gimp_pattern_clipboard_changed (Gimp *gimp,
NULL,
gimp_temp_buf_get_data (pattern->mask),
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
if (unref_buffer)
g_object_unref (buffer);
}
else
{

View File

@@ -144,7 +144,7 @@ gimp_pickable_contiguous_region_by_seed (GimpPickable *pickable,
g_return_val_if_fail (GIMP_IS_PICKABLE (pickable), NULL);
gimp_pickable_flush (pickable);
src_buffer = gimp_pickable_get_buffer (pickable);
src_buffer = gimp_pickable_get_buffer_with_effects (pickable);
format = choose_format (src_buffer, select_criterion,
&n_components, &has_alpha);
@@ -222,7 +222,7 @@ gimp_pickable_contiguous_region_by_color (GimpPickable *pickable,
gimp_pickable_flush (pickable);
src_buffer = gimp_pickable_get_buffer (pickable);
src_buffer = gimp_pickable_get_buffer_with_effects (pickable);
format = choose_format (src_buffer, select_criterion,
&n_components, &has_alpha);

View File

@@ -314,9 +314,6 @@ gimp_pickable_pick_color (GimpPickable *pickable,
{
gint radius = floor (average_radius);
format = babl_format_with_space ("RaGaBaA double",
babl_format_get_space (format));
gimp_pickable_get_pixel_average (pickable,
GEGL_RECTANGLE (x - radius,
y - radius,

View File

@@ -124,11 +124,8 @@ static void gimp_projection_add_update_area (GimpProjection *proj,
gint y,
gint w,
gint h);
static void gimp_projection_flush_whenever (GimpProjection *proj,
gboolean now,
gboolean direct);
static void gimp_projection_update_priority_rect (GimpProjection *proj);
static void gimp_projection_chunk_render_start (GimpProjection *proj);
static gboolean gimp_projection_chunk_render_start (GWeakRef *proj_ref);
static void gimp_projection_chunk_render_stop (GimpProjection *proj,
gboolean merge);
static gboolean gimp_projection_chunk_render_callback (GimpProjection *proj);
@@ -493,23 +490,70 @@ gimp_projection_stop_rendering (GimpProjection *proj)
gimp_projection_chunk_render_stop (proj, TRUE);
}
/**
* gimp_projection_flush:
* @proj:
*
* This requests to render the projection. This function is thread-safe
* and can be called in any thread.
*
* The actual projection painting will happen in the main thread.
*/
void
gimp_projection_flush (GimpProjection *proj)
{
GWeakRef *proj_ref = g_new (GWeakRef, 1);;
g_return_if_fail (GIMP_IS_PROJECTION (proj));
/* Construct in chunks */
gimp_projection_flush_whenever (proj, FALSE, FALSE);
g_weak_ref_init (proj_ref, proj);
/* Construct in chunks - asynchronously in the main thread */
g_idle_add_full (G_PRIORITY_HIGH_IDLE,
(GSourceFunc) gimp_projection_chunk_render_start,
proj_ref, NULL);
}
/**
* gimp_projection_flush_now:
* @proj:
* @direct:
*
* This renders the projection immediately. You can only call this from
* the main thread.
*/
void
gimp_projection_flush_now (GimpProjection *proj,
gboolean direct)
{
g_return_if_fail (GIMP_IS_PROJECTION (proj));
/* Construct NOW */
gimp_projection_flush_whenever (proj, TRUE, direct);
/* Construct NOW - synchronously */
if (proj->priv->update_region)
{
gint n_rects = cairo_region_num_rectangles (proj->priv->update_region);
gint i;
/* Make sure we have a buffer */
gimp_projection_allocate_buffer (proj);
for (i = 0; i < n_rects; i++)
{
cairo_rectangle_int_t rect;
cairo_region_get_rectangle (proj->priv->update_region,
i, &rect);
gimp_projection_paint_area (proj,
direct,
rect.x,
rect.y,
rect.width,
rect.height);
}
/* Free the update region */
g_clear_pointer (&proj->priv->update_region, cairo_region_destroy);
}
}
void
@@ -611,56 +655,6 @@ gimp_projection_add_update_area (GimpProjection *proj,
}
}
static void
gimp_projection_flush_whenever (GimpProjection *proj,
gboolean now,
gboolean direct)
{
if (proj->priv->update_region)
{
/* Make sure we have a buffer */
gimp_projection_allocate_buffer (proj);
if (now) /* Synchronous */
{
gint n_rects = cairo_region_num_rectangles (proj->priv->update_region);
gint i;
for (i = 0; i < n_rects; i++)
{
cairo_rectangle_int_t rect;
cairo_region_get_rectangle (proj->priv->update_region,
i, &rect);
gimp_projection_paint_area (proj,
direct,
rect.x,
rect.y,
rect.width,
rect.height);
}
/* Free the update region */
g_clear_pointer (&proj->priv->update_region, cairo_region_destroy);
}
else /* Asynchronous */
{
/* Consumes the update region */
gimp_projection_chunk_render_start (proj);
}
}
else if (! now && ! proj->priv->iter && proj->priv->invalidate_preview)
{
/* invalidate the preview here since it is constructed from
* the projection
*/
proj->priv->invalidate_preview = FALSE;
gimp_projectable_invalidate_preview (proj->priv->projectable);
}
}
static void
gimp_projection_update_priority_rect (GimpProjection *proj)
{
@@ -688,66 +682,93 @@ gimp_projection_update_priority_rect (GimpProjection *proj)
}
}
static void
gimp_projection_chunk_render_start (GimpProjection *proj)
static gboolean
gimp_projection_chunk_render_start (GWeakRef *proj_ref)
{
cairo_region_t *region = proj->priv->update_region;
gboolean invalidate_preview = FALSE;
GimpProjection *proj;
if (proj->priv->iter)
proj = g_weak_ref_get (proj_ref);
g_weak_ref_clear (proj_ref);
g_free (proj_ref);
if (proj == NULL)
return G_SOURCE_REMOVE;
if (proj->priv->update_region)
{
region = gimp_chunk_iterator_stop (proj->priv->iter, FALSE);
cairo_region_t *region = proj->priv->update_region;
gboolean invalidate_preview = FALSE;
proj->priv->iter = NULL;
/* Make sure we have a buffer */
gimp_projection_allocate_buffer (proj);
if (cairo_region_is_empty (region))
invalidate_preview = proj->priv->invalidate_preview;
if (proj->priv->update_region)
if (proj->priv->iter)
{
cairo_region_union (region, proj->priv->update_region);
region = gimp_chunk_iterator_stop (proj->priv->iter, FALSE);
cairo_region_destroy (proj->priv->update_region);
proj->priv->iter = NULL;
if (cairo_region_is_empty (region))
invalidate_preview = proj->priv->invalidate_preview;
if (proj->priv->update_region)
{
cairo_region_union (region, proj->priv->update_region);
cairo_region_destroy (proj->priv->update_region);
}
}
proj->priv->update_region = NULL;
if (region && ! cairo_region_is_empty (region))
{
proj->priv->iter = gimp_chunk_iterator_new (region);
gimp_projection_update_priority_rect (proj);
if (! proj->priv->idle_id)
{
proj->priv->idle_id = g_idle_add_full (GIMP_PRIORITY_PROJECTION_IDLE + proj->priv->priority,
(GSourceFunc) gimp_projection_chunk_render_callback,
proj, NULL);
}
}
else
{
if (region)
cairo_region_destroy (region);
if (proj->priv->idle_id)
{
g_source_remove (proj->priv->idle_id);
proj->priv->idle_id = 0;
}
if (invalidate_preview)
{
/* invalidate the preview here since it is constructed from
* the projection
*/
proj->priv->invalidate_preview = FALSE;
gimp_projectable_invalidate_preview (proj->priv->projectable);
}
}
}
proj->priv->update_region = NULL;
if (region && ! cairo_region_is_empty (region))
else if (! proj->priv->iter && proj->priv->invalidate_preview)
{
proj->priv->iter = gimp_chunk_iterator_new (region);
/* invalidate the preview here since it is constructed from
* the projection
*/
proj->priv->invalidate_preview = FALSE;
gimp_projection_update_priority_rect (proj);
if (! proj->priv->idle_id)
{
proj->priv->idle_id = g_idle_add_full (
GIMP_PRIORITY_PROJECTION_IDLE + proj->priv->priority,
(GSourceFunc) gimp_projection_chunk_render_callback,
proj, NULL);
}
gimp_projectable_invalidate_preview (proj->priv->projectable);
}
else
{
if (region)
cairo_region_destroy (region);
if (proj->priv->idle_id)
{
g_source_remove (proj->priv->idle_id);
proj->priv->idle_id = 0;
}
g_object_unref (proj);
if (invalidate_preview)
{
/* invalidate the preview here since it is constructed from
* the projection
*/
proj->priv->invalidate_preview = FALSE;
gimp_projectable_invalidate_preview (proj->priv->projectable);
}
}
return G_SOURCE_REMOVE;
}
static void

View File

@@ -76,6 +76,9 @@ typedef struct
gboolean visible;
} GimpAboutDialog;
static void about_dialog_response (GtkDialog *dialog,
gint response_id,
gpointer user_data);
#ifdef G_OS_WIN32
static void about_dialog_realize (GtkWidget *widget,
GimpAboutDialog *dialog);
@@ -95,10 +98,10 @@ static gboolean about_dialog_anim_draw (GtkWidget *widget,
static void about_dialog_reshuffle (GimpAboutDialog *dialog);
static gboolean about_dialog_timer (gpointer data);
#ifdef GIMP_UNSTABLE
#ifndef GIMP_RELEASE
static void about_dialog_add_unstable_message
(GtkWidget *vbox);
#endif /* GIMP_UNSTABLE */
#endif /* ! GIMP_RELEASE */
static void about_dialog_last_release_changed
(GimpCoreConfig *config,
@@ -180,7 +183,7 @@ about_dialog_create (Gimp *gimp,
g_set_weak_pointer (&dialog.dialog, widget);
g_signal_connect (widget, "response",
G_CALLBACK (gtk_widget_destroy),
G_CALLBACK (about_dialog_response),
NULL);
#ifdef G_OS_WIN32
g_signal_connect (widget, "realize",
@@ -202,9 +205,9 @@ about_dialog_create (Gimp *gimp,
{
if (dialog.use_animation)
about_dialog_add_animation (children->data, &dialog);
#ifdef GIMP_UNSTABLE
#ifndef GIMP_RELEASE
about_dialog_add_unstable_message (children->data);
#endif /* GIMP_UNSTABLE */
#endif /* ! GIMP_RELEASE */
#ifdef CHECK_UPDATE
if (gimp_version_check_update ())
about_dialog_add_update (&dialog, config);
@@ -232,6 +235,17 @@ about_dialog_create (Gimp *gimp,
return dialog.dialog;
}
static void
about_dialog_response (GtkDialog *dialog,
gint response_id,
gpointer user_data)
{
if (response_id == GTK_RESPONSE_HELP)
gimp_standard_help_func (GIMP_HELP_ABOUT_DIALOG, NULL);
else
gtk_widget_destroy (GTK_WIDGET (dialog));
}
#ifdef G_OS_WIN32
static void
about_dialog_realize (GtkWidget *widget,
@@ -794,7 +808,7 @@ about_dialog_timer (gpointer data)
return G_SOURCE_CONTINUE;
}
#ifdef GIMP_UNSTABLE
#ifndef GIMP_RELEASE
static void
about_dialog_add_unstable_message (GtkWidget *vbox)
@@ -802,7 +816,7 @@ about_dialog_add_unstable_message (GtkWidget *vbox)
GtkWidget *label;
gchar *text;
text = g_strdup_printf (_("This is an unstable development release\n"
text = g_strdup_printf (_("This is a development build\n"
"commit %s"), GIMP_GIT_VERSION_ABBREV);
label = gtk_label_new (text);
g_free (text);
@@ -817,7 +831,7 @@ about_dialog_add_unstable_message (GtkWidget *vbox)
gtk_widget_show (label);
}
#endif /* GIMP_UNSTABLE */
#endif /* ! GIMP_RELEASE */
static void
about_dialog_last_release_changed (GimpCoreConfig *config,

View File

@@ -131,6 +131,14 @@ file_open_dialog_response (GtkWidget *dialog,
if (file_dialog->image)
g_object_ref (file_dialog->image);
/* If we open multiple files as layers, compress the undos */
if (file_dialog->image &&
open_dialog->open_as_layers &&
g_slist_length (files) > 1)
gimp_image_undo_group_start (file_dialog->image,
GIMP_UNDO_GROUP_LAYER_ADD,
_("Open layers"));
for (list = files; list; list = g_slist_next (list))
{
GFile *file = list->data;
@@ -150,6 +158,12 @@ file_open_dialog_response (GtkWidget *dialog,
if (file_dialog->image)
{
g_object_ref (file_dialog->image);
if (g_slist_length (files) > 1)
gimp_image_undo_group_start (file_dialog->image,
GIMP_UNDO_GROUP_LAYER_ADD,
_("Open layers"));
success = TRUE;
}
}
@@ -181,6 +195,11 @@ file_open_dialog_response (GtkWidget *dialog,
break;
}
if (file_dialog->image &&
open_dialog->open_as_layers &&
g_slist_length (files) > 1)
gimp_image_undo_group_end (file_dialog->image);
if (success)
{
if (file_dialog->image)

View File

@@ -285,17 +285,20 @@ welcome_dialog_new (Gimp *gimp,
if (! show_welcome_page)
gtk_stack_set_visible_child_name (GTK_STACK (stack), "gimp-welcome-create");
main_vbox = gimp_prefs_box_add_page (GIMP_PREFS_BOX (prefs_box),
"gimp-wilber",
_("Release Notes"),
_("Release Notes"),
"gimp-welcome-release_notes",
NULL,
&top_iter);
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 12);
if (gimp_welcome_dialog_n_items > 0)
{
main_vbox = gimp_prefs_box_add_page (GIMP_PREFS_BOX (prefs_box),
"gimp-wilber",
_("Release Notes"),
_("Release Notes"),
"gimp-welcome-release_notes",
NULL,
&top_iter);
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 12);
welcome_dialog_create_release_page (gimp, dialog, main_vbox);
gtk_widget_set_visible (main_vbox, TRUE);
welcome_dialog_create_release_page (gimp, dialog, main_vbox);
gtk_widget_set_visible (main_vbox, TRUE);
}
return dialog;
}
@@ -421,12 +424,11 @@ welcome_dialog_create_welcome_page (Gimp *gimp,
/* Translators: the %s string will be the version, e.g. "3.0". */
tmp = g_strdup_printf (_("You installed GIMP %s!"), GIMP_VERSION);
markup = g_strdup_printf ("<big>%s</big>", tmp);
g_free (tmp);
widget = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (widget), markup);
g_free (markup);
gtk_label_set_selectable (GTK_LABEL (widget), TRUE);
/* XXX For GTK4, we may just replace with gtk_widget_add_css_class() AFAICS. */
gtk_style_context_add_class (gtk_widget_get_style_context (widget), "title-3");
gtk_label_set_text (GTK_LABEL (widget), tmp);
g_free (tmp);
gtk_label_set_justify (GTK_LABEL (widget), GTK_JUSTIFY_CENTER);
gtk_label_set_line_wrap (GTK_LABEL (widget), FALSE);
gtk_widget_set_margin_bottom (widget, 10);

View File

@@ -232,7 +232,7 @@ gimp_canvas_set_guide_style (GtkWidget *canvas,
gdouble offset_y)
{
const Babl *render_space;
GimpColorConfig *config;
GimpColorConfig *config = NULL;
cairo_pattern_t *pattern;
GeglColor *normal_fg;
GeglColor *normal_bg;
@@ -284,7 +284,8 @@ gimp_canvas_set_guide_style (GtkWidget *canvas,
cairo_set_line_width (cr, line_width);
config = GIMP_CORE_CONFIG (GIMP_CANVAS (canvas)->config)->color_management;
if (GIMP_IS_CANVAS (canvas))
config = GIMP_CORE_CONFIG (GIMP_CANVAS (canvas)->config)->color_management;
render_space = gimp_widget_get_render_space (canvas, config);
if (active)
pattern = gimp_cairo_pattern_create_stipple (active_fg, active_bg, 0,
@@ -324,7 +325,7 @@ gimp_canvas_set_grid_style (GtkWidget *canvas,
gdouble offset_y)
{
const Babl *render_space;
GimpColorConfig *config;
GimpColorConfig *config = NULL;
GeglColor *fg;
GeglColor *bg;
@@ -336,7 +337,8 @@ gimp_canvas_set_grid_style (GtkWidget *canvas,
fg = gimp_grid_get_fgcolor (grid);
config = GIMP_CORE_CONFIG (GIMP_CANVAS (canvas)->config)->color_management;
if (GIMP_IS_CANVAS (canvas))
config = GIMP_CORE_CONFIG (GIMP_CANVAS (canvas)->config)->color_management;
render_space = gimp_widget_get_render_space (canvas, config);
switch (gimp_grid_get_style (grid))
{
@@ -403,7 +405,7 @@ gimp_canvas_set_layer_style (GtkWidget *canvas,
gdouble offset_y)
{
const Babl *render_space;
GimpColorConfig *config;
GimpColorConfig *config = NULL;
cairo_pattern_t *pattern;
g_return_if_fail (GTK_IS_WIDGET (canvas));
@@ -413,7 +415,8 @@ gimp_canvas_set_layer_style (GtkWidget *canvas,
cairo_set_line_width (cr, 1.0);
cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
config = GIMP_CORE_CONFIG (GIMP_CANVAS (canvas)->config)->color_management;
if (GIMP_IS_CANVAS (canvas))
config = GIMP_CORE_CONFIG (GIMP_CANVAS (canvas)->config)->color_management;
render_space = gimp_widget_get_render_space (canvas, config);
if (gimp_layer_get_mask (layer) &&
gimp_layer_get_edit_mask (layer))
@@ -445,7 +448,7 @@ gimp_canvas_set_canvas_style (GtkWidget *canvas,
gdouble offset_y)
{
const Babl *render_space;
GimpColorConfig *config;
GimpColorConfig *config = NULL;
cairo_pattern_t *pattern;
g_return_if_fail (GTK_IS_WIDGET (canvas));
@@ -454,7 +457,8 @@ gimp_canvas_set_canvas_style (GtkWidget *canvas,
cairo_set_line_width (cr, 1.0);
cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
config = GIMP_CORE_CONFIG (GIMP_CANVAS (canvas)->config)->color_management;
if (GIMP_IS_CANVAS (canvas))
config = GIMP_CORE_CONFIG (GIMP_CANVAS (canvas)->config)->color_management;
render_space = gimp_widget_get_render_space (canvas, config);
pattern = gimp_cairo_pattern_create_stipple (canvas_fg, canvas_bg, 0,
offset_x, offset_y, render_space);
@@ -470,7 +474,7 @@ gimp_canvas_set_selection_out_style (GtkWidget *canvas,
gdouble offset_y)
{
const Babl *render_space;
GimpColorConfig *config;
GimpColorConfig *config = NULL;
cairo_pattern_t *pattern;
g_return_if_fail (GTK_IS_WIDGET (canvas));
@@ -479,7 +483,8 @@ gimp_canvas_set_selection_out_style (GtkWidget *canvas,
cairo_set_line_width (cr, 1.0);
cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
config = GIMP_CORE_CONFIG (GIMP_CANVAS (canvas)->config)->color_management;
if (GIMP_IS_CANVAS (canvas))
config = GIMP_CORE_CONFIG (GIMP_CANVAS (canvas)->config)->color_management;
render_space = gimp_widget_get_render_space (canvas, config);
pattern = gimp_cairo_pattern_create_stipple (selection_out_fg, selection_out_bg, 0,
offset_x, offset_y, render_space);
@@ -495,7 +500,7 @@ gimp_canvas_set_selection_in_style (GtkWidget *canvas,
gdouble offset_y)
{
const Babl *render_space;
GimpColorConfig *config;
GimpColorConfig *config = NULL;
cairo_pattern_t *pattern;
g_return_if_fail (GTK_IS_WIDGET (canvas));
@@ -504,7 +509,8 @@ gimp_canvas_set_selection_in_style (GtkWidget *canvas,
cairo_set_line_width (cr, 1.0);
cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
config = GIMP_CORE_CONFIG (GIMP_CANVAS (canvas)->config)->color_management;
if (GIMP_IS_CANVAS (canvas))
config = GIMP_CORE_CONFIG (GIMP_CANVAS (canvas)->config)->color_management;
render_space = gimp_widget_get_render_space (canvas, config);
pattern = gimp_cairo_pattern_create_stipple (selection_in_fg, selection_in_bg, index,
offset_x, offset_y, render_space);

View File

@@ -292,6 +292,7 @@ gimp_display_shell_drop_drawable (GtkWidget *widget,
gimp_image_add_layer (image, new_layer,
GIMP_IMAGE_ACTIVE_PARENT, -1, TRUE);
gimp_drawable_enable_resize_undo (GIMP_DRAWABLE (new_layer));
gimp_image_undo_group_end (image);

View File

@@ -933,7 +933,7 @@ gimp_display_shell_set_initial_scale (GimpDisplayShell *shell,
image = gimp_display_get_image (shell->display);
gdk_monitor_get_workarea (shell->initial_monitor, &workarea);
gdk_monitor_get_workarea (gimp_widget_get_monitor (GTK_WIDGET (shell)), &workarea);
image_width = gimp_image_get_width (image);
image_height = gimp_image_get_height (image);

View File

@@ -859,7 +859,8 @@ gimp_display_shell_canvas_tool_events (GtkWidget *canvas,
update_sw_cursor = TRUE;
if (shell->mod_action != GIMP_MODIFIER_ACTION_NONE ||
shell->space_release_pending)
(shell->space_release_pending &&
shell->display->config->space_bar_action == GIMP_SPACE_BAR_ACTION_PAN))
{
gimp_display_shell_handle_scrolling (shell,
state, mevent->x, mevent->y);

View File

@@ -118,6 +118,11 @@ enum
LAST_SIGNAL
};
struct _GimpDisplayShellPrivate
{
GdkMonitor *initial_monitor;
};
typedef struct _GimpDisplayShellOverlay GimpDisplayShellOverlay;
@@ -194,6 +199,7 @@ static gboolean gimp_display_shell_draw (GimpDisplayShell *shell,
G_DEFINE_TYPE_WITH_CODE (GimpDisplayShell, gimp_display_shell,
GTK_TYPE_EVENT_BOX,
G_ADD_PRIVATE (GimpDisplayShell)
G_IMPLEMENT_INTERFACE (GIMP_TYPE_PROGRESS,
gimp_display_shell_progress_iface_init)
G_IMPLEMENT_INTERFACE (GIMP_TYPE_COLOR_MANAGED,
@@ -336,6 +342,9 @@ gimp_display_shell_init (GimpDisplayShell *shell)
{
const gchar *env;
shell->priv = gimp_display_shell_get_instance_private (shell);
shell->priv->initial_monitor = NULL;
shell->options = g_object_new (GIMP_TYPE_DISPLAY_OPTIONS, NULL);
shell->fullscreen_options = g_object_new (GIMP_TYPE_DISPLAY_OPTIONS_FULLSCREEN, NULL);
shell->no_image_options = g_object_new (GIMP_TYPE_DISPLAY_OPTIONS_NO_IMAGE, NULL);
@@ -492,7 +501,7 @@ gimp_display_shell_constructed (GObject *object)
if (config->monitor_res_from_gdk)
{
gimp_get_monitor_resolution (shell->initial_monitor,
gimp_get_monitor_resolution (shell->priv->initial_monitor,
&shell->monitor_xres, &shell->monitor_yres);
}
else
@@ -817,6 +826,9 @@ gimp_display_shell_constructed (GObject *object)
gimp_display_shell_scale_update (shell);
gimp_display_shell_set_show_all (shell, config->default_show_all);
/* This was only useful during construction and should not be further used. */
shell->priv->initial_monitor = NULL;
}
static void
@@ -926,7 +938,7 @@ gimp_display_shell_set_property (GObject *object,
shell->popup_manager = g_value_get_object (value);
break;
case PROP_INITIAL_MONITOR:
shell->initial_monitor = g_value_get_object (value);
shell->priv->initial_monitor = g_value_get_object (value);
break;
case PROP_DISPLAY:
shell->display = g_value_get_object (value);
@@ -966,7 +978,7 @@ gimp_display_shell_get_property (GObject *object,
g_value_set_object (value, shell->popup_manager);
break;
case PROP_INITIAL_MONITOR:
g_value_set_object (value, shell->initial_monitor);
g_value_set_object (value, shell->priv->initial_monitor);
break;
case PROP_DISPLAY:
g_value_set_object (value, shell->display);

View File

@@ -43,7 +43,8 @@
#define GIMP_DISPLAY_SHELL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_DISPLAY_SHELL, GimpDisplayShellClass))
typedef struct _GimpDisplayShellClass GimpDisplayShellClass;
typedef struct _GimpDisplayShellClass GimpDisplayShellClass;
typedef struct _GimpDisplayShellPrivate GimpDisplayShellPrivate;
struct _GimpDisplayShell
{
@@ -54,7 +55,6 @@ struct _GimpDisplayShell
GBytes *window_handle;
GimpUIManager *popup_manager;
GdkMonitor *initial_monitor;
GimpDisplayOptions *options;
GimpDisplayOptions *fullscreen_options;
@@ -255,6 +255,8 @@ struct _GimpDisplayShell
GimpLayer *near_layer_vertical2;
gboolean drawn;
GimpDisplayShellPrivate *priv;
};
struct _GimpDisplayShellClass

View File

@@ -569,6 +569,9 @@ gimp_image_window_constructed (GObject *object)
gimp_container_foreach (GIMP_CONTAINER (device_manager),
(GFunc) gimp_image_window_init_pad_foreach,
window);
/* This was only useful during construction and should not be further used. */
private->initial_monitor = NULL;
}
static void

View File

@@ -540,10 +540,10 @@ gimp_statusbar_init (GimpStatusbar *statusbar)
statusbar);
combo_store =
gimp_int_store_new ("Perceptual", GIMP_COLOR_RENDERING_INTENT_PERCEPTUAL,
"Relative Colorimetric", GIMP_COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC,
"Saturation", GIMP_COLOR_RENDERING_INTENT_SATURATION,
"Absolute Colorimetric", GIMP_COLOR_RENDERING_INTENT_ABSOLUTE_COLORIMETRIC,
gimp_int_store_new (_("Perceptual"), GIMP_COLOR_RENDERING_INTENT_PERCEPTUAL,
_("Relative Colorimetric"), GIMP_COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC,
_("Saturation"), GIMP_COLOR_RENDERING_INTENT_SATURATION,
_("Absolute Colorimetric"), GIMP_COLOR_RENDERING_INTENT_ABSOLUTE_COLORIMETRIC,
NULL);
statusbar->rendering_intent_combo = g_object_new (GIMP_TYPE_INT_COMBO_BOX,
"model", combo_store,

View File

@@ -1400,16 +1400,28 @@ gimp_tool_path_get_function (GimpToolPath *path,
{
if (anchor->type == GIMP_ANCHOR_ANCHOR)
{
if (state & TOGGLE_MASK)
if (! (state & TOGGLE_MASK) &&
private->sel_anchor &&
private->sel_anchor != anchor &&
gimp_stroke_is_extendable (private->sel_stroke,
private->sel_anchor) &&
gimp_stroke_is_extendable (stroke, anchor))
{
function = VECTORS_MOVE_ANCHORSET;
function = VECTORS_CONNECT_STROKES;
}
else
{
if (private->sel_count >= 2 && anchor->selected)
function = VECTORS_MOVE_ANCHORSET;
if (state & TOGGLE_MASK)
{
function = VECTORS_MOVE_ANCHORSET;
}
else
function = VECTORS_MOVE_ANCHOR;
{
if (private->sel_count >= 2 && anchor->selected)
function = VECTORS_MOVE_ANCHORSET;
else
function = VECTORS_MOVE_ANCHOR;
}
}
}
else

View File

@@ -328,9 +328,17 @@ gimp_eek (const gchar *reason,
* takes precedence over the command line argument.
*/
#ifdef G_OS_WIN32
const gchar *gimpdebug = "gimp-debug-tool-" GIMP_TOOL_VERSION ".exe";
#ifdef ENABLE_RELOCATABLE_RESOURCES
const gchar *gimpdebug = g_build_filename (gimp_installation_directory (), "bin",
"gimp-debug-tool-" GIMP_TOOL_VERSION ".exe", NULL);
#else
const gchar *gimpdebug = BINDIR "/gimp-debug-tool-" GIMP_TOOL_VERSION ".exe";
#endif
#elif defined (PLATFORM_OSX)
const gchar *gimpdebug = "gimp-debug-tool-" GIMP_TOOL_VERSION;
#elif !defined (G_OS_WIN32) && !defined (PLATFORM_OSX) && defined ENABLE_RELOCATABLE_RESOURCES
const gchar *gimpdebug = g_build_filename (gimp_installation_directory (),
"libexec", "gimp-debug-tool-" GIMP_TOOL_VERSION, NULL);
#else
const gchar *gimpdebug = LIBEXECDIR "/gimp-debug-tool-" GIMP_TOOL_VERSION;
#endif

View File

@@ -121,8 +121,7 @@ file_open_image (Gimp *gimp,
}
/* FIXME enable these tests for remote files again, needs testing */
if (g_file_is_native (file) &&
g_file_query_exists (file, NULL))
if (g_file_is_native (file))
{
GFileInfo *info;
@@ -131,27 +130,35 @@ file_open_image (Gimp *gimp,
G_FILE_ATTRIBUTE_ACCESS_CAN_READ,
G_FILE_QUERY_INFO_NONE,
NULL, error);
if (! info)
return NULL;
if (g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_STANDARD_TYPE) != G_FILE_TYPE_REGULAR)
if (info != NULL)
{
g_set_error_literal (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("Not a regular file"));
if (g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_STANDARD_TYPE) != G_FILE_TYPE_REGULAR)
{
g_set_error_literal (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("Not a regular file"));
g_object_unref (info);
return NULL;
}
if (! g_file_info_get_attribute_boolean (info,
G_FILE_ATTRIBUTE_ACCESS_CAN_READ))
{
g_set_error_literal (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("Permission denied"));
g_object_unref (info);
return NULL;
}
g_object_unref (info);
}
else
{
/* File likely does not exists. error will already have a more
* accurate reason.
*/
return NULL;
}
if (! g_file_info_get_attribute_boolean (info,
G_FILE_ATTRIBUTE_ACCESS_CAN_READ))
{
g_set_error_literal (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("Permission denied"));
g_object_unref (info);
return NULL;
}
g_object_unref (info);
}
if (! file_proc)
@@ -742,6 +749,11 @@ static void
file_open_sanitize_image (GimpImage *image,
gboolean as_new)
{
/* This should never occur, but apparently it does sometimes #13702
* Avoids infinite loop in the while statement below.
*/
g_return_if_fail (GIMP_IS_IMAGE (image));
if (as_new)
gimp_image_set_file (image, NULL);

View File

@@ -222,6 +222,10 @@ file_utils_save_thumbnail (GimpImage *image,
g_return_val_if_fail (G_IS_FILE (file), FALSE);
image_file = gimp_image_get_file (image);
if (! image_file)
image_file = gimp_image_get_exported_file (image);
if (! image_file)
image_file = gimp_image_get_imported_file (image);
if (image_file)
{

View File

@@ -535,6 +535,8 @@ gimp_gegl_op_blacklisted (const gchar *name,
"gegl:high-pass",
"gegl:hue-chroma",
"gegl:illusion",
"gegl:json:dropshadow2",
"gegl:json:grey2",
"gegl:image-gradient",
"gegl:invert-linear",
"gegl:invert-gamma",
@@ -614,7 +616,7 @@ gimp_gegl_op_blacklisted (const gchar *name,
"gegl:ditto", /* pointless */
"gegl:fill-path",
"gegl:gray", /* we use gimp's op */
"gegl:hstack", /* pointless */
"gegl:hstack", /* deleted from GEGL and replaced by gegl:pack */
"gegl:introspect", /* pointless */
"gegl:layer", /* we use gimp's ops */
"gegl:lcms-from-profile", /* not usable here */
@@ -624,6 +626,7 @@ gimp_gegl_op_blacklisted (const gchar *name,
"gegl:matting-global", /* used in the foreground select tool */
"gegl:matting-levin", /* used in the foreground select tool */
"gegl:opacity", /* poinless */
"gegl:pack", /* pointless */
"gegl:path",
"gegl:posterize", /* we use gimp's op */
"gegl:radial-gradient", /* we use the blend tool */

View File

@@ -466,14 +466,18 @@ gimp_applicator_set_affect (GimpApplicator *applicator,
}
}
void
gboolean
gimp_applicator_set_output_format (GimpApplicator *applicator,
const Babl *format)
{
g_return_if_fail (GIMP_IS_APPLICATOR (applicator));
gboolean changed = FALSE;
g_return_val_if_fail (GIMP_IS_APPLICATOR (applicator), FALSE);
if (applicator->output_format != format)
{
changed = TRUE;
if (format)
{
if (! applicator->output_format)
@@ -499,6 +503,8 @@ gimp_applicator_set_output_format (GimpApplicator *applicator,
applicator->output_format = format;
}
return changed;
}
const Babl *

View File

@@ -124,7 +124,7 @@ void gimp_applicator_set_mode (GimpApplicator *applicator
void gimp_applicator_set_affect (GimpApplicator *applicator,
GimpComponentMask affect);
void gimp_applicator_set_output_format (GimpApplicator *applicator,
gboolean gimp_applicator_set_output_format (GimpApplicator *applicator,
const Babl *format);
const Babl * gimp_applicator_get_output_format (GimpApplicator *applicator);

View File

@@ -793,14 +793,13 @@ language_init (const gchar *language,
static gchar *
language_get_system_lang_id (void)
{
const gchar *syslang = NULL;
/* Using system language. It doesn't matter too much that the string
* format is different when using system or preference-set language,
* because this string is only used for comparison. As long as 2
* similar run have the same settings, the strings will be
* identical.
*/
#if defined G_OS_WIN32
return g_strdup_printf ("LANGID-%d", GetUserDefaultUILanguage());
#elif defined PLATFORM_OSX
@@ -818,7 +817,28 @@ language_get_system_lang_id (void)
langs = [[NSLocale preferredLanguages] componentsJoinedByString:@","];
return g_strdup_printf ("%s", [langs UTF8String]);
#elif defined HAVE__NL_IDENTIFICATION_LANGUAGE
#else
const gchar *syslang = NULL;
const gchar *language;
/* nl_langinfo() does not take LANGUAGE into account, only the `LC_*`
* variables apparently. Even though the GUI is correctly translated
* to LANGUAGE, syslang can end wrong. See #12722.
*
* This is why I return the concatenation of LANGUAGE (even though
* this variable may contain bogus data and therefore not reflect the
* real GUI language either) and the locale language.
*
* Since the returned string is mostly used to detect if we should
* trigger a re-query of all plug-ins (after a localization change),
* it is considered an opaque value.
* It may trigger unneeded force-query, but only if people play with
* environment variables and set different bogus language codes all
* the time. At least it wouldn't block force-query for real cases.
*/
language = g_getenv ("LANGUAGE");
#if defined HAVE__NL_IDENTIFICATION_LANGUAGE
syslang = nl_langinfo (_NL_IDENTIFICATION_LANGUAGE);
#endif
@@ -833,8 +853,6 @@ language_get_system_lang_id (void)
* let's just check environment variables ourselves.
* This is the proper order of priority.
*/
if (syslang == NULL || strlen (syslang) == 0)
syslang = g_getenv ("LANGUAGE");
if (syslang == NULL || strlen (syslang) == 0)
syslang = g_getenv ("LC_ALL");
if (syslang == NULL || strlen (syslang) == 0)
@@ -842,5 +860,13 @@ language_get_system_lang_id (void)
if (syslang == NULL || strlen (syslang) == 0)
syslang = g_getenv ("LANG");
return syslang && strlen (syslang) > 0 ? g_strdup (syslang) : NULL;
if (syslang && strlen (syslang) > 0 && language && strlen (language) > 0)
return g_strjoin ("-", language, syslang, NULL);
else if (syslang && strlen (syslang) > 0)
return g_strdup (syslang);
else if (language && strlen (language) > 0)
return g_strdup (language);
else
return NULL;
#endif
}

View File

@@ -595,6 +595,15 @@ main (int argc,
gimp_init_signal_handlers (&backtrace_file);
#ifdef G_OS_WIN32
/* Make Inno aware of gimp process avoiding broken install/unninstall */
char *utf8_name = g_strdup_printf ("GIMP-%s", GIMP_MUTEX_VERSION);
wchar_t *name = g_utf8_to_utf16 (utf8_name, -1, NULL, NULL, NULL);
CreateMutexW (NULL, FALSE, name);
g_free (utf8_name);
g_free (name);
/* Enable Anti-Aliasing*/
g_setenv ("PANGOCAIRO_BACKEND", "fc", TRUE);

View File

@@ -265,5 +265,14 @@ windows_menu_recent_remove (GimpContainer *container,
GimpSessionInfo *info,
GimpUIManager *manager)
{
gimp_ui_manager_remove_uis (manager, "windows-recent-");
gchar *action_name;
gint info_id;
info_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (info), "recent-action-id"));
action_name = g_strdup_printf ("windows-recent-%04d", info_id);
gimp_ui_manager_remove_uis (manager, action_name);
g_free (action_name);
}

View File

@@ -240,12 +240,10 @@ if enable_default_bin
pointing_to: fs.name(gimpmain_exe.full_path()),
install_dir: get_option('bindir'))
else
meson.add_install_script('sh', '-c',
'cp -f "@0@" "$MESON_INSTALL_DESTDIR_PREFIX/bin/@1@"'.format(gimpmain_exe.full_path(),
fs.name(gimpmain_exe.name()).replace(exec_ver, '.exe')))
meson.add_install_script('sh', '-c',
'cp -f "@0@" "$MESON_INSTALL_DESTDIR_PREFIX/bin/@1@"'.format(gimpmain_exe.full_path(),
fs.name(gimpmain_exe.name()).replace(exec_ver, '-@0@.exe'.format(api_version_major))))
meson.add_install_script(python, '-c', 'from shutil import copy2; from pathlib import Path; from sys import argv; copy2(argv[1], str(Path(argv[2]) / "bin" / argv[3]))',
gimpmain_exe.full_path(), get_option('prefix'), fs.name(gimpmain_exe.name()).replace(exec_ver, '.exe'))
meson.add_install_script(python, '-c', 'from shutil import copy2; from pathlib import Path; from sys import argv; copy2(argv[1], str(Path(argv[2]) / "bin" / argv[3].replace("@0@", argv[4])))',
gimpmain_exe.full_path(), get_option('prefix'), fs.name(gimpmain_exe.name()).replace(exec_ver, '-@0@.exe'), api_version_major.to_string())
endif
if enable_console_bin
if not platform_windows
@@ -256,12 +254,10 @@ if enable_default_bin
pointing_to: fs.name(gimpconsole_exe.full_path()),
install_dir: get_option('bindir'))
else
meson.add_install_script('sh', '-c',
'cp -f "@0@" "$MESON_INSTALL_DESTDIR_PREFIX/bin/@1@"'.format(gimpconsole_exe.full_path(),
fs.name(gimpconsole_exe.name()).replace(exec_ver, '.exe')))
meson.add_install_script('sh', '-c',
'cp -f "@0@" "$MESON_INSTALL_DESTDIR_PREFIX/bin/@1@"'.format(gimpconsole_exe.full_path(),
fs.name(gimpconsole_exe.name()).replace(exec_ver, '-@0@.exe'.format(api_version_major))))
meson.add_install_script(python, '-c', 'from shutil import copy2; from pathlib import Path; from sys import argv; copy2(argv[1], str(Path(argv[2]) / "bin" / argv[3]))',
gimpconsole_exe.full_path(), get_option('prefix'), fs.name(gimpconsole_exe.name()).replace(exec_ver, '.exe'))
meson.add_install_script(python, '-c', 'from shutil import copy2; from pathlib import Path; from sys import argv; copy2(argv[1], str(Path(argv[2]) / "bin" / argv[3].replace("@0@", argv[4])))',
gimpconsole_exe.full_path(), get_option('prefix'), fs.name(gimpconsole_exe.name()).replace(exec_ver, '-@0@.exe'), api_version_major.to_string())
endif
endif
endif

View File

@@ -68,6 +68,7 @@ typedef void (* CompositeFunc) (const gfloat *in,
gint samples);
static void gimp_operation_layer_mode_finalize (GObject *object);
static void gimp_operation_layer_mode_set_property (GObject *object,
guint property_id,
const GValue *value,
@@ -117,8 +118,11 @@ static gboolean process_last_node (GeglOperat
const GeglRectangle *roi,
gint level);
static void gimp_operation_layer_mode_cache_fishes (GimpOperationLayerMode *op,
const Babl *preferred_format);
static void gimp_operation_layer_mode_cache_fishes (GimpOperationLayerMode *op,
const Babl *preferred_format,
const Babl **out_format,
const Babl **composite_to_blend_fish,
const Babl **blend_to_composite_fish);
G_DEFINE_TYPE (GimpOperationLayerMode, gimp_operation_layer_mode,
@@ -147,6 +151,7 @@ gimp_operation_layer_mode_class_init (GimpOperationLayerModeClass *klass)
gegl_operation_class_set_keys (operation_class,
"name", "gimp:layer-mode", NULL);
object_class->finalize = gimp_operation_layer_mode_finalize;
object_class->set_property = gimp_operation_layer_mode_set_property;
object_class->get_property = gimp_operation_layer_mode_get_property;
@@ -210,6 +215,17 @@ gimp_operation_layer_mode_class_init (GimpOperationLayerModeClass *klass)
static void
gimp_operation_layer_mode_init (GimpOperationLayerMode *self)
{
g_rw_lock_init (&self->cache_lock);
}
static void
gimp_operation_layer_mode_finalize (GObject *object)
{
GimpOperationLayerMode *mode = GIMP_OPERATION_LAYER_MODE (object);
g_rw_lock_clear (&mode->cache_lock);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static void
@@ -344,13 +360,7 @@ gimp_operation_layer_mode_prepare (GeglOperation *operation)
self->has_mask = mask_extent && ! gegl_rectangle_is_empty (mask_extent);
gimp_operation_layer_mode_cache_fishes (self, preferred_format);
format = gimp_layer_mode_get_format (self->layer_mode,
self->blend_space,
self->composite_space,
self->composite_mode,
preferred_format);
gimp_operation_layer_mode_cache_fishes (self, preferred_format, &format, NULL, NULL);
gegl_operation_set_format (operation, "input", format);
gegl_operation_set_format (operation, "output", format);
@@ -615,8 +625,6 @@ gimp_operation_layer_mode_real_process (GeglOperation *operation,
gfloat *layer = layer_p;
gfloat *mask = mask_p;
gfloat opacity = layer_mode->opacity;
GimpLayerColorSpace blend_space = layer_mode->blend_space;
GimpLayerColorSpace composite_space = layer_mode->composite_space;
GimpLayerCompositeMode composite_mode = layer_mode->composite_mode;
GimpLayerModeBlendFunc blend_function = layer_mode->blend_function;
gboolean composite_needs_in_color;
@@ -655,21 +663,12 @@ gimp_operation_layer_mode_real_process (GeglOperation *operation,
blend_layer = layer;
blend_out = out;
if (blend_space != GIMP_LAYER_COLOR_SPACE_AUTO)
{
gimp_assert (composite_space >= 1 && composite_space < 5);
gimp_assert (blend_space >= 1 && blend_space < 5);
/* Make sure the cache is set up from the start as the
* operation's prepare() method may have not been run yet.
*/
gimp_operation_layer_mode_cache_fishes (layer_mode, NULL);
composite_to_blend_fish = layer_mode->space_fish [composite_space - 1]
[blend_space - 1];
blend_to_composite_fish = layer_mode->space_fish [blend_space - 1]
[composite_space - 1];
}
/* Make sure the cache is set up from the start as the
* operation's prepare() method may have not been run yet.
*/
gimp_operation_layer_mode_cache_fishes (layer_mode, NULL, NULL,
&composite_to_blend_fish,
&blend_to_composite_fish);
/* if we need to convert the samples between the composite and blend
* spaces...
@@ -874,10 +873,27 @@ process_last_node (GeglOperation *operation,
}
static void
gimp_operation_layer_mode_cache_fishes (GimpOperationLayerMode *op,
const Babl *preferred_format)
gimp_operation_layer_mode_cache_fishes (GimpOperationLayerMode *op,
const Babl *preferred_format,
const Babl **layer_mode_format,
const Babl **composite_to_blend_fish,
const Babl **blend_to_composite_fish)
{
const Babl *format;
gboolean update_cache = FALSE;
g_rw_lock_reader_lock (&op->cache_lock);
gimp_assert (op->composite_space >= GIMP_LAYER_COLOR_SPACE_AUTO &&
op->composite_space < GIMP_LAYER_COLOR_SPACE_LAST);
gimp_assert (op->blend_space >= GIMP_LAYER_COLOR_SPACE_AUTO &&
op->blend_space < GIMP_LAYER_COLOR_SPACE_LAST);
/* XXX I am not why but some old code already had some assert that the
* composite_space would not be AUTO when blend_space is not.
*/
if (op->blend_space != GIMP_LAYER_COLOR_SPACE_AUTO)
gimp_assert (op->composite_space != GIMP_LAYER_COLOR_SPACE_AUTO);
if (! preferred_format)
{
@@ -896,82 +912,123 @@ gimp_operation_layer_mode_cache_fishes (GimpOperationLayerMode *op,
op->composite_space,
op->composite_mode,
preferred_format);
if (op->cached_fish_format != format)
{
op->cached_fish_format = format;
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1] =
babl_fish (babl_format_with_space ("RGBA float", format),
babl_format_with_space ("R~G~B~A float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_NON_LINEAR - 1] =
babl_fish (babl_format_with_space ("RGBA float", format),
babl_format_with_space ("R'G'B'A float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_LAB - 1] =
babl_fish (babl_format_with_space ("RGBA float", format),
babl_format_with_space ("CIE Lab alpha float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_NON_LINEAR - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1] =
babl_fish (babl_format_with_space("R'G'B'A float", format),
babl_format_with_space ( "RGBA float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1] =
babl_fish (babl_format_with_space("R~G~B~A float", format),
babl_format_with_space ( "RGBA float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_LAB - 1] =
babl_fish (babl_format_with_space("R~G~B~A float", format),
babl_format_with_space ( "CIE Lab alpha float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_NON_LINEAR - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_LAB - 1] =
babl_fish (babl_format_with_space("R'G'B'A float", format),
babl_format_with_space ( "CIE Lab alpha float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_LAB - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1] =
babl_fish (babl_format_with_space("CIE Lab alpha float", format),
babl_format_with_space ( "RGBA float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_LAB - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1] =
babl_fish (babl_format_with_space("CIE Lab alpha float", format),
babl_format_with_space ( "R~G~B~A float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_LAB - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_NON_LINEAR - 1] =
babl_fish (babl_format_with_space("CIE Lab alpha float", format),
babl_format_with_space ( "R'G'B'A float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_NON_LINEAR - 1] =
babl_fish (babl_format_with_space("R~G~B~A float", format),
babl_format_with_space ( "R'G'B'A float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_NON_LINEAR - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1] =
babl_fish (babl_format_with_space("R'G'B'A float", format),
babl_format_with_space ( "R~G~B~A float", format));
g_rw_lock_reader_unlock (&op->cache_lock);
update_cache = TRUE;
}
if (update_cache)
{
g_rw_lock_writer_lock (&op->cache_lock);
/* We recheck because it is possible that in-between the point we
* released the read lock and got our write lock, another thread
* also modified the cache (to the same values).
* No need to redo the same thing twice.
*/
if (op->cached_fish_format != format)
{
op->cached_fish_format = format;
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1] =
babl_fish (babl_format_with_space ("RGBA float", format),
babl_format_with_space ("R~G~B~A float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_NON_LINEAR - 1] =
babl_fish (babl_format_with_space ("RGBA float", format),
babl_format_with_space ("R'G'B'A float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_LAB - 1] =
babl_fish (babl_format_with_space ("RGBA float", format),
babl_format_with_space ("CIE Lab alpha float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_NON_LINEAR - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1] =
babl_fish (babl_format_with_space("R'G'B'A float", format),
babl_format_with_space ( "RGBA float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1] =
babl_fish (babl_format_with_space("R~G~B~A float", format),
babl_format_with_space ( "RGBA float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_LAB - 1] =
babl_fish (babl_format_with_space("R~G~B~A float", format),
babl_format_with_space ( "CIE Lab alpha float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_NON_LINEAR - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_LAB - 1] =
babl_fish (babl_format_with_space("R'G'B'A float", format),
babl_format_with_space ( "CIE Lab alpha float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_LAB - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_LINEAR - 1] =
babl_fish (babl_format_with_space("CIE Lab alpha float", format),
babl_format_with_space ( "RGBA float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_LAB - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1] =
babl_fish (babl_format_with_space("CIE Lab alpha float", format),
babl_format_with_space ( "R~G~B~A float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_LAB - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_NON_LINEAR - 1] =
babl_fish (babl_format_with_space("CIE Lab alpha float", format),
babl_format_with_space ( "R'G'B'A float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_NON_LINEAR - 1] =
babl_fish (babl_format_with_space("R~G~B~A float", format),
babl_format_with_space ( "R'G'B'A float", format));
op->space_fish
/* from */ [GIMP_LAYER_COLOR_SPACE_RGB_NON_LINEAR - 1]
/* to */ [GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL - 1] =
babl_fish (babl_format_with_space("R'G'B'A float", format),
babl_format_with_space ( "R~G~B~A float", format));
}
}
if (layer_mode_format)
*layer_mode_format = format;
if (composite_to_blend_fish)
{
if (op->blend_space != GIMP_LAYER_COLOR_SPACE_AUTO &&
op->composite_space != GIMP_LAYER_COLOR_SPACE_AUTO)
*composite_to_blend_fish = op->space_fish[op->composite_space - 1][op->blend_space - 1];
else
*composite_to_blend_fish = NULL;
}
if (blend_to_composite_fish)
{
if (op->blend_space != GIMP_LAYER_COLOR_SPACE_AUTO &&
op->composite_space != GIMP_LAYER_COLOR_SPACE_AUTO)
*blend_to_composite_fish = op->space_fish[op->blend_space - 1][op->composite_space - 1];
else
*blend_to_composite_fish = NULL;
}
if (update_cache)
g_rw_lock_writer_unlock (&op->cache_lock);
else
g_rw_lock_reader_unlock (&op->cache_lock);
}

View File

@@ -46,6 +46,7 @@ struct _GimpOperationLayerMode
GimpLayerCompositeMode composite_mode;
const Babl *cached_fish_format;
const Babl *space_fish[4 /* from */][4 /* to */];
GRWLock cache_lock;
gdouble prop_opacity;
GimpLayerCompositeMode prop_composite_mode;

View File

@@ -32,6 +32,7 @@ typedef enum
GIMP_LAYER_COLOR_SPACE_RGB_NON_LINEAR, /*< desc="RGB (from color profile)" >*/
GIMP_LAYER_COLOR_SPACE_LAB, /*< desc="LAB" >*/
GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL, /*< desc="RGB (perceptual)" >*/
GIMP_LAYER_COLOR_SPACE_LAST, /*< pdb-skip, skip >*/
} GimpLayerColorSpace;

View File

@@ -1084,7 +1084,7 @@ gimp_paint_core_expand_drawable (GimpPaintCore *core,
core->canvas_buffer = new_buffer;
gimp_get_fill_params (context, fill_type, &color, &pattern, NULL);
if (! gimp_drawable_has_alpha (drawable))
if (color && ! gimp_drawable_has_alpha (drawable))
gimp_color_set_alpha (color, 1.0);
undo_buffer = g_hash_table_lookup (core->undo_buffers, drawable);

View File

@@ -504,23 +504,24 @@ gimp_smudge_motion (GimpPaintCore *paint_core,
TRUE);
}
gimp_gegl_smudge_with_paint (accum_buffer,
GEGL_RECTANGLE (paint_buffer_x - x,
paint_buffer_y - y,
paint_buffer_width,
paint_buffer_height),
gimp_pickable_get_buffer (dest_pickable),
GEGL_RECTANGLE (paint_buffer_x +
dest_pickable_off_x,
paint_buffer_y +
dest_pickable_off_y,
paint_buffer_width,
paint_buffer_height),
brush_color,
paint_buffer,
options->no_erasing,
flow,
rate);
if (accum_buffer)
gimp_gegl_smudge_with_paint (accum_buffer,
GEGL_RECTANGLE (paint_buffer_x - x,
paint_buffer_y - y,
paint_buffer_width,
paint_buffer_height),
gimp_pickable_get_buffer (dest_pickable),
GEGL_RECTANGLE (paint_buffer_x +
dest_pickable_off_x,
paint_buffer_y +
dest_pickable_off_y,
paint_buffer_width,
paint_buffer_height),
brush_color,
paint_buffer,
options->no_erasing,
flow,
rate);
if (gimp_dynamics_is_output_enabled (dynamics, GIMP_DYNAMICS_OUTPUT_FORCE))
force = gimp_dynamics_get_linear_value (dynamics,
@@ -553,10 +554,19 @@ gimp_smudge_accumulator_coords (GimpPaintCore *paint_core,
GimpSmudge *smudge = GIMP_SMUDGE (paint_core);
GeglBuffer *accum_buffer;
accum_buffer = g_list_nth_data (smudge->accum_buffers, stroke);
*x = (gint) coords->x;
*y = (gint) coords->y;
*x = (gint) coords->x - gegl_buffer_get_width (accum_buffer) / 2;
*y = (gint) coords->y - gegl_buffer_get_height (accum_buffer) / 2;
if (smudge->accum_buffers)
{
accum_buffer = g_list_nth_data (smudge->accum_buffers, stroke);
if (accum_buffer)
{
*x -= gegl_buffer_get_width (accum_buffer) / 2;
*y -= gegl_buffer_get_height (accum_buffer) / 2;
}
}
}
static void

View File

@@ -162,19 +162,22 @@ brush_get_info_invoker (GimpProcedure *procedure,
{
GimpTempBuf *mask = gimp_brush_get_mask (brush);
GimpTempBuf *pixmap = gimp_brush_get_pixmap (brush);
const Babl *format;
const Babl *format = NULL;
format = gimp_babl_compat_u8_mask_format (
gimp_temp_buf_get_format (mask));
if (brush)
format = gimp_babl_compat_u8_mask_format (gimp_temp_buf_get_format (mask));
width = gimp_brush_get_width (brush);
height = gimp_brush_get_height (brush);
mask_bpp = babl_format_get_bytes_per_pixel (format);
if (pixmap)
if (format)
mask_bpp = babl_format_get_bytes_per_pixel (format);
else
mask_bpp = 0;
if (pixmap && format)
{
format = gimp_babl_compat_u8_format (
gimp_temp_buf_get_format (pixmap));
format = gimp_babl_compat_u8_format (gimp_temp_buf_get_format (pixmap));
color_bpp = babl_format_get_bytes_per_pixel (format);
}
@@ -770,7 +773,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-new
*/
procedure = gimp_procedure_new (brush_new_invoker);
procedure = gimp_procedure_new (brush_new_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-new");
gimp_procedure_set_static_help (procedure,
@@ -802,7 +805,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-get-by-name
*/
procedure = gimp_procedure_new (brush_get_by_name_invoker);
procedure = gimp_procedure_new (brush_get_by_name_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-get-by-name");
gimp_procedure_set_static_help (procedure,
@@ -834,7 +837,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-is-generated
*/
procedure = gimp_procedure_new (brush_is_generated_invoker);
procedure = gimp_procedure_new (brush_is_generated_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-is-generated");
gimp_procedure_set_static_help (procedure,
@@ -865,7 +868,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-get-info
*/
procedure = gimp_procedure_new (brush_get_info_invoker);
procedure = gimp_procedure_new (brush_get_info_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-get-info");
gimp_procedure_set_static_help (procedure,
@@ -914,7 +917,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-get-pixels
*/
procedure = gimp_procedure_new (brush_get_pixels_invoker);
procedure = gimp_procedure_new (brush_get_pixels_invoker, TRUE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-get-pixels");
gimp_procedure_set_static_help (procedure,
@@ -975,7 +978,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-get-spacing
*/
procedure = gimp_procedure_new (brush_get_spacing_invoker);
procedure = gimp_procedure_new (brush_get_spacing_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-get-spacing");
gimp_procedure_set_static_help (procedure,
@@ -1006,7 +1009,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-set-spacing
*/
procedure = gimp_procedure_new (brush_set_spacing_invoker);
procedure = gimp_procedure_new (brush_set_spacing_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-set-spacing");
gimp_procedure_set_static_help (procedure,
@@ -1037,7 +1040,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-get-shape
*/
procedure = gimp_procedure_new (brush_get_shape_invoker);
procedure = gimp_procedure_new (brush_get_shape_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-get-shape");
gimp_procedure_set_static_help (procedure,
@@ -1069,7 +1072,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-set-shape
*/
procedure = gimp_procedure_new (brush_set_shape_invoker);
procedure = gimp_procedure_new (brush_set_shape_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-set-shape");
gimp_procedure_set_static_help (procedure,
@@ -1108,7 +1111,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-get-radius
*/
procedure = gimp_procedure_new (brush_get_radius_invoker);
procedure = gimp_procedure_new (brush_get_radius_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-get-radius");
gimp_procedure_set_static_help (procedure,
@@ -1139,12 +1142,12 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-set-radius
*/
procedure = gimp_procedure_new (brush_set_radius_invoker);
procedure = gimp_procedure_new (brush_set_radius_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-set-radius");
gimp_procedure_set_static_help (procedure,
"Sets the radius of a generated brush.",
"Sets the radius for a generated brush. Clamps radius to [0.0, 32767.0]. Returns the clamped value. Returns an error when brush is non-parametric or not editable.",
"Sets the radius for a generated brush. Clamps radius to [0.1, 4000.0]. Returns the clamped value. Returns an error when brush is non-parametric or not editable.",
NULL);
gimp_procedure_set_static_attribution (procedure,
"Bill Skaggs <weskaggs@primate.ucdavis.edu>",
@@ -1176,7 +1179,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-get-spikes
*/
procedure = gimp_procedure_new (brush_get_spikes_invoker);
procedure = gimp_procedure_new (brush_get_spikes_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-get-spikes");
gimp_procedure_set_static_help (procedure,
@@ -1207,7 +1210,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-set-spikes
*/
procedure = gimp_procedure_new (brush_set_spikes_invoker);
procedure = gimp_procedure_new (brush_set_spikes_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-set-spikes");
gimp_procedure_set_static_help (procedure,
@@ -1244,7 +1247,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-get-hardness
*/
procedure = gimp_procedure_new (brush_get_hardness_invoker);
procedure = gimp_procedure_new (brush_get_hardness_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-get-hardness");
gimp_procedure_set_static_help (procedure,
@@ -1275,7 +1278,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-set-hardness
*/
procedure = gimp_procedure_new (brush_set_hardness_invoker);
procedure = gimp_procedure_new (brush_set_hardness_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-set-hardness");
gimp_procedure_set_static_help (procedure,
@@ -1312,7 +1315,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-get-aspect-ratio
*/
procedure = gimp_procedure_new (brush_get_aspect_ratio_invoker);
procedure = gimp_procedure_new (brush_get_aspect_ratio_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-get-aspect-ratio");
gimp_procedure_set_static_help (procedure,
@@ -1343,7 +1346,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-set-aspect-ratio
*/
procedure = gimp_procedure_new (brush_set_aspect_ratio_invoker);
procedure = gimp_procedure_new (brush_set_aspect_ratio_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-set-aspect-ratio");
gimp_procedure_set_static_help (procedure,
@@ -1380,7 +1383,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-get-angle
*/
procedure = gimp_procedure_new (brush_get_angle_invoker);
procedure = gimp_procedure_new (brush_get_angle_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-get-angle");
gimp_procedure_set_static_help (procedure,
@@ -1411,7 +1414,7 @@ register_brush_procs (GimpPDB *pdb)
/*
* gimp-brush-set-angle
*/
procedure = gimp_procedure_new (brush_set_angle_invoker);
procedure = gimp_procedure_new (brush_set_angle_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brush-set-angle");
gimp_procedure_set_static_help (procedure,

View File

@@ -144,7 +144,7 @@ register_brush_select_procs (GimpPDB *pdb)
/*
* gimp-brushes-popup
*/
procedure = gimp_procedure_new (brushes_popup_invoker);
procedure = gimp_procedure_new (brushes_popup_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brushes-popup");
gimp_procedure_set_static_help (procedure,
@@ -173,7 +173,7 @@ register_brush_select_procs (GimpPDB *pdb)
gimp_param_spec_brush ("initial-brush",
"initial brush",
"The brush to set as the initial choice",
FALSE,
TRUE,
NULL,
FALSE,
GIMP_PARAM_READWRITE));
@@ -189,7 +189,7 @@ register_brush_select_procs (GimpPDB *pdb)
/*
* gimp-brushes-close-popup
*/
procedure = gimp_procedure_new (brushes_close_popup_invoker);
procedure = gimp_procedure_new (brushes_close_popup_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brushes-close-popup");
gimp_procedure_set_static_help (procedure,
@@ -213,7 +213,7 @@ register_brush_select_procs (GimpPDB *pdb)
/*
* gimp-brushes-set-popup
*/
procedure = gimp_procedure_new (brushes_set_popup_invoker);
procedure = gimp_procedure_new (brushes_set_popup_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brushes-set-popup");
gimp_procedure_set_static_help (procedure,

View File

@@ -96,7 +96,7 @@ register_brushes_procs (GimpPDB *pdb)
/*
* gimp-brushes-refresh
*/
procedure = gimp_procedure_new (brushes_refresh_invoker);
procedure = gimp_procedure_new (brushes_refresh_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brushes-refresh");
gimp_procedure_set_static_help (procedure,
@@ -113,7 +113,7 @@ register_brushes_procs (GimpPDB *pdb)
/*
* gimp-brushes-get-list
*/
procedure = gimp_procedure_new (brushes_get_list_invoker);
procedure = gimp_procedure_new (brushes_get_list_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-brushes-get-list");
gimp_procedure_set_static_help (procedure,

View File

@@ -288,7 +288,7 @@ register_buffer_procs (GimpPDB *pdb)
/*
* gimp-buffers-get-name-list
*/
procedure = gimp_procedure_new (buffers_get_name_list_invoker);
procedure = gimp_procedure_new (buffers_get_name_list_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-buffers-get-name-list");
gimp_procedure_set_static_help (procedure,
@@ -318,7 +318,7 @@ register_buffer_procs (GimpPDB *pdb)
/*
* gimp-buffer-rename
*/
procedure = gimp_procedure_new (buffer_rename_invoker);
procedure = gimp_procedure_new (buffer_rename_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-buffer-rename");
gimp_procedure_set_static_help (procedure,
@@ -356,7 +356,7 @@ register_buffer_procs (GimpPDB *pdb)
/*
* gimp-buffer-delete
*/
procedure = gimp_procedure_new (buffer_delete_invoker);
procedure = gimp_procedure_new (buffer_delete_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-buffer-delete");
gimp_procedure_set_static_help (procedure,
@@ -380,7 +380,7 @@ register_buffer_procs (GimpPDB *pdb)
/*
* gimp-buffer-get-width
*/
procedure = gimp_procedure_new (buffer_get_width_invoker);
procedure = gimp_procedure_new (buffer_get_width_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-buffer-get-width");
gimp_procedure_set_static_help (procedure,
@@ -410,7 +410,7 @@ register_buffer_procs (GimpPDB *pdb)
/*
* gimp-buffer-get-height
*/
procedure = gimp_procedure_new (buffer_get_height_invoker);
procedure = gimp_procedure_new (buffer_get_height_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-buffer-get-height");
gimp_procedure_set_static_help (procedure,
@@ -440,7 +440,7 @@ register_buffer_procs (GimpPDB *pdb)
/*
* gimp-buffer-get-bytes
*/
procedure = gimp_procedure_new (buffer_get_bytes_invoker);
procedure = gimp_procedure_new (buffer_get_bytes_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-buffer-get-bytes");
gimp_procedure_set_static_help (procedure,
@@ -470,7 +470,7 @@ register_buffer_procs (GimpPDB *pdb)
/*
* gimp-buffer-get-image-type
*/
procedure = gimp_procedure_new (buffer_get_image_type_invoker);
procedure = gimp_procedure_new (buffer_get_image_type_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-buffer-get-image-type");
gimp_procedure_set_static_help (procedure,

View File

@@ -377,7 +377,7 @@ register_channel_procs (GimpPDB *pdb)
/*
* gimp-channel-new
*/
procedure = gimp_procedure_new (channel_new_invoker);
procedure = gimp_procedure_new (channel_new_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-channel-new");
gimp_procedure_set_static_help (procedure,
@@ -444,7 +444,7 @@ register_channel_procs (GimpPDB *pdb)
/*
* gimp-channel-new-from-component
*/
procedure = gimp_procedure_new (channel_new_from_component_invoker);
procedure = gimp_procedure_new (channel_new_from_component_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-channel-new-from-component");
gimp_procedure_set_static_help (procedure,
@@ -488,7 +488,7 @@ register_channel_procs (GimpPDB *pdb)
/*
* gimp-channel-copy
*/
procedure = gimp_procedure_new (channel_copy_invoker);
procedure = gimp_procedure_new (channel_copy_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-channel-copy");
gimp_procedure_set_static_help (procedure,
@@ -518,7 +518,7 @@ register_channel_procs (GimpPDB *pdb)
/*
* gimp-channel-combine-masks
*/
procedure = gimp_procedure_new (channel_combine_masks_invoker);
procedure = gimp_procedure_new (channel_combine_masks_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-channel-combine-masks");
gimp_procedure_set_static_help (procedure,
@@ -566,7 +566,7 @@ register_channel_procs (GimpPDB *pdb)
/*
* gimp-channel-get-show-masked
*/
procedure = gimp_procedure_new (channel_get_show_masked_invoker);
procedure = gimp_procedure_new (channel_get_show_masked_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-channel-get-show-masked");
gimp_procedure_set_static_help (procedure,
@@ -595,7 +595,7 @@ register_channel_procs (GimpPDB *pdb)
/*
* gimp-channel-set-show-masked
*/
procedure = gimp_procedure_new (channel_set_show_masked_invoker);
procedure = gimp_procedure_new (channel_set_show_masked_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-channel-set-show-masked");
gimp_procedure_set_static_help (procedure,
@@ -624,7 +624,7 @@ register_channel_procs (GimpPDB *pdb)
/*
* gimp-channel-get-opacity
*/
procedure = gimp_procedure_new (channel_get_opacity_invoker);
procedure = gimp_procedure_new (channel_get_opacity_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-channel-get-opacity");
gimp_procedure_set_static_help (procedure,
@@ -653,7 +653,7 @@ register_channel_procs (GimpPDB *pdb)
/*
* gimp-channel-set-opacity
*/
procedure = gimp_procedure_new (channel_set_opacity_invoker);
procedure = gimp_procedure_new (channel_set_opacity_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-channel-set-opacity");
gimp_procedure_set_static_help (procedure,
@@ -682,7 +682,7 @@ register_channel_procs (GimpPDB *pdb)
/*
* gimp-channel-get-color
*/
procedure = gimp_procedure_new (channel_get_color_invoker);
procedure = gimp_procedure_new (channel_get_color_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-channel-get-color");
gimp_procedure_set_static_help (procedure,
@@ -712,7 +712,7 @@ register_channel_procs (GimpPDB *pdb)
/*
* gimp-channel-set-color
*/
procedure = gimp_procedure_new (channel_set_color_invoker);
procedure = gimp_procedure_new (channel_set_color_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-channel-set-color");
gimp_procedure_set_static_help (procedure,

View File

@@ -3125,7 +3125,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-push
*/
procedure = gimp_procedure_new (context_push_invoker);
procedure = gimp_procedure_new (context_push_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-push");
gimp_procedure_set_static_help (procedure,
@@ -3142,7 +3142,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-pop
*/
procedure = gimp_procedure_new (context_pop_invoker);
procedure = gimp_procedure_new (context_pop_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-pop");
gimp_procedure_set_static_help (procedure,
@@ -3159,7 +3159,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-defaults
*/
procedure = gimp_procedure_new (context_set_defaults_invoker);
procedure = gimp_procedure_new (context_set_defaults_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-defaults");
gimp_procedure_set_static_help (procedure,
@@ -3176,7 +3176,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-list-paint-methods
*/
procedure = gimp_procedure_new (context_list_paint_methods_invoker);
procedure = gimp_procedure_new (context_list_paint_methods_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-list-paint-methods");
gimp_procedure_set_static_help (procedure,
@@ -3199,7 +3199,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-paint-method
*/
procedure = gimp_procedure_new (context_get_paint_method_invoker);
procedure = gimp_procedure_new (context_get_paint_method_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-paint-method");
gimp_procedure_set_static_help (procedure,
@@ -3223,7 +3223,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-paint-method
*/
procedure = gimp_procedure_new (context_set_paint_method_invoker);
procedure = gimp_procedure_new (context_set_paint_method_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-paint-method");
gimp_procedure_set_static_help (procedure,
@@ -3247,7 +3247,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-stroke-method
*/
procedure = gimp_procedure_new (context_get_stroke_method_invoker);
procedure = gimp_procedure_new (context_get_stroke_method_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-stroke-method");
gimp_procedure_set_static_help (procedure,
@@ -3271,7 +3271,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-stroke-method
*/
procedure = gimp_procedure_new (context_set_stroke_method_invoker);
procedure = gimp_procedure_new (context_set_stroke_method_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-stroke-method");
gimp_procedure_set_static_help (procedure,
@@ -3295,7 +3295,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-foreground
*/
procedure = gimp_procedure_new (context_get_foreground_invoker);
procedure = gimp_procedure_new (context_get_foreground_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-foreground");
gimp_procedure_set_static_help (procedure,
@@ -3319,7 +3319,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-foreground
*/
procedure = gimp_procedure_new (context_set_foreground_invoker);
procedure = gimp_procedure_new (context_set_foreground_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-foreground");
gimp_procedure_set_static_help (procedure,
@@ -3343,7 +3343,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-background
*/
procedure = gimp_procedure_new (context_get_background_invoker);
procedure = gimp_procedure_new (context_get_background_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-background");
gimp_procedure_set_static_help (procedure,
@@ -3367,7 +3367,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-background
*/
procedure = gimp_procedure_new (context_set_background_invoker);
procedure = gimp_procedure_new (context_set_background_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-background");
gimp_procedure_set_static_help (procedure,
@@ -3391,7 +3391,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-default-colors
*/
procedure = gimp_procedure_new (context_set_default_colors_invoker);
procedure = gimp_procedure_new (context_set_default_colors_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-default-colors");
gimp_procedure_set_static_help (procedure,
@@ -3408,7 +3408,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-swap-colors
*/
procedure = gimp_procedure_new (context_swap_colors_invoker);
procedure = gimp_procedure_new (context_swap_colors_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-swap-colors");
gimp_procedure_set_static_help (procedure,
@@ -3425,7 +3425,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-opacity
*/
procedure = gimp_procedure_new (context_get_opacity_invoker);
procedure = gimp_procedure_new (context_get_opacity_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-opacity");
gimp_procedure_set_static_help (procedure,
@@ -3448,7 +3448,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-opacity
*/
procedure = gimp_procedure_new (context_set_opacity_invoker);
procedure = gimp_procedure_new (context_set_opacity_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-opacity");
gimp_procedure_set_static_help (procedure,
@@ -3471,7 +3471,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-paint-mode
*/
procedure = gimp_procedure_new (context_get_paint_mode_invoker);
procedure = gimp_procedure_new (context_get_paint_mode_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-paint-mode");
gimp_procedure_set_static_help (procedure,
@@ -3495,7 +3495,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-paint-mode
*/
procedure = gimp_procedure_new (context_set_paint_mode_invoker);
procedure = gimp_procedure_new (context_set_paint_mode_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-paint-mode");
gimp_procedure_set_static_help (procedure,
@@ -3519,7 +3519,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-line-width
*/
procedure = gimp_procedure_new (context_get_line_width_invoker);
procedure = gimp_procedure_new (context_get_line_width_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-line-width");
gimp_procedure_set_static_help (procedure,
@@ -3542,7 +3542,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-line-width
*/
procedure = gimp_procedure_new (context_set_line_width_invoker);
procedure = gimp_procedure_new (context_set_line_width_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-line-width");
gimp_procedure_set_static_help (procedure,
@@ -3567,7 +3567,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-line-width-unit
*/
procedure = gimp_procedure_new (context_get_line_width_unit_invoker);
procedure = gimp_procedure_new (context_get_line_width_unit_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-line-width-unit");
gimp_procedure_set_static_help (procedure,
@@ -3592,7 +3592,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-line-width-unit
*/
procedure = gimp_procedure_new (context_set_line_width_unit_invoker);
procedure = gimp_procedure_new (context_set_line_width_unit_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-line-width-unit");
gimp_procedure_set_static_help (procedure,
@@ -3619,7 +3619,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-line-cap-style
*/
procedure = gimp_procedure_new (context_get_line_cap_style_invoker);
procedure = gimp_procedure_new (context_get_line_cap_style_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-line-cap-style");
gimp_procedure_set_static_help (procedure,
@@ -3643,7 +3643,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-line-cap-style
*/
procedure = gimp_procedure_new (context_set_line_cap_style_invoker);
procedure = gimp_procedure_new (context_set_line_cap_style_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-line-cap-style");
gimp_procedure_set_static_help (procedure,
@@ -3669,7 +3669,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-line-join-style
*/
procedure = gimp_procedure_new (context_get_line_join_style_invoker);
procedure = gimp_procedure_new (context_get_line_join_style_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-line-join-style");
gimp_procedure_set_static_help (procedure,
@@ -3693,7 +3693,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-line-join-style
*/
procedure = gimp_procedure_new (context_set_line_join_style_invoker);
procedure = gimp_procedure_new (context_set_line_join_style_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-line-join-style");
gimp_procedure_set_static_help (procedure,
@@ -3718,7 +3718,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-line-miter-limit
*/
procedure = gimp_procedure_new (context_get_line_miter_limit_invoker);
procedure = gimp_procedure_new (context_get_line_miter_limit_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-line-miter-limit");
gimp_procedure_set_static_help (procedure,
@@ -3741,7 +3741,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-line-miter-limit
*/
procedure = gimp_procedure_new (context_set_line_miter_limit_invoker);
procedure = gimp_procedure_new (context_set_line_miter_limit_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-line-miter-limit");
gimp_procedure_set_static_help (procedure,
@@ -3767,7 +3767,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-line-dash-offset
*/
procedure = gimp_procedure_new (context_get_line_dash_offset_invoker);
procedure = gimp_procedure_new (context_get_line_dash_offset_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-line-dash-offset");
gimp_procedure_set_static_help (procedure,
@@ -3790,7 +3790,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-line-dash-offset
*/
procedure = gimp_procedure_new (context_set_line_dash_offset_invoker);
procedure = gimp_procedure_new (context_set_line_dash_offset_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-line-dash-offset");
gimp_procedure_set_static_help (procedure,
@@ -3815,7 +3815,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-line-dash-pattern
*/
procedure = gimp_procedure_new (context_get_line_dash_pattern_invoker);
procedure = gimp_procedure_new (context_get_line_dash_pattern_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-line-dash-pattern");
gimp_procedure_set_static_help (procedure,
@@ -3837,7 +3837,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-line-dash-pattern
*/
procedure = gimp_procedure_new (context_set_line_dash_pattern_invoker);
procedure = gimp_procedure_new (context_set_line_dash_pattern_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-line-dash-pattern");
gimp_procedure_set_static_help (procedure,
@@ -3863,7 +3863,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-brush
*/
procedure = gimp_procedure_new (context_get_brush_invoker);
procedure = gimp_procedure_new (context_get_brush_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-brush");
gimp_procedure_set_static_help (procedure,
@@ -3888,7 +3888,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-brush
*/
procedure = gimp_procedure_new (context_set_brush_invoker);
procedure = gimp_procedure_new (context_set_brush_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-brush");
gimp_procedure_set_static_help (procedure,
@@ -3913,7 +3913,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-brush-size
*/
procedure = gimp_procedure_new (context_get_brush_size_invoker);
procedure = gimp_procedure_new (context_get_brush_size_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-brush-size");
gimp_procedure_set_static_help (procedure,
@@ -3936,7 +3936,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-brush-size
*/
procedure = gimp_procedure_new (context_set_brush_size_invoker);
procedure = gimp_procedure_new (context_set_brush_size_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-brush-size");
gimp_procedure_set_static_help (procedure,
@@ -3959,7 +3959,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-brush-default-size
*/
procedure = gimp_procedure_new (context_set_brush_default_size_invoker);
procedure = gimp_procedure_new (context_set_brush_default_size_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-brush-default-size");
gimp_procedure_set_static_help (procedure,
@@ -3976,7 +3976,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-brush-aspect-ratio
*/
procedure = gimp_procedure_new (context_get_brush_aspect_ratio_invoker);
procedure = gimp_procedure_new (context_get_brush_aspect_ratio_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-brush-aspect-ratio");
gimp_procedure_set_static_help (procedure,
@@ -3999,7 +3999,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-brush-aspect-ratio
*/
procedure = gimp_procedure_new (context_set_brush_aspect_ratio_invoker);
procedure = gimp_procedure_new (context_set_brush_aspect_ratio_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-brush-aspect-ratio");
gimp_procedure_set_static_help (procedure,
@@ -4022,7 +4022,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-brush-angle
*/
procedure = gimp_procedure_new (context_get_brush_angle_invoker);
procedure = gimp_procedure_new (context_get_brush_angle_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-brush-angle");
gimp_procedure_set_static_help (procedure,
@@ -4045,7 +4045,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-brush-angle
*/
procedure = gimp_procedure_new (context_set_brush_angle_invoker);
procedure = gimp_procedure_new (context_set_brush_angle_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-brush-angle");
gimp_procedure_set_static_help (procedure,
@@ -4068,7 +4068,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-brush-spacing
*/
procedure = gimp_procedure_new (context_get_brush_spacing_invoker);
procedure = gimp_procedure_new (context_get_brush_spacing_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-brush-spacing");
gimp_procedure_set_static_help (procedure,
@@ -4091,7 +4091,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-brush-spacing
*/
procedure = gimp_procedure_new (context_set_brush_spacing_invoker);
procedure = gimp_procedure_new (context_set_brush_spacing_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-brush-spacing");
gimp_procedure_set_static_help (procedure,
@@ -4114,7 +4114,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-brush-default-spacing
*/
procedure = gimp_procedure_new (context_set_brush_default_spacing_invoker);
procedure = gimp_procedure_new (context_set_brush_default_spacing_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-brush-default-spacing");
gimp_procedure_set_static_help (procedure,
@@ -4131,7 +4131,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-brush-hardness
*/
procedure = gimp_procedure_new (context_get_brush_hardness_invoker);
procedure = gimp_procedure_new (context_get_brush_hardness_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-brush-hardness");
gimp_procedure_set_static_help (procedure,
@@ -4154,7 +4154,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-brush-hardness
*/
procedure = gimp_procedure_new (context_set_brush_hardness_invoker);
procedure = gimp_procedure_new (context_set_brush_hardness_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-brush-hardness");
gimp_procedure_set_static_help (procedure,
@@ -4177,7 +4177,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-brush-default-hardness
*/
procedure = gimp_procedure_new (context_set_brush_default_hardness_invoker);
procedure = gimp_procedure_new (context_set_brush_default_hardness_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-brush-default-hardness");
gimp_procedure_set_static_help (procedure,
@@ -4194,7 +4194,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-brush-force
*/
procedure = gimp_procedure_new (context_get_brush_force_invoker);
procedure = gimp_procedure_new (context_get_brush_force_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-brush-force");
gimp_procedure_set_static_help (procedure,
@@ -4217,7 +4217,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-brush-force
*/
procedure = gimp_procedure_new (context_set_brush_force_invoker);
procedure = gimp_procedure_new (context_set_brush_force_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-brush-force");
gimp_procedure_set_static_help (procedure,
@@ -4240,7 +4240,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-dynamics-name
*/
procedure = gimp_procedure_new (context_get_dynamics_name_invoker);
procedure = gimp_procedure_new (context_get_dynamics_name_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-dynamics-name");
gimp_procedure_set_static_help (procedure,
@@ -4265,7 +4265,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-dynamics-name
*/
procedure = gimp_procedure_new (context_set_dynamics_name_invoker);
procedure = gimp_procedure_new (context_set_dynamics_name_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-dynamics-name");
gimp_procedure_set_static_help (procedure,
@@ -4289,7 +4289,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-are-dynamics-enabled
*/
procedure = gimp_procedure_new (context_are_dynamics_enabled_invoker);
procedure = gimp_procedure_new (context_are_dynamics_enabled_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-are-dynamics-enabled");
gimp_procedure_set_static_help (procedure,
@@ -4312,7 +4312,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-enable-dynamics
*/
procedure = gimp_procedure_new (context_enable_dynamics_invoker);
procedure = gimp_procedure_new (context_enable_dynamics_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-enable-dynamics");
gimp_procedure_set_static_help (procedure,
@@ -4335,7 +4335,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-emulate-brush-dynamics
*/
procedure = gimp_procedure_new (context_get_emulate_brush_dynamics_invoker);
procedure = gimp_procedure_new (context_get_emulate_brush_dynamics_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-emulate-brush-dynamics");
gimp_procedure_set_static_help (procedure,
@@ -4358,7 +4358,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-emulate-brush-dynamics
*/
procedure = gimp_procedure_new (context_set_emulate_brush_dynamics_invoker);
procedure = gimp_procedure_new (context_set_emulate_brush_dynamics_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-emulate-brush-dynamics");
gimp_procedure_set_static_help (procedure,
@@ -4381,7 +4381,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-mypaint-brush
*/
procedure = gimp_procedure_new (context_get_mypaint_brush_invoker);
procedure = gimp_procedure_new (context_get_mypaint_brush_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-mypaint-brush");
gimp_procedure_set_static_help (procedure,
@@ -4405,7 +4405,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-mypaint-brush
*/
procedure = gimp_procedure_new (context_set_mypaint_brush_invoker);
procedure = gimp_procedure_new (context_set_mypaint_brush_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-mypaint-brush");
gimp_procedure_set_static_help (procedure,
@@ -4429,7 +4429,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-pattern
*/
procedure = gimp_procedure_new (context_get_pattern_invoker);
procedure = gimp_procedure_new (context_get_pattern_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-pattern");
gimp_procedure_set_static_help (procedure,
@@ -4454,7 +4454,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-pattern
*/
procedure = gimp_procedure_new (context_set_pattern_invoker);
procedure = gimp_procedure_new (context_set_pattern_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-pattern");
gimp_procedure_set_static_help (procedure,
@@ -4479,7 +4479,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-gradient
*/
procedure = gimp_procedure_new (context_get_gradient_invoker);
procedure = gimp_procedure_new (context_get_gradient_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-gradient");
gimp_procedure_set_static_help (procedure,
@@ -4504,7 +4504,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-gradient
*/
procedure = gimp_procedure_new (context_set_gradient_invoker);
procedure = gimp_procedure_new (context_set_gradient_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-gradient");
gimp_procedure_set_static_help (procedure,
@@ -4529,7 +4529,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-gradient-fg-bg-rgb
*/
procedure = gimp_procedure_new (context_set_gradient_fg_bg_rgb_invoker);
procedure = gimp_procedure_new (context_set_gradient_fg_bg_rgb_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-gradient-fg-bg-rgb");
gimp_procedure_set_static_help (procedure,
@@ -4546,7 +4546,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-gradient-fg-bg-hsv-cw
*/
procedure = gimp_procedure_new (context_set_gradient_fg_bg_hsv_cw_invoker);
procedure = gimp_procedure_new (context_set_gradient_fg_bg_hsv_cw_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-gradient-fg-bg-hsv-cw");
gimp_procedure_set_static_help (procedure,
@@ -4563,7 +4563,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-gradient-fg-bg-hsv-ccw
*/
procedure = gimp_procedure_new (context_set_gradient_fg_bg_hsv_ccw_invoker);
procedure = gimp_procedure_new (context_set_gradient_fg_bg_hsv_ccw_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-gradient-fg-bg-hsv-ccw");
gimp_procedure_set_static_help (procedure,
@@ -4580,7 +4580,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-gradient-fg-transparent
*/
procedure = gimp_procedure_new (context_set_gradient_fg_transparent_invoker);
procedure = gimp_procedure_new (context_set_gradient_fg_transparent_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-gradient-fg-transparent");
gimp_procedure_set_static_help (procedure,
@@ -4597,7 +4597,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-gradient-blend-color-space
*/
procedure = gimp_procedure_new (context_get_gradient_blend_color_space_invoker);
procedure = gimp_procedure_new (context_get_gradient_blend_color_space_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-gradient-blend-color-space");
gimp_procedure_set_static_help (procedure,
@@ -4621,7 +4621,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-gradient-blend-color-space
*/
procedure = gimp_procedure_new (context_set_gradient_blend_color_space_invoker);
procedure = gimp_procedure_new (context_set_gradient_blend_color_space_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-gradient-blend-color-space");
gimp_procedure_set_static_help (procedure,
@@ -4645,7 +4645,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-gradient-repeat-mode
*/
procedure = gimp_procedure_new (context_get_gradient_repeat_mode_invoker);
procedure = gimp_procedure_new (context_get_gradient_repeat_mode_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-gradient-repeat-mode");
gimp_procedure_set_static_help (procedure,
@@ -4669,7 +4669,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-gradient-repeat-mode
*/
procedure = gimp_procedure_new (context_set_gradient_repeat_mode_invoker);
procedure = gimp_procedure_new (context_set_gradient_repeat_mode_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-gradient-repeat-mode");
gimp_procedure_set_static_help (procedure,
@@ -4693,7 +4693,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-gradient-reverse
*/
procedure = gimp_procedure_new (context_get_gradient_reverse_invoker);
procedure = gimp_procedure_new (context_get_gradient_reverse_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-gradient-reverse");
gimp_procedure_set_static_help (procedure,
@@ -4716,7 +4716,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-gradient-reverse
*/
procedure = gimp_procedure_new (context_set_gradient_reverse_invoker);
procedure = gimp_procedure_new (context_set_gradient_reverse_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-gradient-reverse");
gimp_procedure_set_static_help (procedure,
@@ -4739,7 +4739,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-palette
*/
procedure = gimp_procedure_new (context_get_palette_invoker);
procedure = gimp_procedure_new (context_get_palette_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-palette");
gimp_procedure_set_static_help (procedure,
@@ -4764,7 +4764,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-palette
*/
procedure = gimp_procedure_new (context_set_palette_invoker);
procedure = gimp_procedure_new (context_set_palette_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-palette");
gimp_procedure_set_static_help (procedure,
@@ -4789,7 +4789,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-font
*/
procedure = gimp_procedure_new (context_get_font_invoker);
procedure = gimp_procedure_new (context_get_font_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-font");
gimp_procedure_set_static_help (procedure,
@@ -4814,7 +4814,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-font
*/
procedure = gimp_procedure_new (context_set_font_invoker);
procedure = gimp_procedure_new (context_set_font_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-font");
gimp_procedure_set_static_help (procedure,
@@ -4839,7 +4839,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-antialias
*/
procedure = gimp_procedure_new (context_get_antialias_invoker);
procedure = gimp_procedure_new (context_get_antialias_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-antialias");
gimp_procedure_set_static_help (procedure,
@@ -4862,7 +4862,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-antialias
*/
procedure = gimp_procedure_new (context_set_antialias_invoker);
procedure = gimp_procedure_new (context_set_antialias_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-antialias");
gimp_procedure_set_static_help (procedure,
@@ -4887,7 +4887,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-feather
*/
procedure = gimp_procedure_new (context_get_feather_invoker);
procedure = gimp_procedure_new (context_get_feather_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-feather");
gimp_procedure_set_static_help (procedure,
@@ -4910,7 +4910,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-feather
*/
procedure = gimp_procedure_new (context_set_feather_invoker);
procedure = gimp_procedure_new (context_set_feather_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-feather");
gimp_procedure_set_static_help (procedure,
@@ -4935,7 +4935,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-feather-radius
*/
procedure = gimp_procedure_new (context_get_feather_radius_invoker);
procedure = gimp_procedure_new (context_get_feather_radius_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-feather-radius");
gimp_procedure_set_static_help (procedure,
@@ -4964,7 +4964,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-feather-radius
*/
procedure = gimp_procedure_new (context_set_feather_radius_invoker);
procedure = gimp_procedure_new (context_set_feather_radius_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-feather-radius");
gimp_procedure_set_static_help (procedure,
@@ -4995,7 +4995,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-sample-merged
*/
procedure = gimp_procedure_new (context_get_sample_merged_invoker);
procedure = gimp_procedure_new (context_get_sample_merged_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-sample-merged");
gimp_procedure_set_static_help (procedure,
@@ -5018,7 +5018,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-sample-merged
*/
procedure = gimp_procedure_new (context_set_sample_merged_invoker);
procedure = gimp_procedure_new (context_set_sample_merged_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-sample-merged");
gimp_procedure_set_static_help (procedure,
@@ -5043,7 +5043,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-sample-criterion
*/
procedure = gimp_procedure_new (context_get_sample_criterion_invoker);
procedure = gimp_procedure_new (context_get_sample_criterion_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-sample-criterion");
gimp_procedure_set_static_help (procedure,
@@ -5067,7 +5067,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-sample-criterion
*/
procedure = gimp_procedure_new (context_set_sample_criterion_invoker);
procedure = gimp_procedure_new (context_set_sample_criterion_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-sample-criterion");
gimp_procedure_set_static_help (procedure,
@@ -5093,7 +5093,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-sample-threshold
*/
procedure = gimp_procedure_new (context_get_sample_threshold_invoker);
procedure = gimp_procedure_new (context_get_sample_threshold_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-sample-threshold");
gimp_procedure_set_static_help (procedure,
@@ -5116,7 +5116,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-sample-threshold
*/
procedure = gimp_procedure_new (context_set_sample_threshold_invoker);
procedure = gimp_procedure_new (context_set_sample_threshold_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-sample-threshold");
gimp_procedure_set_static_help (procedure,
@@ -5141,7 +5141,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-sample-threshold-int
*/
procedure = gimp_procedure_new (context_get_sample_threshold_int_invoker);
procedure = gimp_procedure_new (context_get_sample_threshold_int_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-sample-threshold-int");
gimp_procedure_set_static_help (procedure,
@@ -5164,7 +5164,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-sample-threshold-int
*/
procedure = gimp_procedure_new (context_set_sample_threshold_int_invoker);
procedure = gimp_procedure_new (context_set_sample_threshold_int_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-sample-threshold-int");
gimp_procedure_set_static_help (procedure,
@@ -5187,7 +5187,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-sample-transparent
*/
procedure = gimp_procedure_new (context_get_sample_transparent_invoker);
procedure = gimp_procedure_new (context_get_sample_transparent_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-sample-transparent");
gimp_procedure_set_static_help (procedure,
@@ -5210,7 +5210,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-sample-transparent
*/
procedure = gimp_procedure_new (context_set_sample_transparent_invoker);
procedure = gimp_procedure_new (context_set_sample_transparent_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-sample-transparent");
gimp_procedure_set_static_help (procedure,
@@ -5235,7 +5235,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-diagonal-neighbors
*/
procedure = gimp_procedure_new (context_get_diagonal_neighbors_invoker);
procedure = gimp_procedure_new (context_get_diagonal_neighbors_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-diagonal-neighbors");
gimp_procedure_set_static_help (procedure,
@@ -5258,7 +5258,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-diagonal-neighbors
*/
procedure = gimp_procedure_new (context_set_diagonal_neighbors_invoker);
procedure = gimp_procedure_new (context_set_diagonal_neighbors_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-diagonal-neighbors");
gimp_procedure_set_static_help (procedure,
@@ -5283,7 +5283,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-distance-metric
*/
procedure = gimp_procedure_new (context_get_distance_metric_invoker);
procedure = gimp_procedure_new (context_get_distance_metric_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-distance-metric");
gimp_procedure_set_static_help (procedure,
@@ -5307,7 +5307,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-distance-metric
*/
procedure = gimp_procedure_new (context_set_distance_metric_invoker);
procedure = gimp_procedure_new (context_set_distance_metric_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-distance-metric");
gimp_procedure_set_static_help (procedure,
@@ -5333,7 +5333,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-interpolation
*/
procedure = gimp_procedure_new (context_get_interpolation_invoker);
procedure = gimp_procedure_new (context_get_interpolation_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-interpolation");
gimp_procedure_set_static_help (procedure,
@@ -5357,7 +5357,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-interpolation
*/
procedure = gimp_procedure_new (context_set_interpolation_invoker);
procedure = gimp_procedure_new (context_set_interpolation_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-interpolation");
gimp_procedure_set_static_help (procedure,
@@ -5383,7 +5383,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-transform-direction
*/
procedure = gimp_procedure_new (context_get_transform_direction_invoker);
procedure = gimp_procedure_new (context_get_transform_direction_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-transform-direction");
gimp_procedure_set_static_help (procedure,
@@ -5407,7 +5407,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-transform-direction
*/
procedure = gimp_procedure_new (context_set_transform_direction_invoker);
procedure = gimp_procedure_new (context_set_transform_direction_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-transform-direction");
gimp_procedure_set_static_help (procedure,
@@ -5433,7 +5433,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-transform-resize
*/
procedure = gimp_procedure_new (context_get_transform_resize_invoker);
procedure = gimp_procedure_new (context_get_transform_resize_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-transform-resize");
gimp_procedure_set_static_help (procedure,
@@ -5457,7 +5457,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-transform-resize
*/
procedure = gimp_procedure_new (context_set_transform_resize_invoker);
procedure = gimp_procedure_new (context_set_transform_resize_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-transform-resize");
gimp_procedure_set_static_help (procedure,
@@ -5483,7 +5483,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-ink-size
*/
procedure = gimp_procedure_new (context_get_ink_size_invoker);
procedure = gimp_procedure_new (context_get_ink_size_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-ink-size");
gimp_procedure_set_static_help (procedure,
@@ -5506,7 +5506,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-ink-size
*/
procedure = gimp_procedure_new (context_set_ink_size_invoker);
procedure = gimp_procedure_new (context_set_ink_size_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-ink-size");
gimp_procedure_set_static_help (procedure,
@@ -5529,7 +5529,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-ink-angle
*/
procedure = gimp_procedure_new (context_get_ink_angle_invoker);
procedure = gimp_procedure_new (context_get_ink_angle_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-ink-angle");
gimp_procedure_set_static_help (procedure,
@@ -5552,7 +5552,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-ink-angle
*/
procedure = gimp_procedure_new (context_set_ink_angle_invoker);
procedure = gimp_procedure_new (context_set_ink_angle_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-ink-angle");
gimp_procedure_set_static_help (procedure,
@@ -5575,7 +5575,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-ink-size-sensitivity
*/
procedure = gimp_procedure_new (context_get_ink_size_sensitivity_invoker);
procedure = gimp_procedure_new (context_get_ink_size_sensitivity_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-ink-size-sensitivity");
gimp_procedure_set_static_help (procedure,
@@ -5598,7 +5598,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-ink-size-sensitivity
*/
procedure = gimp_procedure_new (context_set_ink_size_sensitivity_invoker);
procedure = gimp_procedure_new (context_set_ink_size_sensitivity_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-ink-size-sensitivity");
gimp_procedure_set_static_help (procedure,
@@ -5621,7 +5621,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-ink-tilt-sensitivity
*/
procedure = gimp_procedure_new (context_get_ink_tilt_sensitivity_invoker);
procedure = gimp_procedure_new (context_get_ink_tilt_sensitivity_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-ink-tilt-sensitivity");
gimp_procedure_set_static_help (procedure,
@@ -5644,7 +5644,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-ink-tilt-sensitivity
*/
procedure = gimp_procedure_new (context_set_ink_tilt_sensitivity_invoker);
procedure = gimp_procedure_new (context_set_ink_tilt_sensitivity_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-ink-tilt-sensitivity");
gimp_procedure_set_static_help (procedure,
@@ -5667,7 +5667,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-ink-speed-sensitivity
*/
procedure = gimp_procedure_new (context_get_ink_speed_sensitivity_invoker);
procedure = gimp_procedure_new (context_get_ink_speed_sensitivity_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-ink-speed-sensitivity");
gimp_procedure_set_static_help (procedure,
@@ -5690,7 +5690,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-ink-speed-sensitivity
*/
procedure = gimp_procedure_new (context_set_ink_speed_sensitivity_invoker);
procedure = gimp_procedure_new (context_set_ink_speed_sensitivity_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-ink-speed-sensitivity");
gimp_procedure_set_static_help (procedure,
@@ -5713,7 +5713,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-ink-blob-type
*/
procedure = gimp_procedure_new (context_get_ink_blob_type_invoker);
procedure = gimp_procedure_new (context_get_ink_blob_type_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-ink-blob-type");
gimp_procedure_set_static_help (procedure,
@@ -5737,7 +5737,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-ink-blob-type
*/
procedure = gimp_procedure_new (context_set_ink_blob_type_invoker);
procedure = gimp_procedure_new (context_set_ink_blob_type_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-ink-blob-type");
gimp_procedure_set_static_help (procedure,
@@ -5761,7 +5761,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-ink-blob-aspect-ratio
*/
procedure = gimp_procedure_new (context_get_ink_blob_aspect_ratio_invoker);
procedure = gimp_procedure_new (context_get_ink_blob_aspect_ratio_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-ink-blob-aspect-ratio");
gimp_procedure_set_static_help (procedure,
@@ -5784,7 +5784,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-ink-blob-aspect-ratio
*/
procedure = gimp_procedure_new (context_set_ink_blob_aspect_ratio_invoker);
procedure = gimp_procedure_new (context_set_ink_blob_aspect_ratio_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-ink-blob-aspect-ratio");
gimp_procedure_set_static_help (procedure,
@@ -5807,7 +5807,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-ink-blob-angle
*/
procedure = gimp_procedure_new (context_get_ink_blob_angle_invoker);
procedure = gimp_procedure_new (context_get_ink_blob_angle_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-ink-blob-angle");
gimp_procedure_set_static_help (procedure,
@@ -5830,7 +5830,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-set-ink-blob-angle
*/
procedure = gimp_procedure_new (context_set_ink_blob_angle_invoker);
procedure = gimp_procedure_new (context_set_ink_blob_angle_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-set-ink-blob-angle");
gimp_procedure_set_static_help (procedure,
@@ -5853,7 +5853,7 @@ register_context_procs (GimpPDB *pdb)
/*
* gimp-context-get-resource
*/
procedure = gimp_procedure_new (context_get_resource_invoker);
procedure = gimp_procedure_new (context_get_resource_invoker, TRUE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-context-get-resource");
gimp_procedure_set_static_help (procedure,

View File

@@ -97,7 +97,7 @@ register_debug_procs (GimpPDB *pdb)
/*
* gimp-debug-timer-start
*/
procedure = gimp_procedure_new (debug_timer_start_invoker);
procedure = gimp_procedure_new (debug_timer_start_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-debug-timer-start");
gimp_procedure_set_static_help (procedure,
@@ -117,7 +117,7 @@ register_debug_procs (GimpPDB *pdb)
/*
* gimp-debug-timer-end
*/
procedure = gimp_procedure_new (debug_timer_end_invoker);
procedure = gimp_procedure_new (debug_timer_end_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-debug-timer-end");
gimp_procedure_set_static_help (procedure,

View File

@@ -240,7 +240,7 @@ register_display_procs (GimpPDB *pdb)
/*
* gimp-display-id-is-valid
*/
procedure = gimp_procedure_new (display_id_is_valid_invoker);
procedure = gimp_procedure_new (display_id_is_valid_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-display-id-is-valid");
gimp_procedure_set_static_help (procedure,
@@ -271,7 +271,7 @@ register_display_procs (GimpPDB *pdb)
/*
* gimp-display-new
*/
procedure = gimp_procedure_new (display_new_invoker);
procedure = gimp_procedure_new (display_new_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-display-new");
gimp_procedure_set_static_help (procedure,
@@ -300,7 +300,7 @@ register_display_procs (GimpPDB *pdb)
/*
* gimp-display-delete
*/
procedure = gimp_procedure_new (display_delete_invoker);
procedure = gimp_procedure_new (display_delete_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-display-delete");
gimp_procedure_set_static_help (procedure,
@@ -323,7 +323,7 @@ register_display_procs (GimpPDB *pdb)
/*
* gimp-display-get-window-handle
*/
procedure = gimp_procedure_new (display_get_window_handle_invoker);
procedure = gimp_procedure_new (display_get_window_handle_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-display-get-window-handle");
gimp_procedure_set_static_help (procedure,
@@ -353,7 +353,7 @@ register_display_procs (GimpPDB *pdb)
/*
* gimp-display-present
*/
procedure = gimp_procedure_new (display_present_invoker);
procedure = gimp_procedure_new (display_present_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-display-present");
gimp_procedure_set_static_help (procedure,
@@ -376,7 +376,7 @@ register_display_procs (GimpPDB *pdb)
/*
* gimp-displays-flush
*/
procedure = gimp_procedure_new (displays_flush_invoker);
procedure = gimp_procedure_new (displays_flush_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-displays-flush");
gimp_procedure_set_static_help (procedure,
@@ -393,7 +393,7 @@ register_display_procs (GimpPDB *pdb)
/*
* gimp-displays-reconnect
*/
procedure = gimp_procedure_new (displays_reconnect_invoker);
procedure = gimp_procedure_new (displays_reconnect_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-displays-reconnect");
gimp_procedure_set_static_help (procedure,

View File

@@ -1155,7 +1155,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-get-format
*/
procedure = gimp_procedure_new (drawable_get_format_invoker);
procedure = gimp_procedure_new (drawable_get_format_invoker, TRUE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-get-format");
gimp_procedure_set_static_help (procedure,
@@ -1186,7 +1186,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-get-thumbnail-format
*/
procedure = gimp_procedure_new (drawable_get_thumbnail_format_invoker);
procedure = gimp_procedure_new (drawable_get_thumbnail_format_invoker, TRUE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-get-thumbnail-format");
gimp_procedure_set_static_help (procedure,
@@ -1217,7 +1217,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-get-pixel
*/
procedure = gimp_procedure_new (drawable_get_pixel_invoker);
procedure = gimp_procedure_new (drawable_get_pixel_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-get-pixel");
gimp_procedure_set_static_help (procedure,
@@ -1259,7 +1259,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-set-pixel
*/
procedure = gimp_procedure_new (drawable_set_pixel_invoker);
procedure = gimp_procedure_new (drawable_set_pixel_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-set-pixel");
gimp_procedure_set_static_help (procedure,
@@ -1301,7 +1301,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-type
*/
procedure = gimp_procedure_new (drawable_type_invoker);
procedure = gimp_procedure_new (drawable_type_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-type");
gimp_procedure_set_static_help (procedure,
@@ -1331,7 +1331,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-type-with-alpha
*/
procedure = gimp_procedure_new (drawable_type_with_alpha_invoker);
procedure = gimp_procedure_new (drawable_type_with_alpha_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-type-with-alpha");
gimp_procedure_set_static_help (procedure,
@@ -1367,7 +1367,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-has-alpha
*/
procedure = gimp_procedure_new (drawable_has_alpha_invoker);
procedure = gimp_procedure_new (drawable_has_alpha_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-has-alpha");
gimp_procedure_set_static_help (procedure,
@@ -1396,7 +1396,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-is-rgb
*/
procedure = gimp_procedure_new (drawable_is_rgb_invoker);
procedure = gimp_procedure_new (drawable_is_rgb_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-is-rgb");
gimp_procedure_set_static_help (procedure,
@@ -1425,7 +1425,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-is-gray
*/
procedure = gimp_procedure_new (drawable_is_gray_invoker);
procedure = gimp_procedure_new (drawable_is_gray_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-is-gray");
gimp_procedure_set_static_help (procedure,
@@ -1454,7 +1454,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-is-indexed
*/
procedure = gimp_procedure_new (drawable_is_indexed_invoker);
procedure = gimp_procedure_new (drawable_is_indexed_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-is-indexed");
gimp_procedure_set_static_help (procedure,
@@ -1483,7 +1483,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-get-bpp
*/
procedure = gimp_procedure_new (drawable_get_bpp_invoker);
procedure = gimp_procedure_new (drawable_get_bpp_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-get-bpp");
gimp_procedure_set_static_help (procedure,
@@ -1512,7 +1512,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-get-width
*/
procedure = gimp_procedure_new (drawable_get_width_invoker);
procedure = gimp_procedure_new (drawable_get_width_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-get-width");
gimp_procedure_set_static_help (procedure,
@@ -1541,7 +1541,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-get-height
*/
procedure = gimp_procedure_new (drawable_get_height_invoker);
procedure = gimp_procedure_new (drawable_get_height_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-get-height");
gimp_procedure_set_static_help (procedure,
@@ -1570,7 +1570,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-get-offsets
*/
procedure = gimp_procedure_new (drawable_get_offsets_invoker);
procedure = gimp_procedure_new (drawable_get_offsets_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-get-offsets");
gimp_procedure_set_static_help (procedure,
@@ -1605,7 +1605,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-mask-bounds
*/
procedure = gimp_procedure_new (drawable_mask_bounds_invoker);
procedure = gimp_procedure_new (drawable_mask_bounds_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-mask-bounds");
gimp_procedure_set_static_help (procedure,
@@ -1659,7 +1659,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-mask-intersect
*/
procedure = gimp_procedure_new (drawable_mask_intersect_invoker);
procedure = gimp_procedure_new (drawable_mask_intersect_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-mask-intersect");
gimp_procedure_set_static_help (procedure,
@@ -1713,7 +1713,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-append-filter-private
*/
procedure = gimp_procedure_new (drawable_append_filter_private_invoker);
procedure = gimp_procedure_new (drawable_append_filter_private_invoker, TRUE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-append-filter-private");
gimp_procedure_set_static_help (procedure,
@@ -1745,7 +1745,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-merge-filter-private
*/
procedure = gimp_procedure_new (drawable_merge_filter_private_invoker);
procedure = gimp_procedure_new (drawable_merge_filter_private_invoker, TRUE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-merge-filter-private");
gimp_procedure_set_static_help (procedure,
@@ -1777,7 +1777,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-get-filters
*/
procedure = gimp_procedure_new (drawable_get_filters_invoker);
procedure = gimp_procedure_new (drawable_get_filters_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-get-filters");
gimp_procedure_set_static_help (procedure,
@@ -1806,7 +1806,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-merge-filters
*/
procedure = gimp_procedure_new (drawable_merge_filters_invoker);
procedure = gimp_procedure_new (drawable_merge_filters_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-merge-filters");
gimp_procedure_set_static_help (procedure,
@@ -1829,7 +1829,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-merge-shadow
*/
procedure = gimp_procedure_new (drawable_merge_shadow_invoker);
procedure = gimp_procedure_new (drawable_merge_shadow_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-merge-shadow");
gimp_procedure_set_static_help (procedure,
@@ -1858,7 +1858,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-free-shadow
*/
procedure = gimp_procedure_new (drawable_free_shadow_invoker);
procedure = gimp_procedure_new (drawable_free_shadow_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-free-shadow");
gimp_procedure_set_static_help (procedure,
@@ -1881,7 +1881,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-update
*/
procedure = gimp_procedure_new (drawable_update_invoker);
procedure = gimp_procedure_new (drawable_update_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-update");
gimp_procedure_set_static_help (procedure,
@@ -1928,7 +1928,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-fill
*/
procedure = gimp_procedure_new (drawable_fill_invoker);
procedure = gimp_procedure_new (drawable_fill_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-fill");
gimp_procedure_set_static_help (procedure,
@@ -1959,7 +1959,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-offset
*/
procedure = gimp_procedure_new (drawable_offset_invoker);
procedure = gimp_procedure_new (drawable_offset_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-offset");
gimp_procedure_set_static_help (procedure,
@@ -2014,7 +2014,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-thumbnail
*/
procedure = gimp_procedure_new (drawable_thumbnail_invoker);
procedure = gimp_procedure_new (drawable_thumbnail_invoker, TRUE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-thumbnail");
gimp_procedure_set_static_help (procedure,
@@ -2073,7 +2073,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-sub-thumbnail
*/
procedure = gimp_procedure_new (drawable_sub_thumbnail_invoker);
procedure = gimp_procedure_new (drawable_sub_thumbnail_invoker, TRUE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-sub-thumbnail");
gimp_procedure_set_static_help (procedure,
@@ -2156,7 +2156,7 @@ register_drawable_procs (GimpPDB *pdb)
/*
* gimp-drawable-foreground-extract
*/
procedure = gimp_procedure_new (drawable_foreground_extract_invoker);
procedure = gimp_procedure_new (drawable_foreground_extract_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-foreground-extract");
gimp_procedure_set_static_help (procedure,

View File

@@ -838,7 +838,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-brightness-contrast
*/
procedure = gimp_procedure_new (drawable_brightness_contrast_invoker);
procedure = gimp_procedure_new (drawable_brightness_contrast_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-brightness-contrast");
gimp_procedure_set_static_help (procedure,
@@ -873,7 +873,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-color-balance
*/
procedure = gimp_procedure_new (drawable_color_balance_invoker);
procedure = gimp_procedure_new (drawable_color_balance_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-color-balance");
gimp_procedure_set_static_help (procedure,
@@ -927,7 +927,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-colorize-hsl
*/
procedure = gimp_procedure_new (drawable_colorize_hsl_invoker);
procedure = gimp_procedure_new (drawable_colorize_hsl_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-colorize-hsl");
gimp_procedure_set_static_help (procedure,
@@ -968,7 +968,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-curves-explicit
*/
procedure = gimp_procedure_new (drawable_curves_explicit_invoker);
procedure = gimp_procedure_new (drawable_curves_explicit_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-curves-explicit");
gimp_procedure_set_static_help (procedure,
@@ -1003,7 +1003,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-curves-spline
*/
procedure = gimp_procedure_new (drawable_curves_spline_invoker);
procedure = gimp_procedure_new (drawable_curves_spline_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-curves-spline");
gimp_procedure_set_static_help (procedure,
@@ -1038,7 +1038,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-extract-component
*/
procedure = gimp_procedure_new (drawable_extract_component_invoker);
procedure = gimp_procedure_new (drawable_extract_component_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-extract-component");
gimp_procedure_set_static_help (procedure,
@@ -1079,7 +1079,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-desaturate
*/
procedure = gimp_procedure_new (drawable_desaturate_invoker);
procedure = gimp_procedure_new (drawable_desaturate_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-desaturate");
gimp_procedure_set_static_help (procedure,
@@ -1109,7 +1109,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-equalize
*/
procedure = gimp_procedure_new (drawable_equalize_invoker);
procedure = gimp_procedure_new (drawable_equalize_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-equalize");
gimp_procedure_set_static_help (procedure,
@@ -1138,7 +1138,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-histogram
*/
procedure = gimp_procedure_new (drawable_histogram_invoker);
procedure = gimp_procedure_new (drawable_histogram_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-histogram");
gimp_procedure_set_static_help (procedure,
@@ -1216,7 +1216,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-hue-saturation
*/
procedure = gimp_procedure_new (drawable_hue_saturation_invoker);
procedure = gimp_procedure_new (drawable_hue_saturation_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-hue-saturation");
gimp_procedure_set_static_help (procedure,
@@ -1270,7 +1270,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-invert
*/
procedure = gimp_procedure_new (drawable_invert_invoker);
procedure = gimp_procedure_new (drawable_invert_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-invert");
gimp_procedure_set_static_help (procedure,
@@ -1299,7 +1299,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-levels
*/
procedure = gimp_procedure_new (drawable_levels_invoker);
procedure = gimp_procedure_new (drawable_levels_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-levels");
gimp_procedure_set_static_help (procedure,
@@ -1371,7 +1371,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-levels-stretch
*/
procedure = gimp_procedure_new (drawable_levels_stretch_invoker);
procedure = gimp_procedure_new (drawable_levels_stretch_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-levels-stretch");
gimp_procedure_set_static_help (procedure,
@@ -1394,7 +1394,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-shadows-highlights
*/
procedure = gimp_procedure_new (drawable_shadows_highlights_invoker);
procedure = gimp_procedure_new (drawable_shadows_highlights_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-shadows-highlights");
gimp_procedure_set_static_help (procedure,
@@ -1459,7 +1459,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-posterize
*/
procedure = gimp_procedure_new (drawable_posterize_invoker);
procedure = gimp_procedure_new (drawable_posterize_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-posterize");
gimp_procedure_set_static_help (procedure,
@@ -1488,7 +1488,7 @@ register_drawable_color_procs (GimpPDB *pdb)
/*
* gimp-drawable-threshold
*/
procedure = gimp_procedure_new (drawable_threshold_invoker);
procedure = gimp_procedure_new (drawable_threshold_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-threshold");
gimp_procedure_set_static_help (procedure,

View File

@@ -383,7 +383,7 @@ register_drawable_edit_procs (GimpPDB *pdb)
/*
* gimp-drawable-edit-clear
*/
procedure = gimp_procedure_new (drawable_edit_clear_invoker);
procedure = gimp_procedure_new (drawable_edit_clear_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-edit-clear");
gimp_procedure_set_static_help (procedure,
@@ -408,7 +408,7 @@ register_drawable_edit_procs (GimpPDB *pdb)
/*
* gimp-drawable-edit-fill
*/
procedure = gimp_procedure_new (drawable_edit_fill_invoker);
procedure = gimp_procedure_new (drawable_edit_fill_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-edit-fill");
gimp_procedure_set_static_help (procedure,
@@ -440,7 +440,7 @@ register_drawable_edit_procs (GimpPDB *pdb)
/*
* gimp-drawable-edit-bucket-fill
*/
procedure = gimp_procedure_new (drawable_edit_bucket_fill_invoker);
procedure = gimp_procedure_new (drawable_edit_bucket_fill_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-edit-bucket-fill");
gimp_procedure_set_static_help (procedure,
@@ -485,7 +485,7 @@ register_drawable_edit_procs (GimpPDB *pdb)
/*
* gimp-drawable-edit-gradient-fill
*/
procedure = gimp_procedure_new (drawable_edit_gradient_fill_invoker);
procedure = gimp_procedure_new (drawable_edit_gradient_fill_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-edit-gradient-fill");
gimp_procedure_set_static_help (procedure,
@@ -571,7 +571,7 @@ register_drawable_edit_procs (GimpPDB *pdb)
/*
* gimp-drawable-edit-stroke-selection
*/
procedure = gimp_procedure_new (drawable_edit_stroke_selection_invoker);
procedure = gimp_procedure_new (drawable_edit_stroke_selection_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-edit-stroke-selection");
gimp_procedure_set_static_help (procedure,
@@ -596,7 +596,7 @@ register_drawable_edit_procs (GimpPDB *pdb)
/*
* gimp-drawable-edit-stroke-item
*/
procedure = gimp_procedure_new (drawable_edit_stroke_item_invoker);
procedure = gimp_procedure_new (drawable_edit_stroke_item_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-edit-stroke-item");
gimp_procedure_set_static_help (procedure,

View File

@@ -39,6 +39,8 @@
#include "core/gimpimage-undo-push.h"
#include "core/gimpitem.h"
#include "core/gimpparamspecs.h"
#include "operations/gimp-operation-config.h"
#include "operations/gimpoperationsettings.h"
#include "gimppdb.h"
#include "gimppdberror.h"
@@ -147,6 +149,13 @@ drawable_filter_new_invoker (GimpProcedure *procedure,
"operation", operation_name,
NULL);
filter = gimp_drawable_filter_new (drawable, name, operation, NULL);
/* We don't have a libgimp function for setting the clipping
* behavior. I want to look further into the whole logic first.
* In the meantime if all API-made filters must have a single
* clipping behavior, I believe that not-clipping (adjusting) is
* the nicer default.
*/
gimp_drawable_filter_set_clip (filter, FALSE);
g_clear_object (&operation);
}
}
@@ -387,18 +396,46 @@ drawable_filter_get_number_arguments_invoker (GimpProcedure *procedure,
{
gboolean success = TRUE;
GimpValueArray *return_vals;
const gchar *operation_name;
GimpDrawableFilter *filter;
gint num_args = 0;
operation_name = g_value_get_string (gimp_value_array_index (args, 0));
filter = g_value_get_object (gimp_value_array_index (args, 0));
if (success)
{
if (gegl_has_operation (operation_name))
GeglNode *node;
const gchar *opname;
node = gimp_drawable_filter_get_operation (filter);
opname = gegl_node_get_operation (node);
if (gegl_has_operation (opname))
{
guint n_properties;
g_free (gegl_operation_list_properties (operation_name, &n_properties));
if (gimp_operation_config_is_custom (gimp, opname))
{
GimpObject *settings = NULL;
GObjectClass *klass;
GObjectClass *parent_klass;
guint n_parent_properties;
gegl_node_get (node,
"config", &settings,
NULL);
klass = G_OBJECT_GET_CLASS (settings);
parent_klass = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
g_free (g_object_class_list_properties (parent_klass, &n_parent_properties));
g_free (g_object_class_list_properties (klass, &n_properties));
g_clear_object (&settings);
n_properties -= n_parent_properties;
}
else
{
g_free (gegl_operation_list_properties (opname, &n_properties));
}
num_args = (gint) n_properties;
}
else
@@ -426,25 +463,49 @@ drawable_filter_get_pspec_invoker (GimpProcedure *procedure,
{
gboolean success = TRUE;
GimpValueArray *return_vals;
const gchar *operation_name;
GimpDrawableFilter *filter;
gint arg_num;
GParamSpec *param_spec = NULL;
operation_name = g_value_get_string (gimp_value_array_index (args, 0));
filter = g_value_get_object (gimp_value_array_index (args, 0));
arg_num = g_value_get_int (gimp_value_array_index (args, 1));
if (success)
{
if (gegl_has_operation (operation_name))
GimpObject *settings = NULL;
GeglNode *node;
const gchar *opname;
node = gimp_drawable_filter_get_operation (filter);
opname = gegl_node_get_operation (node);
if (gegl_has_operation (opname))
{
GParamSpec **specs;
guint n_properties;
GParamSpec **specs;
guint n_properties;
guint n_parent_properties = 0;
specs = gegl_operation_list_properties (operation_name, &n_properties);
if (arg_num >= 0 && arg_num < n_properties)
if (gimp_operation_config_is_custom (gimp, opname))
{
param_spec = g_param_spec_ref (specs[arg_num]);
GObjectClass *klass;
GObjectClass *parent_klass;
gegl_node_get (node,
"config", &settings,
NULL);
klass = G_OBJECT_GET_CLASS (settings);
parent_klass = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
g_free (g_object_class_list_properties (parent_klass, &n_parent_properties));
}
if (settings != NULL)
specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (settings), &n_properties);
else
specs = gegl_operation_list_properties (opname, &n_properties);
if (arg_num >= 0 && n_parent_properties + arg_num < n_properties)
{
param_spec = g_param_spec_ref (specs[n_parent_properties + arg_num]);
}
else
{
@@ -457,6 +518,8 @@ drawable_filter_get_pspec_invoker (GimpProcedure *procedure,
{
success = FALSE;
}
g_clear_object (&settings);
}
return_vals = gimp_procedure_get_return_values (procedure, success,
@@ -490,23 +553,50 @@ drawable_filter_get_arguments_invoker (GimpProcedure *procedure,
const gchar *opname;
GParamSpec **specs;
guint n_specs;
guint n_parent_properties = 0;
GStrvBuilder *names_builder;
GimpObject *settings = NULL;
node = gimp_drawable_filter_get_operation (filter);
opname = gegl_node_get_operation (node);
specs = gegl_operation_list_properties (opname, &n_specs);
if (gegl_has_operation (opname) &&
gimp_operation_config_is_custom (gimp, opname))
{
GObjectClass *klass;
GObjectClass *parent_klass;
gegl_node_get (node,
"config", &settings,
NULL);
klass = G_OBJECT_GET_CLASS (settings);
parent_klass = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
g_free (g_object_class_list_properties (parent_klass, &n_parent_properties));
}
if (settings != NULL)
{
specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (settings), &n_specs);
n_specs -= n_parent_properties;
}
else
{
specs = gegl_operation_list_properties (opname, &n_specs);
}
names_builder = g_strv_builder_new ();
values = gimp_value_array_new (n_specs);
for (gint i = 0; i < n_specs; i++)
{
GParamSpec *pspec = specs[i];
GParamSpec *pspec = specs[n_parent_properties + i];
GValue value = G_VALUE_INIT;
g_value_init (&value, pspec->value_type);
gegl_node_get_property (node, pspec->name, &value);
if (settings != NULL)
g_object_get_property (G_OBJECT (settings), pspec->name, &value);
else
gegl_node_get_property (node, pspec->name, &value);
if (GEGL_IS_PARAM_SPEC_ENUM (pspec))
{
@@ -553,6 +643,7 @@ drawable_filter_get_arguments_invoker (GimpProcedure *procedure,
g_strv_builder_unref (names_builder);
g_free (specs);
g_clear_object (&settings);
}
return_vals = gimp_procedure_get_return_values (procedure, success,
@@ -609,7 +700,7 @@ register_drawable_filter_procs (GimpPDB *pdb)
/*
* gimp-drawable-filter-id-is-valid
*/
procedure = gimp_procedure_new (drawable_filter_id_is_valid_invoker);
procedure = gimp_procedure_new (drawable_filter_id_is_valid_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-filter-id-is-valid");
gimp_procedure_set_static_help (procedure,
@@ -638,7 +729,7 @@ register_drawable_filter_procs (GimpPDB *pdb)
/*
* gimp-drawable-filter-new
*/
procedure = gimp_procedure_new (drawable_filter_new_invoker);
procedure = gimp_procedure_new (drawable_filter_new_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-filter-new");
gimp_procedure_set_static_help (procedure,
@@ -683,7 +774,7 @@ register_drawable_filter_procs (GimpPDB *pdb)
/*
* gimp-drawable-filter-get-name
*/
procedure = gimp_procedure_new (drawable_filter_get_name_invoker);
procedure = gimp_procedure_new (drawable_filter_get_name_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-filter-get-name");
gimp_procedure_set_static_help (procedure,
@@ -714,7 +805,7 @@ register_drawable_filter_procs (GimpPDB *pdb)
/*
* gimp-drawable-filter-get-operation-name
*/
procedure = gimp_procedure_new (drawable_filter_get_operation_name_invoker);
procedure = gimp_procedure_new (drawable_filter_get_operation_name_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-filter-get-operation-name");
gimp_procedure_set_static_help (procedure,
@@ -744,7 +835,7 @@ register_drawable_filter_procs (GimpPDB *pdb)
/*
* gimp-drawable-filter-get-visible
*/
procedure = gimp_procedure_new (drawable_filter_get_visible_invoker);
procedure = gimp_procedure_new (drawable_filter_get_visible_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-filter-get-visible");
gimp_procedure_set_static_help (procedure,
@@ -773,7 +864,7 @@ register_drawable_filter_procs (GimpPDB *pdb)
/*
* gimp-drawable-filter-set-visible
*/
procedure = gimp_procedure_new (drawable_filter_set_visible_invoker);
procedure = gimp_procedure_new (drawable_filter_set_visible_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-filter-set-visible");
gimp_procedure_set_static_help (procedure,
@@ -803,7 +894,7 @@ register_drawable_filter_procs (GimpPDB *pdb)
/*
* gimp-drawable-filter-get-opacity
*/
procedure = gimp_procedure_new (drawable_filter_get_opacity_invoker);
procedure = gimp_procedure_new (drawable_filter_get_opacity_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-filter-get-opacity");
gimp_procedure_set_static_help (procedure,
@@ -832,7 +923,7 @@ register_drawable_filter_procs (GimpPDB *pdb)
/*
* gimp-drawable-filter-get-blend-mode
*/
procedure = gimp_procedure_new (drawable_filter_get_blend_mode_invoker);
procedure = gimp_procedure_new (drawable_filter_get_blend_mode_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-filter-get-blend-mode");
gimp_procedure_set_static_help (procedure,
@@ -862,7 +953,7 @@ register_drawable_filter_procs (GimpPDB *pdb)
/*
* gimp-drawable-filter-update
*/
procedure = gimp_procedure_new (drawable_filter_update_invoker);
procedure = gimp_procedure_new (drawable_filter_update_invoker, TRUE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-filter-update");
gimp_procedure_set_static_help (procedure,
@@ -945,7 +1036,7 @@ register_drawable_filter_procs (GimpPDB *pdb)
/*
* gimp-drawable-filter-get-number-arguments
*/
procedure = gimp_procedure_new (drawable_filter_get_number_arguments_invoker);
procedure = gimp_procedure_new (drawable_filter_get_number_arguments_invoker, TRUE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-filter-get-number-arguments");
gimp_procedure_set_static_help (procedure,
@@ -958,12 +1049,11 @@ register_drawable_filter_procs (GimpPDB *pdb)
"Jehan",
"2024");
gimp_procedure_add_argument (procedure,
gimp_param_spec_string ("operation-name",
"operation name",
"The procedure name",
FALSE, FALSE, TRUE,
NULL,
GIMP_PARAM_READWRITE));
gimp_param_spec_drawable_filter ("filter",
"filter",
"The filter",
FALSE,
GIMP_PARAM_READWRITE));
gimp_procedure_add_return_value (procedure,
g_param_spec_int ("num-args",
"num args",
@@ -976,7 +1066,7 @@ register_drawable_filter_procs (GimpPDB *pdb)
/*
* gimp-drawable-filter-get-pspec
*/
procedure = gimp_procedure_new (drawable_filter_get_pspec_invoker);
procedure = gimp_procedure_new (drawable_filter_get_pspec_invoker, TRUE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-filter-get-pspec");
gimp_procedure_set_static_help (procedure,
@@ -988,12 +1078,11 @@ register_drawable_filter_procs (GimpPDB *pdb)
"Jehan",
"2024");
gimp_procedure_add_argument (procedure,
gimp_param_spec_string ("operation-name",
"operation name",
"The procedure name",
FALSE, FALSE, TRUE,
NULL,
GIMP_PARAM_READWRITE));
gimp_param_spec_drawable_filter ("filter",
"filter",
"The filter",
FALSE,
GIMP_PARAM_READWRITE));
gimp_procedure_add_argument (procedure,
g_param_spec_int ("arg-num",
"arg num",
@@ -1012,7 +1101,7 @@ register_drawable_filter_procs (GimpPDB *pdb)
/*
* gimp-drawable-filter-get-arguments
*/
procedure = gimp_procedure_new (drawable_filter_get_arguments_invoker);
procedure = gimp_procedure_new (drawable_filter_get_arguments_invoker, TRUE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-filter-get-arguments");
gimp_procedure_set_static_help (procedure,
@@ -1047,7 +1136,7 @@ register_drawable_filter_procs (GimpPDB *pdb)
/*
* gimp-drawable-filter-delete
*/
procedure = gimp_procedure_new (drawable_filter_delete_invoker);
procedure = gimp_procedure_new (drawable_filter_delete_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawable-filter-delete");
gimp_procedure_set_static_help (procedure,

View File

@@ -136,7 +136,7 @@ register_drawable_select_procs (GimpPDB *pdb)
/*
* gimp-drawables-popup
*/
procedure = gimp_procedure_new (drawables_popup_invoker);
procedure = gimp_procedure_new (drawables_popup_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawables-popup");
gimp_procedure_set_static_help (procedure,
@@ -172,7 +172,7 @@ register_drawable_select_procs (GimpPDB *pdb)
gimp_param_spec_drawable ("initial-drawable",
"initial drawable",
"The drawable to set as the initial choice",
FALSE,
TRUE,
GIMP_PARAM_READWRITE | GIMP_PARAM_NO_VALIDATE));
gimp_procedure_add_argument (procedure,
g_param_spec_boxed ("parent-window",
@@ -186,7 +186,7 @@ register_drawable_select_procs (GimpPDB *pdb)
/*
* gimp-drawables-close-popup
*/
procedure = gimp_procedure_new (drawables_close_popup_invoker);
procedure = gimp_procedure_new (drawables_close_popup_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawables-close-popup");
gimp_procedure_set_static_help (procedure,
@@ -210,7 +210,7 @@ register_drawable_select_procs (GimpPDB *pdb)
/*
* gimp-drawables-set-popup
*/
procedure = gimp_procedure_new (drawables_set_popup_invoker);
procedure = gimp_procedure_new (drawables_set_popup_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-drawables-set-popup");
gimp_procedure_set_static_help (procedure,

View File

@@ -91,7 +91,7 @@ register_dynamics_procs (GimpPDB *pdb)
/*
* gimp-dynamics-refresh
*/
procedure = gimp_procedure_new (dynamics_refresh_invoker);
procedure = gimp_procedure_new (dynamics_refresh_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-dynamics-refresh");
gimp_procedure_set_static_help (procedure,
@@ -108,7 +108,7 @@ register_dynamics_procs (GimpPDB *pdb)
/*
* gimp-dynamics-get-name-list
*/
procedure = gimp_procedure_new (dynamics_get_name_list_invoker);
procedure = gimp_procedure_new (dynamics_get_name_list_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-dynamics-get-name-list");
gimp_procedure_set_static_help (procedure,

View File

@@ -656,7 +656,7 @@ register_edit_procs (GimpPDB *pdb)
/*
* gimp-edit-cut
*/
procedure = gimp_procedure_new (edit_cut_invoker);
procedure = gimp_procedure_new (edit_cut_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-edit-cut");
gimp_procedure_set_static_help (procedure,
@@ -686,7 +686,7 @@ register_edit_procs (GimpPDB *pdb)
/*
* gimp-edit-copy
*/
procedure = gimp_procedure_new (edit_copy_invoker);
procedure = gimp_procedure_new (edit_copy_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-edit-copy");
gimp_procedure_set_static_help (procedure,
@@ -717,7 +717,7 @@ register_edit_procs (GimpPDB *pdb)
/*
* gimp-edit-copy-visible
*/
procedure = gimp_procedure_new (edit_copy_visible_invoker);
procedure = gimp_procedure_new (edit_copy_visible_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-edit-copy-visible");
gimp_procedure_set_static_help (procedure,
@@ -746,7 +746,7 @@ register_edit_procs (GimpPDB *pdb)
/*
* gimp-edit-paste
*/
procedure = gimp_procedure_new (edit_paste_invoker);
procedure = gimp_procedure_new (edit_paste_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-edit-paste");
gimp_procedure_set_static_help (procedure,
@@ -782,7 +782,7 @@ register_edit_procs (GimpPDB *pdb)
/*
* gimp-edit-paste-as-new-image
*/
procedure = gimp_procedure_new (edit_paste_as_new_image_invoker);
procedure = gimp_procedure_new (edit_paste_as_new_image_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-edit-paste-as-new-image");
gimp_procedure_set_static_help (procedure,
@@ -805,7 +805,7 @@ register_edit_procs (GimpPDB *pdb)
/*
* gimp-edit-named-cut
*/
procedure = gimp_procedure_new (edit_named_cut_invoker);
procedure = gimp_procedure_new (edit_named_cut_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-edit-named-cut");
gimp_procedure_set_static_help (procedure,
@@ -842,7 +842,7 @@ register_edit_procs (GimpPDB *pdb)
/*
* gimp-edit-named-copy
*/
procedure = gimp_procedure_new (edit_named_copy_invoker);
procedure = gimp_procedure_new (edit_named_copy_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-edit-named-copy");
gimp_procedure_set_static_help (procedure,
@@ -879,7 +879,7 @@ register_edit_procs (GimpPDB *pdb)
/*
* gimp-edit-named-copy-visible
*/
procedure = gimp_procedure_new (edit_named_copy_visible_invoker);
procedure = gimp_procedure_new (edit_named_copy_visible_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-edit-named-copy-visible");
gimp_procedure_set_static_help (procedure,
@@ -916,7 +916,7 @@ register_edit_procs (GimpPDB *pdb)
/*
* gimp-edit-named-paste
*/
procedure = gimp_procedure_new (edit_named_paste_invoker);
procedure = gimp_procedure_new (edit_named_paste_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-edit-named-paste");
gimp_procedure_set_static_help (procedure,
@@ -958,7 +958,7 @@ register_edit_procs (GimpPDB *pdb)
/*
* gimp-edit-named-paste-as-new-image
*/
procedure = gimp_procedure_new (edit_named_paste_as_new_image_invoker);
procedure = gimp_procedure_new (edit_named_paste_as_new_image_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-edit-named-paste-as-new-image");
gimp_procedure_set_static_help (procedure,

View File

@@ -338,12 +338,12 @@ file_load_thumbnail_invoker (GimpProcedure *procedure,
}
static GimpValueArray *
file_save_thumbnail_invoker (GimpProcedure *procedure,
Gimp *gimp,
GimpContext *context,
GimpProgress *progress,
const GimpValueArray *args,
GError **error)
file_create_thumbnail_invoker (GimpProcedure *procedure,
Gimp *gimp,
GimpContext *context,
GimpProgress *progress,
const GimpValueArray *args,
GError **error)
{
gboolean success = TRUE;
GimpImage *image;
@@ -369,7 +369,7 @@ register_file_procs (GimpPDB *pdb)
/*
* gimp-file-load
*/
procedure = gimp_procedure_new (file_load_invoker);
procedure = gimp_procedure_new (file_load_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-file-load");
gimp_procedure_set_static_help (procedure,
@@ -407,7 +407,7 @@ register_file_procs (GimpPDB *pdb)
/*
* gimp-file-load-layer
*/
procedure = gimp_procedure_new (file_load_layer_invoker);
procedure = gimp_procedure_new (file_load_layer_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-file-load-layer");
gimp_procedure_set_static_help (procedure,
@@ -451,7 +451,7 @@ register_file_procs (GimpPDB *pdb)
/*
* gimp-file-load-layers
*/
procedure = gimp_procedure_new (file_load_layers_invoker);
procedure = gimp_procedure_new (file_load_layers_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-file-load-layers");
gimp_procedure_set_static_help (procedure,
@@ -495,12 +495,13 @@ register_file_procs (GimpPDB *pdb)
/*
* gimp-file-save
*/
procedure = gimp_procedure_new (file_save_invoker);
procedure = gimp_procedure_new (file_save_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-file-save");
gimp_procedure_set_static_help (procedure,
"Saves a file by extension.",
"This procedure invokes the correct file save handler according to the file's extension and/or prefix.\n"
"Saves to XCF or export @image to any supported format by extension.",
"This procedure invokes the correct file save/export handler according to @file's extension and/or prefix.\n"
"\n"
"The @options argument is currently unused and should be set to %NULL right now.",
NULL);
gimp_procedure_set_static_attribution (procedure,
@@ -523,7 +524,7 @@ register_file_procs (GimpPDB *pdb)
gimp_procedure_add_argument (procedure,
g_param_spec_object ("file",
"file",
"The file to save the image in",
"The file to save or export the image in",
G_TYPE_FILE,
GIMP_PARAM_READWRITE));
gimp_procedure_add_argument (procedure,
@@ -537,7 +538,7 @@ register_file_procs (GimpPDB *pdb)
/*
* gimp-file-load-thumbnail
*/
procedure = gimp_procedure_new (file_load_thumbnail_invoker);
procedure = gimp_procedure_new (file_load_thumbnail_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-file-load-thumbnail");
gimp_procedure_set_static_help (procedure,
@@ -576,14 +577,17 @@ register_file_procs (GimpPDB *pdb)
g_object_unref (procedure);
/*
* gimp-file-save-thumbnail
* gimp-file-create-thumbnail
*/
procedure = gimp_procedure_new (file_save_thumbnail_invoker);
procedure = gimp_procedure_new (file_create_thumbnail_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-file-save-thumbnail");
"gimp-file-create-thumbnail");
gimp_procedure_set_static_help (procedure,
"Saves a thumbnail for the given image",
"This procedure saves a thumbnail for the given image according to the Free Desktop Thumbnail Managing Standard. The thumbnail is saved so that it belongs to the given file. This means you have to save the image under this name first, otherwise this procedure will fail. This procedure may become useful if you want to explicitly save a thumbnail with a file.",
"Creates a thumbnail of @image for the given @file",
"This procedure creates a thumbnail for the given @file and stores it according to relevant standards.\n"
"In particular, it will follow the [Free Desktop Thumbnail Managing Standard](https://specifications.freedesktop.org/thumbnail-spec/latest/thumbsave.html) when relevant.\n"
"\n"
"The thumbnail is stored so that it belongs to the given @file. This means you have to save @image under this name first. As a fallback, the call will work if @image was exported or imported as @file. In any other case, this procedure will fail.",
NULL);
gimp_procedure_set_static_attribution (procedure,
"Josh MacDonald",

View File

@@ -188,7 +188,7 @@ register_floating_sel_procs (GimpPDB *pdb)
/*
* gimp-floating-sel-remove
*/
procedure = gimp_procedure_new (floating_sel_remove_invoker);
procedure = gimp_procedure_new (floating_sel_remove_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-floating-sel-remove");
gimp_procedure_set_static_help (procedure,
@@ -211,7 +211,7 @@ register_floating_sel_procs (GimpPDB *pdb)
/*
* gimp-floating-sel-anchor
*/
procedure = gimp_procedure_new (floating_sel_anchor_invoker);
procedure = gimp_procedure_new (floating_sel_anchor_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-floating-sel-anchor");
gimp_procedure_set_static_help (procedure,
@@ -234,7 +234,7 @@ register_floating_sel_procs (GimpPDB *pdb)
/*
* gimp-floating-sel-to-layer
*/
procedure = gimp_procedure_new (floating_sel_to_layer_invoker);
procedure = gimp_procedure_new (floating_sel_to_layer_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-floating-sel-to-layer");
gimp_procedure_set_static_help (procedure,
@@ -257,7 +257,7 @@ register_floating_sel_procs (GimpPDB *pdb)
/*
* gimp-floating-sel-attach
*/
procedure = gimp_procedure_new (floating_sel_attach_invoker);
procedure = gimp_procedure_new (floating_sel_attach_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-floating-sel-attach");
gimp_procedure_set_static_help (procedure,

View File

@@ -107,7 +107,7 @@ register_font_procs (GimpPDB *pdb)
/*
* gimp-font-get-lookup-name
*/
procedure = gimp_procedure_new (font_get_lookup_name_invoker);
procedure = gimp_procedure_new (font_get_lookup_name_invoker, TRUE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-font-get-lookup-name");
gimp_procedure_set_static_help (procedure,
@@ -139,7 +139,7 @@ register_font_procs (GimpPDB *pdb)
/*
* gimp-font-get-by-name
*/
procedure = gimp_procedure_new (font_get_by_name_invoker);
procedure = gimp_procedure_new (font_get_by_name_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-font-get-by-name");
gimp_procedure_set_static_help (procedure,

View File

@@ -146,7 +146,7 @@ register_font_select_procs (GimpPDB *pdb)
/*
* gimp-fonts-popup
*/
procedure = gimp_procedure_new (fonts_popup_invoker);
procedure = gimp_procedure_new (fonts_popup_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-fonts-popup");
gimp_procedure_set_static_help (procedure,
@@ -175,7 +175,7 @@ register_font_select_procs (GimpPDB *pdb)
gimp_param_spec_font ("initial-font",
"initial font",
"The name of the initial font choice.",
FALSE,
TRUE,
NULL,
FALSE,
GIMP_PARAM_READWRITE));
@@ -191,7 +191,7 @@ register_font_select_procs (GimpPDB *pdb)
/*
* gimp-fonts-close-popup
*/
procedure = gimp_procedure_new (fonts_close_popup_invoker);
procedure = gimp_procedure_new (fonts_close_popup_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-fonts-close-popup");
gimp_procedure_set_static_help (procedure,
@@ -215,7 +215,7 @@ register_font_select_procs (GimpPDB *pdb)
/*
* gimp-fonts-set-popup
*/
procedure = gimp_procedure_new (fonts_set_popup_invoker);
procedure = gimp_procedure_new (fonts_set_popup_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-fonts-set-popup");
gimp_procedure_set_static_help (procedure,

View File

@@ -152,7 +152,7 @@ register_fonts_procs (GimpPDB *pdb)
/*
* gimp-fonts-refresh
*/
procedure = gimp_procedure_new (fonts_refresh_invoker);
procedure = gimp_procedure_new (fonts_refresh_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-fonts-refresh");
gimp_procedure_set_static_help (procedure,
@@ -169,7 +169,7 @@ register_fonts_procs (GimpPDB *pdb)
/*
* gimp-fonts-get-custom-configs
*/
procedure = gimp_procedure_new (fonts_get_custom_configs_invoker);
procedure = gimp_procedure_new (fonts_get_custom_configs_invoker, TRUE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-fonts-get-custom-configs");
gimp_procedure_set_static_help (procedure,
@@ -213,7 +213,7 @@ register_fonts_procs (GimpPDB *pdb)
/*
* gimp-fonts-get-list
*/
procedure = gimp_procedure_new (fonts_get_list_invoker);
procedure = gimp_procedure_new (fonts_get_list_invoker, FALSE);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-fonts-get-list");
gimp_procedure_set_static_help (procedure,

Some files were not shown because too many files have changed in this diff Show More