NEWS 50.3 KB
Newer Older
Sven Neumann's avatar
Sven Neumann committed
1
                   ------------------------------
Sven Neumann's avatar
Sven Neumann committed
2
                   GNU Image Manipulation Program
3
                         Development Branch
Sven Neumann's avatar
Sven Neumann committed
4
                   ------------------------------
5

Jehan's avatar
Jehan committed
6
This is the unstable branch of GIMP.
7

Michael Natterer's avatar
Michael Natterer committed
8

Jehan's avatar
Jehan committed
9
Overview of Changes from GIMP 2.99.8 to GIMP 2.99.10
Jehan's avatar
Jehan committed
10
11
====================================================

Jehan's avatar
Jehan committed
12
13
14
15
Core:

  - Linked layers concept replaced by named sets of layers:
    * One can now store your current selection of layers under any given
Jehan's avatar
Jehan committed
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
      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.
Jehan's avatar
Jehan committed
34
35
36
37
  - 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.
Jehan's avatar
Jehan committed
38
39
40
41
42
43
44
45
46
47
48
49
50
51
  - New internal API gimp_widget_blink_rect() to blink only specific
    area of a widget, which may be useful for various notification-type
    exchanges.
  - 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.
  - 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.
Jehan's avatar
Jehan committed
52
53
54

User Interface:

Jehan's avatar
Jehan committed
55
56
57
58
  - 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):
Jehan's avatar
Jehan committed
59
60
    * This makes locks much more obvious rather than when they were at
      the dockable header.
Jehan's avatar
Jehan committed
61
62
63
    * 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).
Jehan's avatar
Jehan committed
64
65
    * This is clearer by showing or not icons (rather than always
      showing several icons, yet with toggle design which is not even so
Jehan's avatar
Jehan committed
66
      understandable depending on the theme used). If no locks are set,
Jehan's avatar
Jehan committed
67
68
69
70
71
72
      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.
Jehan's avatar
Jehan committed
73
74
  - Visibility (eye icon) and lock columns in the item dockables are
    given an icon header to be more discoverable.
Jehan's avatar
Jehan committed
75
76
77
  - 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).
Jehan's avatar
Jehan committed
78
79
  - Channels and vectors are now multi-selectable (though actions may
    have not been all updated yet to handle multiple items).
Jehan's avatar
Jehan committed
80

Jehan's avatar
Jehan committed
81
82
83
84
85
Plug-ins:

  - PSD:
    * new support for loading 16-bit per channel CMYK images.
    * new support for files in LAB colorspace.
Jehan's avatar
Jehan committed
86
87
    * new support for loading 32-bit per channel images (some code
      existed yet may have never really worked).
Jehan's avatar
Jehan committed
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
    * 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.
Jehan's avatar
Jehan committed
103
104
  - JPEG XL:
    * Bit depth now selectable in JXL export.
Daniel Novomeský's avatar
Daniel Novomeský committed
105
106
107
    * 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).
Jehan's avatar
Jehan committed
108
109
110
111
112
113
114
115
116
  - 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.
Jehan's avatar
Jehan committed
117
118
119
120
121
122

Build:

  - Improved Coding Style document with commit message styling, git
    usage, comment styling, natural language text rules, localization
    and some section reorganization.
Jehan's avatar
Jehan committed
123
124
125
  - GExiv2 dependency bumped to 0.12.2 (fixing bothersome warnings on
    some unknown metadata domains).
  - libjxl dependency bumped to 0.6.1.
Jehan's avatar
Jehan committed
126

Jehan's avatar
Jehan committed
127
128
129
130
131
132
133
134
135
136
API:

  - New gimp_item_get_lock_visibility() and
    gimp_item_set_lock_visibility() to get and set the visibility lock
    of an item.
  - New gimp_event_triggers_context_menu() as alternative to
    gdk_event_triggers_context_menu() with the additional ability of
    using button release events a 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.
Jehan's avatar
Jehan committed
137
  - Removed: gimp_item_set_linked() and gimp_item_get_linked().
Jehan's avatar
Jehan committed
138

