2492 lines
		
	
	
		
			127 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			2492 lines
		
	
	
		
			127 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|                    ------------------------------
 | |
|                    GNU Image Manipulation Program
 | |
|                          Development Branch
 | |
|                    ------------------------------
 | |
| 
 | |
| This is the unstable branch of GIMP.
 | |
| 
 | |
| 
 | |
| Overview of Changes from GIMP 2.99.16 to GIMP 2.99.18
 | |
| =====================================================
 | |
| 
 | |
| Core:
 | |
| 
 | |
|   - New snapping options:
 | |
|     * "Snap to Bounding Boxes": allows on-canvas snapping to either layer
 | |
|       borders or center.
 | |
|     * "Snap to Equidistance": allows to snap a layer to be at the same distance
 | |
|       from a second one that this second one is to a third one, either
 | |
|       horizontally or vertically.
 | |
|   - GIMP is now able to use fonts with custom styles, which Pango is unable to
 | |
|     work with.
 | |
|   - Font names are not unique anymore, which means that GIMP doesn't rename
 | |
|     identically named fonts with #1 or #2, etc. as it used to do. These fonts
 | |
|     with same name are now properly working despite the name clash.
 | |
|   - GimpData now have a concept of collection, which is either a controlled name
 | |
|     for internal data, or a string constructed from the local file path for
 | |
|     external data. This will be used to serialize data objects hence easily
 | |
|     retrieve the proper data even when some data may have duplicate names.
 | |
|   - New palette import support: SwatchBooker.
 | |
|   - Artifically set PANGOCAIRO_BACKEND=fc when running on Windows to use the
 | |
|     fontconfig backend, which enables anti-aliasing on Windows, unlike the
 | |
|     default pangocairo backend.
 | |
|   - XCF:
 | |
|     * Font information are more accurately stored (not only the font name, but
 | |
|       also storing various other attributes and even a file hash in the ideal
 | |
|       case where the exact same font file is available), allowing to find the
 | |
|       right font (if installed) on load with less errors.
 | |
|     * As a consequence of the previous point, new files with text layers will be
 | |
|       saved as a bumped XCF 19 version.
 | |
|     * Older XCF versions with text layers can still be saved using older XCF
 | |
|       versions as long as the text layers are untouched in an edit session.
 | |
|   - "view-zoom-*" actions are not radio actions anymore.
 | |
|   - Improve thumbnail loading algorithm:
 | |
|     1. If there is a GimpThumbnailProcedure, it is run first.
 | |
|     2. Otherwise we check if a thumbnail is in the metadata.
 | |
|     3. As last resort, we just load the full image.
 | |
|   - Generic inter-process transient window reimplemented using opaque GBytes
 | |
|     window identifiers instead of guint32. The goal is to have windows created
 | |
|     by plug-ins be transient to the calling core image window, but also the
 | |
|     other way around: some core dialogs are generated through PDB calls (in
 | |
|     particular resource and drawable chooser dialogs created by gimp_*_popup()
 | |
|     functions) and should be transient to plug-in dialogs.
 | |
|     This works on X11 and Wayland (the Wayland implementation is new, previous
 | |
|     code was X11-only). It should work on Windows too (code exists) but this was
 | |
