                   ------------------------------
                   GNU Image Manipulation Program
                         Development Branch
                   ------------------------------

This is the unstable branch of GIMP.


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: RAYSCALE, 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.

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