Jehan's avatar
Jehan committed
139
140
141
142
143
144
Documentation:

  - API documentation is now built with `gi-docgen` instead of
    `gtk-doc`. The syntax for in-comment documentation is slightly
    changed.

145
146
147
148
Translations:
  - Updated Basque, British English, Catalan, Chinese (China), Hungarian,
    Italian, Kabyle, Latvian, Lithuanian, Polish, Portuguese, Slovenian,
    Spanish, Swedish, Ukrainian translations
Jehan's avatar
Jehan committed
149

Jehan's avatar
Jehan committed
150
151
152
Overview of Changes from GIMP 2.99.6 to GIMP 2.99.8
===================================================

Jehan's avatar
Jehan committed
153
154
155
156
Core:

  - Selection display implementation now updated to more modern display
    server logics when drawing to display buffer. This fixes selection
Jehan's avatar
Jehan committed
157
    drawing in Wayland and macOS Big Sur.
Jehan's avatar
Jehan committed
158
159
  - "Create a New Image" default action is "OK" so that hitting Enter in
    text/number fields is equivalent to clicking OK.
Jehan's avatar
Jehan committed
160
161
162
163
164
165
166
167
168
169
  - 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
Jehan's avatar
Jehan committed
170
    flipping and rotate). New "view-rotate-reset" and "view-flip-reset"
Jehan's avatar
Jehan committed
171
172
173
174
    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).
Jehan's avatar
Jehan committed
175
176
177
  - All g_memdup() ported to g_memdup2() thanks to GLib version bump.
  - Various leaks and other bugs fixed, notably with several static
    analyzer results
Jehan's avatar
Jehan committed
178
179
180
181
182
183
  - 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.
Jehan's avatar
Jehan committed
184
185
186
  - 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.
Jehan's avatar
Jehan committed
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202

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.
Jehan's avatar
Jehan committed
203
204
205
206
207
  - 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.
Jehan's avatar
Jehan committed
208

Jehan's avatar
Jehan committed
209
210
211
212
API:

  - New gimp_display_present() function to present a specific display at
    the top of the image display stack.
Jehan's avatar
Jehan committed
213
214
215
216
  - 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.
Jehan's avatar
Jehan committed
217
218
219
  - 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.
Jehan's avatar
Jehan committed
220

Jehan's avatar
Jehan committed
221
222
223
224
225
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.
Jehan's avatar
Jehan committed
226
227
228
  - 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.
Jehan's avatar
Jehan committed
229
230
231
  - Scriptfu now handles GFile and GimpObjectArray types.
  - 16-bit SGI images now supported (until now, they were loaded as
    8-bit).
Jehan's avatar
Jehan committed
232
  - file-webp ported to GimpSaveProcedureDialog.
Jehan's avatar
Jehan committed
233
  - New JPEG XL plug-in (loading and exporting).
Jehan's avatar
Jehan committed
234
  - Various cleaning replacing g_file_get_path() with g_file_peek_path()
Jehan's avatar
Jehan committed
235

Jehan's avatar
Jehan committed
236
237
Translations:

Jehan's avatar
Jehan committed
238
239
  - New Vietnamese, Lithuanian and Portuguese translations for the
    installer.
Jehan's avatar
Jehan committed
240
241
242

Build:

Jehan's avatar
Jehan committed
243
  - Windows installer scripts updated to all supported languages.
Jehan's avatar
Jehan committed
244
245
  - New "windows-installer-langs" unit test to detect discrepancies of
    langs listed in build system, installer and gettext files.
Jehan's avatar
Jehan committed
246
  - New CI jobs for Windows native builds with MSYS2.
Jehan's avatar
Jehan committed
247
248
249
  - 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.
Jehan's avatar
Jehan committed
250
251
252
  - 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.
Jehan's avatar
Jehan committed
253
  - Improved tag handling in the CI for transparent release process.
Jehan's avatar
Jehan committed
254
255
256
257
258
259
  - 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.
Jehan's avatar
Jehan committed
260
261
262
263
264
265
266
267
268
269
  - 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.