|     left disabled as it leads to core process hanging (as described in
 | |
|     https://bugzilla.gnome.org/show_bug.cgi?id=359538) and is pending debugging.
 | |
|     There is no macOS implementation yet, and it seems to be missing from GDK as
 | |
|     well.
 | |
|   - Indexed images' colormap:
 | |
|     * Now possible to delete colors if unused.
 | |
|   - Updates for floating data's actions:
 | |
|     * New actions "edit-paste-float" and "edit-paste-float-in-place" for pasting
 | |
|       the contents of the clipboard as floating data with default positionning
 | |
|       algorithm or in-place respectively;
 | |
|     * renames "select-float" to "select-cut-float" which does a cut and paste as
 | |
|       float in one action;
 | |
|     * adds "select-copy-float" which does a copy and paste as float in one
 | |
|       action;
 | |
|     * reorganize a bit the `Edit > Paste as` submenu with sections for the
 | |
|       floating data variants;
 | |
|     * add a "Float" submenu in "Select" root menu, containing the 2 variant
 | |
|       actions "select-cut-float" and "select-copy-float".
 | |
| 
 | |
| 
 | |
| Graphical User Interface:
 | |
| 
 | |
|   - "Merge menu and title bar" option is not shown on macOS as it is not usable
 | |
|     there (the main menu is anyway out of the window from the start).
 | |
|   - Top menu has been special-cased for macOS (some items are removed with
 | |
|     "hidden-when" attribute set to "macos-menubar" value) for items which are
 | |
|     also available in the application menu.
 | |
|   - Menu section can now be named with the "section-name" attribute in
 | |
|     GtkBuilder ".ui" files. This can be used as a replacement of the former
 | |
|     "Placeholder" concept which we used to have (and has now been completely
 | |
|     removed).
 | |
|     Plug-ins or GEGL operations which want to make use of sections can use the
 | |
|     "[Section]" syntax. For instance installing a plug-in in the menu path
 | |
|     "<Image>/File/[Open]" will install the menu item at the end of the Open
 | |
|     section (i.e. after the various other open-file actions at the top of the
 | |
|     File menu).
 | |
|   - Some string or naming consistencies were fixed in source strings.
 | |
|   - GimpContainerEntry don't have inline completion anymore. Instead the result
 | |
|     pop-up always appear, even for one result. This is because a limitation of
 | |
|     GtkEntryCompletion: we cannot remove the case sensitivity search (see
 | |
|     gtk#275) which was very bad usage experience because when we reached a
 | |
|     single result, suddenly nothing happened anymore (no popup, no completion)
 | |
|     if case was different on any letter. It's just better to always have popup
 | |
|     with case insensitivity.
 | |
|     This widget is used for instance for on-canvas font selection.
 | |
|   - Some icons were modified with an added light border to make them better
 | |
|     visible on dark themes: gimp-tool-text icons in Color and Legacy icon themes
 | |
|     and gimp-tool-dodge in Color theme.
 | |
|   - Help menu rearranged to be better organized and also to move "About GIMP" as
 | |
|     the last item, which is its more conventional position.
 | |
|   - Many fixes to the default themes (including several cases of CSS rules
 | |
|     leaking from system themes).
 | |
|   - New settings in Preferences to set the interface base font size (this won't
 | |
|     work as well, or at all, for themes which would set absolute font sizes).
 | |
|   - "gimp-wilber-eek" icon is now reused as generic "image-missing" icon too.
 | |
|   - In dockables' grid view, the hovered icon is now highlighted with a
 | |
|     contrasted border.
 | |
|   - GimpPdbDialog (e.g. resource chooser dialogs) are now set to system defaults
 | |
|     for whether or not they use a header bar.
 | |
|   - Shift+Number-row default shortcuts are now transformed into the actual key
 | |
|     in the currently used layout (reciprocally, if numbers are direct access
 | |
|     key, their counterpart shortcuts are similarly updated).
 | |
|   - Colormap dockable:
 | |
|     * New "Delete" button available and sensitive only when selecting an unused
 | |
|       color in the palette.
 | |
|   - Windows: title bar will be switched to light or dark mode based on the
 | |
|     current theme.
 | |
|   - The quit dialog now adjusts its size relatively to monitor height.
 | |
|   - The heuristic to set a cursor when single or multi-selecting items in a tree
 | |
|     view got reviewed in order to avoid unecessary scroll. As a general rule,
 | |
|     the cursor is always set to one of the selected element, ideally the last
 | |
|     clicked element unless it is not selected (e.g. removed with Ctrl-click),
 | |
|     then a closest selected element is chosen to avoid unecessarily scroll of
 | |
|     the item list.
 | |
| 
 | |
| Tools:
 | |
| 
 | |
|   - Text tool:
 | |
|     * improve markup creation logic when replacing selected text in
 | |
|       order not to create useless styling markup interfering with other
 | |
|       features.
 | |
|     * Alignment for RTL languages is now more consistent with how it works in
 | |
|       other software (such as LibreOffice or Scribus).
 | |
| 
 | |
| Plug-ins:
 | |
| 
 | |
|   - Farbfeld: new image format import/export support.
 | |
|   - OpenEXR:
 | |
|     * Files with single channels are always treated as grayscale, even when
 | |
|       they use non-conventional channel names. A notice message is also
 | |
|       presented to the user in a dialog for information.
 | |
|   - Metadata Editor:
 | |
|     * Various code cleanups and improvements;
 | |
|     * GUI improvements;
 | |
|     * Xmp.plus.ImageSupplierName can now only have one value;
 | |
|     * Improved Creation date handling;
 | |
|     * Synchronization (both for reading and writing) added between some Exif,
 | |
|       Xmp and Iptc equivalent tags. On reading, when equivalent tags have
 | |
|       different values at load, a terminal warning is now outputted.
 | |
|   - Script-fu:
 | |
|     * Generated dialog's titles are not prefixed with "Script-Fu: " anymore.
 | |
|     * Several scripts were removed and moved to gimp-data-extras: erase-rows,
 | |
|       grid-system, select-to-brush, select-to-image, select-to-pattern.
 | |
|     * script-fu-copy-visible was removed (and not moved to gimp-data-extras).
 | |
|     * New test scripts.
 | |
|   - New gimp-help-main script to link to the "Table of Contents" of the manual,
 | |
|     added to the "Help > User Manual" submenu.
 | |
|   - PSP:
 | |
|     * added support to load PSP ICC Profile data.
 | |
|     * fixed vulnerabilities: ZDI-CAN-22096, ZDI-CAN-22097.
 | |
|     * load active selection from PSP file.
 | |
|     * Load guides and grid info.
 | |
|   - Image Map: two new fields to the HTML Link tab and one new field to the
 | |
|     Javascript tab for area properties:
 | |
|     * accesskey: The same as the mnemonic key shortcuts in GTK, to activate an
 | |
|       area of the image map. Depending on the OS, you either hold ALT or
 | |
|       ALT+SHIFT and this key.
 | |
|     * tabindex: What order to select the area when the user presses Tab.
 | |
|     * onClick: Run a Javascript function when the user clicks on the area.
 | |
|   - Esm Software PIX: new import support.
 | |
|   - All plug-ins were ported to the new Gimp*Procedure API using
 | |
|     GimpProcedureConfig instead of GimpValueArray arguments.
 | |
|   - Add Border (script-fu): add a 'Allow resizing' toggle.
 | |
|   - Plug-ins ported to GimpProcedureDialog: van-gogh-lic, dds-write, flame,
 | |
|     histogram-export, lighting, fractal-explorer, map-object, sample-colorize,
 | |
|     compose, curve-bend, depth-merge, selection-to-path, pagecurl, file-cel,
 | |
|     file-svg, file-wmf, smooth-palette, small-tile, film, gradient-flare, tile,
 | |
|     web-page, screenshot.
 | |
|   - JPEG-XL:
 | |
|     * Load metadata via libjxl exclusively.
 | |
|     * Disable GIMP EXIF orientation support, using orientation stored in
 | |
|       codestream instead.
 | |
|   - HEIF:
 | |
|     * Load metadata via libheif exclusively.
 | |
|     * Disable GIMP EXIF orientation support.
 | |
|   - PDF:
 | |
|     * "Layers as Pages" works now for a single layer group with multiple
 | |
|       sub-layers.
 | |
|   - DDS:
 | |
|     * Add support for loading DDS 16- and 32-bit per channel RGBA. Loading is
 | |
|       supported for 16-bit half float, 32-bit float, 16 and 32-bit unsigned and
 | |
|       signed int.
 | |
|       This supports both the DX10 formats and the D3D FOURCC versions.
 | |
|       16- and 32-bit per channel images with less than 4 channels are not yet
 | |
|       supported.
 | |
|     * Add DDS support for loading R8G8, R16 and R16G16 formats.
 | |
|       GIMP can load DXGI variants as well as the older D3DF versions, including
 | |
|       handling of the signed versions.
 | |
|       We also set signed when the pixelformat flag DDPF_BUMPDUDV is set.
 | |
|     * New option to vertically flip dds image on import. This is needed by some
 | |
|       game engines.
 | |
|     * New import option for DDS DXT1/BC1 images to always use transparency. If
 | |
|       unchecked, fully transparent values are interpreted as black pixels.
 | |
|   - GIF:
 | |
|     * Remember when a file was stored as a GIF animation to be reused when
 | |
|       overwriting.
 | |
|    - PNG:
 | |
|     * Import/export safe-to-copy PNG chunks.
 | |
|    - HEJ2: new import support. HEJ2 is JPEG 2000 image coded images in HEIF
 | |
|      containers.
 | |
| 
 | |
| Translations:
 | |
| 
 | |
|   - Many non-translatable strings were made translatable. Various other
 | |
|     localization bugs were handled.
 | |
|   - New Belarusian translation in the Windows installer.
 | |
| 
 | |
| API:
 | |
| 
 | |
|   - Changes in libgimpconfig:
 | |
|     * GimpConfig serialization doesn't break anymore if one property
 | |
|       serialization fails. GIMP will now continue to serialize the rest. In
 | |
|       particular, it will allow to retrieve as many arguments as possible
 | |
|       between plug-in runs.
 | |
|     * GBytes (de)serialization support added. It supports gracefully a NULL
 | |
|       GBytes value.
 | |
|   - Changes in libgimp:
 | |
|     * GimpResource can now be (de)serialized using the data name and collection
 | |
|       so that we are now able to retrieve a used resource quite reliably between
 | |
|       runs.
 | |
|     * For GimpProcedure with no run-mode parameter, the run-mode is considered
 | |
|       non-interactive (e.g. for decision algorithm about whether to reuse
 | |
|       previous settings or not).
 | |
|     * Arguments of type GimpResource and its subtypes are now supported and
 | |
|       GimpProcedureDialog will generate appropriate chooser widgets.
 | |
|     * Arguments of type GimpLayer and GimpChannel will have a proper widget
 | |
|       generated (GimpDrawableChooser) by GimpProcedureDialog, limited to only
 | |
|       the proper drawable subtype.
 | |
|     * All GimpProcedure and its subtypes now have a run() method using a
 | |
|       GimpConfig instead of a GimpValueArray. In particular, the type of the run
 | |
|       argument changed in gimp_procedure_new(), gimp_batch_procedure_new(),
 | |
|       gimp_image_procedure_new(), gimp_load_procedure_new(),
 | |
|       gimp_save_procedure_new() and gimp_thumbnail_procedure_new().
 | |
|       The following 2 run function types had further evolutions:
 | |
|       + GimpRunLoadFunc: by default, a GimpLoadProcedure will try and load
 | |
|         metadata from a file (if Exiv2 knows the format). The run() function
 | |
|         will be allowed to edit the GimpMetadata object but also the load flags
 | |
|         before it is actually attached to the image, allowing plug-ins to have
 | |
|         custom metadata handling code when needed.
 | |
|       + GimpRunSaveFunc: metadata handling is integrated in this new version of
 | |
|         the API, since the run() function will pass a prepared metadata object,
 | |
|         which can be modified by plug-in code (if needed). This GimpMetadata
 | |
|         object will be stored automatically by the GimpSaveProcedure
 | |
|         infrastructure if the mimetype argument is set in
 | |
|         gimp_save_procedure_new().
 | |
|     * On plug-in exit, we do not display memory reference hold warnings for Lua,
 | |
|       Javascript and Python plug-ins anymore. The GObject-Introspection bindings
 | |
|       for these languages seem to hold references of their own in some
 | |
|       conditions and anyway plug-in developers don't have any memory management
 | |
|       capabilities available in the chosen languages. It's not like they can do
 | |
|       anything.
 | |
|     * New functions:
 | |
|       + gimp_procedure_dialog_set_sensitive_if_in()
 | |
|       + gimp_procedure_dialog_set_ok_label()
 | |
|       + gimp_procedure_dialog_fill_notebook()
 | |
|       + gimp_procedure_dialog_fill_notebook_list()
 | |
|       + gimp_procedure_dialog_fill_paned()
 | |
|       + gimp_procedure_config_get_choice_id()
 | |
|       + gimp_prop_brush_chooser_new()
 | |
|       + gimp_prop_font_chooser_new()
 | |
|       + gimp_prop_gradient_chooser_new()
 | |
|       + gimp_prop_palette_chooser_new()
 | |
|       + gimp_prop_pattern_chooser_new()
 | |
|       + gimp_resource_select_button_get_label()
 | |
|       + gimp_pattern_get_buffer()
 | |
|       + gimp_drawables_close_popup()
 | |
|       + gimp_drawables_popup()
 | |
|       + gimp_drawables_set_popup()
 | |
|       + gimp_prop_drawable_chooser_new()
 | |
|       + gimp_font_get_pango_font_description()
 | |
|       + gimp_fonts_get_by_name()
 | |
|       + gimp_image_get_palette()
 | |
|       + gimp_procedure_run_config()
 | |
|       + gimp_procedure_run_valist()
 | |
|     * Removed functions:
 | |
|       + gimp_procedure_config_begin_run()
 | |
|       + gimp_procedure_config_end_run()
 | |
|       + gimp_procedure_config_begin_export()
 | |
|       + gimp_procedure_config_end_export()
 | |
|       + gimp_procedure_config_get_values()
 | |
|       + gimp_procedure_config_set_values()
 | |
|       + gimp_pdb_run_procedure_argv()
 | |
|       + gimp_pdb_run_procedure()
 | |
|       + gimp_pdb_run_procedure_valist()
 | |
|       + gimp_pdb_run_procedure_array()
 | |
|       + gimp_pdb_run_procedure_config()
 | |
|       + gimp_procedure_new_arguments()
 | |
|       + gimp_pdb_set_data() a.k.a. gimp_set_data()
 | |
|       + gimp_pdb_get_data() a.k.a. gimp_get_data()
 | |
|       + gimp_pdb_get_data_size() a.k.a. gimp_get_data_size()
 | |
|     * Modified functions:
 | |
|       + gimp_procedure_dialog_get_label():
 | |
|         1. Added `is_markup` and `with_mnemonic` boolean arguments.
 | |
|         2. `label_id` argument can be a string property to sync to, or a new
 | |
|            widget ID to create, using `text` as initialization contents.
 | |
|       + gimp_label_spin_set_increments(): made more generic and robust to handle
 | |
|         integer spin or modifyable min/max.
 | |
|       + gimp_param_spec_get_desc():
 | |
|         - Also handles new GimpChoice arguments by listing all valid string
 | |
|           values for a given argument.
 | |
|         - Returned string is now pango-markup formatted.
 | |
|       + gimp_display_get_window_handle() and gimp_progress_get_window_handle():
 | |
|         the return value is now an opaque GBytes which is to be interpreted
 | |
|         differently depending on the running platform.
 | |
|       + All gimp_*_popup() functions now have a `parent_window` argument which
 | |
|         is the opaque window handle of the calling plug-in dialog, such as can
 | |
|         be returned by gimp_dialog_get_native_handle().
 | |
|       + gimp_brush_get_pixels() replaced by gimp_brush_get_buffer() and
 | |
|         gimp_brush_get_mask().
 | |
|       + gimp_text_layer_set_font() now uses a GimpFont.
 | |
|       + gimp_text_layer_get_font() now returns a GimpFont.
 | |
|       + gimp_text_layer_new() now uses a GimpFont.
 | |
|       + gimp_text_fontname() renamed gimp_text_font().
 | |
|       + gimp_text_get_extents_fontname() renamed gimp_text_get_extents_font().
 | |
|       + gimp_ui_init() now implies a gegl_init().
 | |
|       + gimp_procedure_run() now uses a variable argument list of (name, value)
 | |
|         pairs.
 | |
|     * New classes:
 | |
|       + GimpPickableSelect
 | |
|       + GimpDrawableChooser
 | |
|     * Modified classes or structure:
 | |
|       + GimpProgress:
 | |
|         - GimpProgressVtableGetWindowFunc function type now returns GBytes.
 | |
|         - get_window() abstract method is renamed get_window_handle().
 | |
|       + GimpResourceSelectButton:
 | |
|         - Class made abstract.
 | |
|         - It now has a label which is used in the size group in
 | |
|           GimpProcedureDialog.
 | |
|       + GimpBrushSelectButton: big UX improvements.
 | |
|       + GimpPatternSelectButton: big UX improvements.
 | |
|       + All Gimp*SelectButton widgets were renamed to Gimp*Chooser.
 | |
|     * New GimpProcedure argument types:
 | |
|       + GimpChoice: this will replace cases when we used to use int arguments to
 | |
|         represent custom enum types, which was particularly non-usable when the
 | |
|         list of valid choices was long and the string docs was not kept
 | |
|         up-to-date.
 | |
|         It comes with GIMP_PROC_ARG_CHOICE(), GIMP_PROC_AUX_ARG_CHOICE(),
 | |
|         GIMP_PROC_VAL_CHOICE(), GIMP_VALUES_GET_CHOICE() and
 | |
|         GIMP_VALUES_SET_CHOICE() macros.
 | |
|         The advantages of this new type:
 | |
|         - No need to keep the list of valid choices up-to-date anymore within
 | |
|           the docs string.
 | |
|         - Since the docs string doesn't contain long list of arguments, we don't
 | |
|           have long opaque and non-understandable tooltips assigned to graphical
 | |
|           interface widgets.
 | |
|         - Calling a PDB procedure with a human-readable string is much more
 | |
|           understandable than with an opaque int.
 | |
|         - This type handles invalid input for generic error handling.
 | |
|         - We can easily generate a list of the valid string values. E.g. this is
 | |
|           now used in the Procedure Browser through gimp_param_spec_get_desc().
 | |
|         - Choices can be made insensitive if needed.
 | |
|         - A proper widget (GimpStringComboBox) will be generated by
 | |
|           GimpProcedureDialog by default.
 | |
|     * PDB: the big change in the PDB is that we decided not to warrant argument
 | |
|       orders anymore. In particular, it means that the libgimp functions to run
 | |
|       PDB procedures are not based on an ordered array of arguments anymore but
 | |
|       on named arguments only.
 | |
|       + The first consequence is that it will be possible to add arguments, and
 | |
|         even order them however we want in the list of arguments. For
 | |
|         backward-compatibility, what will matter is only that the procedure
 | |
|         using the default values for the new arguments will behave the same way
 | |
|         it did when it used not to have said arguments. Then scripts won't break
 | |
|         as we add new arguments and we won't have to create alternative v2 or v3
 | |
|         PDB procedures each time we wish to add a new feature.
 | |
|       + The second consequence is that calling PDB procedures is now much more
 | |
|         semantic. Firstly we can ignore arguments for which we keep the default
 | |
|         values; secondly every argument will be accompanied by a name instead of
 | |
|         being a long list of int or boolean values.
 | |
|         Typically while we used to call a PDB like this:
 | |
| ```C
 | |
|         gimp_pdb_run_procedure (gimp_get_pdb (),
 | |
|                                 "file-png-save",
 | |
|                                 GIMP_TYPE_RUN_MODE,     GIMP_RUN_NONINTERACTIVE,
 | |
|                                 GIMP_TYPE_IMAGE,        image,
 | |
|                                 G_TYPE_INT,             1,
 | |
|                                 GIMP_TYPE_OBJECT_ARRAY, args,
 | |
|                                 G_TYPE_FILE,            file,
 | |
|                                 G_TYPE_BOOLEAN,         FALSE,
 | |
|                                 G_TYPE_INT,             9,
 | |
|                                 G_TYPE_BOOLEAN,         FALSE,
 | |
|                                 G_TYPE_BOOLEAN,         FALSE,
 | |
|                                 G_TYPE_BOOLEAN,         FALSE,
 | |
|                                 G_TYPE_BOOLEAN,         FALSE,
 | |
|                                 G_TYPE_BOOLEAN,         FALSE,
 | |
|                                 G_TYPE_BOOLEAN,         FALSE,
 | |
|                                 G_TYPE_NONE);
 | |
| ```
 | |
|         We can now call it like this (with a shorter list of arguments, ignoring
 | |
|         all the ones which we keep default, not bothering about arg order and
 | |
|         tagging each arg with a semantic name):
 | |
| ```C
 | |
|         gimp_procedure_run (gimp_pdb_lookup_procedure (gimp_get_pdb (),
 | |
|                                                        "file-png-save"),
 | |
|                             "run-mode",         GIMP_RUN_NONINTERACTIVE,
 | |
|                             "image",            image,
 | |
|                             "num-drawables",    1,
 | |
|                             "drawables",        drawables,
 | |
|                             "file",             file,
 | |
|                             "bkgd",             FALSE,
 | |
|                             "phys",             FALSE,
 | |
|                             "time",             FALSE,
 | |
|                             NULL);
 | |
| ```
 | |
|       + The few libgimp functions of the form `gimp_pdb_run_procedure*()` were
 | |
|         removed and moved directly to `gimp_procedure_run*()` variant. The
 | |
|         presence of both interfaces was making it confusing.
 | |
|       + For bindings not able to replicate variable arguments functions, the
 | |
|         bindable function will be gimp_procedure_run_config() only, which will
 | |
|         be renamed to gimp_procedure_run() in bindings.
 | |
|       + Note that internally the argument order is still relevant for any system
 | |
|         which interfaces directly with the PDB instead of libgimp. In other
 | |
|         words, it is still relevant for script-fu which generates functions out
 | |
|         of PDB procedures directly (not libgimp).
 | |
|       + GimpObjectArray arguments now allow NULL through the pipe as meaning an
 | |
|         empty array.
 | |
|   - Changes in libgimpbase:
 | |
|     * New classes:
 | |
|       + GimpChoice: meant to represent a list of allowed strings values.
 | |
|   - Changes in libgimpwidgets:
 | |
|     * New functions:
 | |
|       + gimp_widget_set_native_handle()
 | |
|       + gimp_dialog_get_native_handle()
 | |
|       + gimp_preview_area_reset()
 | |
|     * New classes:
 | |
|       + GimpLabelStringWidget: makes any widget with a "value" string property
 | |
|         into a GimpLabeled.
 | |
|     * Modified classes:
 | |
|       + GimpStringComboBox:
 | |
|         - add a "value" string property to GimpStringComboBox (which makes it
 | |
|           usable by GimpLabelStringWidget).
 | |
|         - New method gimp_string_combo_box_set_sensitivity()
 | |
|   - Changes in libgimpui:
 | |
|     * Modified functions:
 | |
|       + gimp_window_set_transient_for_display() and gimp_window_set_transient()
 | |
|         now use an internal implementation similar to core
 | |
|         gimp_window_set_transient_for(), with the same improvements (works even
 | |
|         at construction when the window is not visible yet + works for Wayland
 | |
|         too).
 | |
|     * Removed functions:
 | |
|       - gimp_ui_get_progress_window()
 | |
|       - gimp_ui_get_display_window()
 | |
| 
 | |
| Build:
 | |
| 
 | |
|   - Windows 10 becomes the new minimal support for the 3.0 stable series on
 | |
|     Windows. This bump happens because of end-of-support by Microsoft itself,
 | |
|     and also by MSYS2 project which is our base for the official installers.
 | |
|   - CI now generates babl and GEGL API reference HTML as artifact tarballs.
 | |
|   - New meson options -Dfits and -Dopenmp to enable/disable respectively FITS or
 | |
|     OpenMP support more explicitly (allowing to bypass auto-detection).
 | |
|   - Pango 1.50 or higher is now required as a result of using
 | |
|     pango_attribute_as_font_desc(). Also pango, pangocairo and pangoft2 now use
 | |
|     the same minimum version requirement.
 | |
|   - New Aarch64/Windows build jobs in CI.
 | |
|   - The universal Windows installer generated by the CI now detects and installs
 | |
|     a native Aarch64 build on ARM 64-bit architecture.
 | |
|   - Meson: alternatively to luajit, we now search also lua5.1, then 5.2 and 5.3
 | |
|     (5.1 first, because apart luajit, it is the only one with lua-lgi support in
 | |
|     MSYS2 right now).
 | |
| 
 | |
| 
 | |
| Overview of Changes from GIMP 2.99.14 to GIMP 2.99.16
 | |
| =====================================================
 | |
| 
 | |
| Core:
 | |
| 
 | |
|   - "Anchor" tooltip changing depending on whether we are floating over a layer
 | |
|     or layer mask.
 | |
|   - GIMP_TIMER_START|END are no-op on release builds.
 | |
|   - Ctrl-F overridden in our item dockables to trigger our item search popover
 | |
|     (multi-item selection, ability to use regexp or glob search by enabling these
 | |
|     in Preferences, etc.) rather than the default GTK selection popup for tree
 | |
|     views.
 | |
|   - All code is now multi-item aware (even though it might mean specifically
 | |
|     forbidding using some features on multiple items).
 | |
|   - Better support of non-ASCII characters in paths on Windows and other fixes
 | |
|     for Windows: API un-deprecation, unicode variants of functions…
 | |
|   - Copy|Cut-Paste code reworked further.
 | |
|   - Action "Crop to Selection" renamed to "Resize Layers to Selection".
 | |
|   - Action "Crop to Content" renamed to "Crop Layers to Content".
 | |
|   - If any opened image (with a display) is dirty, then GIMP will now inhibit the
 | |
|     log-out event on OSes which support it.
 | |
|   - Port from GtkAction/GtkUIManager to GAction/GMenu finished.
 | |
|   - The action search now shows the top menu path for actions when available.
 | |
|   - Actions can now be attributed multiple shortcuts. The duplicate actions
 | |
|     ending in `-accel` were removed in favor of multiple shortcuts and a few
 | |
|     secondary (semantic) shortcuts were added such as `Copy`/`Cut`/`Paste`
 | |
|     buttons for relevant actions, or `ZoomIn`/`ZoomOut` for canvas zoom,
 | |
|     `Forward`/`Back` to navigate through image tabs, but also some numpad
 | |
|     shortcuts like the `/` divide from the numpad for the action search
 | |
|     (additionally to the base keyboard `/` key).
 | |
|     It is not possible to attribute several shortcuts from GUI yet.
 | |
|   - An action is automatically generated for all GEGL operations which would
 | |
|     normally appear in the GEGL Operation tool. This includes in particular
 | |
|     third-party GEGL operations which might be user-installed. It makes these
 | |
|     filters also searchable in the action search, usable in menus and shortcuts
 | |
|     can be assigned as well.
 | |
|   - If present, the GEGL key "gimp:menu-label" will be used to set the short
 | |
|     label of the generated action (short labels are typically used in menus since
 | |
|     the menu path can serve as context). Otherwise the "title" with appended
 | |
|     "..." is used.
 | |
|   - GimpAction now have a concept of short vs. long labels, which can be used in
 | |
|     different places. In particular, in action search, we usually want the long
 | |
|     label, whereas in menus, we usually want the short label as we have context
 | |
|     (though the latter can be tweaked by a custom "label-variant" attribute in
 | |
|     .ui files).
 | |
|   - New "Middle Gray (CIELAB)" fill option (new image or new layer).
 | |
|   - Stroke Selection: "Line" and "Paint tool" styles are now in a stack
 | |
|     switcher instead of radio buttons. More advanced options are not "hidden"
 | |
|     anymore in a foldable widget.
 | |
|   - New grayscale color picking mode.
 | |
|   - .aco palettes are now imported with babl. As a result, it is now possible to
 | |
|     import CIE Lab palettes (colorspace 7)
 | |
|   - Action search now displays a "help" icon which can be clicked to show the
 | |
|     currently selected action's manual page (or the action search manual page if
 | |
|     no actions are selected). Alternatively the F1 shortcut will do the same.
 | |
|   - Basic matrix operations code was optimized.
 | |
|   - Fill/Stroke Path/Selection split the "Solid color" option into a "Foreground
 | |
|     color" and "Background color".
 | |
|   - Standardize to "X-bit" wording (e.g. "32-bit floating point" rather "32 bit
 | |
|     floating point").
 | |
| 
 | |
| Tools:
 | |
| 
 | |
|   - GEGL Operation: auto-activate when enabled.
 | |
|   - Transform tools and GEGL operation don't auto-activate when opening a new
 | |
|     image or changing the active image.
 | |
|   - Align tool: "use extents of layer contents" also applies to the alignment
 | |
|     reference (not only the target objects).
 | |
|   - Color picker: pick in the image's RGB space.
 | |
|   - Text tool: new tool option "Show on-canvas editor" to toggle the visibility
 | |
|     of the on-canvas dialog.
 | |
|   - Unified Transform tool: the transform matrix is now selectable in the
 | |
|     on-canvas dialog (for instance to be easily re-usable in other software).
 | |
| 
 | |
| Graphical User Interface:
 | |
| 
 | |
|   - Default, Compact and Gray themes now display a three-dot handle to paned
 | |
|     separators to improve accessibility and discoverability of the drag ability.
 | |
|   - The paned separator width is also increased a bit for accessibility (though
 | |
|     the Compact theme keeps a smaller separator width).
 | |
|   - Consistently use "Soft-proofing" wording instead of "Softproofing" or "Soft
 | |
|     proofing"
 | |
|   - The "GEGL Operation…" item was moved out of the "Filters > Generic" menu and
 | |
|     into the "Tools" menu.
 | |
|   - If present, the GEGL key "gimp:menu-path" will now be used by GIMP to create
 | |
|     a menu item for an operation in a given menu path.
 | |
|   - Default theme is less dark and the previous Default theme is renamed
 | |
|     "Darker".
 | |
|   - "Default" theme does not use smaller font size (than system theme) anymore;
 | |
|     but the "Compact" theme now does.
 | |
|   - New option "Merge menu and title bar" in Preferences > Image Windows: this
 | |
|     is basically an option to switch to Client Side Decoration for the image
 | |
|     windows (menu will be inside the title bar). It is OFF by default.
 | |
| 
 | |
| Actions:
 | |
| 
 | |
|   - "tools-rotate-arbitrary" and "tools-rotate-image-arbitrary" are now disabled
 | |
|     when no image is opened.
 | |
| 
 | |
| Plug-ins:
 | |
| 
 | |
|   - JPEG-XL:
 | |
|     * Initial support for CMYK/A JPEGXL export: Key and Alpha data is saved in
 | |
|       extra channels, and the simulation profile is saved as well.
 | |
|       Per the specification developers, the format does not support 'naive' CMYK
 | |
|       conversion, so a profile is required for export. The option will be
 | |
|       disabled if not set.
 | |
|     * Support libjxl 0.9: some API were removed which would have broken
 | |
|       the plug-in build. Now it should work both with old and new
 | |
|       version.
 | |
|   - Script-fu:
 | |
|     * Byte support: add a new type 'byte' to be able to handle binary data while
 | |
|       still retaining the utf8 char and string behavior.
 | |
|     * Enum values are now generated from GIR.
 | |
|   - Script-fu console: command history now persists across GIMP sessions.
 | |
|   - PSD:
 | |
|     * PSD clipping paths: import and export support.
 | |
|     * Unsupported features are now listed in a dialog on import.
 | |
|     * Add compatibility notice on export: some people have noted that legacy
 | |
|       layer modes have better compatibility when exporting PSDs and reopening
 | |
|       them in Photoshop.
 | |
|     * New "file-psd-load-metadata" procedure to be used by other plug-ins in
 | |
|       order to load Photoshop-format metadata. Some formats in particular allow
 | |
|       PSD style metadata (e.g. see TIFF and JPEG).
 | |
|   - TIFF:
 | |
|     * PSD metadata (both in image or layer level) can now be loaded by calling
 | |
|       the new "file-psd-load-metadata" PDB procedure.
 | |
|     * IBM PC Formatted TIFF layers are now supported on import.
 | |
|   - JPEG:
 | |
|     * PSD metadata (image level only, e.g. paths) can now be loaded by calling
 | |
|       the new "file-psd-load-metadata" PDB procedure.
 | |
|     * Clipping path import added.
 | |
|     * Option "4:2:2 horizontal (chroma halved)" renamed to "4:2:2 (chroma halved
 | |
|       horizontally)" and "4:2:2 vertical (chroma halved)" renamed to "4:4:0
 | |
|       (chroma halved vertically)". Research indicates it to be the most usual
 | |
|       notation for these options.
 | |
|   - DDS:
 | |
|     * OpenMP support enabled when available on the build machine.
 | |
|   - All Python 3 plug-ins whose Python 2 variants used to have a GUI now also
 | |
|     have one.
 | |
|   - Script "Predator" removed.
 | |
|   - PAM: import and export (formats: GRAYSCALE, GRAYSCALE_ALPHA, RGB, RGB_ALPHA)
 | |
|     support added. PAM files are essentially PPM files with a different header
 | |
|     format and alpha/16 bit support.
 | |
|   - GIF:
 | |
|     * Load error message handling improved.
 | |
|     * Keep GIF's full palette on import (sometimes needed for consistency when
 | |
|       used in a specific pipeline, e.g. a videogame engine with fixed palette).
 | |
|   - PCX:
 | |
|     * new radio option "override-palette" to override PCX 1 bit palette.
 | |
|     * 8bpp with 4 planes in PCX/DC import support added (we were only supporting
 | |
|       3 planes).
 | |
|   - QOI: new format support (import and export).
 | |
|   - Amiga IFF/ILBM: initial support for importing indexed ILBM, Amiga PBM, and
 | |
|     ACBM images.
 | |
|   - DCX: new import support (DCX files are containers that store up to 1023 PCX
 | |
|     files).
 | |
|   - Plug-ins ported to GAction: animation-play, colormap-remap, ifs-compose,
 | |
|     gfig, ImageMap.
 | |
|   - Plug-ins ported to GimpProcedureConfig and GimpProcedureDialog:
 | |
|     align-layers, hot, wavelet-decompose, file-sunras, file-heif, file-tga,
 | |
|     file-pat, file-xpm, file-csource, file-jp2-load, file-dds (import),
 | |
|     file-sgi, file-fli, file-pnm, file-gbr, file-psp, file-aa, bmp-save,
 | |
|     despeckle, blinds, contrast-retinex, jigsaw, nl-filter, destripe, file-mng,
 | |
|     file-html-table, file-xbm, file-pdf-load, file-gif-save, file-ps,
 | |
