1
1
mirror of https://gitlab.gnome.org/GNOME/gimp.git synced 2025-10-05 21:02:42 +02:00

Compare commits

...

22 Commits

Author SHA1 Message Date
Gabriele
cb5d8ac8a3 Merge branch 'gabrybarbe-fix-color-area-update' into 'master'
issue #14883: make color preview update immediate

Closes #14883

See merge request GNOME/gimp!2465
2025-10-05 00:38:42 +02:00
Bruno Lopes
d8d73266bc build/linux: Update poppler module to 25.10
Synced from
6d4124f7b8
2025-10-04 18:51:18 -03:00
Bruno Lopes
356c2baec5 gitlab-ci, build/windows: Remove forgotten comment about fixed #12284 2025-10-04 16:16:49 -03:00
Bruno Lopes
aea7042aa1 meson: Support Windows native paths (aka backslashes) on -Dprefix
Closes: #12284
2025-10-04 16:12:00 -03:00
Alan Mortensen
97944a5415 Update Danish translation
(cherry picked from commit d81cfcc325)
2025-10-04 12:48:26 +00:00
Alx Sa
a5182a010f tools: Fix missing cursor for MyPaint Brush tool
Resolves #15001
In the MyPaint Brushes v2 port (ea8b9dc1),
I implemented a cursor_update () function from the
parent class. However, I did not call the parent's
version of the function afterwards, so the MyPaint
Brush cursor was not being redrawn. This patch
adds the call to fix the cursor display issue.
2025-10-03 22:14:52 +00:00
Øyvind Kolås
9c2c5ff183 meson, app: depend on GEGL-0.4.64 2025-10-03 23:56:36 +02:00
Bruno Lopes
f09007507f Declare gexiv2 dependency on many targets (due to gimpmetadata.h)
Our build files were relying 'sysroot' to find gexiv2.h but this is
not possible with Apple Clang om which sysroot points to macOS SDK.
So, exotic environments like Homebrew were failing. Let's fix this.
2025-10-03 18:31:53 -03:00
Bruno Lopes
2b91551f4e gitlab-ci: Complete cbe56ff3 2025-10-03 09:03:26 -03:00
Bruno Lopes
cbe56ff388 gitlab-ci: Remove dangling MSYSTEM_PREFIX on Win job names
It makes them consistent with other non-Windows jobs so
easier to read.
2025-10-02 21:37:33 -03:00
Anders Jonsson
7cec3f52b9 .gitlab: fix template typo 2025-10-03 00:54:09 +02:00
Alx Sa
81c67e5614 tools: Don't commit Filter Tool without a filter
The Filter Tool is a "hidden" tool that we switch to
when applying a filter. Like other tools, it commits when
we save our image. However, we may no longer have an
active filter in the tool when we do so (like, after applying
an NDE filter). Because we check the drawable from the
filter to confirm whether we should force NDE or not,
this can cause a CRITICAL when we try to access a now
non-existent filter.

This patch extends the "if (filter_tool->filter)" check to
cover the full commit check process, to prevent the bug.
2025-10-02 12:07:25 +00:00
Øyvind Kolås
67fa72a94e meson, app: depend on babl-0.1.116 2025-10-02 13:22:29 +02:00
Yuri Chornoivan
6587256c3a Update Ukrainian translation 2025-10-02 08:21:41 +00:00
Bruno Lopes
ad9dbf2c8b tools: Drop bashism/gnushism in read command 2025-10-01 21:26:25 -03:00
Bruno Lopes
2f0bfc569b meson: Fix wrong debugging_format detection on clang-cl and msvc 2025-10-01 20:13:33 -03:00
Alx Sa
36330a271a tools: Prevent bucket fill on link/vector layers
Resolves #14993
We currently prevent paint tools from painting on
link or vector layers. However, we had not added this
protection to the bucket fill tool. This patch copies over
the relevant if statements to prevent this.
2025-10-01 13:23:09 +00:00
Jehan
baa4825880 app: use the new release/ alias URLs for the "Learn more" link of…
… Release Notes tab.
2025-10-01 14:40:18 +02:00
Jehan
8c910c2b6b tools: improve release stats.
- Interactively query the release version from standard input.
- Compute the logical previous version but also the previous release in
  time. For instance the logical previous release of GIMP 3.0.6 will be
  3.0.4 but the time-wise previous release will be 3.1.4.
- Some statistics will use the logical previous release whereas others
  the time-wise one.
2025-10-01 14:39:51 +02:00
Marco Ciampa
a025cfe41b Updated Italian translation 2025-10-01 12:37:59 +02:00
Jehan
41035c7589 plug-ins: fix memory management and handle multi-file zip.
We should not call archive_entry_free() since man
archive_read_next_header explicitly says that the returned entry is an
internal object:

> This is a convenience wrapper around archive_read_next_header2() that
> reuses an internal struct archive_entry object for each request.

The only reason why it was not crashing is that we were not properly
freeing the archive itself so internal objects were hanging! The man
archive_read says:

> Once you have finished reading data from the archive, you should call
> archive_read_close() to close the archive, then call archive_read_free()
> to release all resources, including all memory allocated by the library.

Therefore this code add archive_read_free() at the end and removes
archive_entry_free().

Furthermore we now verify if the zip archive contains any other file.
Unlike all other compression formats we were supporting until now, zip
is a full multi-file container format and we are always only trying to
read the first file listed in the archive. This likely means that this
file was not meant to be opened this way. In any case, still try to load
the first file as an image, yet raise a warning about the existence of
more files in the archive.
2025-09-30 20:14:01 +02:00
Gabriele Barbero
9d64379b1c libgimpcolor, libgimpwidgets: make color preview update immediate
Previously, the `gimp_color_area_set_color` function compared the new color
to the current one using perceptual similarity. This caused small or gradual
color changes to be missed, resulting in a "laggy" update of the color preview
in GimpColorSelection.

Now, the check is performed on the actual color difference, and the preview
is updated every time the color changes, even for minimal variations.
This ensures the color preview is always immediate.
2025-09-13 00:44:51 +02:00
52 changed files with 796 additions and 602 deletions

View File