Jehan's avatar
Jehan committed
270
271
  - Flatpak nightly build now uses the new "fallback-x11" permission
    instead of "x11" to prevent unnecessary X11 access while in Wayland.
Jehan's avatar
Jehan committed
272
273
  - Fixes to codebase making GIMP 2.99 finally building and running on
    macOS.
Jehan's avatar
Jehan committed
274
275
276
277
  - 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.
Jehan's avatar
Jehan committed
278
279
280
  - Our desktop file now lists a `StartupWMClass` tag to better
    associate running GIMP windows with the application icon (and
    possibly other metadata).
Jehan's avatar
Jehan committed
281
282


Jehan's avatar
Jehan committed
283
284
285
286
287
288
Overview of Changes from GIMP 2.99.4 to GIMP 2.99.6
===================================================

Core:

  - Various fixes for Wayland support.
Jehan's avatar
Jehan committed
289
  - Canvas Size dialog now displays a template selector to simply
Jehan's avatar
Jehan committed
290
291
292
293
    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.
Jehan's avatar
Jehan committed
294
295
  - Off-canvas guides are now allowed. Guides are not deleted anymore
    when dropped off-canvas, but when dropped off-viewport.
Jehan's avatar
Jehan committed
296
297
298
299
300
301
302
303
304
305
  - 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).
Jehan's avatar
Jehan committed
306
307
308
309
310
  - 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).
Jehan's avatar
Jehan committed
311
312
313

Tools:

Jehan's avatar
Jehan committed
314
315
316
317
318
319
320
321
322
  - 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.
Jehan's avatar
Jehan committed
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340

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.
Jehan's avatar
Jehan committed
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
  - 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.
Jehan's avatar
Jehan committed
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
  - 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/
Jehan's avatar
Jehan committed
378
379
380
381
    * 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/
Jehan's avatar
Jehan committed
382
383
  - gimp_parasite_data() and gimp_parasite_data_size() are replaced by
    gimp_parasite_get_data() which is introspection friendly.
Jehan's avatar
Jehan committed
384
385
386
  - 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.
Jehan's avatar
Jehan committed
387
388
389
390
391
  - 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.
Jehan's avatar
Jehan committed
392
393
  - PDB procedure 'plug-in-autocrop-layer' multi-layer aware.
  - GimpProcedureDialog now handles GimpRGB arguments.
Jehan's avatar
Jehan committed
394
395
396
397
398
399
400
401
402
403
404
405

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
Jehan's avatar
Jehan committed
406
407
408
    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).
Jehan's avatar
Jehan committed
409
410
411
412
413
  - 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.
Jehan's avatar
Jehan committed
414
415
416
  - "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.
Jehan's avatar
Jehan committed
417
  - Various fixes and improvements to OpenRaster image support.
Jehan's avatar
Jehan committed
418
419
  - PDF export now has progression.
  - PSD import/export got multi-layer selection support.
Jehan's avatar
Jehan committed
420
421
422
423
424
425
  - 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.
Jehan's avatar
Jehan committed
426
427
428
  - benchmark-foreground-extract.py moved to gimp-data-extras.
  - Various plug-ins now work with multiple selected drawables when
    relevant.
Jehan's avatar
Jehan committed
429
430
431
432
433
434
435
436
437

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).

Jehan's avatar
Jehan committed
438
439
Translations:

Jehan's avatar
Jehan committed
440
  - New Hebrew translation for the installer.
Jehan's avatar
Jehan committed
441

Jehan's avatar
Jehan committed
442
443
444
445
446
Build:

  - Bumping minimum GEGL to version 0.4.30.


Jehan's avatar
Jehan committed
447
448
449
450
451
452
453
454
455
456
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.
Jehan's avatar
Jehan committed
457
458
459
  - Improve sample text logics for CJK fonts, showing different
    sample characters for Korean and Japanese, making detection
    at-a-glance of such fonts easier.
Jehan's avatar
Jehan committed
460
461
462
463
464
465
466
467
468
  - 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).
Jehan's avatar
Jehan committed
469
470
471

User Interface:

472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
  - 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.
Jehan's avatar
Jehan committed
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
  - 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
luz paz's avatar
luz paz committed
519
      but complementary with a slightly different targeting behavior.
Jehan's avatar
Jehan committed
520
521
522
523
524
525
    * 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).
Jehan's avatar
Jehan committed
526

Jehan's avatar
Jehan committed
527
528
529
530
Tools:

  - New Paint Select tool in the playground. This is a tool prototype
    which would hopefully end up as a quick binary selection tool.
Jehan's avatar
Jehan committed
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
  - 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).
Jehan's avatar
Jehan committed
564

Jehan's avatar
Jehan committed
565
566
567
568
569
570
571
572
573
574
575
576
577
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.
Jehan's avatar
Jehan committed
578
579
580
581
582
  - 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.
Jehan's avatar
Jehan committed
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
  - 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).
Jehan's avatar
Jehan committed
600
601
602
603
604
605
    * 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.
Jehan's avatar
Jehan committed
606
607
608
  - New gimp_get_num_processors() function for plug-ins to be able to
    set their own multi-threading operations as configured in
    Preferences.
Jehan's avatar
Jehan committed
609
610
611

Plug-ins:

Jehan's avatar
Jehan committed
612
613
614
  - 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.
615
616
617
618
619
620
621
  - 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.
Jehan's avatar
Jehan committed
622
623
624
  - file-jp2 is now able to decode JPEG2000 files faster with
    multi-threading, using the thread number settings returned by
    gimp_get_num_processors().
Jehan's avatar
Jehan committed
625
626
  - Improved plug-in debugging helper infrastructure: GIMP_PLUGIN_DEBUG
    has a new `fatal-criticals` option and better defaults. Developer
luz paz's avatar
luz paz committed
627
    documentation got some rewriting and debugging code benefited from
Jehan's avatar
Jehan committed
628
    refactorization.
Jehan's avatar
Jehan committed
629
  - py-slice.py moved to gimp-data-extras.
Jehan's avatar
Jehan committed
630
631
632
633
634
635
636
637
638
639
640
641
642

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

Jehan's avatar
Jehan committed
643
644
645
646
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().
Jehan's avatar
Jehan committed
647
  - Bumping minimum GEGL to version 0.4.28.
Jehan's avatar
Jehan committed
648
649


650
Overview of Changes from GIMP 2.10.x to GIMP 2.99.2
651
===================================================
Alexandre Prokoudine's avatar
Alexandre Prokoudine committed
652

653
654
Core:

655
656
657
658
659
660
661
662
663
664
665
666
  - 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.
Jehan's avatar
Jehan committed
667
668
669
  - All code is year-2038-safe with deprecated time API replaced.
  - "Alpha to Selection" various actions warn when the result selection
    is empty.
670
671
672
673
674
675
676
677
678
679
680
681
682
683
  - 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".
684
685
686

User Interface:

Jehan's avatar
Jehan committed
687
688
689
690
691
692
693
694
695
696
697
698
  - 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
luz paz's avatar
luz paz committed
699
      preferred in dark modes.
Jehan's avatar
Jehan committed
700
701
702
703
704
705
    * 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+
Jehan's avatar
Jehan committed
706
707
      widgets are being used when relevant (e.g. GtkSwitch which gives a
      better feeling of a general "ON/OFF state").
708
709
    * Progressive/smooth scroll actions (e.g. ctrl+scroll for zooming)
      are now possible.
Jehan's avatar
Jehan committed
710
  - Image display rendered faster with a render cache that keeps the
711
712
    result of scaling, color management, display filters and shell mask
    (for tools like fuzzy select).
Jehan's avatar
Jehan committed
713
714
715
  - Shift-click on layer GimpContainerTreeView (typically the Layers
    dockable) allows to expand/collapse all item groups but the clicked
    one.
Jehan's avatar
Jehan committed
716
  - Compact GimpSpinScale is now the only available version.
Jehan's avatar
Jehan committed
717
718
719
720
  - 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.
721
722
723

Devices:

Jehan's avatar
Jehan committed
724
725
726
727
728
729
730
  - 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.
Jehan's avatar
Jehan committed
731
732
733
734
735
736
737
738
  - "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.
739

Alexandre Prokoudine's avatar
Alexandre Prokoudine committed
740
741
Plug-ins:

Jehan's avatar
Jehan committed
742
743
  - Major rewrite of the API (see below). So GIMP 2.10.x plug-ins and
    below must be ported to the new API.
744
745
746
747
  - 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
Jehan's avatar
Jehan committed
748
749
    way, simply in their respective languages, as documentation/example
    code for a language binding.
Jehan's avatar
Jehan committed
750
751
  - The Goat Exercise plug-ins are themselves installed as a GIMP
    Extension, as a demo for extension creation.
Jehan's avatar
Jehan committed
752
753
754
755
756
757
758
  - 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`
759
760
761
  - HEIF export allows selecting color subsampling/pixel format (YUV444,
    YUV420, RGB) and encoder speed (Slow, Balanced, Fast).
    Lossless option delivers visually lossless output.
762
763
  - New "file-heif-av1-load" procedure separate from "file-heif-load"
    for AVIF only.
Jehan's avatar
Jehan committed
764
765
  - shadow_bevel.py, sphere.py, whirlpinch.py and clothify.py moved to
    gimp-data-extras.
Jehan's avatar
Jehan committed
766

767
768
API:

769
770
  - `GimpPDB` is now a class to represent the PDB communication channel
    with GIMP. It is a singleton which exist exactly once per running
luz paz's avatar
luz paz committed
771
    plug-in, hence it is not meant to be manually instantiated and can
Jehan's avatar
Jehan committed
772
773
774
    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.
775
776
  - `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
Jehan's avatar
Jehan committed
777
    query_procedures() and create_procedure(). Two other methods
luz paz's avatar
luz paz committed
778
    (init_procedures() and quit()) can be optionally overridden.
Jehan's avatar
Jehan committed
779
780
781
782
783
    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.
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
  - 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
luz paz's avatar
luz paz committed
805
    `GimpValueArray` whose values can be transferred into a
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
    `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.
Jehan's avatar
Jehan committed
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
  - 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.
870
  - The whole API has been updated to use objects instead of object IDs
Jehan's avatar
Jehan committed
871
872
873
    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.
874
875
876
877
  - 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"
luz paz's avatar
luz paz committed
878
    differentiation in parameters. Hence all libgimp* functions with
Jehan's avatar
Jehan committed
879
    these parameters have been updated as well.
880
881
882
883
884
885
886
  - 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.
Jehan's avatar
Jehan committed
887
  - 2 new libgimp functions: gimp_image_policy_rotate() and
888
889
890
891
    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".
luz paz's avatar
luz paz committed
892
    It is unnecessary to call these functions when developing a new
893
894
895
896
897
898
899
    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).
Jehan's avatar
Jehan committed
900
901
902
903
904
905
906
907
908
909
910
911
912
913
  - 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.
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
  - 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.
Jehan's avatar
Jehan committed
939
940
941
942
943
944
945
946
947
  - 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).
948
949
950
951
  - All pygimp specific Python API does not exist anymore. Python will
    use the same API as C plug-ins, introspected through GObject
    Introspection.

Jehan's avatar
Jehan committed
952
953
Documentation:

Jehan's avatar
Jehan committed
954
955
956
957
958
959
  - `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
Jehan's avatar
Jehan committed
960
    build system in order to avoid build system-specific bugs.
Jehan's avatar
Jehan committed
961
962
  - Continuous integration in Gitlab with:
    - an autotools build with GCC on a Debian/testing runner
Jehan's avatar
Jehan committed
963
    - an autotools distcheck build on a Debian/testing runner
Jehan's avatar
Jehan committed
964
965
966
967
968
    - 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
Jehan's avatar
Jehan committed
969
970
971
    - 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
972
973
974
975
976
977
978
979
980
981
982
983

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
Jehan's avatar
Jehan committed
984
985
986
987
988
    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.