|     border-average, mail, checkerboard.
 | |
|   - metadata-viewer and metadata-editor: graphical interfaces are not built from
 | |
|     GtkBuilder .ui files anymore. These were the last instances of using this
 | |
|     format (except for our new menus!) for creating full GUIs as we don't want
 | |
|     to go this way anymore!
 | |
|   - FITS:
 | |
|     * Ported to cfitsio library for loading/exporting. This allows us to
 | |
|       import compressed FITS files (GZIP, HCOMP, PLIO, RICE) in 8/16/32
 | |
|       bit and float/double precision.
 | |
|     * As a result of the port, this plug-in is now optional.
 | |
|   - ILBM: "Hold and Modify" (HAM) mode use control bits to increase the
 | |
|     palette beyond what's stored in the CMAP chunk. We now check if HAM
 | |
|     mode is set and then interprets the plane bits accordingly.
 | |
| 
 | |
| API:
 | |
| 
 | |
|   - Changes in libgimpwidgets:
 | |
|     * New functions:
 | |
|       + gimp_int_store_new_array(): variant of gimp_int_store_new() which will
 | |
|         work in bindings.
 | |
|       + gimp_spin_scale_get_mnemonic_keyval()
 | |
|     * Improved annotations or usage:
 | |
|       + gimp_procedure_dialog_get_spin_scale(): factor must be 1.0 for integer
 | |
|         properties.
 | |
|   - Changes in libgimp:
 | |
|     * New classes:
 | |
|       + GimpResource: with unique int ID, instead of data name. Actual data will
 | |
|         be one of the following subclasses:
 | |
|         + GimpBrush
 | |
|         + GimpFont
 | |
|         + GimpGradient
 | |
|         + GimpPalette
 | |
|         + GimpPattern
 | |
|     * New functions:
 | |
|       + gimp_procedure_dialog_fill_scrolled_window()
 | |
|       + gimp_procedure_dialog_get_size_entry()
 | |
|     * Improved annotations or usage:
 | |
|       + set_i18n() method of GimpPlugIn expects a UTF-8 catalog directory.
 | |
|       + clarify gimp_image_set_file() usage (only for XCF files).
 | |
|       + gimp_image_add_sample_point()
 | |
|       + gimp_image_get_sample_point_position()
 | |
|   - Changes in libgimpbase:
 | |
|     * New functions:
 | |
|       + gimp_bind_text_domain()
 | |
|       + gimp_value_array_copy()
 | |
|     * Improved annotations or usage:
 | |
|       + gimp_locale_directory() returns a string in the OS encoding for all but
 | |
|         Windows (UTF-8), i.e. GLib "filename" encoding.
 | |
|       + Metadata "Exif.Image.ImageResources" and "Exif.Image.0x935c" are not
 | |