@@ -532,10 +532,7 @@ gimp-snap:
STORE_OPTION: '-Dms-store=true'
parallel:
matrix:
- RUNNER: windows-aarch64
MSYSTEM_PREFIX: clangarm64
- RUNNER: win32-ps
MSYSTEM_PREFIX: clang64
- RUNNER: [windows-aarch64, win32-ps]
tags:
- $RUNNER
variables:
@@ -543,8 +540,8 @@ gimp-snap:
#meson.build forces non-relocatable .pc. See: https://github.com/mesonbuild/meson/issues/14346
PKGCONF_RELOCATABLE_OPTION: '-Dpkgconfig.relocatable=true'
before_script:
# FIXME:'gimpenv' have buggy code about Windows paths. See: https://gitlab.gnome.org/GNOME/gimp/-/issues/12284
- $GIMP_PREFIX = "$PWD\_install-$MSYSTEM_PREFIX".Replace('\', '/')
- if (-not $env:MSYSTEM_PREFIX) { $env:MSYSTEM_PREFIX = if ((Get-WmiObject Win32_ComputerSystem).SystemType -like 'ARM64*') { 'clangarm64' } else { 'clang64' }}
- $GIMP_PREFIX = "$PWD\_install-$env:MSYSTEM_PREFIX"
timeout: 30m
.win_environ: &WIN_ENVIRON
@@ -565,9 +562,9 @@ deps-win:
- build\windows\1_build-deps-msys2.ps1
artifacts:
paths:
- _install-$MSYSTEM_PREFIX/
- babl/_build-$MSYSTEM_PREFIX/meson-logs/meson-log.txt
- gegl/_build-$MSYSTEM_PREFIX/meson-logs/meson-log.txt
- _install-*/
- babl/_build-*/meson-logs/meson-log.txt
- gegl/_build-*/meson-logs/meson-log.txt
expire_in: 2 hours
gimp-win:
@@ -583,14 +580,14 @@ gimp-win:
- build\windows\2_build-gimp-msys2.ps1
artifacts:
paths:
- gimp-$MSYSTEM_PREFIX/
- _build-$MSYSTEM_PREFIX/meson-logs/meson-log.txt
- _build-$MSYSTEM_PREFIX/done-dll.list
- gimp-*/
- _build-*/meson-logs/meson-log.txt
- _build-*/done-dll.list
# Needed by dist-installer-weekly and dist-store-weekly
- _build-$MSYSTEM_PREFIX/config.h
- _build-$MSYSTEM_PREFIX/plug-ins/file_associations.list
- _build-$MSYSTEM_PREFIX/build/windows/installer/
- _build-$MSYSTEM_PREFIX/build/windows/store/
- _build-*/config.h
- _build-*/plug-ins/file_associations.list
- _build-*/build/windows/installer/
- _build-*/build/windows/store/
expire_in: 2 days
@@ -599,12 +596,10 @@ gimp-win:
extends: .win
parallel:
matrix:
- RUNNER: win32-ps
MSYSTEM_PREFIX: mingw32
- RUNNER: [win32-ps]
variables:
MSYSTEM_PREFIX: mingw32
MINGW_PACKAGE_PREFIX: mingw-w64-i686
CC: cc
CXX: c++
deps-win-eol:
extends: .win-eol

View File

@@ -24,7 +24,7 @@ https://gitlab.gnome.org/GNOME/gimp/-/issues/?sort=updated_desc&state=all&label_
- "Be considerate and respectful". This is our main rule.
E.g. avoid negative emotional writing which only generates more upsetting
interactions.
- Stay on topic by writting only one bug per report created.
- Stay on topic by writing only one bug per report created.
- Add full (not cropped) screenshots or other files using the clip button on GitLab. -->
### Reproduction

View File

@@ -12,4 +12,4 @@
Only human created works please!
- You can request the devs to allow installable packages to be
generated from this MR by writting ~Package: in the comments -->
generated from this MR by writing ~Package: in the comments -->

View File

@@ -101,6 +101,6 @@ libappactions = static_library('appactions',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-Actions"',
dependencies: [
gegl, gdk_pixbuf, gtk3,
gegl, gdk_pixbuf, gtk3, gexiv2,
],
)

View File

@@ -44,7 +44,7 @@ libappconfig = static_library('appconfig',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-Config"',
dependencies: [
cairo, gegl, gdk_pixbuf, gio, gio_specific, libmypaint,
cairo, gegl, gdk_pixbuf, gexiv2, gio, gio_specific, libmypaint,
],
)

View File

@@ -1125,10 +1125,19 @@ welcome_dialog_create_release_page (Gimp *gimp,
tmp = g_strdup_printf (GIMP_VERSION);
if (GIMP_MINOR_VERSION % 2 == 0 && ! strstr (tmp, "RC"))
release_link = g_strdup_printf ("https://www.gimp.org/release-notes/gimp-%d.%d.html",
GIMP_MAJOR_VERSION, GIMP_MINOR_VERSION);
{
if (GIMP_MICRO_VERSION == 0 && ! strstr (tmp, "RC"))
release_link = g_strdup_printf ("https://www.gimp.org/release-notes/gimp-%d.%d.html",
GIMP_MAJOR_VERSION, GIMP_MINOR_VERSION);
else
release_link = g_strdup_printf ("https://www.gimp.org/release/%d.%d.%d/",
GIMP_MAJOR_VERSION, GIMP_MINOR_VERSION,
GIMP_MICRO_VERSION);
}
else
release_link = g_strdup ("https://www.gimp.org/");
{
release_link = g_strdup ("https://www.gimp.org/");
}
g_free (tmp);
widget = gtk_link_button_new_with_label (release_link, _("Learn more"));

View File

@@ -122,6 +122,6 @@ libappdisplay = static_library('appdisplay',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-Display"',
dependencies: [
gegl, gtk3, cairo,
gegl, gtk3, cairo, gexiv2
],
)

View File

@@ -16,6 +16,7 @@ libappfiledata = static_library('appfiledata',
cairo,
gdk_pixbuf,
gegl,
gexiv2,
libarchive,
],
)

View File

@@ -11,6 +11,6 @@ libappfile = static_library('appfile',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-File"',
dependencies: [
gegl, gdk_pixbuf,
gegl, gdk_pixbuf, gexiv2
],
)

View File

@@ -56,5 +56,6 @@ libappgegl = static_library('appgegl',
cairo,
gegl,
gdk_pixbuf,
gexiv2
],
)

View File

@@ -31,7 +31,7 @@ libappgui = static_library('appgui',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-GUI"',
dependencies: [
cairo, gegl, gdk_pixbuf, gio_specific, gtk3
cairo, gegl, gdk_pixbuf, gexiv2, gio_specific, gtk3
],
install: false,
)

View File

@@ -16,6 +16,6 @@ libappmenus = static_library('appmenus',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-Menus"',
dependencies: [
gegl, gtk3
gegl, gtk3, gexiv2
],
)

View File

@@ -25,6 +25,6 @@ libapplayermodeslegacy = static_library('applayermodeslegacy',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-Layer-Modes-Legacy"',
dependencies: [
cairo, gegl, gdk_pixbuf,
cairo, gegl, gdk_pixbuf, gexiv2
],
)

View File

@@ -50,5 +50,6 @@ libapplayermodes = static_library('applayermodes',
cairo,
gegl,
gdk_pixbuf,
gexiv2
],
)

View File

@@ -66,7 +66,7 @@ libappoperations = static_library('appoperations',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-Operations"',
dependencies: [
cairo, gegl, gdk_pixbuf,
cairo, gegl, gdk_pixbuf, gexiv2
],
)

View File

@@ -63,6 +63,6 @@ libapppaint = static_library('apppaint',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-Paint"',
dependencies: [
cairo, gegl, gdk_pixbuf, libmypaint,
cairo, gegl, gdk_pixbuf, gexiv2, libmypaint,
],
)

View File

@@ -22,6 +22,6 @@ libapppath = static_library('apppath',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-Path"',
dependencies: [
cairo, gegl, gdk_pixbuf,
cairo, gegl, gdk_pixbuf, gexiv2
],
)

View File

