------------------------------ GNU Image Manipulation Program Development Branch ------------------------------ This is the unstable branch of GIMP. Overview of Changes from GIMP 2.99.10 to GIMP 2.99.12 ===================================================== Core: - Added concept of "hidden item" to a GimpImage. This would allow to process non attached items for internal processing more easily. - Do not show a crosshair anymore when "Show brush outline" is checked and "Show pointer for paint tools" is unchecked, if the brush outline cannot be drawn (in which case a fallback 4-arcs generic outline showing the size is displayed), for instance because using a dynamic changing the size. - When both "Show brush outline" and "Show pointer for paint tools" are unchecked, show a minimal visual feedback of a few pixels only, as inconspicuous as possible, instead of a crosshair. - Move and reorganize pointer-related settings in Preferences from "Image Windows" to "Input Devices" tabs. - On macOS, delay opening new images dropped on the application icon in the dock to after GIMP is fully initialized. - Some code reorganization and factorization of image colormap and palette handling. - Language changes will trigger plug-in query() call at next GIMP restart. This allows to have strings in query() and stored in GIMP config being re-localized. This implies both explicit language changes in Preferences or system language changes when GIMP is set to follow system language. - Keyboard grab removed from the canvas display, hence getting rid of annoying grab permission warnings on Wayland. - Preferences > Display > Transparency > Check style has now a new option "Custom checks" allowing to select any RGB colors. - Full migration from intltool to gettext only. - The soft-proof profile, soft-proofing rendering intent and whether black point compensation is used when soft-proofing are now image data. These have also been moved to the Image menu (out of View). They are not stored to the XCF file yet. - Hacks on canvas rulers and statusbar added in GIMP 2.99.10 for macOS triggering too big redraws were removed. This depends on patches added to upcoming GTK+ 3.24.35. - CMYK color picking and sample point now use babl and the space specified by the soft-proof profile set on the image, if any. Tools: - The "Fill by line art detection" mode of the Bucket Fill tool got the following improvements: * New "Stroke borders" option where you can select a paint tool (except source tools) to stroke the fill mask before filling with the color. The settings will be the ones as set on the corresponding tool (except for the color). * The options got reorganized in 3 sections (Line Art Detection, Line Art Closure and Fill Borders) and some options were reworded. This should hopefully make the now many options more understandable. - Full text layer's text size will now be changed when changing font size in the text editor window, when no text is selected. Graphical User Interface: - New "Drag to Zoom" mode and speed settings in Preferences. Existing drag-to-zoom behavior was linear depending only on pointer direction (which makes it more or less time-based if we consider that pointer events are regular). The new mode will take the actual distance moved into account allowing to go faster or slower by dragging further or not. The "speed" settings allows a finer zoom speed control for both the old and new modes. - Touchpad gesture rotation (2-finger pinch) on canvas now implemented. Note that rotation or scaling by pinch are exclusive so GIMP will detect the expected behavior through the initial movement and will therefore lock on either rotation or scaling for the whole duration of the pinch. - Slight tweak of the "You will have to restart GIMP" popup: the list now uses nicer "bullet point" characters and the nick (short description) is shown rather than the internal property name. Command Line Interface: - Unless only one batch interpreter is available, there is no default interpreter anymore (it used to be script-fu). Therefore if you set `--batch` but not `--batch-interpreter`, GIMP will output an error message and will list the available interpreters. - GIMP will stop running the batch commands as soon as one command fails (it won't try the following ones). - A new `--quit` option allows you to quit GIMP immediately after running the batch commands. - If `--quit` is set and batch commands are run, the GIMP binary exit code will propagate errors from any batch failure. Exit codes are taken from command Linux error codes: 0 for success, 69 for service unavailable (e.g. setting a non-existing interpreter name), 64 for usage (e.g. not specifying any interpreter or calling errors), 70 for execution errors (bugs in the interpreter plug-in) and 130 for canceling the call. Plug-ins: - BigTIFF: our TIFF plug-in now officially supports BigTIFF import and export. * Import was actually already working transparently if you had a recent enough libtiff. Now the recent libtiff is enforced by dependency requirements. * Export support was added with a checkbox in the interactive dialog and a new "bigtiff" argument in the "file-tiff-save" PDB procedure. * When an interactive export of ClassicTIFF fails for the explicit reason of "Maximum TIFF file size exceeded", the export dialog is raised again with a message proposing to try again as BigTIFF or trying another compression algorithm. This allows because discoverability and understandibility of the issue, while not forcing BigTIFF export (since it might not be supported everywhere). - GIF: new option to specify a number of repeat for animated GIF (rather than single run vs. infinite loop only). - help-browser: rewritten to use GtkAction and GtkApplication, even though it's now a deprecated plug-in (though it's a good example for porting other plug-ins the same way). - PNG: the format does not have any flag for linear RGB, but it can simply include a linear profile (or a 1.0 gAMA chunk). Therefore since we always attach the profile when importing (or transform the gAMA chunk into a profile), we now always load PNG images as non-linear backend. - python-fu-eval and plug-in-script-fu-eval ported to new GimpBatchProcedure class. - JPEG: * CMYK export is now possible. It uses the "Soft-proofing" profile set on the image. * CMYK import ported to GEGL/babl conversion. The CMYK profile in the JPEG image will be stored as soft-proof profile on the image. - WebP: new option "Use Sharp YUV" available in non-lossless export. It renders sharper edges at the cost of a slower export. - DDS: * 16-bit masks now supported. * DDS images with single 16-bit channel support added. * DDS images with 2 16-bit channels correctly converted to 16-bit RGB images. * More robust DDS loading. * New "Flip image" option: some game engine require a flipped image. Rather than flipping, exporting, unflipping process, let's have an option to flip the result at export time. - script-fu: * Various updates to get the API back in shape. * Porting doc updated. * "script-fu-server" was now extracted into its own separate plug-in so that it doesn't need to run permanently with the script-fu extension (could be seen as security hazard too) and it also makes each of these plug-ins more robust by being on their own process each. * A new `gimp-script-fu-interpreter-3.0` binary is installed globally to be used to create Scheme plug-ins, similarly to other plug-ins, in particular in the plug-ins/ directory, not the scripts/ directory anymore. Moreover it makes the whole script-fu infrastructure much more robust as script-fu individual scripts won't crash the whole script-fu extension any longer (they only crash themselves). Note: this is not a GObject Introspected Scheme binding, just our own binding based on script-fu interpreter. Script-fu plug-ins still don't have access to the whole of libgimp. - FLI: * Internal type usage improvements, mnemonics added, etc. * 1-frame animation now loaded correctly (it's not really an animation then, yet it should still open!). * Better error handling. * Layer names now include the delay in ms. * More robust FLI/FLC loading, double-checking data rather than assuming that the file writer properly followed the specs. - Several plug-ins now follow the user-set checkboard color preferences, when relevant. - RAW data: * Improved export dialog with better labels and ported to new dialog generation API. * Improved import dialog, ported to new dialog generation API, with factorized code to more easily handle more cases. * All the exportable formats can now be loaded back. * "file-raw-load" and "file-raw-save" procedures API are now much better with all relevant arguments. * "file-hgt-load" doesn't show a dialog anymore when sample spacing detection worked correctly since we already have all the necessary information. - WBMP: new plug-in to load WBPM image files. It is still limited support and doesn't support all types of WBMP images. - TIFF: * 8 and 16-bit CMYK(A) TIFF files can be exported, using the image soft-proof profile. * Imported CMYK TIFF profiles are now set as soft-proof profile on the image. - SVG: on import, when parsing fails, GIMP will propose to disable size parsing limitations, while explaining this has security implications and should only be done on SVG files from trusted sources. - PSD: * Import now uses babl conversion inconditionally, even for CMYK images, using the soft-proof profile set on the image. * Improved error logging during load. * CMYK profile on a CMYK PSD file is now stored as soft-proof profile in the image. API: - Changes in libgimpbase: * gimp_checks_get_colors() added. * gimp_checks_get_shades() removed (replaced by gimp_checks_get_colors()) - Changes in libgimpcolor: * New functions: + gimp_color_managed_get_simulation_profile() + gimp_color_managed_simulation_profile_changed() - Changes in libgimp: * New functions: + gimp_image_metadata_save_filter() + gimp_check_custom_color1() + gimp_check_custom_color2() + gimp_procedure_dialog_get_int_radio() + gimp_procedure_dialog_get_file_chooser() + gimp_image_get_simulation_profile() + gimp_image_set_simulation_profile() + gimp_image_set_simulation_profile_from_file() + gimp_image_get_selected_drawables() * Removed functions: + gimp_plug_in_set_translation_domain() + image_get_active_drawable() + image_get_active_layer() + image_set_active_layer() + image_get_active_channel() + image_set_active_channel() + image_get_active_vectors() + image_set_active_vectors() * Updated functions: + gimp_procedure_dialog_get_widget() now supports %G_TYPE_PARAM_FILE properties. + gimp_prop_file_chooser_button_new() now works with G_PARAM_SPEC_OBJECT having a value_type == G_TYPE_FILE (additionally to GIMP_PARAM_SPEC_CONFIG_PATH properties). * Functions skipped by bindings: + gimp_get_images() (in favor of gimp_list_*() variant) + gimp_image_get_layers() (in favor of gimp_image_list_*() variant) + gimp_image_get_channels() (in favor of gimp_image_list_*() variant) + gimp_image_get_vectors() (in favor of gimp_image_list_*() variant) + gimp_image_get_selected_layers() (in favor of gimp_image_list_*() variant) + gimp_item_get_children() (in favor of gimp_item_list_*() variant) * New class: + GimpBatchProcedure: procedure usable as a batch interpreter on command line. * Protocol bumped to handle the check colors passed at call time on the wire. * Plug-ins are now expected to have their localization in a Gettext catalog folder locale/ under their main directory, named the same way as this directory (i.e. usually the plug-in name). If the catalog is absent, a message will be outputted on stderr. To override this behavior, a GimpPlugIn is encouraged to override the new set_i18n() method. If it returns FALSE, localization is disabled (or it may be implemented in a different way, for instance with another system than Gettext); if it returns TRUE, you can set a different subfolder and catalog name. * The core does not localize menu items from plug-ins anymore. All plug-ins are now expected to handle their localization within their code. In particular gimp_procedure_set_menu_label() and gimp_procedure_set_documentation() should now pass the localized text. With gettext, it usually means passing arguments through gettext() and not just marking them with N_(). - Changes in libgimpwidgets: * Freedesktop portal implementation of GimpPickButton now checks the version of the XDG portal since `PickColor()` API only got added in version 2. * New classes: + GimpIntRadioFrame * Removed functions: + gimp_prop_int_radio_box_new() - Changes in PDB: * gimp-plug-in-domain-register removed. Translations: - New Galician and Georgian translations for the installer. Build: - libtiff dependency's minimum required version bumped to 4.0.0. - gexiv2 dependency's minimum required version bumped to 0.14.0. - Our meson/Debian CI now runs `meson dist` too. - gvfs is marked as an expected dependency for GIMP (as a GIO module) on Linux, since it seems we wouldn't have HTTP support without. This is only written in the INSTALL file though, no tests are run on configure time. - The distribution stage now has a new `dev-docs` job containing both the C API reference (gi-docgen) and the Python and Javascript (gjs) ones (g-ir-doc). - The `pdbgen` (generation of PDB source files) build step is finally ported to meson too, which is a major step to one day consider this build system out of the "experimental" zone. - Windows installer's gettext files (.po) will now also contain extracted comments from the source to give more context to translators. - Flatpak manifest upgraded with new version constraints so that the flatpak-external-data-checker does not warn wrongly on major update when we don't want to or can't update immediately. - meson is now recommended for Windows and macOS builds and our official installer and DMG respectively are now built (still from CI) with meson. - Flatpak manifest improved with version constraints for dependencies where we should not update just yet (hence don't want new version notifications). - appstream-util replaced by appstreamcli for AppStream file testing (requires appstreamcli 0.15.3 or over). - gi-docgen API documentation will now properly link to other API namespaces thanks to a new urlmap file. - Separate libgimp-scriptfu-3.0 library for a future where it will be shared by several binaries. - GEGL dependency's minimum required version bumped to 0.4.38. Overview of Changes from GIMP 2.99.8 to GIMP 2.99.10 ==================================================== Core: - Linked layers concept replaced by named sets of layers: * One can now store your current selection of layers under any given name and select it again later. * You can also search for layers by their names with patterns (as configured in Preferences, see next news item) and save this pattern search if desired. - Preferences > Interface now has an "Item search" with a dropdown settings proposing the following values: * Basic text search: this search does tokenization, case-folding and UTF-8 normalization. Moreover ASCII alternates are compared, which means that e.g. "e" would matched accented versions (such as "é" or others). * Glob pattern search: this is the GLib implementation of this pattern syntax. It matches '*' (wildcard) and '?' (joker). GLib docs notes also: "Note that in contrast to glob(), the '/' character can be matched by the wildcards, there are no '[...]' character ranges and '*' and '?' can not be escaped to include them literally in a pattern." * Regular expression search: Perl-compatible regular expressions as implemented in GLib. - New item visibility lock: forbidding to change the state of visibility of a given item. This is useful when shift-clicking massively items visibility, but you want to exclude some specific items from the visibility switch. - New internal API gimp_widget_blink_rect() to blink only specific area of a widget, which may be useful for various notification-type exchanges. This is used in particular to blink lock cells in GimpItemTreeView in order to point attention to the reason why an action is forbidden (e.g. when trying to paint on a layer with pixels locked, a message would be shown on status bar and the "Lock pixels" icon would blink). - XCF version 16 with support of item sets. - Wayland: * Clean some popup code out of gtk_menu_popup() which is deprecated and won't work anymore on Wayland (wrong positionning). * Use GtkGestureDrag in ColorWheel module and ScrolledPreview widget to avoid unwanted popups and make us future-proof for GTK4. - macOS: various improvements for macOS support of the development version. In particular the slowness issues have been solved and various bugs have been fixed. - The debug dialog only gets a backtrace of the main thread now, because of some bugs in GDB locking GIMP when trying to get a full backtrace for all threads. - The line art data is now stored for a few additional minutes in the user context after closing the bucket fill tool. This allows quick switch between tools without forcing a recomputation of the line art. - Stroking a path with source tools (Clone, Heal…) is now possible when the tool is active and a source was selected. Technically it's more of a bug fix because the GUI existed as though it was meant to work, but since the report has existed for more than 13 years and I'm not sure it has ever worked, it's worth writing it here. - Block the statusbar from needlessly triggering full canvas redraws by not propagating its resize requests. This is quite a useful optimization for macOS in particular (but any OS in general too). - Alpha and position locks can now be set on layer groups. Alpha lock on groups mostly works like pixel lock (except for the alpha channel only). Position lock work both ways by forbidding moving child layers but also parent layers. - XCF version 17 with support of visibility locks, as well as ability to set alpha or position locks on layer groups. User Interface: - Link icon removed from the Layers dockable. - Lock icon its now made visible next to the "Eye" icon (visibility) on each item row, where the Link icon was. It raises a popover to switch all available locks (contents, position, visibility, alpha): * This makes locks much more obvious rather than when they were at the dockable header. * This also works better with multiple selection of items (when one selected item is locked and another is not, the lock button were ending up in inconsistent state). * This is clearer by showing or not icons (rather than always showing several icons, yet with toggle design which is not even so understandable depending on the theme used). If no locks are set, nothing is shown; if only one lock is set, a specific icon is shown; if several locks are set, a multi-lock icon is shown (and one need to click to get the list of locks). * Locks can now be set massively with shift and alt-click (see next item) with the same logics as you can change visibility massively on the eye button. - Visibility (eye icon) and lock columns in the item dockables are given an icon header to be more discoverable. - Alt-click on eye and lock icons allows to massively switch visibility/lock state but only within selected items (unlike shift-click which switch within all items at same level). - Channels and vectors are now multi-selectable (though actions may have not been all updated yet to handle multiple items). - On-hover indicators around inactive/unset eye/locked toggles in Layer/Channels/Paths dialogs. - GimpSpinScale made more compact. - New "Welcome dialog" which appears only after a new installation or an update, will show a few common links, and the release notes (taken from the AppStream data, so they can even be localized). - The new "Welcome dialog" comes with a new splash screen by Aryeom. Tools: - It is now possible to enable/disable dynamics in a single checkbox. The dynamics "Dynamics Off" which used to be in the default list has been removed as disabling dynamics is now equivalent and much faster (it's also faster to get back to whatever dynamics you were using before). - A new action "context-dynamics-toggle" is available, allowing to switch dynamics ON/OFF (see previous news item) with a shortcut. - New option "Allow closing lines in selected layer" in the "Fill by line art detection" mode of bucket fill tool. Basically this allows to use the fill color (foreground or background color) as closure color in the drawable to be filled. This is an additional step after the line art computation to allow fast usage. Plug-ins: - PSD: * new support for loading 16-bit per channel CMYK images. * new support for files in LAB colorspace. * new support for loading 32-bit per channel images (some code existed yet may have never really worked). * Add extra layer groups when loading PSD images with clipping layers: PhotoShop handles clipping layers in a different way than GIMP. The only way to have it look the same is by adding extra layer groups. PSD layers that have clipping set, combined with the first non clipping layer below it are grouped together in a new layer group. Doing this results in the same image as the PSD merged image unless there are other PSD elements in play that we don't handle yet. * PSD layers with clipping set need clip to backdrop as composite mode: Certain PSD layers have a flag called clipping set to 1. We were not handling this flag and had some reports about colors bleeding where they were not supposed to. We are going to set GIMP's layer composite_mode to GIMP_LAYER_COMPOSITE_CLIP_TO_BACKDROP, which is the closest we can get to PhotoShop's clipping. With this, the colors won't bleed anymore. - JPEG XL: * Bit depth now selectable in JXL export. * Import in 8-bit and 16-bit integer precision now possible for lossless images. (GIMP used to import all JXL images as 32-bit float precision images). * New very fast export settings: thunder and lightning (fastest). * Compression slider is disabled for lossless. - Screenshot: * Remove KDE and GNOME screenshot portal in favor of Freedesktop portal. Security restrictions make them more and more unsuable on recent KDE and GNOME versions. * Set the "interactive" option to TRUE for the Freedesktop API, so that the screenshot options are presented immediately (instead of taking a screenshot, then only proposing options to try again). This is more consistent to how our non-D-Bus screenshot plug-in used to work. * Windows: cursor capture option now available. - CUR: added load and export support for Microsoft Windows cursor (.cur) files. - HEIF: bit depth heuristic removed for the settings. The plug-in just stores and set back the last used values as for other settings instead of trying to be "clever". - help-browser and webpage are now marked "unmaintained" and building them is discouraged, except for developers. The reasons are: the multiple problems for building, while it is not even available on Windows anymore (and unsure if it will ever be solved anytime soon), bringing features which nowadays most people have with browsers installed by default on systems (allowing to read the manual and take full webpage screenshots). Build: - Improved Coding Style document with commit message styling, git usage, comment styling, natural language text rules, localization and some section reorganization. - GExiv2 dependency bumped to 0.12.2 (fixing bothersome warnings on some unknown metadata domains). - libjxl dependency bumped to 0.6.1. - New meson option -Dcan-crosscompile-gir=true to force GObject-Introspection generation even when cross-compiling (some people manage to do it, e.g. with Yocto). - Added .clang-format file and new CI pipeline to verify coding-style issues in merge requests. - New tool `flatpak-releases` to easily list and install specific versions of our flatpak builds, which can be a great help when debugging or trying to bisect with released binaries. - Important refactoring of icon builds: * Whether using meson or autotools, and whether installing vector icons or raster ones (with --disable-vector-icons), the same lists are always used and no icons are missing. The new custom tool tools/generate-icon-makefiles.py makes sure the Makefile list is in sync with the meson one. The lists are committed in icons/icon-lists/ with a "usage grouping" logics when possible. * PNG versions for Color and Symbolic icon themes should not be committed anymore. The Symbolic PNG version are generated with GTK tool gtk-encode-symbolic-svg and the Color PNG version are rendered with a new custom tool tools/colorsvg2png.c. * New weekly CI to build with raster icons on meson and autotools and making sure the build systems are well synced. * Meson's -Dvec-icons option renamed to -Dvector-icons. - meson dependency bumped to 0.53.0. - We recommend fontconfig 2.13.95 or over on Windows where support for user-installed fonts (feature appeared in Windows 1809) was implemented. GIMP had its own workaround until now, which got removed in this version. - Optimization of the DLL search script for creating the Windows installer, which made the "packaging-win*-native" jobs in particular run from over 2 hours in some cases to about 10 minutes. So it's a big gain for the creation wait for the Windows installer. - GEGL minimum required version bumped to 0.4.36. API: - Vala bindings gimp-3.vapi and gimp-ui-3.vapi were renamed to gimp-3.0.vapi and gimp-ui-3.0.vapi respectively in the autotools build (now consistent with meson). - Changes in libgimp: * GimpStringArray type was removed in favor of GStrv. Various libgimp API were updated to use GStrv, and relevant plug-in procedures with GStrv arguments or return values were updated as well. * New functions: + gimp_context_are_dynamics_enabled() + gimp_context_enable_dynamics(). + gimp_item_get_lock_visibility() + gimp_item_set_lock_visibility() + gimp_pdb_run_procedure_config() * Removed functions: + gimp_item_get_linked() + gimp_item_set_linked() - Changes in libgimpui: * New widgets: + GimpLabelColor (now used by default for GimpRGB properties in GimpProcedureDialog) + GimpLabelEntry (now used by default for string properties in GimpProcedureDialog) + GimpSpinScale (formerly a core-only widget, e.g. used by the "Opacity" slider on the Layers dockable, moved to libgimpui to be usable by plug-ins) * New functions: + gimp_color_area_enable_drag() + gimp_event_triggers_context_menu(): alternative to gdk_event_triggers_context_menu() with the additional ability of using button release events as contextual menu triggering (instead of press events), which might be prefered in some cases. Other than this, it uses exactly the same conditions as its GDK counterpart. + gimp_procedure_dialog_get_spin_scale() + gimp_prop_label_color_new(). + gimp_prop_label_entry_new() + gimp_prop_spin_scale_new() + gimp_prop_widget_set_factor() * Improved functions: + gimp_procedure_dialog_get_widget() can now generate widgets of type GimpSpinScale (for int/double properties) and GimpLabelColor or GimpColorButton (for GimpRGB properties). + gimp_procedure_dialog_get_color_widget() now only return GimpLabelColor widgets (editable or not). Documentation: - API documentation is now built with `gi-docgen` instead of `gtk-doc`. The syntax for in-comment documentation is slightly changed. - Important rework of the developer documentation has started in devel-docs/. Translations: - 20 translations were updated: Basque, British English, Catalan, Chinese (China), Danish, German, Greek, Hungarian, Italian, Kabyle, Latvian, Lithuanian, Polish, Portuguese, Russian, Slovenian, Spanish, Swedish, Ukrainian, Vietnamese. 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 macOS Big Sur. - "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-reset" 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). - All g_memdup() ported to g_memdup2() thanks to GLib version bump. - Various leaks and other bugs fixed, notably with several static analyzer results - Add metadata preference for saving thumbnail by default: saving a thumbnail is closely related to the other metadata preferences, but so far this was the only one that didn't have a preference for a default user value. A new settings in the "Image Import & Export" section of the Preferences allows to select whether thumbnail saving should be enabled by default or not. - 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. 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: - Layout of the Canvas Size dialog re-designed a bit more horizontally after the template selector feature made it too high. - 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 or logics changes. 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. - New function gimp_export_thumbnail() to query the user settings (as set in Preferences) on whether or not a file plug-in should export the image thumbnail. 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. - New JPEG XL plug-in (loading and exporting). - Various cleaning replacing g_file_get_path() with g_file_peek_path() Translations: - New Vietnamese, Lithuanian and Portuguese translations for the installer. Build: - Windows installer scripts updated to all supported languages. - New "windows-installer-langs" unit test to detect discrepancies of langs listed in build system, installer and gettext files. - New CI jobs for Windows native builds with MSYS2. - Less critical CI jobs (meson/clang build and cppcheck static analysis) moved to a scheduled run for resource saving, and 32-bit cross-built Windows job now only runnable manually. - 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. - 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. - Flatpak nightly build now uses the new "fallback-x11" permission instead of "x11" to prevent unnecessary X11 access while in Wayland. - Fixes to codebase making GIMP 2.99 finally building and running on macOS. - Our flatpak manifests now use the flatpak-external-data-checker tool with the Anitya backend allowing to monitor our dependencies and ensure they are always up-to-date. All dependencies have been updated accordingly. - Our desktop file now lists a `StartupWMClass` tag to better associate running GIMP windows with the application icon (and possibly other metadata). 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.