|         exported anymore. These are specific to Photoshop, and while we cannot
 | |
|         modify them, they can contain sensitive information (e.g. a thumbnail).
 | |
|       + Exif.Photo.PixelXDimension and Exif.Photo.PixelYDimension metadata tags
 | |
|         will now be updated (if they already exist in the image) when resizing
 | |
|         and exporting.
 | |
|   - Changes in libgimpconfig:
 | |
|     GStrv config properties are now properly serialized and deserialized for use
 | |
|     as plug-ins arguments.
 | |
|     * New functions:
 | |
|       + gimp_config_serialize_strv()
 | |
|       + gimp_config_deserialize_strv()
 | |
|    - PDB:
 | |
|      * Remove GimpUint8Array in favor of GBytes.
 | |
| 
 | |
| Build:
 | |
| 
 | |
|   - MacPorts support for macOS added (this is even now the official support as we
 | |
|     build our new packages with MacPorts).
 | |
|   - meson: make sure libgimp does not depend on GTK+.
 | |
|   - GLib requirement bumped to version 2.70 as minimum.
 | |
|   - Improved C99 compatibility of IPC_RMID check.
 | |
|   - Windows: port fileicon.ico from gimp-2-10 with additional sizes for clearer
 | |
|     icons on different resolutions and displays.
 | |
|   - Improve our build scripts to better handle sanitizer tools.
 | |
|   - Fix some broken unit tests in the meson build.
 | |
|   - Meson build options 'lua', 'javascript' and 'python' are now features, and
 | |
|     not boolean. I.e. use option values 'enabled'/'disabled' (defaulting to
 | |
|     'auto') instead of true/false.
 | |
|   - Meson build 'vala-plugins' option was renamed to simply 'vala'.
 | |
|   - Added dependency to Exiv2 0.27.4.
 | |
|   - JUnit reports from Meson for the CI build.
 | |
|   - autotools was fully dropped!
 | |
|   - Debian 12 bookworm is now our base platform for CI, but also for deciding
 | |
|     whether we can bump a dependency minimum required version or not. This is a
 | |
|     consequence of approaching GIMP 3.0 release so we don't want to bump minimum
 | |
|     versions too high.
 | |
|   - GEGL requirement bumped to GEGL 0.4.46.
 | |
|   - Windows installer's welcome image is now generated in several sizes
 | |
|     from our splash screen image, avoiding discrepancies as well as
 | |
|     unnecessarily filling our repository with a history of duplicate
 | |
|     images.
 | |
|   - Add some logic to common/ and python/ plug-ins to facilitate running
 | |
|     GIMP from the build directory (without being installed) while still
 | |
|     able to load all plug-ins.
 | |
|   - gtk-mac-integration was dropped as a dependency on macOS. It made problems
 | |
|     and is apparently less needed with GTK+3.
 | |
|   - Supported macOS version was bumped from macOS 10.12 to macOS 10.13.
 | |
| 
 | |
| Debugging:
 | |
| 
 | |
|   - New --runtime option to `flatpak-releases` debugging script (a dev tool
 | |
|     allowing for instance to bisect issues through flatpak builds). This option
 | |
|     allows to list the runtime builds (additionally to the main GIMP flatpaks).
 | |
| 
 | |
| Documentation:
 | |
| 
 | |
|   - More developer docs is being moved to the new developer website.
 | |
|   - Better clarify licensing of files under data/.
 | |
|   - Improve flatpak maintenance doc (build/flatpak/README.md).
 | |
| 
 | |
| Translations:
 | |
| 
 | |
|   - 25 translations were updated: Basque, Bulgarian, Catalan, Chinese (China),
 | |
|     Chinese (Taiwan), Danish, Esperanto, French, Georgian, German, Greek,
 | |
|     Hungarian, Icelandic, Italian, Lithuanian, Persian, Polish, Portuguese,
 | |
|     Romanian, Russian, Slovenian, Spanish, Swedish, Turkish, Ukrainian.
 | |
| 
 | |
| 
 | |
| Overview of Changes from GIMP 2.99.12 to GIMP 2.99.14
 | |
| =====================================================
 | |
| 
 | |
| Core:
 | |
| 
 | |
|   - The download button in About dialog when a new version is available
 | |
|     will now show the development download page when running unstable
 | |
|     branch code.
 | |
|   - The update check on macOS now uses native HTTPS-able API, so that we
 | |
|     don't have to wait for GIO to have HTTPS modules for macOS.
 | |
|   - The main process is now run as a GimpApp which is a new class derived from
 | |
|     GtkApplication. The main process of `gimp-console` on the other hand is a
 | |
|     `GimpConsoleApp` which is derived from GApplication. Both new classes share
 | |
|     a same GimpCoreApp interface. This is a main step for the GTK+3 port.
 | |
|   - Various improvements on awareness of multi-item selection across core
 | |
|     features. A notable fix is the preview when transforming multiple layers at
 | |
|     once (with various transform tools). Various actions are now multi-drawable
 | |
|     aware as well.
 | |
|   - New "Vectors Structure" in the XCF format: XCF files (format bumped to
 | |
|     version 18) can now store and load all the usual and common properties of
 | |
|     other items. In other words, it makes XCF now able to store locks, color
 | |
|     tags and several selected paths.
 | |
|   - XCF saving with RLE and zlib encoding are now multi-threaded and therefore
 | |
|     much faster in most cases.
 | |
|   - Pasting an image now creates a new layer by default (not a Floating Layer
 | |
|     anymore). The only 3 cases where we still have floating items are:
 | |
|     * when pasting into a layer mask;
 | |
|     * when doing quick copy/cut paste on-canvas with the Alt modifiers;
 | |
|     * when floating layers explicitly with the "Float" action.
 | |
|   - Copy-paste code was deeply reviewed and re-specified in the light of
 | |
|     multi-item selection; it's still a WIP:
 | |
|     * When pasting several drawables, we currently paste them over the top
 | |
|       selected layer (visually in Layers dockable).
 | |
|     * Pasted data position was rewritten, based on existing logic, but taking
 | |
|       into account the multiple selected items.
 | |
|     * Pasting a selected area from multiple layers still creates multiple
 | |
|       layers, not merged pixel contents as a single layer.
 | |
|     * New layers created when copying from a selection are consistently the
 | |
|       offset and dimensions of the bounding box of the dimension.
 | |
|     * When a layer and one of its group layer parent are selected, it is
 | |
|       equivalent to have only the child layer selected.
 | |
|   - 2 new actions were added: "Paste as Single Layer" and "Paste as Single Layer
 | |
|     in Place" under the "Paste as" submenu of Edit menu. These paste the copied
 | |
|     layers as a single merged layer, instead of as several layers (as "Paste"
 | |
|     and "Paste in Place" do).
 | |
| 
 | |
| Graphical User Interface:
 | |
| 
 | |
|   - New "Gray" theme based on a 18.42% luminance middle-gray background, which
 | |
|     should be a good neutral environment for color work.
 | |
|   - The foreground/background editor in the toolbox will now take into account
 | |
|     the toolbox icon size and resize itself accordingly (live, as you change
 | |
|     theme). This allows to have really narrow toolbox when you use small icons.
 | |
|   - Theme-override icon size selection in Preferences > Themes: this allows to
 | |
|     override theme-set icon sizes, with a global concept of small, medium, large
 | |
|     and huge. The following widgets are so far modified: toolbox icons, fg/bg
 | |
|     editor in toolbox, fg/bg editor in Colors dockable, dockables tab icons,
 | |
|     bottom buttons (in the button box) of dockables, header eye and lock icons
 | |
|     above item trees, and eye and lock icon switches in item tree cells.
 | |
|   - Symmetry dockable contents is now shown, yet deactivated, when no images are
 | |
|     opened, improving discoverability.
 | |
|   - Reworked the "Convert to * Working Space?" dialog into a "Keep the Embedded
 | |
|     Working Space?" one. Keeping an image working space is now the recommended
 | |
|     and default action. "Convert" became an explicit action requiring to click
 | |
|     (neither mapped to Enter nor Escape keys).
 | |
|   - "Floating Selection" renamed to "Floating Layer" or "Floating Mask"
 | |
|     depending on the type of item it applies to.
 | |
|   - "Floating Masks" are now drawn above the layer mask in the Layers dockable,
 | |
|     making the fact that they would anchor to the below layer mask (not the
 | |
|     layer) much more obvious.
 | |
|   - "Paste into Selection" and "Paste into Selection in Place" were moved under
 | |
|     the "Paste as" submenu of Edit menu.
 | |
| 
 | |
| Tools:
 | |
| 
 | |
|   - Text tool: new "Outlined" and "Outlined and filled" options, with various
 | |
|     sub-options to choose the outline style, color, pattern, width, cap and join
 | |
|     styles, miter limit, anti-aliasing and dash pattern.
 | |
|   - Align tool:
 | |
|     * now multi-item aware, it is much more usable than it used to be when we
 | |
|       had to click on canvas to select items.
 | |
|     * On-canvas clicks are now only needed to select guides (Alt or Alt-Shift
 | |
|       click and selected guide colors change) or for the reference object
 | |
|       (normal click).
 | |
|     * Also the reference object gets on-canvas handles and the name is written
 | |
|       in the dockable, making it obvious if you selected the right reference or
 | |
|       not.
 | |
|     * Moreover the selected reference will now loop when layers are stacked on
 | |
|       each other, which allow to select a bottom layer, even if there are layers
 | |
|       above it everywhere.
 | |
|     * New option "Use extents of layer contents" to Align tool: this is similar
 | |
|       to first run "Crop to Content" on every layer to align or distribute
 | |
|       (without actually cropping the layers).
 | |
|     * Fine-grained align/distribute button sensitivity to make it more obvious
 | |
|       when an action would not make any change anyway.
 | |
|     * New anchor point setting (pivot widget) to choose which part of the target
 | |
|       items will be aligned or distributed.
 | |
|     * Get rid of various broken distribution actions.
 | |
|     * Distribution actions don't move the 2 extreme (top/bottom or left/right
 | |
|       depending on distribution direction) targets, but distribute all other
 | |
|       targets within their range. It is more consistent with how it works in
 | |
|       other software.
 | |
|     * Adding 2 "Distribute with evenly (horizontal|vertical) gaps" actions,
 | |
|       which distribute by keeping a common gap between objects instead of
 | |
|       between anchor points.
 | |
|     * Offset settings have been removed.
 | |
|   - Transform tools are now auto-activated on selection (and when switching
 | |
|     images or item selection).
 | |
| 
 | |
| Plug-ins:
 | |
| 
 | |
|   - PDF:
 | |
|     * Export code was ported to GimpProcedureDialog.
 | |
|     * New "root-layers-only" argument to "file-pdf-save", which comes
 | |
|       with a checkbox in the export dialog to allow exporting as pages
 | |
|       the root layers only. The main usage is to organize your pages'
 | |
|       contents in layer groups.
 | |
|   - AVIF:
 | |
|     * RGB AVIF compatibility with Safari on iOS 16.0: Some AVIF images are
 | |
|       rendered differently in Apple's implementation compared to implementations
 | |
|       of Google and Mozilla. See: https://github.com/AOMediaCodec/av1-avif/issues/195
 | |
|       This changes requires libheif 1.10.0 though the plug-in can still build
 | |
|       with older libheif.
 | |
|   - PSD:
 | |
|     * export of CMYK(A) files added, with 8 or 16-bit precision per channel,
 | |
|       using a CMYK soft-proof profile for conversion.
 | |
|     * Paths are now exported with PSD files.
 | |
|   - JPEG-XL:
 | |
|     * Metadata import/export now supported (requires libjxl 0.7.0).
 | |
|   - Python-Console:
 | |
|     * sys.stdout.flush() implemented as a no-op inside the console, to be able
 | |
|       to easily copy-paste code, or using libraries which flush the output.
 | |
|   - ICNS:
 | |
|     * Initial support for loading and exporting.
 | |
|   - TIFF:
 | |
|     * New toggle to optionally load reduced pages. We keep a heuristic to try
 | |
|       and guess whether these are thumbnails (single reduced image in the second
 | |
|       position), but it's only used to decide whether the option is checked by
 | |
|       default or not. It is now up to anyone to decide or not whether they want
 | |
|       to load these reduced images.
 | |
| 
 | |
| API:
 | |
| 
 | |
|   - Changes in libgimp:
 | |
|     * Abstract method get_window() of GimpProgressVtable had its signature
 | |
|       changed. The window ID is now a guint64.
 | |
|     * New functions:
 | |
|       + gimp_text_layer_set_markup()
 | |
|       + gimp_image_get_selected_channels()
 | |
|       + gimp_image_get_selected_vectors()
 | |
|       + gimp_image_list_selected_channels()
 | |
|       + gimp_image_list_selected_vectors()
 | |
|       + gimp_image_set_selected_channels()
 | |
|       + gimp_image_set_selected_vectors()
 | |
|       + gimp_image_take_selected_channels()
 | |
|       + gimp_image_take_selected_vectors()
 | |
|       + gimp_image_list_selected_drawables()
 | |
|     * Updated functions:
 | |
|       + gimp_vectors_stroke_translate() now uses offsets in double type.
 | |
|     * New classes:
 | |
|       + GimpTextLayer: child class of GimpLayer.
 | |
|   - Changes in libgimpwidgets:
 | |
|     * Updated widgets:
 | |
|       + GimpPickButton now has a specific implementation for Windows. In
 | |
|         particular it improves color picking with multi-monitor and scales
 | |
|         different than 100%.
 | |
| 
 | |
| Build:
 | |
| 
 | |
|   - meson requirement bump to meson 0.56.0.
 | |
|   - Many fixes to the meson build scripts, making it closer to be our
 | |
|     official build for GIMP 3.0.
 | |
|   - The CI now generates a tarball containing the GIMP references,
 | |
|     generated by gi-docgen and g-ir-doc.
 | |
|   - Improved Clang 15.0.0 support.
 | |
|   - "win*-nightly" jobs were added back and are now more efficient with the
 | |
|     --output-dll-list option.
 | |
|   - babl requirement bumped to babl 0.1.98.
 | |
|   - GEGL requirement bumped to GEGL 0.4.40.
 | |
|   - GIMP macOS builds (gimp-macos-build repository) was moved to using MacPorts
 | |
|     in order to take advantage of a bigger community to maintain our
 | |
|     dependencies.
 | |
|   - GIMP now has an Apple Silicon build.
 | |
| 
 | |
| 
 | |
| 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).
 | |
|     These 3 simulation data are also stored in the XCF file now.
 | |
|   - 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.
 | |
|   - The "Create New Image" dialog now has settings for the simulation
 | |
|     profile, intent and black point compensation. This is also shown in
 | |