@@ -75,7 +75,7 @@ libapppdb = static_library('apppdb',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-PDB"',
dependencies: [
cairo, gegl, gdk_pixbuf,
cairo, gegl, gdk_pixbuf, gexiv2
],
)
@@ -85,7 +85,7 @@ libappinternalprocs = static_library('appinternalprocs',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-PDB"',
dependencies: [
cairo, gegl, gdk_pixbuf, pangocairo, pango,
cairo, gegl, gdk_pixbuf, gexiv2, pangocairo, pango,
],
sources: [
pdbgen

View File

@@ -56,6 +56,6 @@ libappplugin = static_library('appplug-in',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-Plug-In"',
dependencies: [
cairo, gegl, gdk_pixbuf,
cairo, gegl, gdk_pixbuf, gexiv2,
],
)

View File

@@ -28,6 +28,6 @@ libapppropgui = static_library('apppropgui',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-PropGUI"',
dependencies: [
gegl, gtk3,
gegl, gtk3, gexiv2
],
)

View File

@@ -464,7 +464,7 @@ sanity_check_babl (void)
#define BABL_REQUIRED_MAJOR 0
#define BABL_REQUIRED_MINOR 1
#define BABL_REQUIRED_MICRO 114
#define BABL_REQUIRED_MICRO 116
babl_get_version (&babl_major_version,
&babl_minor_version,
@@ -502,7 +502,7 @@ sanity_check_gegl (void)
#define GEGL_REQUIRED_MAJOR 0
#define GEGL_REQUIRED_MINOR 4
#define GEGL_REQUIRED_MICRO 62
#define GEGL_REQUIRED_MICRO 64
gegl_get_version (&gegl_major_version,
&gegl_minor_version,

View File

@@ -42,6 +42,6 @@ libapptext = static_library('apptext',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-Text"',
dependencies: [
gegl, gdk_pixbuf, harfbuzz, pangocairo, pangoft2,
gegl, gdk_pixbuf, gexiv2, harfbuzz, pangocairo, pangoft2,
],
)

View File

@@ -39,6 +39,7 @@
#include "core/gimpimageproxy.h"
#include "core/gimpitem.h"
#include "core/gimplineart.h"
#include "core/gimplinklayer.h"
#include "core/gimppickable.h"
#include "core/gimppickable-contiguous-region.h"
#include "core/gimpprogress.h"
@@ -50,6 +51,8 @@
#include "operations/layer-modes/gimp-layer-modes.h"
#include "path/gimpvectorlayer.h"
#include "widgets/gimphelp-ids.h"
#include "widgets/gimpwidgets-utils.h"
@@ -620,7 +623,21 @@ gimp_bucket_fill_tool_button_press (GimpTool *tool,
return;
}
if (gimp_item_is_content_locked (GIMP_ITEM (drawable), &locked_item))
if (gimp_item_is_link_layer (GIMP_ITEM (drawable)))
{
gimp_tool_message_literal (tool, display,
_("Link layers must be rasterized "
"before they can be painted on."));
return;
}
else if (gimp_item_is_vector_layer (GIMP_ITEM (drawable)))
{
gimp_tool_message_literal (tool, display,
_("Vector layers must be rasterized "
"before they can be painted on."));
return;
}
else if (gimp_item_is_content_locked (GIMP_ITEM (drawable), &locked_item))
{
gimp_tool_message_literal (tool, display,
_("The selected layer's pixels are locked."));

View File

@@ -562,48 +562,50 @@ gimp_filter_tool_control (GimpTool *tool,
case GIMP_TOOL_ACTION_COMMIT:
if (filter_tool->filter)
drawable = gimp_drawable_filter_get_drawable (filter_tool->filter);
/* TODO: Expand non-destructive editing to other drawables
* besides layers and channels */
if ((! GIMP_IS_LAYER (drawable) && ! GIMP_IS_CHANNEL (drawable)) ||
GIMP_IS_LAYER_MASK (drawable) ||
(! filter_tool->existing_filter && options->merge_filter))
non_destructive = FALSE;
if (filter_tool->operation)
{
gegl_node_get (filter_tool->operation,
"operation", &operation_name,
NULL);
drawable = gimp_drawable_filter_get_drawable (filter_tool->filter);
if (! g_strcmp0 (operation_name, "gegl:nop"))
/* TODO: Expand non-destructive editing to other drawables
* besides layers and channels */
if ((! GIMP_IS_LAYER (drawable) && ! GIMP_IS_CHANNEL (drawable)) ||
GIMP_IS_LAYER_MASK (drawable) ||
(! filter_tool->existing_filter && options->merge_filter))
non_destructive = FALSE;
/* TODO: Once we can serialize GimpDrawable, remove so that filters with
* aux nodes can be non-destructive */
if (gegl_node_has_pad (filter_tool->operation, "aux") ||
/* GEGL graph is dangerous even without using third-party
* effects, because it may run any effect. E.g. it can
* run sink effects overwriting any local files with user
* rights. We leave a way in through an environment
* variable because it is a useful tool for GEGL ops
* developers but it should only be set while knowing what
* you are doing.
*/
(g_strcmp0 (operation_name, "gegl:gegl") == 0 &&
g_getenv ("GIMP_ALLOW_GEGL_GRAPH_LAYER_EFFECT") == NULL))
non_destructive = FALSE;
if (filter_tool->operation)
{
gegl_node_get (filter_tool->operation,
"operation", &operation_name,
NULL);
g_free (operation_name);
if (! g_strcmp0 (operation_name, "gegl:nop"))
non_destructive = FALSE;
/* TODO: Once we can serialize GimpDrawable, remove so that
* filters with aux nodes can be non-destructive */
if (gegl_node_has_pad (filter_tool->operation, "aux") ||
/* GEGL graph is dangerous even without using third-party
* effects, because it may run any effect. E.g. it can
* run sink effects overwriting any local files with user
* rights. We leave a way in through an environment
* variable because it is a useful tool for GEGL ops
* developers but it should only be set while knowing what
* you are doing.
*/
(g_strcmp0 (operation_name, "gegl:gegl") == 0 &&
g_getenv ("GIMP_ALLOW_GEGL_GRAPH_LAYER_EFFECT") == NULL))
non_destructive = FALSE;
g_free (operation_name);
}
/* Ensure that filters applied to group, vector or link layers are
* non-destructive */
if (GIMP_IS_GROUP_LAYER (drawable) ||
gimp_item_is_vector_layer (GIMP_ITEM (drawable)) ||
gimp_item_is_link_layer (GIMP_ITEM (drawable)))
non_destructive = TRUE;
}
/* Ensure that filters applied to group, vector or link layers are non-destructive */
if (GIMP_IS_GROUP_LAYER (drawable) ||
gimp_item_is_vector_layer (GIMP_ITEM (drawable)) ||
gimp_item_is_link_layer (GIMP_ITEM (drawable)))
non_destructive = TRUE;
gimp_filter_tool_commit (filter_tool, non_destructive);
break;
}

View File

@@ -127,6 +127,8 @@ static void gimp_mybrush_tool_cursor_update (GimpTool *tool,
options->view_zoom = (gimp_zoom_model_get_factor (shell->zoom) > 0.0f) ?
gimp_zoom_model_get_factor (shell->zoom) : 1.0f;
options->view_rotation = shell->rotate_angle;
GIMP_TOOL_CLASS (parent_class)->cursor_update (tool, coords, state, display);
}
static void

View File

@@ -143,6 +143,6 @@ libapptools = static_library('apptools',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-Tools"',
dependencies: [
gegl, gtk3,
gegl, gtk3, gexiv2,
],
)

View File

@@ -280,6 +280,6 @@ libappwidgets = static_library('appwidgets',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-Widgets"',
dependencies: [
gegl, gtk3,
gegl, gtk3, gexiv2,
],
)

View File

@@ -13,6 +13,6 @@ libappxcf = static_library('appxcf',
include_directories: [ rootInclude, rootAppInclude, ],
c_args: '-DG_LOG_DOMAIN="Gimp-XCF"',
dependencies: [
cairo, gegl, gdk_pixbuf, zlib
cairo, gegl, gdk_pixbuf, gexiv2, zlib
],
)

View File

@@ -245,8 +245,8 @@
"sources": [
{
"type": "archive",
"url": "https://poppler.freedesktop.org/poppler-25.09.1.tar.xz",
"sha256": "0c1091d01d3dd1664a13816861e812d02b29201e96665454b81b52d261fad658",
"url": "https://poppler.freedesktop.org/poppler-25.10.0.tar.xz",
"sha256": "6b5e9bb64dabb15787a14db1675291c7afaf9387438cc93a4fb7f6aec4ee6fe0",
"x-checker-data": {
"type": "anitya",
"project-id": 3686,

View File

@@ -32,8 +32,7 @@ if ($GITLAB_CI)
# Prepare env
if (-not $GIMP_PREFIX)
{
#FIXME:'gimpenv' have buggy code about Windows paths. See: https://gitlab.gnome.org/GNOME/gimp/-/issues/12284
$GIMP_PREFIX = "$PWD\..\_install".Replace('\', '/')
$GIMP_PREFIX = "$PWD\..\_install"
}
Invoke-Expression ((Get-Content .gitlab-ci.yml | Select-String 'win_environ\[' -Context 0,7) -replace '> ','' -replace '- ','')

View File

@@ -48,7 +48,7 @@ if have_vala and have_gobject_introspection
'goat-exercise-vala.vala',
include_directories: [ rootInclude, ],
dependencies: [
libgimp_vapi, libgimpui_vapi, gtk3, gegl, math,
libgimp_vapi, libgimpui_vapi, libgimpui_dep, math,
],
c_args: [
'-DGETTEXT_PACKAGE="@0@"'.format('org.gimp.extension.goat-exercises'),

View File

@@ -421,6 +421,7 @@ libgimp_dep = declare_dependency(
cairo,
gdk_pixbuf,
gegl,
gexiv2,
],
link_with: [
libgimp,
@@ -438,7 +439,6 @@ libgimpui = library('gimpui-'+ gimp_api_version,
libgimpui_sources,
dependencies: [
libgimp_dep,
gexiv2,
gtk3,
],
sources: [

View File

@@ -150,6 +150,38 @@ gimp_color_is_perceptually_identical (GeglColor *color1,
return (gimp_color_get_CIE2000_distance (color1, color2) < 0.6);
}
/**
* gimp_color_is_identical:
* @color1: a [class@Gegl.Color]
* @color2: a [class@Gegl.Color]
*
* Determine whether @color1 and @color2 are exactly the same, by comparing
* their RGBA components. If the RGBA values are the same, then the colors are
* considered identical, otherwise not.
*
* Returns: whether the 2 colors are exactly the same.
*
* Since: 3.2
**/
gboolean
gimp_color_is_identical (GeglColor *color1,
GeglColor *color2)
{
gdouble r1, g1, b1, a1;
gdouble r2, g2, b2, a2;
g_return_val_if_fail (GEGL_IS_COLOR (color1), FALSE);
g_return_val_if_fail (GEGL_IS_COLOR (color2), FALSE);
gegl_color_get_rgba (color1, &r1, &g1, &b1, &a1);
gegl_color_get_rgba (color2, &r2, &g2, &b2, &a2);
return (r1 == r2 &&
g1 == g2 &&
b1 == b2 &&
a1 == a2);
}
/**
* gimp_color_is_out_of_self_gamut:
* @color: a [class@Gegl.Color]

View File

@@ -9,6 +9,7 @@ EXPORTS
gimp_cairo_checkerboard_create
gimp_cairo_surface_create_buffer
gimp_cairo_surface_get_format
gimp_color_is_identical
gimp_color_is_out_of_gamut
gimp_color_is_out_of_self_gamut
gimp_color_is_perceptually_identical

View File

@@ -50,6 +50,9 @@ void gimp_color_set_alpha (GeglColor *color,
gboolean gimp_color_is_perceptually_identical (GeglColor *color1,
GeglColor *color2);
gboolean gimp_color_is_identical (GeglColor *color1,
GeglColor *color2);
GeglColor * gimp_color_parse_css (const gchar *css);
GeglColor * gimp_color_parse_hex (const gchar *hex);
GeglColor * gimp_color_parse_name (const gchar *name);

View File

@@ -36,7 +36,7 @@ libgimpcolor = library('gimpcolor-' + gimp_api_version,
libgimpcolor_sources,
include_directories: rootInclude,
dependencies: [
cairo, gdk_pixbuf, gegl, lcms, math,
cairo, gdk_pixbuf, gegl, gexiv2, lcms, math,
],
c_args: [ '-DG_LOG_DOMAIN="LibGimpColor"', '-DGIMP_COLOR_COMPILATION', ],
link_with: [ libgimpbase, ],

View File

@@ -70,7 +70,7 @@ libgimpconfig = library('gimpconfig-' + gimp_api_version,
libgimpconfig_sources,
include_directories: rootInclude,
dependencies: [
cairo, gdk_pixbuf, gegl, gio, gio_specific,
cairo, gdk_pixbuf, gegl, gexiv2, gio, gio_specific,
],
c_args: [ '-DG_LOG_DOMAIN="LibGimpConfig"', '-DGIMP_CONFIG_COMPILATION', ],
link_with: [

View File

@@ -19,7 +19,7 @@ libgimpmodule = library('gimpmodule-' + gimp_api_version,
libgimpmodule_sources,
include_directories: rootInclude,
dependencies: [
gegl, gio, glib, gmodule,
gegl, gexiv2, gio, glib, gmodule,
],
c_args: [ '-DG_LOG_DOMAIN="LibGimpModule"', '-DGIMP_MODULE_COMPILATION', ],
link_with: [

View File

@@ -65,7 +65,7 @@ libgimpthumb = library('gimpthumb-'+ gimp_api_version,
libgimpthumb_sources,
include_directories: rootInclude,
dependencies: [
gegl, glib, gobject, gdk_pixbuf, gio,
gegl, gexiv2, glib, gobject, gdk_pixbuf, gio,
],
c_args: [ '-DG_LOG_DOMAIN="LibGimpThumb"', '-DGIMP_THUMB_COMPILATION', ],
link_with: [

View File

@@ -528,7 +528,7 @@ gimp_color_area_set_color (GimpColorArea *area,
g_return_if_fail (GIMP_IS_COLOR_AREA (area));
g_return_if_fail (GEGL_IS_COLOR (color));
if (! gimp_color_is_perceptually_identical (area->color, color))
if (! gimp_color_is_identical (area->color, color))
{
area->needs_render = TRUE;
gtk_widget_queue_draw (GTK_WIDGET (area));

View File

@@ -683,7 +683,7 @@ gimp_color_selection_notebook_changed (GimpColorSelector *selector,
selection->color = gegl_color_duplicate (color);
update = UPDATE_SCALES | UPDATE_ENTRY;
if (! gimp_color_is_perceptually_identical (color, old_color))
if (! gimp_color_is_identical (color, old_color))
update |= UPDATE_COLOR;
gimp_color_selection_update (selection, update);

View File

@@ -207,7 +207,7 @@ libgimpwidgets = library('gimpwidgets-'+ gimp_api_version,
libgimpwidgets_sources,
include_directories: rootInclude,
dependencies: [
gegl, gtk3, lcms, math, mscms
gegl, gexiv2, gtk3, lcms, math, mscms
],
c_args: [ '-DG_LOG_DOMAIN="LibGimpWidgets"', '-DGIMP_WIDGETS_COMPILATION', ],
link_with: [

View File

@@ -128,7 +128,7 @@ fs = import('fs')
cc = meson.get_compiler('c')
cxx = meson.get_compiler('cpp')
prefix = get_option('prefix')
prefix = get_option('prefix').replace('\\', '/')
buildtype = get_option('buildtype')
exec_ver = '-' + gimp_app_version
@@ -334,6 +334,9 @@ if get_option('buildtype') == 'debug' or get_option('buildtype') == 'debugoptimi
if not platform_windows
# DWARF symbols for GCC and LLDB on Unix
debugging_format = 'native'
elif cc.get_argument_syntax() == 'msvc'
# CodeView symbols for DIA or DbgHelp debuggers and LLDB on Windows
debugging_format = 'Native'
elif platform_windows and get_option('win-debugging') == 'native' and cc.has_argument('-gcodeview') and cc.has_link_argument('-Wl,--pdb=') and cc.get_id() == 'clang'
# CodeView symbols for DIA or DbgHelp debuggers and LLDB on Windows
debugging_format = 'native'
@@ -406,7 +409,7 @@ winsock = platform_windows ? cc.find_library('ws2_32') : no_dep
mscms = platform_windows ? cc.find_library('mscms') : no_dep
atk_minver = '2.4.0'
atk = dependency('atk', version: '>='+atk_minver)
babl_minver = '0.1.114'
babl_minver = '0.1.116'
babl = dependency('babl-0.1', version: '>='+babl_minver, required: false)
if not babl.found()
# babl changed its pkg-config name from 'babl' to 'babl-0.1' in version
@@ -428,7 +431,7 @@ freetype2_minver = '2.1.7'
freetype2 = dependency('freetype2', version: '>='+freetype2_minver)
gdk_pixbuf_minver = '2.30.8'
gdk_pixbuf = dependency('gdk-pixbuf-2.0', version: '>='+gdk_pixbuf_minver)
gegl_minver = '0.4.62'
gegl_minver = '0.4.64'
gegl = dependency('gegl-0.4', version: '>='+gegl_minver)
exiv2_minver = '0.27.4'
exiv2 = dependency('exiv2', version: '>='+exiv2_minver)
@@ -2046,7 +2049,7 @@ pkgconfig.generate(libgimpui,
# Install native debug data (.pdb) on Windows
# Ideally meson should take care of it automatically.
# See: https://github.com/mesonbuild/meson/issues/12977
if platform_windows and debugging_format == 'native'
if platform_windows and debugging_format == 'native' and cc.get_argument_syntax() != 'msvc'
install_win_debug_script = find_program('build/windows/2_bundle-gimp-uni_sym.py')
meson.add_install_script(install_win_debug_script)
endif

View File

@@ -1,6 +1,6 @@
modules_deps = [
gtk3, babl, gegl, math,
gtk3, babl, gegl, gexiv2, math,
]
color_selector_libs = [

View File

@@ -1083,6 +1083,7 @@ zip_load (GFile *infile,
if (r != ARCHIVE_OK)
{
archive_read_close (a);
archive_read_free (a);
goto out;
}
@@ -1094,13 +1095,22 @@ zip_load (GFile *infile,
if (r != ARCHIVE_OK)
{
archive_read_close (a);
archive_read_free (a);
goto out;
}
archive_entry_free (entry);
ret = TRUE;
if (archive_read_next_header (a, &entry) != ARCHIVE_EOF)
/* Leave a chance for the load to succeed (in case the first
* file happens to be an image file), yet still warns. This
* procedure expects that the archive contains a single
* file.
*/
g_message (_("This zip archive contains more than one file."));
}
archive_read_close (a);
archive_read_free (a);
}
out:

View File

@@ -10,9 +10,7 @@ common_plugins_list = [
{ 'name': 'colormap-remap', },
{ 'name': 'compose', },
{ 'name': 'contrast-retinex', },
{ 'name': 'crop-zealous',
'deps': [ gtk3, gegl, gdk_pixbuf, cairo, ],
},
{ 'name': 'crop-zealous' },
{ 'name': 'curve-bend', },
{ 'name': 'decompose', },
{ 'name': 'depth-merge', },
@@ -20,7 +18,7 @@ common_plugins_list = [
{ 'name': 'destripe', },
{ 'name': 'file-cel', },
{ 'name': 'file-compressor',
'deps': [ gegl, gdk_pixbuf, cairo, gio, libarchive, liblzma, pango, bz2, zlib, ],
'deps': [ gio, libarchive, liblzma, pango, bz2, zlib, ],
},
{ 'name': 'file-csource', },
{ 'name': 'file-dicom', },
@@ -28,34 +26,32 @@ common_plugins_list = [
{ 'name': 'file-gbr', },
{ 'name': 'file-gegl', },
{ 'name': 'file-gif-load',
'deps': [ gtk3, gegl, gdk_pixbuf, cairo, zlib, ],
'deps': [ zlib, ],
},
{ 'name': 'file-gif-export', },
{ 'name': 'file-gih', },
{ 'name': 'file-glob',
'deps': [ gtk3, gegl, gdk_pixbuf, cairo, ],
},
{ 'name': 'file-glob', },
{ 'name': 'file-header', },
{ 'name': 'file-html-table', },
{ 'name': 'file-paa', },
{ 'name': 'file-pat', },
{ 'name': 'file-pcx', },
{ 'name': 'file-pdf-load',
'deps': [ gtk3, gegl, gdk_pixbuf, poppler ],
'deps': [ poppler ],
},
{ 'name': 'file-pix', },
{ 'name': 'file-png',
'deps': [ gtk3, gegl, libpng, lcms ],
'deps': [ libpng, lcms ],
},
{ 'name': 'file-pnm', },
{ 'name': 'file-psp',
'deps': [ gtk3, gegl, zlib, ],
'deps': [ zlib, ],
},
{ 'name': 'file-raw-data', },
{ 'name': 'file-seattle-filmworks', },
{ 'name': 'file-sunras', },
{ 'name': 'file-svg',
'deps': [ gtk3, gegl, rsvg, ],
'deps': [ rsvg, ],
},
{ 'name': 'file-tga', },
{ 'name': 'file-tim', },
@@ -88,26 +84,26 @@ common_plugins_list = [
if libaa.found()
common_plugins_list += {
'name': 'file-aa',
'deps': [ gtk3, gegl, gdk_pixbuf, libaa, ],
'deps': [ libaa, ],
}
endif
if have_heif
common_plugins_list += { 'name': 'file-heif',
'deps': [ gtk3, gegl, libheif, gexiv2, lcms, ],
'deps': [ libheif, lcms, ],
}
endif
if openjpeg.found()
common_plugins_list += { 'name': 'file-jp2',
'deps': [ gtk3, gegl, gdk_pixbuf, openjpeg, ],
'deps': [ openjpeg, ],
}
endif
if libjxl.found() and libjxl_threads.found()
common_plugins_list += {
'name': 'file-jpegxl',
'deps': [ gtk3, gegl, gexiv2, libjxl, libjxl_threads, ],
'deps': [ libjxl, libjxl_threads, ],
}
endif
@@ -117,57 +113,55 @@ if libmng.found()
mng_cflags = [ '-DMNG_USE_DLL' ]
endif
common_plugins_list += { 'name': 'file-mng',
'deps': [ gtk3, gegl, libmng, libpng, ],
'deps': [ libmng, libpng, ],
'cflags': mng_cflags,
}
endif
if cairopdf.found()
common_plugins_list += { 'name': 'file-pdf-export',
'deps': [ gtk3, gegl, gdk_pixbuf, poppler, cairo, cairopdf ],
'deps': [ poppler, cairopdf ],
}
endif
if ghostscript.found()
common_plugins_list += { 'name': 'file-ps',
'deps': [ gtk3, gegl, gdk_pixbuf, ghostscript, ],
'deps': [ ghostscript, ],
}
endif
if wmf.found()
common_plugins_list += { 'name': 'file-wmf',
'deps': [ gtk3, gegl, wmf, ],
'deps': [ wmf, ],
}
endif
if xmc.found()
common_plugins_list += { 'name': 'file-xmc',
'deps': [ gtk3, gegl, xmc, ],
'deps': [ xmc, ],
}
endif
if libxpm.found()
common_plugins_list += { 'name': 'file-xpm',
'deps': [ gtk3, gegl, libxpm, ],
'deps': [ libxpm, ],
}
endif
if have_qoi
common_plugins_list += {
'name': 'file-qoi',
'deps': [ gtk3, gegl, ],
}
endif
if libiff.found() and libilbm.found()
common_plugins_list += {
'name': 'file-iff',
'deps': [ gtk3, gegl, libiff, libilbm, ],
'deps': [ libiff, libilbm, ],
}
elif have_ilbm
common_plugins_list += {
'name': 'file-iff',
'deps': [ gtk3, gegl, ],
}
endif
@@ -178,7 +172,6 @@ endif
if platform_linux
common_plugins_list += {
'name': 'file-desktop-link',
'deps': [ gtk3, gegl, gdk_pixbuf, cairo, ],
}
endif
if not platform_windows
@@ -187,7 +180,7 @@ endif
if get_option('webkit-unmaintained')
common_plugins_list += { 'name': 'web-page',
'deps': [ gtk3, gegl, gdk_pixbuf, webkit, ],
'deps': [ webkit, ],
}
endif
@@ -195,7 +188,7 @@ plugin_custom_targets = []
foreach plugin : common_plugins_list
plugin_name = plugin.get('name')
plugin_sources = [ plugin.get('sources', plugin_name + '.c') ]
plugin_deps = plugin.get('deps', [ gtk3, gegl, gdk_pixbuf, ])
plugin_deps = plugin.get('deps', [])
plugin_cflags = plugin.get('cflags', [])
if platform_windows
@@ -241,7 +234,7 @@ foreach plugin : common_plugins_list
libgimpui,
libgimpwidgets,
],
dependencies: [ plugin_deps, math ],
dependencies: [ plugin_deps, math, libgimpui_dep ],
c_args: plugin_cflags,
win_subsystem: 'windows',
install: true,

View File

@@ -28,7 +28,7 @@ help_plugin_lib = static_library('help_plugin',
plugin_sources,
include_directories: [ rootInclude, ],
dependencies: [
gtk3, gegl, cairo, gio, gdk_pixbuf,
libgimpui_dep, gio,
],
install: false,
)

File diff suppressed because it is too large Load Diff

View File

@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gimp-plug-ins\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gimp/issues\n"
"POT-Creation-Date: 2025-09-29 19:54+0000\n"
"PO-Revision-Date: 2025-09-29 22:59+0300\n"
"POT-Creation-Date: 2025-10-02 00:31+0000\n"
"PO-Revision-Date: 2025-10-02 11:21+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
"Language: uk\n"
@@ -2808,19 +2808,87 @@ msgstr "Непрозорість"
msgid "gzip archive"
msgstr "архів gzip"
#: plug-ins/common/file-compressor.c:229
msgid "Loads files compressed with gzip"
msgstr "Завантажує файли, які стиснуто за допомогою gzip"
#: plug-ins/common/file-compressor.c:230
#| msgid ""
#| "This plug-in loads files in the various Netpbm portable file formats."
msgid "This procedure loads files in the gzip compressed format."
msgstr "Ця процедура завантажує файли у стисненому форматі gzip."
#: plug-ins/common/file-compressor.c:234
msgid "Exports files compressed with gzip"
msgstr "Експортує файли, які стиснуто за допомогою gzip"
#: plug-ins/common/file-compressor.c:235
#| msgid "Exports files in the PNM file format"
msgid "This procedure exports files in the gzip compressed format."
msgstr "Ця процедура експортує файли у стисненому форматі gzip."
#: plug-ins/common/file-compressor.c:240
msgid "bzip archive"
msgstr "архів bzip"
#: plug-ins/common/file-compressor.c:248
msgid "Loads files compressed with bzip2"
msgstr "Завантажує файли, які стиснуто за допомогою bzip2"
#: plug-ins/common/file-compressor.c:249
#| msgid ""
#| "This plug-in loads files in the various Netpbm portable file formats."
msgid "This procedure loads files in the bzip2 compressed format."
msgstr "Ця процедура завантажує файли у стисненому форматі bzip2."
#: plug-ins/common/file-compressor.c:253
msgid "Exports files compressed with bzip2"
msgstr "Експортує файли, які стиснуто за допомогою bzip2"
#: plug-ins/common/file-compressor.c:254
#| msgid ""
#| "This plug-in loads files in the various Netpbm portable file formats."
msgid "This procedure exports files in the bzip2 compressed format."
msgstr "Ця процедура експортує файли у стисненому форматі bzip2."
#: plug-ins/common/file-compressor.c:259
msgid "xz archive"
msgstr "архів xz"
#: plug-ins/common/file-compressor.c:267
msgid "Loads files compressed with xz"
msgstr "Завантажує файли, які стиснуто за допомогою xz"
#: plug-ins/common/file-compressor.c:268
#| msgid ""
#| "This plug-in loads files in the various Netpbm portable file formats."
msgid "This procedure loads files in the xz compressed format."
msgstr "Ця процедура завантажує файли у стисненому форматі xz."
#: plug-ins/common/file-compressor.c:272
#| msgid "Error reading compressed data. "
msgid "Exports files compressed with xz"
msgstr "Експортує файли, які стиснуто за допомогою xz"
#: plug-ins/common/file-compressor.c:273
#| msgid "Exports files in the PNM file format"
msgid "This procedure exports files in the xz compressed format."
msgstr "Ця процедура експортує файли у стисненому форматі xz."
#: plug-ins/common/file-compressor.c:278
#| msgid "gzip archive"
msgid "zip archive"
msgstr "архів zip"
#: plug-ins/common/file-compressor.c:286
msgid "Loads files compressed with zip"
msgstr "Завантажує файли, які стиснуто за допомогою zip"
#: plug-ins/common/file-compressor.c:287
#| msgid ""
#| "This plug-in loads files in the various Netpbm portable file formats."
msgid "This procedure loads files in the zip compressed format."
msgstr "Ця процедура завантажує файли у стисненому форматі zip."
#: plug-ins/common/file-compressor.c:471
msgid "No sensible file extension, saving as compressed XCF."
msgstr "Немає потрібного розширення, зберігається як стиснутий XCF."
@@ -2834,6 +2902,15 @@ msgstr "Стиснення «%s»"
msgid "No sensible file extension, attempting to load with file magic."
msgstr "Немає потрібного розширення, спроба визначення типу за вмістом файлу."
#. Leave a chance for the load to succeed (in case the first
#. * file happens to be an image file), yet still warns. This
#. * procedure expects that the archive contains a single
#. * file.
#.
#: plug-ins/common/file-compressor.c:1110
msgid "This zip archive contains more than one file."
msgstr "В архіві zip міститься декілька файлів."
#: plug-ins/common/file-desktop-link.c:114
msgid "Desktop Link"
msgstr "Посилання .desktop"

146
po/it.po
View File

@@ -45,8 +45,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gimp 2.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-23 16:13+0200\n"
"PO-Revision-Date: 2025-09-23 16:09+0200\n"
"POT-Creation-Date: 2025-10-01 12:30+0200\n"
"PO-Revision-Date: 2025-10-01 12:37+0200\n"
"Last-Translator: Marco Ciampa <ciampix@posteo.net>\n"
"Language-Team: gimp@erlug.linux.it\n"
"Language: it\n"
@@ -124,7 +124,15 @@ msgstr ""
msgid "If you wanted to quit immediately instead, call GIMP with --quit."
msgstr "Se invece si desidera uscire immediatamente, chiamare GIMP con --quit."
#: ../app/gimp-update.c:444
#: ../app/gimp-update.c:424
msgid "Perhaps you are missing GIO backends and need to install GVFS?"
msgstr "Forse mancano i backend GIO e bisogna installare GVFS?"
#: ../app/gimp-update.c:429
msgid "Perhaps you are missing GIO backends."
msgstr "Forse mancano i backend GIO."
#: ../app/gimp-update.c:466
#, c-format
msgid ""
"A new version of GIMP (%s) was released.\n"
@@ -2535,8 +2543,8 @@ msgid "Enter a description for the marker"
msgstr "Inserire una descrizione per il marcatore"
#: ../app/actions/data-commands.c:90 ../app/actions/documents-commands.c:393
#: ../app/actions/file-commands.c:234 ../app/dialogs/file-open-dialog.c:253
#: ../app/dialogs/file-open-dialog.c:295
#: ../app/actions/file-commands.c:234 ../app/dialogs/file-open-dialog.c:254
#: ../app/dialogs/file-open-dialog.c:300
#: ../app/dialogs/file-open-location-dialog.c:217
#: ../app/dialogs/file-open-location-dialog.c:233
#: ../app/display/gimpdisplayshell-dnd.c:646
@@ -3053,134 +3061,124 @@ msgctxt "dialogs-action"
msgid "Open the dashboard"
msgstr "Apri il cruscotto"
#: ../app/actions/dialogs-actions.c:311 ../app/actions/dialogs-actions.c:312
msgctxt "dialogs-action"
msgid "_Settings..."
msgstr "Impo_stazioni..."
#: ../app/actions/dialogs-actions.c:314 ../app/actions/dialogs-actions.c:315
#: ../app/actions/dialogs-actions.c:310 ../app/actions/dialogs-actions.c:311
msgctxt "dialogs-action"
msgid "_Preferences"
msgstr "_Preferenze"
#: ../app/actions/dialogs-actions.c:318
#: ../app/actions/dialogs-actions.c:313
msgctxt "dialogs-action"
msgid "Open the preferences dialog"
msgstr "Apri la finestra delle preferenze"
#: ../app/actions/dialogs-actions.c:323
#: ../app/actions/dialogs-actions.c:318
msgctxt "dialogs-action"
msgid "_Input Devices Editor"
msgstr "Editor dispositivi di _ingresso"
#: ../app/actions/dialogs-actions.c:324
#: ../app/actions/dialogs-actions.c:319
msgctxt "dialogs-action"
msgid "_Input Devices"
msgstr "Dispositivi di _ingresso"
#: ../app/actions/dialogs-actions.c:326
#: ../app/actions/dialogs-actions.c:321
msgctxt "dialogs-action"
msgid "Open the input devices editor"
msgstr "Apri la modifica dei dispositivi d'ingresso"
#: ../app/actions/dialogs-actions.c:331
#: ../app/actions/dialogs-actions.c:326
msgctxt "dialogs-action"
msgid "_Keyboard Shortcuts Editor"
msgstr "Editor _tasti scorciatoia"
#: ../app/actions/dialogs-actions.c:332
#: ../app/actions/dialogs-actions.c:327
msgctxt "dialogs-action"
msgid "_Keyboard Shortcuts"
msgstr "_Tasti scorciatoia"
#: ../app/actions/dialogs-actions.c:334
#: ../app/actions/dialogs-actions.c:329
msgctxt "dialogs-action"
msgid "Open the keyboard shortcuts editor"
msgstr "Apri la modifica dei tasti scorciatoia"
#: ../app/actions/dialogs-actions.c:339
#: ../app/actions/dialogs-actions.c:334
msgctxt "dialogs-action"
msgid "_Modules Dialog"
msgstr "Finestra _moduli"
#: ../app/actions/dialogs-actions.c:340
#: ../app/actions/dialogs-actions.c:335
msgctxt "dialogs-action"
msgid "_Modules"
msgstr "_Moduli"
#: ../app/actions/dialogs-actions.c:342
#: ../app/actions/dialogs-actions.c:337
msgctxt "dialogs-action"
msgid "Open the module manager dialog"
msgstr "Apri finestra di gestione moduli"
#: ../app/actions/dialogs-actions.c:347
#: ../app/actions/dialogs-actions.c:342
msgctxt "dialogs-action"
msgid "_Tip of the Day"
msgstr "Suggerimenti del _giorno"
#: ../app/actions/dialogs-actions.c:349
#: ../app/actions/dialogs-actions.c:344
msgctxt "dialogs-action"
msgid "Show some helpful tips on using GIMP"
msgstr "Mostra alcuni utili suggerimenti sull'uso di GIMP"
#: ../app/actions/dialogs-actions.c:354
#: ../app/actions/dialogs-actions.c:349
msgctxt "dialogs-action"
msgid "Welcome Dialog"
msgstr "Finestra di benvenuto"
#: ../app/actions/dialogs-actions.c:356
#: ../app/actions/dialogs-actions.c:351
msgctxt "dialogs-action"
msgid "Show information on running GIMP release"
msgstr "Mostra informazioni sulla versione di GIMP in esecuzione"
#: ../app/actions/dialogs-actions.c:362 ../app/actions/dialogs-actions.c:369
#: ../app/actions/dialogs-actions.c:357 ../app/actions/dialogs-actions.c:362
msgctxt "dialogs-action"
msgid "About GIMP"
msgstr "Informazioni su GIMP"
#: ../app/actions/dialogs-actions.c:364
msgctxt "dialogs-action"
msgid "About"
msgstr "Informazioni"
#: ../app/actions/dialogs-actions.c:366
#: ../app/actions/dialogs-actions.c:359
msgctxt "dialogs-action"
msgid "_About"
msgstr "_Informazioni"
#: ../app/actions/dialogs-actions.c:374
#: ../app/actions/dialogs-actions.c:367
msgctxt "dialogs-action"
msgid "_Search and Run a Command"
msgstr "Cerca ed e_segui un comando"
#: ../app/actions/dialogs-actions.c:376
#: ../app/actions/dialogs-actions.c:369
msgctxt "dialogs-action"
msgid "Search commands by keyword, and run them"
msgstr "Cerca comandi per parola-chiave e li esegue"
#: ../app/actions/dialogs-actions.c:382
#: ../app/actions/dialogs-actions.c:375
msgctxt "dialogs-action"
msgid "Manage _Extensions"
msgstr "Gestione _estensioni"
#: ../app/actions/dialogs-actions.c:384
#: ../app/actions/dialogs-actions.c:377
msgctxt "dialogs-action"
msgid "Manage Extensions: search, install, uninstall, update."
msgstr "Gestione estensioni: cerca, installa, disinstalla, aggiorna."
#: ../app/actions/dialogs-actions.c:448
#: ../app/actions/dialogs-actions.c:441
msgid "Tool_box"
msgstr "Pannello strumenti"
#: ../app/actions/dialogs-actions.c:449
#: ../app/actions/dialogs-actions.c:442
msgid "Raise the toolbox"
msgstr "Alza il pannello strumenti"
#: ../app/actions/dialogs-actions.c:453
#: ../app/actions/dialogs-actions.c:446
msgid "New Tool_box"
msgstr "Nuovo pannello strum_enti"
#: ../app/actions/dialogs-actions.c:454
#: ../app/actions/dialogs-actions.c:447
msgid "Create a new toolbox"
msgstr "Crea un nuovo pennello strumenti"
@@ -12988,7 +12986,7 @@ msgstr ""
#: ../app/core/gimp-contexts.c:153 ../app/core/gimp-internal-data.c:338
#: ../app/core/gimptooloptions.c:361 ../app/gui/modifiers.c:191
#: ../app/gui/session.c:449 ../app/menus/menus.c:480
#: ../app/gui/session.c:449 ../app/menus/menus.c:488
#: ../app/widgets/gimpdevices.c:226
#, c-format
msgid "Deleting \"%s\" failed: %s"
@@ -14960,11 +14958,11 @@ msgstr "Lunghezza massima chiusura diritta"
msgid "Maximum straight length (in pixels) to close the line art"
msgstr "Lunghezza massima retta (in pixel) per chiudere il tratteggio"
#: ../app/core/gimplink.c:255
#: ../app/core/gimplink.c:256
msgid "The file got deleted"
msgstr "Il file è stato eliminato"
#: ../app/core/gimplink.c:349
#: ../app/core/gimplink.c:351
msgid "No file was set"
msgstr "Nessun file impostato"
@@ -16146,10 +16144,15 @@ msgid "Search extensions matching these keywords"
msgstr "Cerca le estensioni che corrispondono a queste parole chiave"
#: ../app/dialogs/file-open-dialog.c:142 ../app/dialogs/file-open-dialog.c:168
#: ../app/dialogs/file-open-dialog.c:286
#: ../app/dialogs/file-open-dialog.c:291
msgid "Open layers"
msgstr "Apri livelli"
#: ../app/dialogs/file-open-dialog.c:258
#, c-format
msgid "Opening '%s' failed."
msgstr "L'apertura di '%s' è fallita."
#: ../app/dialogs/file-open-location-dialog.c:74
msgid "Open Location"
msgstr "Apri posizione"
@@ -18867,13 +18870,13 @@ msgid "GIMP website"
msgstr "Il sito di GIMP"
#: ../app/dialogs/welcome-dialog.c:545
msgid "Tutorials"
msgstr "Guide"
#: ../app/dialogs/welcome-dialog.c:550
msgid "Documentation"
msgstr "Documentazione"
#: ../app/dialogs/welcome-dialog.c:550
msgid "Community Tutorials"
msgstr "Guide della comunità"
#. XXX: should we add API docs for plug-in developers once it's
#. * properly set up?
#. Welcome message: right
@@ -19920,26 +19923,26 @@ msgstr "Clic e trascina per spostare il punto cardine"
msgid "Click-Drag to shear"
msgstr "Clic e trascina per inclinare"
#: ../app/file/file-open.c:264
#: ../app/file/file-open.c:272
#, c-format
msgid "%s plug-in returned SUCCESS but did not return an image"
msgstr "Il plug-in %s ha risposto successo ma non ha restituito un'immagine"
#: ../app/file/file-open.c:275
#: ../app/file/file-open.c:283
#, c-format
msgid "%s plug-in could not open image"
msgstr "Il plug-in %s non poteva aprire l'immagine"
#: ../app/file/file-open.c:690
#: ../app/file/file-open.c:698
msgid "Image doesn't contain any layers"
msgstr "L'immagine non contiene nessun livello"
#: ../app/file/file-open.c:748
#: ../app/file/file-open.c:756
#, c-format
msgid "Opening '%s' failed: %s"
msgstr "L'apertura di \"%s\" è fallita: %s"
#: ../app/file/file-open.c:836
#: ../app/file/file-open.c:846
#, c-format
msgid ""
"Only platform-native file paths are supported: '%s' cannot be opened as link."
@@ -19947,11 +19950,11 @@ msgstr ""
"Sono supportati solo i percorsi file nativi della piattaforma: '%s' non può "
"essere aperto come collegamento."
#: ../app/file/file-open.c:978 ../app/file/file-save.c:132
#: ../app/file/file-open.c:985 ../app/file/file-save.c:132
msgid "Not a regular file"
msgstr "Non è un file normale"
#: ../app/file/file-open.c:987 ../app/file/file-save.c:141
#: ../app/file/file-open.c:994 ../app/file/file-save.c:141
msgid "Permission denied"
msgstr "Permesso negato"
@@ -21716,11 +21719,7 @@ msgstr "Ruota livello vettoriale"
msgid "Transform Vector Layer"
msgstr "Trasforma livello vettoriale"
#: ../app/path/gimpvectorlayer.c:526
msgid "Discard Vector Informations"
msgstr "Abbandona le informazioni vettoriali"
#: ../app/path/gimpvectorlayer.c:669
#: ../app/path/gimpvectorlayer.c:526 ../app/path/gimpvectorlayer.c:669
msgid "Discard Vector Information"
msgstr "Abbandona le informazioni vettoriali"
@@ -22277,7 +22276,7 @@ msgstr "Autoritaglio immagine"
msgid "Autocrop layer"
msgstr "Autoritaglio livello"
#: ../app/pdb/image-cmds.c:2556
#: ../app/pdb/image-cmds.c:2564
msgid ""
"Image resolution is out of bounds, using the default resolution instead."
msgstr ""
@@ -22306,43 +22305,48 @@ msgstr "Trasformazione 2D"
msgid "2D Transforming"
msgstr "Trasformazione 2D in corso"
#: ../app/pdb/link-layer-cmds.c:67 ../app/pdb/link-layer-cmds.c:89
#, c-format
msgid "Failed to create link layer"
msgstr "Impossibile creare livello collegato"
#: ../app/pdb/path-cmds.c:325
msgid "Remove path stroke"
msgstr "Rimuovi delineatura del tracciato"
#: ../app/pdb/path-cmds.c:362
msgid "Close path stroke"
msgstr "Chiudi la delineatura del tracciato"
msgstr "Chiudi delineatura tracciato"
#: ../app/pdb/path-cmds.c:401
msgid "Reverse path stroke"
msgstr "Inverti delineatura del tracciato"
msgstr "Inverti delineatura tracciato"
#: ../app/pdb/path-cmds.c:446
msgid "Translate path stroke"
msgstr "Trasla la delineatura del tracciato"
msgstr "Trasla delineatura tracciato"
#: ../app/pdb/path-cmds.c:491
msgid "Scale path stroke"
msgstr "Scala la delineatura del tracciato"
msgstr "Scala delineatura tracciato"
#: ../app/pdb/path-cmds.c:538
msgid "Rotate path stroke"
msgstr "Ruota la delineatura del tracciato"
msgstr "Ruota delineatura tracciato"
#: ../app/pdb/path-cmds.c:583 ../app/pdb/path-cmds.c:632
msgid "Flip path stroke"
msgstr "Rifletti la delineatura del tracciato"
msgstr "Rifletti delineatura tracciato"
#: ../app/pdb/path-cmds.c:761 ../app/pdb/path-cmds.c:884
#: ../app/pdb/path-cmds.c:1114
msgid "Add path stroke"
msgstr "Aggiungi la delineatura del tracciato"
msgstr "Aggiungi delineatura tracciato"
#: ../app/pdb/path-cmds.c:938 ../app/pdb/path-cmds.c:994
#: ../app/pdb/path-cmds.c:1058
msgid "Extend path stroke"
msgstr "Estendi la delineatura del tracciato"
msgstr "Estendi delineatura tracciato"
#: ../app/pdb/pdb-cmds.c:1185 ../app/pdb/pdb-cmds.c:1227
#, c-format
@@ -24333,7 +24337,7 @@ msgstr "Selezione sconosciuta"
#: ../app/tools/gimpforegroundselecttool.c:667
msgid "press Enter to preview."
msgstr "premere invio l'anteprima."
msgstr "premere invio per l'anteprima."
#: ../app/tools/gimpforegroundselecttool.c:669
msgid "press Escape to exit preview or Enter to apply."
@@ -27751,7 +27755,7 @@ msgstr "Informazioni varie"
msgid "Select fields"
msgstr "Seleziona campi"
#. Tranlators: "N/A" is an abbreviation for "not available"
#. Translators: "N/A" is an abbreviation for "not available"
#: ../app/widgets/gimpdashboard.c:3323
msgctxt "dashboard-value"
msgid "N/A"

View File

@@ -10,7 +10,7 @@ gimptool = executable('gimptool' + exec_ver,
'gimptool.c',
include_directories: rootInclude,
dependencies: [
gegl, gtk3,
gegl, gtk3, gexiv2
],
link_with: [
libgimpbase,
@@ -25,7 +25,7 @@ gimp_test_clipboard = executable('gimp-test-clipboard' + exec_ver,
'gimp-test-clipboard.c',
include_directories: rootInclude,
dependencies: [
gegl, gtk3,
gegl, gtk3, gexiv2
],
install: true,
)

View File

@@ -20,45 +20,77 @@
############################################
#### Usage ####
if [ "$#" -ne 2 -a "$#" -ne 1 ]; then
echo "Usage: $0 <GIMP_TAG_PREV> <GIMP_TAG_CUR>"
echo
echo " GIMP_TAG_PREV: last tag release or commit (non-included in stats)"
echo " ex: GIMP_2_9_6"
echo " GIMP_TAG_CUR: current tag release or commit (included in stats); ex: GIMP_2_9_8"
echo " ex: GIMP_2_9_8."
echo " Optional. If absent, statistics up to HEAD."
exit 1
fi
printf "GIMP version to release: "; read ver
PREV=$1
git --no-pager show $PREV >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "First tag is unknown: $PREV"
exit 2
fi
if [ -z "$ver" ]; then
TAG="HEAD"
PREV_TAG=$(git ls-remote --tags --exit-code --refs "https://gitlab.gnome.org/GNOME/gimp.git" |grep -o "GIMP_[0-9]*_[0-9]*_[0-9]*" | sort --version-sort | tail -1)
INTERMEDIATE_TAG=$PREV_TAG
if [ "$#" = 2 ]; then
CUR=$2
git --no-pager show $CUR >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Second tag is unknown: $CUR"
exit 2
fi
is_dev_release=1
else
CUR='HEAD'
major=$(echo "$ver" | cut -d'.' -f1)
minor=$(echo "$ver" | cut -d'.' -f2)
micro=$(echo "$ver" | cut -d'.' -f3)
TAG=GIMP_${major}_${minor}_${micro}
git --no-pager show $TAG >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Tag is unknown: $TAG"
exit 1
fi
is_dev_release=$((minor % 2))
if [ $((micro % 2)) -ne 0 ]; then
echo "Releases must have an even micro version."
exit 1
fi
# The previous tag will be in the same branch. For instance 3.0.4 is
# previous to 3.0.6 even if we may have released 3.1 versions
# in-between.
PREV_TAG=$(git ls-remote --tags --exit-code --refs "https://gitlab.gnome.org/GNOME/gimp.git" |grep -o "GIMP_[0-9]*_[0-9]*_[0-9]*" | sort --version-sort | grep -B1 $TAG | head -1)
# The intermediate tag is the actual version we released before.
INTERMEDIATE_TAG=$(git ls-remote --tags --sort=taggerdate --exit-code --refs "https://gitlab.gnome.org/GNOME/gimp.git" |grep -o "GIMP_[0-9]*_[0-9]*_[0-9]*" | grep -B1 $TAG | head -1)
fi
prev_date=`git log -1 --format=%ci $PREV`
cur_date=`git log -1 --format=%ci $CUR`
#if [ $is_dev_release -eq 0 ]; then
#read -p "Previous stable GIMP version:" ver
#elif [ $micro -eq 0 ];
#else
#read -p "Previous GIMP version:" ver
#fi
prevmajor=$(echo "$1" | cut -d'_' -f2)
prevminor=$(echo "$1" | cut -d'_' -f3)
prevmicro=$(echo "$1" | cut -d'_' -f4)
prevmajor=$(echo "$PREV_TAG" | cut -d'_' -f2)
prevminor=$(echo "$PREV_TAG" | cut -d'_' -f3)
prevmicro=$(echo "$PREV_TAG" | cut -d'_' -f4)
major=$(echo "$2" | cut -d'_' -f2)
minor=$(echo "$2" | cut -d'_' -f3)
micro=$(echo "$2" | cut -d'_' -f4)
intmajor=$(echo "$INTERMEDIATE_TAG" | cut -d'_' -f2)
intminor=$(echo "$INTERMEDIATE_TAG" | cut -d'_' -f3)
intmicro=$(echo "$INTERMEDIATE_TAG" | cut -d'_' -f4)
echo "Previous Release: $prevmajor.$prevminor.$prevmicro"
if [ "$PREV_TAG" != "$INTERMEDIATE_TAG" ]; then
echo "Intermediate Release: $intmajor.$intminor.$intmicro"
fi
#if [ $((prevmicro % 2)) -ne 0 ]; then
#echo "Releases must have an even micro version."
#exit 1
#fi
#if [ $is_dev_release -eq 0 ]; then
#if [ $((prevminor % 2)) -ne 0 ]; then
#echo "$ver is not a stable version."
#exit 1
#fi
#fi
prev_date=`git log -1 --format=%ci $PREV_TAG`
int_date=`git log -1 --format=%ci $INTERMEDIATE_TAG`
cur_date=`git log -1 --format=%ci $TAG`
get_issues_mrs()
{
@@ -116,7 +148,7 @@ count_contributors()
folders=$1
text=$2
contributors=`git --no-pager shortlog -sn $PREV..$CUR -- $folders`
contributors=`git --no-pager shortlog -sn $PREV_TAG..$TAG -- $folders`
if [ -n "$contributors" ]; then
contributors=`echo "$contributors" | cut -f2`
n_contributors=`echo "$contributors" | wc -l`
@@ -152,11 +184,16 @@ count_repo_contributors()
text=$3
prev_tag=$4
cur_tag=$5
since_date=$6
cd $repo
git fetch origin > /dev/null 2>&1
if [ -z "$cur_tag" ]; then
contributors=`git --no-pager shortlog -sn --since="$prev_date" --until="$cur_date" origin/$branch`
if [ -z "$since_date" ]; then
contributors=`git --no-pager shortlog -sn --since="$prev_date" --until="$cur_date" origin/$branch`
else
contributors=`git --no-pager shortlog -sn --since="$since_date" --until="$cur_date" origin/$branch`
fi
else
contributors=`git --no-pager shortlog -sn $prev_tag..$cur_tag`
fi
@@ -177,15 +214,20 @@ count_repo_contributors()
cd - > /dev/null
}
echo "Copy the below text into your release news:"
echo
echo "-------------------------------------------"
echo
echo "Since [GIMP $prevmajor.$prevminor.$prevmicro](/release/$prevmajor.$prevminor.$prevmicro/), in the main GIMP repository:"
echo
echo "* $closed_issues reports were closed as FIXED."
echo "* $merged_mrs merge requests were merged."
# Main stats:
contribs=`git --no-pager shortlog -s -n $PREV..$CUR`
contribs=`git --no-pager shortlog -s -n $PREV_TAG..$TAG`
contribs_n=`printf "$contribs" | wc -l`
commits_n=`git log --oneline $PREV..$CUR | wc -l`
commits_n=`git log --oneline $PREV_TAG..$TAG | wc -l`
echo "* $commits_n commits were pushed."
@@ -195,16 +237,16 @@ echo "* $commits_n commits were pushed."
#commits_rate=$(( $commits_n / $days_n ))
#echo "Start date: $prev_date - End date: $cur_date"
#echo "Between $PREV and $CUR, $contribs_n people contributed $commits_n commits to GIMP."
#echo "Between $PREV_TAG and $TAG, $contribs_n people contributed $commits_n commits to GIMP."
#echo "This is an average of $commits_rate commits a day."
#echo
#echo "Statistics on all files:" `git diff --shortstat $PREV..$CUR 2>/dev/null`
#echo "Statistics on all files:" `git diff --shortstat $PREV_TAG..$TAG 2>/dev/null`
#echo
#echo "Total contributor list:"
#printf "$contribs"
# Translation stats:
i18n=`git --no-pager log --stat $PREV..$CUR -- po* | grep "Updated\? .* \(translation\|language\)"`
i18n=`git --no-pager log --stat $PREV_TAG..$TAG -- po* | grep "Updated\? .* \(translation\|language\)"`
i18n=`printf "$i18n" | sed "s/ *Updated\? \(.*\) \(translation\|language\).*/\\1/" | sort | uniq`
i18n_n=`printf "$i18n" | wc -l`
# It seems that if the last line has no newline, wc does not count it.
@@ -214,7 +256,7 @@ i18n_comma=`printf "$i18n" | paste -s -d, | sed 's/,/, /g'`
echo "* $i18n_n translations were updated: $i18n_comma."
#echo "Statistics on C files:" `git diff --shortstat $PREV..$CUR -- "*.[ch]" 2>/dev/null`
#echo "Statistics on C files:" `git diff --shortstat $PREV_TAG..$TAG -- "*.[ch]" 2>/dev/null`
echo
echo "$contribs_n people contributed changes or fixes to GIMP $major.$minor.$micro codebase (order
@@ -229,7 +271,7 @@ count_contributors 'themes/*/*.css themes/*/*png' "%d theme designers: %s"
meson_builds=`find . -name meson.build -not -path gimp-data`
count_contributors "meson_options.txt $meson_builds .gitlab-ci.yml build" "%d build, packaging or CI contributors: %s"
count_contributors 'data/ etc/ desktop/ menus/ docs/ devel-docs/ NEWS INSTALL.in' "%d contributors on other types of resources: %s"
count_repo_contributors "gimp-data" main "The gimp-data submodule had %d commits by %d contributors: %s"
count_repo_contributors "gimp-data" main "The gimp-data submodule had %d commits by %d contributors: %s" "" "" $int_date
count_data_contributors 'images' "%d image creators: %s"
count_data_contributors 'icons/*.svg icons/*.png' "%d icon designers: %s"
count_data_contributors 'cursors' "%d cursor designers: %s"
@@ -251,23 +293,23 @@ echo "number of commits):"
echo
echo "* Our UX tracker had $ux_closed_issues reports closed as FIXED."
babl_ver=`get_latest_from_meson babl $CUR`
prev_babl_ver=`get_latest_from_meson babl $PREV`
babl_ver=`get_latest_from_meson babl $TAG`
prev_babl_ver=`get_latest_from_meson babl $PREV_TAG`
if [ "$babl_ver" != "$prev_babl_ver" ]; then
prev_tag=`get_tag_from_version BABL $prev_babl_ver`
cur_tag=`get_tag_from_version BABL $babl_ver`
count_repo_contributors "../babl" master "babl $babl_ver is made of %d commits by %d contributors: %s" $prev_tag $cur_tag
fi
gegl_ver=`get_latest_from_meson gegl $CUR`
prev_gegl_ver=`get_latest_from_meson gegl $PREV`
gegl_ver=`get_latest_from_meson gegl $TAG`
prev_gegl_ver=`get_latest_from_meson gegl $PREV_TAG`
if [ "$gegl_ver" != "$prev_gegl_ver" ]; then
prev_tag=`get_tag_from_version GEGL $prev_gegl_ver`
cur_tag=`get_tag_from_version GEGL $gegl_ver`
count_repo_contributors "../gegl" master "GEGL $gegl_ver is made of %d commits by %d contributors: %s" $prev_tag $cur_tag
fi
count_repo_contributors "../ctx.graphics" dev "[ctx](https://ctx.graphics/) had %d commits since $prevmajor.$prevminor.$prevmicro release by %d contributors: %s"
count_repo_contributors "../ctx.graphics" dev "[ctx](https://ctx.graphics/) had %d commits since $intmajor.$intminor.$intmicro release by %d contributors: %s"
count_repo_contributors "../gimp-test-images" main "The \`gimp-test-images\` (unit testing repository) repository had %d commits by %d contributors: %s"
count_repo_contributors "../gimp-macos-build" master "The \`gimp-macos-build\` (macOS packaging scripts) release had %d commits by %d contributors: %s"
# TODO: