mirror of https://github.com/GNOME/gimp.git
821 lines
42 KiB
Plaintext
821 lines
42 KiB
Plaintext
------------------------------
|
|
GNU Image Manipulation Program
|
|
Development Branch
|
|
------------------------------
|
|
|
|
This is the unstable branch of GIMP.
|
|
|
|
|
|
Overview of Changes from GIMP 2.99.6 to GIMP 2.99.8
|
|
===================================================
|
|
|
|
Core:
|
|
|
|
- Selection display implementation now updated to more modern display
|
|
server logics when drawing to display buffer. This fixes selection
|
|
drawing in Wayland (and possibly in macOS Big Sur too, though this
|
|
change is untested on this OS so far).
|
|
- "Create a New Image" default action is "OK" so that hitting Enter in
|
|
text/number fields is equivalent to clicking OK.
|
|
- Paint tool core code can now receive multiple drawables as input
|
|
though it is disabled by default, unless a tool calls
|
|
gimp_paint_tool_enable_multi_paint() in its init() method. This is
|
|
only used in source tools so far.
|
|
- Clicking anywhere on toolbox empty space (dead areas between
|
|
buttons) or on Wilber's drop area, as well as on the toolbox buttons
|
|
themselves, actively focuses the canvas (similarly to the `Esc`
|
|
shortcut).
|
|
- Config folder migration for GIMP 3 with initial implementation.
|
|
- Action "view-rotate-reset" renamed to "view-reset" (resets both
|
|
flipping and rotate). New "view-rotate-reset" and "view-flip-rotate"
|
|
for resetting rotation and flipping respectively.
|
|
- New GimpEarlyRc class replacing GimpLangRc for very early config
|
|
parsing (it used to be for language setting, now also for the
|
|
pointer input API choice on Windows).
|
|
|
|
Tools:
|
|
|
|
- Clone, Heal and Perspective clone now work on multiple selected
|
|
layers. There are 2 new modes:
|
|
* When cloning while multiple drawables are being selected, each
|
|
drawable clones from itself to itself, i.e. every drawable is both
|
|
its source and target.
|
|
* When sourcing from multiple drawables then cloning into a single
|
|
drawable, the source is the composited image. This is similar to
|
|
"Sample Merged", except limited to a list of drawables.
|
|
|
|
User Interface:
|
|
|
|
- Preferences now allows to select the input device API on Windows
|
|
(Wintab or Windows Ink), as Windows Pointer Input Stack (Windows
|
|
Ink) support was added recently in GTK3.
|
|
- Layout of the Canvas Size dialog re-designed a bit more horizontally
|
|
after the template selector feature made it too high.
|
|
|
|
API:
|
|
|
|
- New gimp_display_present() function to present a specific display at
|
|
the top of the image display stack.
|
|
- New gimp_procedure_dialog_fill_expander() to create a GtkExpander in
|
|
procedure dialogs.
|
|
- All widgets within a same container in a GimpProcedureDialog are
|
|
added to their own GtkSizeGroup.
|
|
|
|
Plug-ins:
|
|
|
|
- PSD now supports bigger-than-4GiB files. File support was ported to
|
|
GIO API with 64-bit offsets, hence allowing loading correctly very
|
|
big files.
|
|
- PSD now supports loading up to 99 channels (specs say that 56 is the
|
|
max but some sample PSD files have more channels).
|
|
- PSB file format is now supported for loading.
|
|
- Scriptfu now handles GFile and GimpObjectArray types.
|
|
- 16-bit SGI images now supported (until now, they were loaded as
|
|
8-bit).
|
|
- file-webp ported to GimpSaveProcedureDialog.
|
|
|
|
Translations:
|
|
|
|
- New Vietnamese and Lithuanian translations for the installer.
|
|
|
|
Build:
|
|
|
|
- Windows installer scripts updated to all supported languages.
|
|
- New CI jobs for Windows native builds with MSYS2.
|
|
- Several less critical CI jobs (32-bit cross-built Windows,
|
|
meson/clang build, cppcheck static analysis) moved to a scheduled
|
|
run for resource saving.
|
|
- Windows installer now built as a CI job. The installer is not
|
|
signed. The installer creation happens on tags for releases and at
|
|
regular scheduled intervals for tests.
|
|
- Improved tag handling in the CI for transparent release process.
|
|
- New flatpak job (on scheduled interval) published on GNOME Nightly
|
|
repository.
|
|
- Windows installer and test flatpak (to download, no repository) can
|
|
now be built by a merge request CI when the labels "5. Windows
|
|
Installer" and/or "5. Flatpak package" are respectively set in the
|
|
MR labels.
|
|
- Scalable GIMP application icon is installed too.
|
|
- Thumbnail icon feature was dropped: when images were opened, the
|
|
application icon used to be a composition of the active image and
|
|
the application icon (Wilber). This was confusing, hard to
|
|
distinguish and working on less and less platforms because of recent
|
|
OS and desktop rules.
|
|
- Generate SHA* checksums for CI-generated Windows installers.
|
|
- New `CODING_STYLE.md` document in repository for our coding style
|
|
rules.
|
|
- Configure: --enable-check-update now has an "auto" value.
|
|
Meson: -Dcheck-update is now a yes|no|platform-default combo.
|
|
The auto/platform-default value defaults to "yes" on Windows and
|
|
macOS and "no" on other platforms.
|
|
- GLib dependency's minimum required version bumped to 2.68.0.
|
|
- GEGL minimum required version bumped to 0.4.32.
|
|
|
|
|
|
Overview of Changes from GIMP 2.99.4 to GIMP 2.99.6
|
|
===================================================
|
|
|
|
Core:
|
|
|
|
- Various fixes for Wayland support.
|
|
- Canvas Size dialog now displays a template selector to simply
|
|
resize the canvas to a known template. When the image's and
|
|
template's pixel density don't match, a choice will be proposed to
|
|
set the image's PPI to the template's one or to scale the template's
|
|
pixel size with the image's pixel density.
|
|
- Off-canvas guides are now allowed. Guides are not deleted anymore
|
|
when dropped off-canvas, but when dropped off-viewport.
|
|
- Pinch gesture is now possible on canvas for zooming in/out (works on
|
|
Wayland, not on X11; untested yet on *BSD, macOS, Windows and
|
|
others).
|
|
- GimpAction core class now stores a reason for explaining being
|
|
disabled. This can be used later for giving better hints on why some
|
|
effects or plug-ins are not usable in some situations. We already
|
|
had this feature, but by tweaking the action's tooltip, which
|
|
prevented this to have proper styling on GUIs and disrupted action
|
|
search (as the reason text was searched, hence may return actions it
|
|
should not).
|
|
- Copy|Cut-Paste could already operate on multiple layers, by merging
|
|
the result into a single layer. It will still do this when a
|
|
selection exists, yet will paste layers as-is otherwise. This makes
|
|
an alternative way to move layers, which is sometimes easier than
|
|
drag'n dropping (especially between separate images).
|
|
|
|
Tools:
|
|
|
|
- Paint Select tool got various improvements:
|
|
* apply a threshold on the image mask before triggering the
|
|
automatic expansion to simplify mask handling in the gegl
|
|
paint-select operation.
|
|
* enable viewport-based local selection.
|
|
- GEGL Operation tool is now moved into Filters > Generic menu because
|
|
it behaves more like a generic filter conceptually. As other
|
|
filters, the GEGL Operation action is now only active when there are
|
|
opened images.
|
|
|
|
API:
|
|
|
|
- The generate "Metadata" frame layout in a GimpSaveProcedureDialog
|
|
has been improved to always show the same number of columns to avoid
|
|
ugly layout with options on 3 columns, then 2 columns on the next
|
|
line (for instance).
|
|
- The "Reset" button in GimpProcedureDialog shows a down arrow to show
|
|
this is actually a button menu.
|
|
- "Save|Load Defaults" in GimpProcedureDialog are renamed as "Save
|
|
Settings" and "Load Saved Settings". The term "defaults" was not
|
|
very clear and could be confused with "factory defaults". Moreover
|
|
tooltips were added and the "Load Defaults" button is now only
|
|
sensitive if "Save Defaults" buttion has been hit at least once.
|
|
- Annotations improved.
|
|
- Drop g_object_notify() in favor of g_object_notify_by_pspec() in
|
|
various implementations to avoid a slight performance hit because of
|
|
a global lock.
|
|
- New function gimp_parasite_get_data() replacing gimp_parasite_data()
|
|
and gimp_parasite_data_size() in a GObject Introspection friendly
|
|
way.
|
|
- gimp_procedure_dialog_new() now allows a NULL title if a menu label
|
|
was set on the GimpProcedure with gimp_procedure_set_menu_label().
|
|
- gimp_progress_update() improved: do not update more than 20 times
|
|
per second and do not warn on stderr when too many progression steps
|
|
are outputted. Indeed we should not place the burden of deciding
|
|
whether there are too much or not enough progression updates on
|
|
plug-in developers. On the opposite, they should be encouraged to
|
|
update the progression as often as possible while libgimp will
|
|
handle the decision on whether it actually ignores the progression
|
|
step or not. This makes easier plug-in development and good
|
|
progression feedback of long process.
|
|
- GimpInt16Array was removed: it was used neither by GIMP core nor any
|
|
core plug-ins. If third-party plug-ins really need this type, they
|
|
may easily reintroduce it through GimpUint8Array (array of bytes) or
|
|
GimpInt32Array (using only a subrange).
|
|
- New function gimp_image_take_selected_layers() similar to
|
|
gimp_image_set_selected_layers() except that it takes a GList
|
|
(instead of a C array) and it takes ownership of the list pointer.
|
|
- New functions: gimp_procedure_set_sensitivity_mask() and
|
|
gimp_procedure_get_sensitivity_mask() for plug-ins to advertize when
|
|
a procedure should be sensitive (in particular relatively to
|
|
multi-drawable selection).
|
|
- GimpImageProcedure's run() functions now have an array of drawables
|
|
as argument (instead of a single drawable), to be consistent with
|
|
multi-drawable selection ability.
|
|
- New gimp_plug_in_error_quark() as a generic GQuark/GError domain for
|
|
plug-ins.
|
|
- Several functions were renamed to be consistent with our naming
|
|
scheme:
|
|
* s/gimp_parasite_name/gimp_parasite_get_name/
|
|
* s/gimp_parasite_flags/gimp_parasite_get_flags/
|
|
* s/gimp_image_base_type/gimp_image_get_base_type/
|
|
* s/gimp_image_width/gimp_image_get_width/
|
|
* s/gimp_image_height/gimp_image_get_height/
|
|
* s/gimp_drawable_bpp/gimp_drawable_get_bpp/
|
|
* s/gimp_drawable_width/gimp_drawable_get_width/
|
|
* s/gimp_drawable_height/gimp_drawable_get_height/
|
|
* s/gimp_drawable_offsets/gimp_drawable_get_offsets/
|
|
- gimp_parasite_data() and gimp_parasite_data_size() are replaced by
|
|
gimp_parasite_get_data() which is introspection friendly.
|
|
- libgimpconfig: GimpParasite can now be serialized. This is useful
|
|
when using a GimpParasite procedure argument, whose random contents
|
|
(possibly binary) can be stored across sessions.
|
|
- Move public classes to G_DECLARE_DERIVABLE_TYPE and
|
|
G_DECLARE_FINAL_TYPE in order not to expose useless variables to
|
|
plug-in developers.
|
|
- New function gimp_procedure_dialog_set_sensitive() sets
|
|
GimpProcedureDialog's widget sensitive value or binding.
|
|
- PDB procedure 'plug-in-autocrop-layer' multi-layer aware.
|
|
- GimpProcedureDialog now handles GimpRGB arguments.
|
|
|
|
Plug-ins:
|
|
|
|
- We dropped the dialog for the Freedesktop portal implementation of
|
|
the screenshot plug-in. Basically the Freedesktop portal provides
|
|
its own GUI with most options, so also showing ours is redundant.
|
|
Just directly call the portal and wait for the image in return.
|
|
- Color profile and comment is saved on each layer of a TIFF file to
|
|
prevent any ambiguity as TIFF allows its layers to have different
|
|
profiles.
|
|
- On PNG import, create an ICC profile out of the gAMA and/or cHRM
|
|
chunks, if any of them are present, if no color profile is set and
|
|
if the sRGB chunk is not present. This happens for RGB images as
|
|
well as grayscale images (creating respectively a RGB or grayscale
|
|
color profile).
|
|
- Improve PNG export in no-profile case with gAMA and cHRM chunks
|
|
(additionally to the sRGB chunk) according to PNG spec
|
|
recommendations. Moreover the "gamma" option has now been removed
|
|
because we just have proper core support of this metadata through
|
|
ICC profile creation now, which is just more powerful.
|
|
- "gamma" option for PNG export was removed (from GUI and
|
|
file-png-load PDB API) because it is now redundant as we have proper
|
|
support for this metadata.
|
|
- Various fixes and improvements to OpenRaster image support.
|
|
- PDF export now has progression.
|
|
- PSD import/export got multi-layer selection support.
|
|
- Qbist:
|
|
* make the applied pattern a bit more prominent by adding a
|
|
label about the center pattern of the 9x9 grid (which is the
|
|
selected one meant to be applied).
|
|
* last used values now stored with the new API, hence surviving
|
|
across sessions.
|
|
- benchmark-foreground-extract.py moved to gimp-data-extras.
|
|
- Various plug-ins now work with multiple selected drawables when
|
|
relevant.
|
|
|
|
Devel docs:
|
|
|
|
- Python 3 and Javascript API documentation are now generated inside
|
|
the build directory devel-docs/g-ir-docs/html/ (not installed right
|
|
now) if you configure the build with option --enable-g-ir-doc
|
|
(alternative for the meson build: -Dg-ir-doc=true but the docs ends
|
|
up incomplete so autotools build is advised, cf. #6362).
|
|
|
|
Translations:
|
|
|
|
- New Hebrew translation for the installer.
|
|
|
|
Build:
|
|
|
|
- Bumping minimum GEGL to version 0.4.30.
|
|
|
|
|
|
Overview of Changes from GIMP 2.99.2 to GIMP 2.99.4
|
|
===================================================
|
|
|
|
Core:
|
|
|
|
- Action search now always show all actions, even inactive ones. In
|
|
order not to clutter the results, inactive ones are shown after
|
|
active results (following the same match quality level).
|
|
Consequently the "Show unavailable actions" checkbox has been
|
|
removed from the `Preferences > Help System` dialog.
|
|
- Improve sample text logics for CJK fonts, showing different
|
|
sample characters for Korean and Japanese, making detection
|
|
at-a-glance of such fonts easier.
|
|
- With "Ask what to do" color profile policy, profile conversion at
|
|
image loading is not proposed anymore when the image's profile is
|
|
the preferred profile set in Preferences for the current image type
|
|
(currently it would only be discarded if the image's profile was the
|
|
built-in profile, now GIMP accounts for both cases).
|
|
- When file loading plug-ins are run, the file chooser dialog is now
|
|
hidden until the plug-in returns.
|
|
- GIMP tries to keep error dialogs above to raise awareness when they
|
|
arrive (not discovered later under other dialogs).
|
|
|
|
User Interface:
|
|
|
|
- GimpSpinScale widget improvements:
|
|
* The widget will grab focus when starting to edit the entry, and
|
|
in particular the current number will be fully selected (because
|
|
often we want to just type down a completely different number
|
|
accurately).
|
|
* Also when giving focus to the entry with middle click (from
|
|
anywhere inside the widget), the scale value doesn't change in the
|
|
same time anymore.
|
|
* Finally we can now target-click accurately the entry current value
|
|
to edit the entry (again, without changing the value and selecting
|
|
existing number fully) with the main button (usually left button).
|
|
Even though middle click is simpler because we don't have to be
|
|
accurate (we can middle-click anywhere in the spin scale widget),
|
|
it is hardly discoverable, whereas clicking a number entry which
|
|
is meant to be editable is the most common GUI interaction
|
|
expectation.
|
|
* To help feature discoverability, when hovering the widget, the
|
|
cursor will change and show a "grab" cursor when a click would
|
|
start an absolute edit (the cursor changes to "grabbing" when
|
|
actually clicking and dragging the scale) or a "text" cursor when
|
|
a click would focus the number entry. When Shift key is being
|
|
hold, the cursor is the one for the relative edit, wherever the
|
|
position over the widget. This should make discovering possible
|
|
interactions with the widget a lot easier.
|
|
- Various improvements in the Layers dockable (and similar tree view
|
|
widgets):
|
|
* The bigger thumbnail popup on long click (e.g. on a layer or mask
|
|
thumbnail) does not pop out when any modifier is hold (such as
|
|
Shift/Ctrl for multi-selection or any other modifier used for
|
|
alternative actions).
|
|
* Alternative actions which were available with modifier-clicks on
|
|
layer or mask thumbnails have been moved to an Alt+ modifier when
|
|
necessary, in order to not clash with multi-layer selection
|
|
interaction. In particular:
|
|
+ Ctrl-click on a mask to enable/disable it now moved to
|
|
Alt-Ctrl-click.
|
|
* The Shift+click and Ctrl+click actions on a layer thumbnail to add
|
|
and remove respectively a layer mask have been removed because the
|
|
much older feature for "Alpha to Selection" already use all the
|
|
Alt+ modifier combinations.
|
|
* The alternative Alt+ actions now only operate on the clicked layer
|
|
and not on the selection unlike the corresponding actions
|
|
(available through buttons, actions and menus). Also they do not
|
|
change the selection. So you can Alt+click a layer for "Alpha to
|
|
Selection", same as you can Alt+click a mask for showing it
|
|
without triggering a selection change. This allows these
|
|
alternative actions to not be redundant of the equivalent actions
|
|
but complementary with a slightly different targeting behavior.
|
|
* The various interactions with modifiers now catch the exact
|
|
modifier combination they require, hence avoiding interaction
|
|
cases running several actions (e.g. Alt-Ctrl on a layer thumbnail
|
|
removes the clicked layer's alpha channel from the selection
|
|
without modifying the selected layer while Ctrl only would modify
|
|
the selection).
|
|
|
|
Tools:
|
|
|
|
- New Paint Select tool in the playground. This is a tool prototype
|
|
which would hopefully end up as a quick binary selection tool.
|
|
- The new default dynamics is: "Pressure Size". This doesn't change
|
|
anything for common input devices (mouses, touchpad) yet would allow
|
|
tablet devices to directly show that pressure input is working on
|
|
first use. Until now, people would have the impression that tablets
|
|
are not working (even though GIMP 3 will have hotplug so it is
|
|
actually working from scratch) just because "Dynamics Off" was the
|
|
default.
|
|
|
|
Input Devices:
|
|
|
|
- Various improvements to the Input Devices editor:
|
|
* Do not show virtual devices and XTEST API (Linux/X11) device in
|
|
the Input Devices editor as they are useless from a configuration
|
|
standpoint.
|
|
* Only show the axes returned by GDK instead of the whole
|
|
list of possible axes, which made no sense.
|
|
* Show better names for axes, as returned by GDK, for instance a X
|
|
axis becomes often "Abs X" on a graphics tablet and "Rel X" on a
|
|
mouse or other devices made to work relatively.
|
|
* Don't show an empty list for devices with no axes, just don't show
|
|
the list widget at all.
|
|
* For each device, select by default the first axis with curve
|
|
ability, if any, (i.e. the Pressure axis if the device has one) in
|
|
order to make the dialog directly more useful and usable.
|
|
- Default tool have been set on different device sources:
|
|
* Pen devices (tablet styluses main input) now default to the
|
|
paintbrush tool.
|
|
* Eraser devices (tablet styluses back input) still defaults to
|
|
eraser tool.
|
|
* Touch screen (finger) defaults to Smudge tool.
|
|
* All other devices defaults to paintbrush (this was already the
|
|
case, but was broken for as long as I remember, now it should work
|
|
properly).
|
|
|
|
API:
|
|
|
|
- GimpFileEntry public variables were made private and a new function
|
|
has been added: gimp_file_entry_get_entry().
|
|
- New GimpScaleEntry and GimpColorScaleEntry widget classes and new
|
|
relevant API for these objects, replacing the former functions
|
|
creating various widgets and attaching them to a GtkGrid. This makes
|
|
for easier to use and less constrained GUI functions (with a lot
|
|
less arguments, as we try now to smartly generate appropriate
|
|
defaults for many options; gimp_scale_entry_new() in particular went
|
|
down from 17 arguments to 5), also better introspectability for
|
|
bindings, and finally it will be useful for automatic dialog
|
|
generation for plug-ins.
|
|
- New GimpLabeled class and subclasses: GimpLabelSpin,
|
|
GimpLabelIntWidget.
|
|
- Several new functions for GimpProcedureDialog for automatic dialog
|
|
generation based on input arguments. Though not mandatory, the
|
|
various functions allow to organize better the widgets.
|
|
- The GimpProcedureDialog class will now check that mnemonics are
|
|
present on every option, and also that there is no duplicate
|
|
mnemonics. It will print messages on stderr if any of these test
|
|
fails (so that it won't bother users but developers and translators
|
|
should be able to get feedback about missing/duplicate mnemonics).
|
|
- GimpSaveProcedure now has generic metadata support (with an API so
|
|
that an export procedure can declare whether it supports given
|
|
metadata types or contents).
|
|
Combined with a new subclass GimpSaveProcedureDialog (child of
|
|
GimpProcedureDialog), this ensures that:
|
|
* If a format supports a given metadata, they will always have an
|
|
auxiliary argument with the same name across plug-ins.
|
|
* The label and tooltips will also be always the same in the GUI.
|
|
* Order of metadata widgets will also stay consistent.
|
|
* The widgets will work the same (no more "Comment" text view
|
|
missing in one plug-in but present in another, or with an entry
|
|
here, and a text view there, and so on).
|
|
* The metadata frame will show an "(edit)" link which will run the
|
|
"plug-in-metadata-editor" plug-in. The eventual goal is to move
|
|
some generic logics to the metadata editor (when it makes sense)
|
|
and to raise awareness for metadata edition and viewing abilities.
|
|
This is still a work-in-progress which requires much more
|
|
improvements in said abilities.
|
|
- New gimp_get_num_processors() function for plug-ins to be able to
|
|
set their own multi-threading operations as configured in
|
|
Preferences.
|
|
|
|
Plug-ins:
|
|
|
|
- file-fli, file-tiff, file-jpeg and file-png updated to new dialog
|
|
generation API. In the most complicated case (file-jpeg), this
|
|
shaved 600 lines out of the plug-in code.
|
|
- file-heif:
|
|
- now uses gimp_get_num_processors() instead of
|
|
g_get_num_processors() (allowing to bypass system thread info).
|
|
- Realtime parameter is set for AOM encoder when Fast encoding
|
|
speed is selected by user.
|
|
- Ability to set pixel format (YUV444, RGB) is enabled
|
|
for >= libheif 1.10 to avoid issues in older versions.
|
|
- file-jp2 is now able to decode JPEG2000 files faster with
|
|
multi-threading, using the thread number settings returned by
|
|
gimp_get_num_processors().
|
|
- Improved plug-in debugging helper infrastructure: GIMP_PLUGIN_DEBUG
|
|
has a new `fatal-criticals` option and better defaults. Developer
|
|
documentation got some rewriting and debugging code benefited from
|
|
refactorization.
|
|
- py-slice.py moved to gimp-data-extras.
|
|
|
|
Installer:
|
|
|
|
- Various updates to adapt to the GIMP 2.99/3 build.
|
|
- Lua made optional.
|
|
|
|
Devel docs:
|
|
|
|
- Documentation to port GIMP 2.10 plug-ins to GIMP 3.0 has been
|
|
started in `devel-docs/GIMP3-plug-in-porting-guide/`. It is also
|
|
visible directly on out Gitlab instance with visual styling:
|
|
https://gitlab.gnome.org/GNOME/gimp/-/tree/master/devel-docs/GIMP3-plug-in-porting-guide
|
|
|
|
Build:
|
|
|
|
- Bumping minimum harfbuzz version to 1.0.5 for hb_ft_font_set_funcs().
|
|
- Bumping minimum pango version to 1.44.0 for pango_font_has_char().
|
|
- Bumping minimum GEGL to version 0.4.28.
|
|
|
|
|
|
Overview of Changes from GIMP 2.10.x to GIMP 2.99.2
|
|
===================================================
|
|
|
|
Core:
|
|
|
|
- Improved "space invasion".
|
|
- New extension format support (.gex a.k.a. GIMP Extension) which is
|
|
an archive containing various supported data. So far, it can
|
|
package: brushes, MyPaint brushes, dynamics, patterns, gradients,
|
|
palettes, tool presets, plug-ins, splash images and themes.
|
|
- New extension manager allowing to enable, disable or uninstall
|
|
installed extensions, with a dialog available in `Edit > Manage
|
|
Extensions`.
|
|
- Multi selection of layers now possible. Various tools and features
|
|
are now multi-selection aware.
|
|
- XCF format bumped to version 14 with awareness of multiple layer
|
|
selection.
|
|
- All code is year-2038-safe with deprecated time API replaced.
|
|
- "Alpha to Selection" various actions warn when the result selection
|
|
is empty.
|
|
- Color Profile Policy (import) now exposes a "Convert to Preferred
|
|
Profile" (fourth) choice and the import dialog default "Convert"
|
|
action will convert the image to the preferred profile (if any was
|
|
set, otherwise it falls back to the built-in profile). Converting to
|
|
the built-in profile will be still available as secondary action.
|
|
- A new "Metadata Rotation Policy" is now exposed in the Preferences
|
|
dialog, next to the "Color Profile Policy" (in page `Preferences >
|
|
Image Import & Export`) with 3 options: "Ask what to do", "Discard
|
|
metadata without rotating" and "Rotate the image then discard
|
|
metadata".
|
|
This policy used to be handled API-size, with a dialog generated by
|
|
libgimpui gimp_image_metadata_load_finish(), and saved in a global
|
|
parasite. The whole logics and GUI has been moved as core logics,
|
|
similar to the "Color Profile Policy".
|
|
|
|
User Interface:
|
|
|
|
- Whole interface ported to GTK+3:
|
|
* Proper HiDPI support, which will follow the system's scale factor
|
|
for all widgets. This is a core toolkit support, unlike the basic
|
|
better-than-nothing hacks from GIMP 2.10.x.
|
|
* GTK+3 CSS-like support. All themes for former versions are
|
|
therefore not working anymore.
|
|
* GTK+3 themes have the concept of "dark variant", so a same theme
|
|
may propose both a light and a dark versions. Preference for dark
|
|
variants can now be checked in `Preferences > Themes > Use dark
|
|
theme variant if available` checkbox, allowing for instance to use
|
|
your system theme in its light variant everywhere except in GIMP.
|
|
This option is checked by default as graphics software are often
|
|
preferred in dark modes.
|
|
* Symbolic icon themes are now recolored automatically according to
|
|
the theme colors (no theme and icon theme tweaking anymore to end
|
|
up with dark on dark or light on light interfaces), except for
|
|
color elements whose SVG style is marked as "!important".
|
|
* Native Wayland support.
|
|
* Various dialogs now use Client-Side decorations and modern GTK+
|
|
widgets are being used when relevant (e.g. GtkSwitch which gives a
|
|
better feeling of a general "ON/OFF state").
|
|
* Progressive/smooth scroll actions (e.g. ctrl+scroll for zooming)
|
|
are now possible.
|
|
- Image display rendered faster with a render cache that keeps the
|
|
result of scaling, color management, display filters and shell mask
|
|
(for tools like fuzzy select).
|
|
- Shift-click on layer GimpContainerTreeView (typically the Layers
|
|
dockable) allows to expand/collapse all item groups but the clicked
|
|
one.
|
|
- Compact GimpSpinScale is now the only available version.
|
|
- Scalable symbolic icons "switch-on", "switch-off" (from GTK
|
|
repository) and "software-update-available" (from Adwaita
|
|
repository) are now bundled with GIMP in a "hicolor" overlay so that
|
|
they are available even if missing from the custom theme.
|
|
|
|
Devices:
|
|
|
|
- Device hotplug supported (thanks to GTK+3). In particular:
|
|
* you don't need to have your tablets and other devices plugged
|
|
before you start GIMP anymore;
|
|
* enabling your devices in the "Configure Input Devices" dialog is
|
|
not needed anymore. Tablets will work out-of-the box;
|
|
* you can safely unplug and replug the same or other input devices
|
|
while GIMP is running.
|
|
- "Input Devices" dialog improved:
|
|
* "Save" and "Close" buttons replaced by "OK" (save and exit),
|
|
"Cancel" (reset and exit) and "Reset" (reset to previous settings
|
|
but keep the dialog open).
|
|
* "Keys" list has been discontinued. The "key" concept is
|
|
associated to "keyboard" devices (a tablet being a "pointing
|
|
device" with buttons, not keys) so this list was actually useless
|
|
and only confusing.
|
|
|
|
Plug-ins:
|
|
|
|
- Major rewrite of the API (see below). So GIMP 2.10.x plug-ins and
|
|
below must be ported to the new API.
|
|
- Every introspected binding which we test comes with a "Goat
|
|
Exercise", which is a demo plug-in popping a dialog and showing its
|
|
own source code. It processes a simple "gegl:invert" operation on a
|
|
drawable. All "Goat Exercises" must do the same thing in the same
|
|
way, simply in their respective languages, as documentation/example
|
|
code for a language binding.
|
|
- The Goat Exercise plug-ins are themselves installed as a GIMP
|
|
Extension, as a demo for extension creation.
|
|
- Plug-ins must be installed in their own subdirectory in
|
|
`$XDG_CONFIG_HOME/GIMP/2.99/plug-ins/`, thus preventing data mess
|
|
(with plug-ins coming with data and installing it all in the root
|
|
plug-ins/ directory) and DLL hell. The main plug-in executable must
|
|
be named the same as the directory (possibly with an added
|
|
extension).
|
|
E.g.: `plug-ins/my-cool-plug-in/my-cool-plug-in.py`
|
|
- HEIF export allows selecting color subsampling/pixel format (YUV444,
|
|
YUV420, RGB) and encoder speed (Slow, Balanced, Fast).
|
|
Lossless option delivers visually lossless output.
|
|
- New "file-heif-av1-load" procedure separate from "file-heif-load"
|
|
for AVIF only.
|
|
- shadow_bevel.py, sphere.py, whirlpinch.py and clothify.py moved to
|
|
gimp-data-extras.
|
|
|
|
API:
|
|
|
|
- `GimpPDB` is now a class to represent the PDB communication channel
|
|
with GIMP. It is a singleton which exist exactly once per running
|
|
plug-in, hence it is not meant to be manually instantiated and can
|
|
only be returned by gimp_get_pdb(). It is mostly used to look up
|
|
procedures declared by other plug-ins or by GIMP core, check if a
|
|
given procedure exist and run the procedures.
|
|
- `GimpPlugIn` is a class which every plug-in should now subclass as a
|
|
way to create their plug-in, and override at least the methods
|
|
query_procedures() and create_procedure(). Two other methods
|
|
(init_procedures() and quit()) can be optionally overridden.
|
|
The new subclass must be declared to gimp by calling gimp_main() to
|
|
make it available to the core (PDB procedure, menu items, etc.).
|
|
A plug-in can obtain its own GimpPlugIn instance with
|
|
gimp_get_plug_in(). This is a singleton object which belongs to
|
|
libgimp.
|
|
- Plug-In procedures are now represented by a class `GimpProcedure`.
|
|
* The subclass `GimpFileProcedure` handles file-related procedures,
|
|
and its own subclasses `GimpLoadProcedure` and `GimpSaveProcedure`
|
|
handle load/export procedures (file format support).
|
|
* The subclass `GimpThumbnailProcedure` for procedures run during
|
|
the lifetime of the GIMP session each time a plug-in thumbnail
|
|
procedure is called.
|
|
* The subclass `GimpImageProcedure` handles `GimpImage`-related
|
|
procedures, i.e. any procedure which want to work on the opened
|
|
image (GIMP core will pass through the active image and selected
|
|
drawables to the plug-in procedure).
|
|
* Objects of the subclass `GimpPDBProcedure` are not meant to be
|
|
created or freed by plug-ins, they represent any `GimpProcedure`
|
|
and are returned by `gimp_pdb_lookup_procedure()` by looking it up
|
|
by name on the singleton `GimpPDB` object.
|
|
- `GimpProcedureConfig` is the base class to represent the arguments
|
|
when running a `GimpProcedure`. It implements the `GimpConfig`
|
|
interface and will provide proper management of saved settings
|
|
(including the last used values) and generated GUI using
|
|
prop_widgets to plug-ins. This is still a work-in-progress.
|
|
Currently `GimpProcedure` run function is called with a
|
|
`GimpValueArray` whose values can be transferred into a
|
|
`GimpProcedureConfig` by calling `gimp_procedure_config_begin_run()`
|
|
or `gimp_procedure_config_begin_export()`.
|
|
- `GimpDisplay` is now a class of its own.
|
|
- `GimpImage` is now a class to represent an opened image.
|
|
- `GimpItem` is now a class to represent various `GimpImage` items.
|
|
* `GimpVectors` subclass represents an image path.
|
|
* `GimpDrawable` subclass represents drawable object but is a
|
|
simili-abstract class as it won't be a finale object class, which
|
|
can be so far either a:
|
|
+ `GimpLayer` represents image layers.
|
|
+ `GimpChannel` represents a `GimpImage` channel which is
|
|
typically in GIMP a named channel which can be added into a
|
|
`GimpImage` channel stack (the "Channels" dockable in the GUI)
|
|
with `gimp_image_insert_channel()`. This class is not really
|
|
used to represent a color space component though this is
|
|
conceptually the same thing (so maybe some day) and named
|
|
channel can actually be created from an image color component
|
|
with `gimp_channel_new_from_component()`.
|
|
Some other specific usages have their own subclasses:
|
|
- `GimpLayerMask` subclass is used for a `GimpLayer` mask.
|
|
- `GimpSelection` subclass is used for a `GimpImage` selection.
|
|
- GimpImage, GimpItem and GimpDisplay (and their various subclasses)
|
|
represent objects which can be passed through the PDB. They are
|
|
managed by libgimp and should not be freed by plug-ins.
|
|
- The PDB-passing classes still have IDs which can be obtained with
|
|
gimp_image_get_id(), gimp_item_get_id() and gimp_display_get_id()
|
|
respectively. Conversely you can get back the object with
|
|
gimp_image_get_by_id(), gimp_item_get_by_id() and
|
|
gimp_display_get_by_id().
|
|
Specific variants exist to get back an item object from its ID, such
|
|
as gimp_layer_get_by_id(), which do additional class verification
|
|
(other than this, they are similar to gimp_item_get_by_id()).
|
|
**NOTE**: since objects are managed by libgimp, you are ensured that
|
|
a `*_get_by_id()` call returns you exactly the same object you had
|
|
previously for a given object. Consequently you can do pointer
|
|
comparison of objects to compare images, items or displays during a
|
|
given run. This will work because objects are unique (these are not
|
|
several object copies representing the same remote object).
|
|
- Type validation function which used to work on IDs now work directly
|
|
with object arguments while new function with added `*_id*` have
|
|
been created to validate from an object ID instead, GIMP 2.10-style.
|
|
To verify if an ID exist:
|
|
* gimp_image_is_valid() / gimp_image_id_is_valid()
|
|
* gimp_item_is_valid() / gimp_item_id_is_valid()
|
|
* gimp_display_is_valid() / gimp_display_id_is_valid()
|
|
To check if GimpItem are from specific subclasses:
|
|
* gimp_item_is_drawable() / gimp_item_id_is_drawable()
|
|
* gimp_item_is_layer() / gimp_item_id_is_layer()
|
|
* gimp_item_is_text_layer() / gimp_item_id_is_text_layer()
|
|
* gimp_item_is_channel() / gimp_item_id_is_channel()
|
|
* gimp_item_is_layer_mask() / gimp_item_id_is_layer_mask()
|
|
* gimp_item_is_selection() / gimp_item_id_is_selection()
|
|
* gimp_item_is_vectors() / gimp_item_id_is_vectors()
|
|
|
|
**NOTE**: since these are GObject classes, you can also use the
|
|
GObject style macros such as GIMP_IS_LAYER(). Yet these macros do
|
|
not do any ID verification (which is not a problem anyway in most
|
|
cases as you got the object from API calls) and will not exist in
|
|
bindings.
|
|
|
|
**IMPORTANT**: using IDs is mostly for internal usage and actually
|
|
there are very few reasons to ever need to get an object ID from a
|
|
plug-in. Usually you should rather just work only with the unique
|
|
object pointers returned by the API.
|
|
- The whole API has been updated to use objects instead of object IDs
|
|
when relevant. For instance all existing libgimp functions from 2.10
|
|
which were called on an image ID are now called on a GimpImage
|
|
object instead.
|
|
- All file paths procedure parameters are now handled by GIO's `GFile`
|
|
which simplify various file handling issues (path formats, encoding,
|
|
etc.) and brings new features (remote access, secure protocol
|
|
support, etc.). We also got rid of the "filename" vs "raw_filename"
|
|
differentiation in parameters. Hence all libgimp* functions with
|
|
these parameters have been updated as well.
|
|
- gimp_image_metadata_load_finish() is now fully GUI/GTK-code free.
|
|
The first consequence is that it is not in libgimpui anymore, but in
|
|
libgimp, as it should. The second consequence is that the boolean
|
|
`interactive` argument has been removed. Now all image rotation
|
|
logics (the part which needed a GUI) has been moved into core and
|
|
will be automatically run when normally loading images from GIMP's
|
|
interface, similarly as to how color profiles was already handled.
|
|
- 2 new libgimp functions: gimp_image_policy_rotate() and
|
|
gimp_image_policy_color_profile() are now available to explicitly
|
|
call the Preferences-set policy on an image. This may result in a
|
|
dialog being presented to the user if `interactive` is TRUE and
|
|
settings is "Ask what to do".
|
|
It is unnecessary to call these functions when developing a new
|
|
GimpLoadProcedure because the core will automatically do the right
|
|
thing and call these on normal image loading workflow.
|
|
Instead if a plug-in calls such GimpLoadProcedure through the PDB,
|
|
no such functions will be run automatically. It is up to the plug-in
|
|
to decide what to do (no conversion, mandatory conversion, or using
|
|
user settings, possibly with a dialog to decide, hence calling these
|
|
functions explicitly).
|
|
- New function gimp_export_comment() to query the user settings (as
|
|
set in Preferences) on whether or not a file plug-in should export
|
|
the image's comment.
|
|
- Several functions which are returning C-array of objects with a size
|
|
output argument now also have a GList counterpart (not as
|
|
replacement, but as additional API):
|
|
* gimp_get_images() -> gimp_list_images()
|
|
* gimp_image_get_layers() -> gimp_image_list_layers()
|
|
* gimp_image_get_selected_layers() -> gimp_image_list_selected_layers()
|
|
* gimp_image_get_channels() -> gimp_image_list_channels()
|
|
* gimp_image_get_vectors() -> gimp_image_list_vectors()
|
|
* gimp_item_get_children() -> gimp_item_list_children()
|
|
- New function gimp_vectors_stroke_reverse() to reverse a specified
|
|
stroke in a given GimpVectors.
|
|
- In GIMP 2.10, functions gimp_drawable_preview_get_drawable() and
|
|
gimp_zoom_preview_get_drawable() got deprecated in favor of
|
|
respectively gimp_drawable_preview_get_drawable_id() and
|
|
gimp_zoom_preview_get_drawable_id(). The original names have been
|
|
reinstated and now returns a GimpDrawable object, whereas the newer
|
|
functions got removed.
|
|
Similarly gimp_zoom_preview_new_from_drawable_id() and
|
|
gimp_drawable_preview_new_from_drawable_id() are replaced by
|
|
respectively gimp_zoom_preview_new_from_drawable() and
|
|
gimp_drawable_preview_new_from_drawable().
|
|
- Deprecated functions in GIMP 2.10.x have been removed. To get a list
|
|
of these function, this file should hopefully map most of them to a
|
|
replacement equivalent:
|
|
devel-docs/GIMP3-plug-in-porting-guide/removed_functions.md
|
|
- gimp_spin_button_new() had some weird compatibility macro to expand
|
|
to a newer or older signature depending on the number of arguments.
|
|
Now only the newer signature with 3 arguments is available.
|
|
- Properties removed from custom widgets:
|
|
* GimpAspectPreview, GimpDrawablePreview and GimpZoomPreview had a
|
|
deprecated "drawable" property in favor of "drawable-id" property.
|
|
The "drawable" property got reinstated (and the "drawable-id"
|
|
removed) and obviously now stores a GimpDrawable object rather
|
|
than an integer.
|
|
* The property "stock-id" was removed from GimpHintBox and
|
|
GimpCellRendererToggle. Use "icon-name" instead.
|
|
- Note: there are likely more API changes, unfortunately we haven't
|
|
kept the NEWS file up-to-start from scratch. The best is to look at
|
|
the API generated documentation.
|
|
- The full API is GObject Introspected into 2 modules: Gimp and
|
|
GimpUi. This means plug-ins can be written in various non-C
|
|
languages. So far the following languages have been tested and work
|
|
well: Python 3, Lua, Javascript and Vala.
|
|
(Note: Python 2 is also working, but considering that this language
|
|
is end-of-life since 2020, we don't really care).
|
|
- All pygimp specific Python API does not exist anymore. Python will
|
|
use the same API as C plug-ins, introspected through GObject
|
|
Introspection.
|
|
|
|
Documentation:
|
|
|
|
- `devel-docs/xcf.txt` updated to handle XCF 14.
|
|
|
|
Build:
|
|
|
|
- New meson build system. Still deemed "experimental" for the time
|
|
being. Packagers are recommended to continue using the autotools
|
|
build system in order to avoid build system-specific bugs.
|
|
- Continuous integration in Gitlab with:
|
|
- an autotools build with GCC on a Debian/testing runner
|
|
- an autotools distcheck build on a Debian/testing runner
|
|
- a meson build with GCC on a Debian/testing runner
|
|
- a meson build with Clang on a Debian/testing runner
|
|
- a meson cross-build with Mingw-w64 for Windows 32-bit
|
|
- a meson cross-build with Mingw-w64 for Windows 64-bit
|
|
- static code analysis with cppcheck
|
|
- a source tarball distribution job (tar.bz2 and tar.xz)
|
|
- a ready-to-run Windows 64-bit test archive
|
|
- a ready-to-run Windows 32-bit test archive
|
|
|
|
Known blocker issues:
|
|
|
|
- GTK+3 port is functional but not complete as some deprecated APIs
|
|
are still being used.
|
|
- Space invasion is still a work-in-progress.
|
|
- Plug-ins API update is still a work-in-progress.
|
|
- GIMP extensions are still a work-in-progress.
|
|
- Multiple layer selection is still work-in-progress. Some issues are
|
|
expected, and possibly even some crashes in code paths which were
|
|
not updated yet.
|
|
- No custom theme yet, in particular we want a neutral gray theme with
|
|
light/dark variants, and a middle-gray theme too.
|
|
- We probably want to revive a "Small" theme as well with smaller
|
|
icons (useful on smaller displays, or mid-high density displays or
|
|
simply depending on tastes).
|
|
- Various blocking bugs happen on Wayland only.
|