|     templates and the "Default Image" tab in Preferences, and has been
 | |
|     removed from the "Color Management" tab, because these are now first
 | |
|     and foremost image data.
 | |
|   - GimpColorFrame is now current image's simulation profile/intent/bpc
 | |
|     aware. In other words, CMYK shown by the color picker or in sample
 | |
|     point shows values in the correct simulation space (not in some
 | |
|     default CMYK space).
 | |
|   - A new default action to change the current brush size was mapped to
 | |
|     Alt + right button click.
 | |
|   - Some Preferences settings have been moved to a new Preferences >
 | |
|     Canvas Interaction tab.
 | |
|   - All on-canvas interactions (panning, canvas rotation, etc.) are now
 | |
|     customizable in Preferences > Canvas Interaction > Modifiers tab. It
 | |
|     allows to switch/change the modifiers used for an action, or even
 | |
|     just remove some modifiers mapping (when you never use an action,
 | |
|     e.g. some people say the canvas rotation is not useful to them).
 | |
|   - GtkAction-s can also be mapped to modifiers now through the same
 | |
|     settings.
 | |
|   - GIMP themes can now have a "gimp-dark.css" file which will be used
 | |
|     if the "Use dark theme variant if available" option was checked.
 | |
|   - The FG/BG editor area in the toolbox is now sized relatively to
 | |
|     toolbox icon size, allowing for it to be much bigger when using big
 | |
|     icons, or smaller when using small icons (which can e.g. be aligned
 | |
|     on a very narrow single column for people who appreciate this
 | |
|     organization).
 | |
|   - The Welcome dialog can now show "demo" bullet points, from scenarios
 | |
|     written within the Appstream metadata.
 | |
| 
 | |
| 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.
 | |
|   - Raise tool options before blinking specific settings widgets when
 | |
|     some tools fail to work because of various tool options settings
 | |
|     (e.g. selection tool cannot remove from an empty selection; warp
 | |
|     tool cannot stroke; move tool cannot move because of the types of
 | |
|     object to move isn't selected; and so on).
 | |
| 
 | |
| 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.
 | |
|   - New soft-proof toggle in status bar to see the soft-proofing status
 | |
|     and enable/disable it. It is only active when a soft-proof profile
 | |
|     was set.
 | |
|   - GimpContainerTreeView (e.g. Layers/Channels/Vectors dockables) now
 | |
|     have zooming through ctrl+mouse wheel (for preview size).
 | |
|   - GimpContainerTreeView (e.g. Layers/Channels/Vectors dockables) now
 | |
|     have zooming with touchpad pinch (touchscreen pinch now kinda exists
 | |
|     but is not so usable in our tests, at least on Linux through
 | |
|     libinput) for preview size.
 | |
|   - Gradient editor now has zooming with touchpad pinch (touchscreen
 | |
|     pinch not so fancy either, at least on Linux through libinput,
 | |
|     similar to GimpContainerTreeView case).
 | |
|   - A new soft-proofing pop-over dialog appears when right-clicking the
 | |
|     new soft-proof toggle in the status bar. It allows to view or change
 | |
|     all soft-proofing related settings (whether they are associated to
 | |
|     the image, such as the profile, intent or black-point compensation;
 | |
|     or to the view, such as the out-of-gamut check) very easily.
 | |
|   - New "Default" theme containing a dark and light variant. As the name
 | |
|     implies, this theme is now made the default theme on new
 | |
|     installations.
 | |
|   - New "Compact" theme containing a dark and light variant.
 | |
| 
 | |
| 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 common 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.
 | |
|     * Add toggle to choose PNG bit depth behavior.
 | |
|   - 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.
 | |
|     * On export, the "bad image dimensions" error message is now more
 | |
|       accurate and tells the max dimension possible for WebP images
 | |
|       (16383 as it's stored on 14 bits).
 | |
|   - 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.
 | |
|   - 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.
 | |
|     * New function 'script-fu-register-filter' to declare a multi-layer
 | |
|       capable script.
 | |
|     * Many script-fu scripts were ported to newer API.
 | |
|   - 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.
 | |
|     * High bit depth import/export support.
 | |
|     * 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.
 | |
|     * Added support for extra layer mask: According to the specs the
 | |
|       extra mask (which they call real user supplied layer mask) is used
 | |
|       "when both a user mask and a vector mask are present".
 | |
|       We haven't seen an example that has the extra mask, so not sure
 | |
|       which of the masks would appear first.
 | |
|       For now assuming that the extra mask will be first. The advantage
 | |
|       of adding this here now, is that we won't try to add a mask
 | |
|       channel as a normal channel.
 | |
|     * Minimal support of duotone data: on import, a duotone image will
 | |
|       be imported as grayscale image with an alert and the color
 | |
|       information will be stored in a parasite; on export, a dialog will
 | |
|       propose you to re-include the duotone data if the image is still
 | |
|       grayscale. This allows for a roundtrip in GIMP without losing the
 | |
|       duotone information.
 | |
|   - ANI: new import/export support.
 | |
| 
 | |
| 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()
 | |
|       + gimp_color_managed_get_simulation_bpc()
 | |
|       + gimp_color_managed_get_simulation_intent()
 | |
|       + gimp_color_managed_simulation_bpc_changed()
 | |
|       + gimp_color_managed_simulation_intent_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()
 | |
|       + gimp_image_get_simulation_bpc()
 | |
|       + gimp_image_get_simulation_intent()
 | |
|       + gimp_image_set_simulation_bpc()
 | |
|       + gimp_image_set_simulation_intent()
 | |
|     * 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 and %G_TYPE_PARAM_ENUM 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
 | |
|     * New functions:
 | |
|       + gimp_color_notebook_set_simulation()
 | |
|       + gimp_color_selection_set_simulation()
 | |
|       + gimp_color_selector_set_simulation()
 | |
|     * Removed functions:
 | |
|       + gimp_prop_int_radio_box_new()
 | |
|     * Updated functions:
 | |
|       + GimpColorNotebook, GimpColorSelection and GimpColorSelector are
 | |
|         now ported to babl code and are simulation space aware.
 | |
|       + GimpPickButton will now use the X11 color picking API as a
 | |
|         default when GIMP is running on X11 (instead of trying the
 | |
|         portals first), because it has color space information of the
 | |
|         display (so we can convert back the color from display space to
 | |
|         image space); and also on some desktop, the portal looks
 | |
|         available while it's actually not implemented (hence picking
 | |
|         fails).
 | |
|         This fixes or improves the color picking in the Colors dockable,
 | |
|         in Change Foreground/Background Color dialogs, etc.
 | |
|   - Changes in PDB:
 | |
|     * gimp-plug-in-domain-register removed.
 | |
| 
 | |
| Modules:
 | |
| 
 | |
|   - The CMYK color selector is now simulation space aware, i.e. that it
 | |
|     shows CMYK values in the soft-proof profile space if a soft-proof
 | |
|     profile has been set.
 | |
| 
 | |
| 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.
 | |
|   - "flatpak" job now uses a gnome-runtime-images migrated to Quay.
 | |
|   - "win*-nightly" jobs removed.
 | |
|   - Improved meson infrastructure to support Windows installer languages
 | |
|     which don't have base language files provided by upstream InnoSetup.
 | |
|     We started using it for Kabyle (which was showing up as "English"
 | |
|     otherwise!).
 | |
|   - After various fixes and implementations of missing build features to
 | |
|     the meson scripts, we are going to start advising packagers (for all
 | |
|     platforms) to build GIMP 2.99.12 with meson as a trial by fire to
 | |
|     make it the new default build system.
 | |
|   - New "sources-meson" CI job to distribute a tarball built with the
 | |
|     meson scripts.
 | |
|   - INSTALL now targets meson build as a test recommendation. We'll see
 | |
|     if any issue arises from packagers!
 | |
|   - Improved support for homebrew build on macOS.
 | |
| 
 | |
| Documentation:
 | |
| 
 | |
|   - Draft devel doc for scriptfu v3 script authors.
 | |
| 
 | |
| 
 | |
| 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.
 |