import OL gimp-3.0.4-1.el9_7.1
This commit is contained in:
parent
fac97f0b7c
commit
df751d603e
@ -1 +1 @@
|
||||
79324eeafe2b63fe7f2b1637e57b683695af8f05 SOURCES/gimp-2.99.8.tar.bz2
|
||||
f7c52adcf5c8ab3e858ac776d3b7cedd1f94a891 SOURCES/gimp-3.0.4.tar.xz
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
||||
SOURCES/gimp-2.99.8.tar.bz2
|
||||
SOURCES/gimp-3.0.4.tar.xz
|
||||
|
||||
@ -1,25 +0,0 @@
|
||||
diff -up gimp-2.10.14/etc/gimprc.in.cm-system-monitor-profile-by-default gimp-2.10.14/etc/gimprc.in
|
||||
--- gimp-2.10.14/etc/gimprc.in.cm-system-monitor-profile-by-default 2019-10-26 21:46:48.000000000 +0200
|
||||
+++ gimp-2.10.14/etc/gimprc.in 2019-11-04 13:17:23.322750636 +0100
|
||||
@@ -317,9 +317,9 @@
|
||||
|
||||
# Defines the color management behavior. This is a parameter list.
|
||||
#
|
||||
-# (color-management
|
||||
+(color-management
|
||||
# (mode display)
|
||||
-# (display-profile-from-gdk no)
|
||||
+ (display-profile-from-gdk no)
|
||||
# (display-rendering-intent relative-colorimetric)
|
||||
# (display-use-black-point-compensation yes)
|
||||
# (display-optimize yes)
|
||||
@@ -328,7 +328,8 @@
|
||||
# (simulation-optimize yes)
|
||||
# (simulation-gamut-check no)
|
||||
# (out-of-gamut-color (color-rgb 1 0 1))
|
||||
-# (display-module "CdisplayLcms"))
|
||||
+# (display-module "CdisplayLcms")
|
||||
+)
|
||||
|
||||
# Keep a permanent record of all opened and saved files in the Recent
|
||||
# Documents list. Possible values are yes and no.
|
||||
@ -1,12 +0,0 @@
|
||||
diff -up gimp-2.10.18/etc/gimprc.in.no-phone-home-default gimp-2.10.18/etc/gimprc.in
|
||||
--- gimp-2.10.18/etc/gimprc.in.no-phone-home-default 2020-02-23 21:15:47.217777581 +0100
|
||||
+++ gimp-2.10.18/etc/gimprc.in 2020-02-23 21:22:42.416162110 +0100
|
||||
@@ -393,7 +393,7 @@
|
||||
# Check for availability of GIMP updates through background internet queries.
|
||||
# Possible values are yes and no.
|
||||
#
|
||||
-# (check-updates yes)
|
||||
+(check-updates no)
|
||||
|
||||
# Timestamp of the last update check. (null)
|
||||
#
|
||||
@ -1,12 +0,0 @@
|
||||
diff -up gimp-2.10.24/etc/gimprc.in.external-help-browser gimp-2.10.24/etc/gimprc.in
|
||||
--- gimp-2.10.24/etc/gimprc.in.external-help-browser 2021-04-03 00:02:39.312656132 +0200
|
||||
+++ gimp-2.10.24/etc/gimprc.in 2021-04-03 00:03:27.360453285 +0200
|
||||
@@ -836,7 +836,7 @@
|
||||
# Sets the browser used by the help system. Possible values are gimp and
|
||||
# web-browser.
|
||||
#
|
||||
-# (help-browser web-browser)
|
||||
+(help-browser web-browser)
|
||||
|
||||
# When enabled, a search of actions will also return inactive actions.
|
||||
# Possible values are yes and no.
|
||||
@ -1,98 +0,0 @@
|
||||
Built out of the following commits from release 2.10.36:
|
||||
- 7db71cd0b6e36c454aa0d2d3efeec7e636db4dbc
|
||||
- e92f279c97282a2b20dca0d923db7465f2057703
|
||||
- 9dda8139e4d07e3a273436eda993fef32555edbe
|
||||
|
||||
Applied onto worktree starting from top to bottom.
|
||||
---
|
||||
plug-ins/file-dds/ddsread.c | 39 +++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 39 insertions(+)
|
||||
|
||||
diff --git a/plug-ins/file-dds/ddsread.c b/plug-ins/file-dds/ddsread.c
|
||||
index 72102d0e1c..ba5b712edd 100644
|
||||
--- a/plug-ins/file-dds/ddsread.c
|
||||
+++ b/plug-ins/file-dds/ddsread.c
|
||||
@@ -124,6 +124,7 @@ read_dds (GFile *file,
|
||||
guint l = 0;
|
||||
guchar *pixels;
|
||||
FILE *fp;
|
||||
+ gsize file_size;
|
||||
dds_header_t hdr;
|
||||
dds_header_dx10_t dx10hdr;
|
||||
dds_load_info_t d;
|
||||
@@ -157,6 +158,10 @@ read_dds (GFile *file,
|
||||
return GIMP_PDB_EXECUTION_ERROR;
|
||||
}
|
||||
|
||||
+ fseek (fp, 0L, SEEK_END);
|
||||
+ file_size = ftell (fp);
|
||||
+ fseek (fp, 0, SEEK_SET);
|
||||
+
|
||||
gimp_progress_init_printf ("Loading %s:", gimp_file_get_utf8_name (file));
|
||||
|
||||
/* read header */
|
||||
@@ -317,6 +322,16 @@ read_dds (GFile *file,
|
||||
precision = GIMP_PRECISION_U8_NON_LINEAR;
|
||||
}
|
||||
|
||||
+ /* verify header information is accurate */
|
||||
+ if (hdr.depth < 1 ||
|
||||
+ (hdr.pitch_or_linsize > (file_size - sizeof (hdr))) ||
|
||||
+ (((guint64) hdr.height * hdr.width * hdr.depth) > (file_size - sizeof (hdr))))
|
||||
+ {
|
||||
+ fclose (fp);
|
||||
+ g_message ("Invalid or corrupted DDS header\n");
|
||||
+ return GIMP_PDB_EXECUTION_ERROR;
|
||||
+ }
|
||||
+
|
||||
image = gimp_image_new_with_precision (hdr.width, hdr.height, type, precision);
|
||||
|
||||
if (! image)
|
||||
@@ -985,6 +1000,14 @@ load_layer (FILE *fp,
|
||||
guint size = hdr->pitch_or_linsize >> (2 * level);
|
||||
guint layerw;
|
||||
gint format = DDS_COMPRESS_NONE;
|
||||
+ gsize file_size;
|
||||
+ gsize current_position;
|
||||
+
|
||||
+ current_position = ftell (fp);
|
||||
+ fseek (fp, 0L, SEEK_END);
|
||||
+ file_size = ftell (fp);
|
||||
+ fseek (fp, 0, SEEK_SET);
|
||||
+ fseek (fp, current_position, SEEK_SET);
|
||||
|
||||
if (width < 1) width = 1;
|
||||
if (height < 1) height = 1;
|
||||
@@ -1082,6 +1105,13 @@ load_layer (FILE *fp,
|
||||
size *= 16;
|
||||
}
|
||||
|
||||
+ if (size > (file_size - current_position) ||
|
||||
+ size > hdr->pitch_or_linsize)
|
||||
+ {
|
||||
+ g_message ("Requested data exceeds size of file.\n");
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
if ((hdr->flags & DDSD_LINEARSIZE) &&
|
||||
!fread (buf, size, 1, fp))
|
||||
{
|
||||
@@ -1121,6 +1151,15 @@ load_layer (FILE *fp,
|
||||
gimp_progress_update ((double) y / (double) hdr->height);
|
||||
}
|
||||
|
||||
+ current_position = ftell (fp);
|
||||
+ if ((hdr->flags & DDSD_PITCH) &&
|
||||
+ ((width * d->bpp) > (file_size - current_position) ||
|
||||
+ (width * d->bpp) > hdr->pitch_or_linsize))
|
||||
+ {
|
||||
+ g_message ("Requested data exceeds size of file.\n");
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
if ((hdr->flags & DDSD_PITCH) &&
|
||||
! fread (buf, width * d->bpp, 1, fp))
|
||||
{
|
||||
--
|
||||
2.43.0
|
||||
|
||||
@ -1,20 +0,0 @@
|
||||
O-Commit: 865cc56894dcb6e1c664a55e4b4010ebf6919e10
|
||||
---
|
||||
plug-ins/file-psd/psd-util.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/plug-ins/file-psd/psd-util.c b/plug-ins/file-psd/psd-util.c
|
||||
index 761865e7af..545bd32f7c 100644
|
||||
--- a/plug-ins/file-psd/psd-util.c
|
||||
+++ b/plug-ins/file-psd/psd-util.c
|
||||
@@ -583,6 +583,7 @@ decode_packbits (const gchar *src,
|
||||
{
|
||||
IFDBG(2) g_debug ("Overrun in packbits replicate of %d chars", n - unpack_left);
|
||||
error_code = 2;
|
||||
+ break;
|
||||
}
|
||||
memset (dst, *src, n);
|
||||
src++;
|
||||
--
|
||||
2.43.0
|
||||
|
||||
@ -1,31 +0,0 @@
|
||||
O-Commit: 9c9521e99dd24a73fe7701bf5bde6dbbd26c4862
|
||||
---
|
||||
plug-ins/common/file-psp.c | 11 ++++++++++-
|
||||
1 file changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/plug-ins/common/file-psp.c b/plug-ins/common/file-psp.c
|
||||
index f891ca1856..6944ad4072 100644
|
||||
--- a/plug-ins/common/file-psp.c
|
||||
+++ b/plug-ins/common/file-psp.c
|
||||
@@ -1278,8 +1278,17 @@ read_color_block (FILE *f,
|
||||
}
|
||||
|
||||
color_palette_entries = GUINT32_FROM_LE (entry_count);
|
||||
+ /* TODO: GIMP currently only supports a maximum of 256 colors
|
||||
+ * in an indexed image. If this changes, we can change this check */
|
||||
+ if (color_palette_entries > 256)
|
||||
+ {
|
||||
+ g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
|
||||
+ _("Error: Unsupported palette size"));
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
/* psp color palette entries are stored as RGBA so 4 bytes per entry
|
||||
- where the fourth bytes is always zero */
|
||||
+ * where the fourth bytes is always zero */
|
||||
pal_size = color_palette_entries * 4;
|
||||
color_palette = g_malloc (pal_size);
|
||||
if (fread (color_palette, pal_size, 1, f) < 1)
|
||||
--
|
||||
2.43.0
|
||||
|
||||
@ -1,21 +0,0 @@
|
||||
O-Commit: d52d32cb82905e4ee58d249dcde9e8d47f2b915d
|
||||
---
|
||||
plug-ins/common/file-psp.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/plug-ins/common/file-psp.c b/plug-ins/common/file-psp.c
|
||||
index 6944ad4072..d1156d4732 100644
|
||||
--- a/plug-ins/common/file-psp.c
|
||||
+++ b/plug-ins/common/file-psp.c
|
||||
@@ -1657,7 +1657,7 @@ read_channel_data (FILE *f,
|
||||
else
|
||||
endq = q + line_width * height;
|
||||
|
||||
- buf = g_malloc (127);
|
||||
+ buf = g_malloc (128);
|
||||
while (q < endq)
|
||||
{
|
||||
fread (&runcount, 1, 1, f);
|
||||
--
|
||||
2.43.0
|
||||
|
||||
@ -0,0 +1,26 @@
|
||||
diff -urNp old/etc/gimprc.in new/etc/gimprc.in
|
||||
--- old/etc/gimprc.in 2025-05-02 16:05:59.766235164 +0200
|
||||
+++ new/etc/gimprc.in 2025-05-02 16:08:52.117193144 +0200
|
||||
@@ -316,9 +316,9 @@
|
||||
|
||||
# Defines the color management behavior. This is a parameter list.
|
||||
#
|
||||
-# (color-management
|
||||
+ (color-management
|
||||
# (mode display)
|
||||
-# (display-profile-from-gdk no)
|
||||
+ (display-profile-from-gdk no)
|
||||
# (display-rendering-intent relative-colorimetric)
|
||||
# (display-use-black-point-compensation yes)
|
||||
# (display-optimize yes)
|
||||
@@ -326,7 +326,9 @@
|
||||
# (simulation-use-black-point-compensation no)
|
||||
# (simulation-optimize yes)
|
||||
# (simulation-gamut-check no)
|
||||
-# (out-of-gamut-color (color-rgb 1 0 1)))
|
||||
+# (out-of-gamut-color (color-rgb 1 0 1))
|
||||
+ (display-module "CdisplayLcms")
|
||||
+)
|
||||
|
||||
# Keep a permanent record of all opened and saved files in the Recent
|
||||
# Documents list. Possible values are yes and no.
|
||||
12
SOURCES/gimp-3.0.2-external-help-browser.patch
Normal file
12
SOURCES/gimp-3.0.2-external-help-browser.patch
Normal file
@ -0,0 +1,12 @@
|
||||
diff -urNp old/etc/gimprc.in new/etc/gimprc.in
|
||||
--- old/etc/gimprc.in 2025-05-02 16:10:40.807797273 +0200
|
||||
+++ new/etc/gimprc.in 2025-05-02 16:12:22.380006468 +0200
|
||||
@@ -824,7 +824,7 @@
|
||||
# Sets the browser used by the help system. Possible values are gimp and
|
||||
# web-browser.
|
||||
#
|
||||
-# (help-browser gimp)
|
||||
+(help-browser web-browser)
|
||||
|
||||
# The maximum number of actions saved in history. This is an integer value.
|
||||
#
|
||||
189
SOURCES/gimp-3.0.4-CVE-2025-10920-10925-10934.patch
Normal file
189
SOURCES/gimp-3.0.4-CVE-2025-10920-10925-10934.patch
Normal file
@ -0,0 +1,189 @@
|
||||
diff -urNp a/plug-ins/common/file-dicom.c b/plug-ins/common/file-dicom.c
|
||||
--- a/plug-ins/common/file-dicom.c 2025-11-20 10:40:07.878919653 +0100
|
||||
+++ b/plug-ins/common/file-dicom.c 2025-11-20 10:47:48.219305960 +0100
|
||||
@@ -344,6 +344,7 @@ load_image (GFile *file,
|
||||
gint bits_stored = 0;
|
||||
gint high_bit = 0;
|
||||
guint8 *pix_buf = NULL;
|
||||
+ guint64 pixbuf_size = 0;
|
||||
gboolean is_signed = FALSE;
|
||||
guint8 in_sequence = 0;
|
||||
gboolean implicit_encoding = FALSE;
|
||||
@@ -399,6 +400,7 @@ load_image (GFile *file,
|
||||
guint16 ctx_us;
|
||||
guint8 *value;
|
||||
guint32 tag;
|
||||
+ size_t actual_read;
|
||||
|
||||
if (fread (&group_word, 1, 2, dicom) == 0)
|
||||
break;
|
||||
@@ -503,15 +505,24 @@ load_image (GFile *file,
|
||||
|
||||
if (element_length >= (G_MAXUINT - 6))
|
||||
{
|
||||
- g_message ("'%s' seems to have an incorrect value field length.",
|
||||
- gimp_file_get_utf8_name (file));
|
||||
- gimp_quit ();
|
||||
+ g_set_error (error, GIMP_PLUG_IN_ERROR, 0,
|
||||
+ _("'%s' has an an incorrect value for field size. Possibly corrupt image."),
|
||||
+ gimp_file_get_utf8_name (file));
|
||||
+ g_free (dicominfo);
|
||||
+ fclose (dicom);
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
/* Read contents. Allocate a bit more to make room for casts to int
|
||||
below. */
|
||||
value = g_new0 (guint8, element_length + 4);
|
||||
- fread (value, 1, element_length, dicom);
|
||||
+ actual_read = fread (value, 1, element_length, dicom);
|
||||
+ if (actual_read < element_length)
|
||||
+ {
|
||||
+ g_warning ("Missing data: needed %u bytes, got %u. Possibly corrupt image.",
|
||||
+ element_length, (guint32) actual_read);
|
||||
+ element_length = actual_read;
|
||||
+ }
|
||||
|
||||
/* ignore everything inside of a sequence */
|
||||
if (in_sequence)
|
||||
@@ -524,7 +535,7 @@ load_image (GFile *file,
|
||||
if (big_endian && group_word != 0x0002)
|
||||
ctx_us = GUINT16_SWAP_LE_BE (ctx_us);
|
||||
|
||||
- g_debug ("group: %04x, element: %04x, length: %d",
|
||||
+ g_debug ("group: %04x, element: %04x, length: %u",
|
||||
group_word, element_word, element_length);
|
||||
g_debug ("Value: %s", (char*)value);
|
||||
/* Recognize some critical tags */
|
||||
@@ -658,6 +669,7 @@ load_image (GFile *file,
|
||||
if (group_word == 0x7fe0 && element_word == 0x0010)
|
||||
{
|
||||
pix_buf = value;
|
||||
+ pixbuf_size = element_length;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -688,25 +700,50 @@ load_image (GFile *file,
|
||||
}
|
||||
}
|
||||
|
||||
+ g_debug ("Bpp: %d, wxh: %u x %u, spp: %d\n", bpp, width, height, samples_per_pixel);
|
||||
+
|
||||
if ((bpp != 8) && (bpp != 16))
|
||||
{
|
||||
- g_message ("'%s' has a bpp of %d which GIMP cannot handle.",
|
||||
- gimp_file_get_utf8_name (file), bpp);
|
||||
- gimp_quit ();
|
||||
+ g_set_error (error, GIMP_PLUG_IN_ERROR, 0,
|
||||
+ _("'%s' has a bpp of %d which GIMP cannot handle."),
|
||||
+ gimp_file_get_utf8_name (file), bpp);
|
||||
+ g_free (pix_buf);
|
||||
+ g_free (dicominfo);
|
||||
+ fclose (dicom);
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
if ((width > GIMP_MAX_IMAGE_SIZE) || (height > GIMP_MAX_IMAGE_SIZE))
|
||||
{
|
||||
- g_message ("'%s' has a larger image size (%d x %d) than GIMP can handle.",
|
||||
- gimp_file_get_utf8_name (file), width, height);
|
||||
- gimp_quit ();
|
||||
+ g_set_error (error, GIMP_PLUG_IN_ERROR, 0,
|
||||
+ _("'%s' has a larger image size (%d x %d) than GIMP can handle."),
|
||||
+ gimp_file_get_utf8_name (file), width, height);
|
||||
+ g_free (pix_buf);
|
||||
+ g_free (dicominfo);
|
||||
+ fclose (dicom);
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
if (samples_per_pixel > 3)
|
||||
{
|
||||
- g_message ("'%s' has samples per pixel of %d which GIMP cannot handle.",
|
||||
- gimp_file_get_utf8_name (file), samples_per_pixel);
|
||||
- gimp_quit ();
|
||||
+ g_set_error (error, GIMP_PLUG_IN_ERROR, 0,
|
||||
+ _("'%s' has samples per pixel of %d which GIMP cannot handle."),
|
||||
+ gimp_file_get_utf8_name (file), samples_per_pixel);
|
||||
+ g_free (pix_buf);
|
||||
+ g_free (dicominfo);
|
||||
+ fclose (dicom);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ if ((guint64) width * height * (bpp >> 3) * samples_per_pixel > pixbuf_size)
|
||||
+ {
|
||||
+ g_set_error (error, GIMP_PLUG_IN_ERROR, 0,
|
||||
+ _("'%s' has not enough pixel data. Possibly corrupt image."),
|
||||
+ gimp_file_get_utf8_name (file));
|
||||
+ g_free (pix_buf);
|
||||
+ g_free (dicominfo);
|
||||
+ fclose (dicom);
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
dicominfo->width = width;
|
||||
diff -urNp a/plug-ins/common/file-wbmp.c b/plug-ins/common/file-wbmp.c
|
||||
--- a/plug-ins/common/file-wbmp.c 2025-11-20 10:40:07.879708221 +0100
|
||||
+++ b/plug-ins/common/file-wbmp.c 2025-11-20 10:50:11.843417667 +0100
|
||||
@@ -256,6 +256,7 @@ read_image (FILE *fd,
|
||||
GeglBuffer *buffer;
|
||||
guchar *dest, *temp;
|
||||
gint i, cur_progress, max_progress;
|
||||
+ size_t n_read;
|
||||
|
||||
/* Make a new image in GIMP */
|
||||
if ((width < 0) || (width > GIMP_MAX_IMAGE_SIZE))
|
||||
@@ -280,14 +281,14 @@ read_image (FILE *fd,
|
||||
|
||||
gimp_image_insert_layer (image, layer, NULL, 0);
|
||||
|
||||
- dest = g_malloc0 (width * height);
|
||||
+ dest = g_malloc0 ((gsize) width * height);
|
||||
|
||||
ypos = 0;
|
||||
|
||||
cur_progress = 0;
|
||||
max_progress = height;
|
||||
|
||||
- while (ReadOK (fd, &v, 1))
|
||||
+ while ((n_read = ReadOK (fd, &v, 1)) != 0)
|
||||
{
|
||||
for (i = 1; (i <= 8) && (xpos < width); i++, xpos++)
|
||||
{
|
||||
@@ -312,6 +313,9 @@ read_image (FILE *fd,
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (n_read == 0)
|
||||
+ g_warning (_("Read failure at position %u. Possibly corrupt image."), ypos * width + xpos);
|
||||
+
|
||||
buffer = gimp_drawable_get_buffer (GIMP_DRAWABLE (layer));
|
||||
|
||||
gegl_buffer_set (buffer, GEGL_RECTANGLE (0, 0, width, height), 0, NULL, dest,
|
||||
diff -urNp a/plug-ins/common/file-xwd.c b/plug-ins/common/file-xwd.c
|
||||
--- a/plug-ins/common/file-xwd.c 2025-11-20 10:40:07.879708221 +0100
|
||||
+++ b/plug-ins/common/file-xwd.c 2025-11-20 10:41:46.852626816 +0100
|
||||
@@ -1683,9 +1683,20 @@ load_xwd_f2_d16_b16 (GFile *fi
|
||||
greenval = (green * 255) / maxgreen;
|
||||
for (blue = 0; blue <= maxblue; blue++)
|
||||
{
|
||||
+ guint32 offset = ((red << redshift) + (green << greenshift) +
|
||||
+ (blue << blueshift)) * 3;
|
||||
+
|
||||
+ if (offset+2 >= maxval)
|
||||
+ {
|
||||
+ g_set_error (error, GIMP_PLUG_IN_ERROR, 0,
|
||||
+ _("Invalid colormap offset. Possibly corrupt image."));
|
||||
+ g_free (data);
|
||||
+ g_free (ColorMap);
|
||||
+ g_object_unref (buffer);
|
||||
+ return NULL;
|
||||
+ }
|
||||
blueval = (blue * 255) / maxblue;
|
||||
- cm = ColorMap + ((red << redshift) + (green << greenshift)
|
||||
- + (blue << blueshift)) * 3;
|
||||
+ cm = ColorMap + offset;
|
||||
*(cm++) = redval;
|
||||
*(cm++) = greenval;
|
||||
*cm = blueval;
|
||||
153
SOURCES/gimp-3.0.4-glib.patch
Normal file
153
SOURCES/gimp-3.0.4-glib.patch
Normal file
@ -0,0 +1,153 @@
|
||||
diff -urNp a/app/core/gimpimage-colormap.c b/app/core/gimpimage-colormap.c
|
||||
--- a/app/core/gimpimage-colormap.c 2025-05-20 09:08:24.351925471 +0200
|
||||
+++ b/app/core/gimpimage-colormap.c 2025-05-20 09:20:42.372348093 +0200
|
||||
@@ -328,9 +328,8 @@ gimp_image_colormap_is_index_used (GimpI
|
||||
num_processors = GIMP_GEGL_CONFIG (image->gimp->config)->num_processors;
|
||||
layers = gimp_image_get_layer_list (image);
|
||||
|
||||
- pool = g_thread_pool_new_full ((GFunc) gimp_image_colormap_thread_is_index_used,
|
||||
+ pool = g_thread_pool_new ((GFunc) gimp_image_colormap_thread_is_index_used,
|
||||
GINT_TO_POINTER (color_index),
|
||||
- (GDestroyNotify) g_free,
|
||||
num_processors, TRUE, NULL);
|
||||
for (iter = layers; iter; iter = g_list_next (iter))
|
||||
{
|
||||
diff -urNp a/app/core/gimpitemlist.c b/app/core/gimpitemlist.c
|
||||
--- a/app/core/gimpitemlist.c 2025-05-20 09:08:24.354925484 +0200
|
||||
+++ b/app/core/gimpitemlist.c 2025-05-20 09:20:03.980745485 +0200
|
||||
@@ -629,7 +629,7 @@ gimp_item_list_get_items_by_glob (GimpIt
|
||||
spec = g_pattern_spec_new (pattern);
|
||||
for (iter = items; iter; iter = iter->next)
|
||||
{
|
||||
- if (g_pattern_spec_match_string (spec, gimp_object_get_name (iter->data)))
|
||||
+ if (g_pattern_match_string (spec, gimp_object_get_name (iter->data)))
|
||||
match = g_list_prepend (match, iter->data);
|
||||
}
|
||||
g_pattern_spec_free (spec);
|
||||
diff -urNp a/app/plug-in/gimpplugin.c b/app/plug-in/gimpplugin.c
|
||||
--- a/app/plug-in/gimpplugin.c 2025-05-20 09:08:24.339925418 +0200
|
||||
+++ b/app/plug-in/gimpplugin.c 2025-05-20 09:19:19.516679552 +0200
|
||||
@@ -403,7 +403,7 @@ gimp_plug_in_close_waitpid (GPid
|
||||
GError *error = NULL;
|
||||
|
||||
if (plug_in->manager->gimp->be_verbose &&
|
||||
- ! g_spawn_check_wait_status (status, &error))
|
||||
+ ! g_spawn_check_exit_status (status, &error))
|
||||
{
|
||||
g_printerr ("Process for plug-in '%s' terminated with error: %s\n",
|
||||
gimp_object_get_name (plug_in),
|
||||
diff -urNp a/app/sanity.c b/app/sanity.c
|
||||
--- a/app/sanity.c 2025-05-20 09:08:24.395925663 +0200
|
||||
+++ b/app/sanity.c 2025-05-20 09:18:48.132179032 +0200
|
||||
@@ -171,7 +171,7 @@ static gchar *
|
||||
sanity_check_glib (void)
|
||||
{
|
||||
#define GLIB_REQUIRED_MAJOR 2
|
||||
-#define GLIB_REQUIRED_MINOR 70
|
||||
+#define GLIB_REQUIRED_MINOR 68
|
||||
#define GLIB_REQUIRED_MICRO 0
|
||||
|
||||
const gchar *mismatch = glib_check_version (GLIB_REQUIRED_MAJOR,
|
||||
diff -urNp a/app/text/gimptext.c b/app/text/gimptext.c
|
||||
--- a/app/text/gimptext.c 2025-05-20 09:08:24.397925671 +0200
|
||||
+++ b/app/text/gimptext.c 2025-05-20 09:16:10.900785765 +0200
|
||||
@@ -827,7 +827,8 @@ gimp_text_serialize_property (GimpConfig
|
||||
|
||||
for (guint i = 0; i < length; ++i)
|
||||
{
|
||||
- PangoAttrFontDesc *attr_font_desc = pango_attribute_as_font_desc ((PangoAttribute*)g_slist_nth_data (list, i));
|
||||
+ PangoAttrFontDesc *attr_font_desc = (((PangoAttribute*)g_slist_nth_data (list, i))->klass->type == PANGO_ATTR_FONT_DESC
|
||||
+ ? (PangoAttrFontDesc *)g_slist_nth_data (list, i) : NULL );
|
||||
|
||||
if (attr_font_desc != NULL)
|
||||
{
|
||||
diff -urNp a/app/text/gimptext-parasite.c b/app/text/gimptext-parasite.c
|
||||
--- a/app/text/gimptext-parasite.c 2025-05-20 09:08:24.397925671 +0200
|
||||
+++ b/app/text/gimptext-parasite.c 2025-05-20 09:15:33.606149497 +0200
|
||||
@@ -131,7 +131,8 @@ gimp_text_from_parasite (const GimpParas
|
||||
|
||||
for (guint i = 0; i < length; ++i)
|
||||
{
|
||||
- PangoAttrFontDesc *attr_font_desc = pango_attribute_as_font_desc ((PangoAttribute*)g_slist_nth_data (list, i));
|
||||
+ PangoAttrFontDesc *attr_font_desc = (((PangoAttribute*)g_slist_nth_data (list, i))->klass->type == PANGO_ATTR_FONT_DESC
|
||||
+ ? (PangoAttrFontDesc *)g_slist_nth_data (list, i) : NULL );
|
||||
|
||||
if (attr_font_desc != NULL)
|
||||
{
|
||||
diff -urNp a/app/xcf/xcf-save.c b/app/xcf/xcf-save.c
|
||||
--- a/app/xcf/xcf-save.c 2025-05-20 09:08:24.399171071 +0200
|
||||
+++ b/app/xcf/xcf-save.c 2025-05-20 09:14:35.628966564 +0200
|
||||
@@ -2389,9 +2389,8 @@ xcf_save_level (XcfInfo *info,
|
||||
* i.e. there is a bug in our code.
|
||||
*/
|
||||
queue = g_async_queue_new_full ((GDestroyNotify) xcf_save_free_job_data);
|
||||
- pool = g_thread_pool_new_full ((GFunc) xcf_save_tile_parallel,
|
||||
+ pool = g_thread_pool_new ((GFunc) xcf_save_tile_parallel,
|
||||
queue,
|
||||
- (GDestroyNotify) xcf_save_free_job_data,
|
||||
num_processors, TRUE, NULL);
|
||||
|
||||
i = 0;
|
||||
diff -urNp a/libgimp/gimpvectorloadprocedure.c b/libgimp/gimpvectorloadprocedure.c
|
||||
--- a/libgimp/gimpvectorloadprocedure.c 2025-05-20 09:08:24.489926072 +0200
|
||||
+++ b/libgimp/gimpvectorloadprocedure.c 2025-05-20 09:13:46.148798654 +0200
|
||||
@@ -370,7 +370,7 @@ gimp_vector_load_procedure_run (GimpProc
|
||||
}
|
||||
}
|
||||
|
||||
- g_prefix_error_literal (&error, _("Vector image loading plug-in failed: "));
|
||||
+ //g_prefix_error_literal (&error, _("Vector image loading plug-in failed: "));
|
||||
}
|
||||
|
||||
/* One or both dimensions are still zero at this point. */
|
||||
diff -urNp a/libgimpbase/gimpchoice.c b/libgimpbase/gimpchoice.c
|
||||
--- a/libgimpbase/gimpchoice.c 2025-05-20 09:08:24.491384100 +0200
|
||||
+++ b/libgimpbase/gimpchoice.c 2025-05-20 09:13:13.230538618 +0200
|
||||
@@ -454,7 +454,7 @@ gimp_param_choice_class_init (GParamSpec
|
||||
klass->value_type = G_TYPE_STRING;
|
||||
klass->finalize = gimp_param_choice_finalize;
|
||||
klass->value_validate = gimp_param_choice_validate;
|
||||
- klass->value_is_valid = gimp_param_choice_value_is_valid;
|
||||
+ //klass->value_is_valid = gimp_param_choice_value_is_valid;
|
||||
klass->values_cmp = gimp_param_choice_values_cmp;
|
||||
}
|
||||
|
||||
diff -urNp a/meson.build b/meson.build
|
||||
--- a/meson.build 2025-05-20 09:08:24.256925056 +0200
|
||||
+++ b/meson.build 2025-05-20 09:12:38.933510408 +0200
|
||||
@@ -432,7 +432,7 @@ gio = dependency('gio-2.0'
|
||||
gio_specific_name = platform_windows ? 'gio-windows-2.0' : 'gio-unix-2.0'
|
||||
gio_specific = dependency(gio_specific_name)
|
||||
|
||||
-glib_minver = '2.70.0'
|
||||
+glib_minver = '2.68.0'
|
||||
glib = dependency('glib-2.0', version: '>='+glib_minver)
|
||||
gi = dependency('gobject-introspection-1.0')
|
||||
|
||||
@@ -443,7 +443,7 @@ gmodule = dependency('gmodule-
|
||||
|
||||
gtk3_minver = '3.24.0'
|
||||
gtk3 = dependency('gtk+-3.0', version: '>='+gtk3_minver)
|
||||
-harfbuzz_minver = '2.8.2'
|
||||
+harfbuzz_minver = '2.7.4'
|
||||
harfbuzz = dependency('harfbuzz', version: '>='+harfbuzz_minver)
|
||||
json_glib_minver = '1.2.6'
|
||||
json_glib = dependency('json-glib-1.0', version: '>='+json_glib_minver)
|
||||
@@ -472,7 +472,7 @@ endif
|
||||
|
||||
conf.set_quoted('MYPAINT_BRUSHES_DIR', mypaint_brushes_dir)
|
||||
|
||||
-pango_minver = '1.50.0'
|
||||
+pango_minver = '1.48.0'
|
||||
if platform_osx
|
||||
pango_macos_recommended_version = '1.55.0'
|
||||
pango_macos_warning='''
|
||||
@@ -1837,6 +1837,8 @@ if is_git_repository
|
||||
endif
|
||||
endif
|
||||
|
||||
+conf.set('G_DEFINE_FINAL_TYPE(TN, t_n, T_P)', 'G_DEFINE_TYPE(TN, t_n, T_P)')
|
||||
+
|
||||
configure_file(
|
||||
output: 'config.h',
|
||||
configuration: conf
|
||||
@ -1,60 +0,0 @@
|
||||
From 4f99f1fcfd892ead19831b5adcd38a99d71214b6 Mon Sep 17 00:00:00 2001
|
||||
From: Jacob Boerema <jgboerema@gmail.com>
|
||||
Date: Fri, 29 Apr 2022 16:40:32 -0400
|
||||
Subject: [PATCH] app: fix #8120 GIMP 2.10.30 crashed when allocate large
|
||||
memory
|
||||
|
||||
GIMP could crash if the information regarding old path properties read
|
||||
from XCF was incorrect. It did not check if xcf_old_path succeeded and
|
||||
kept trying to load more paths even if the last one failed to load.
|
||||
|
||||
Instead we now stop loading paths as soon as that function fails.
|
||||
In case we have a failure here we also try to skip to the next property
|
||||
based on the size of the path property, in hopes that the only problem
|
||||
was this property.
|
||||
---
|
||||
app/xcf/xcf-load.c | 14 +++++++++++---
|
||||
1 file changed, 11 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/app/xcf/xcf-load.c b/app/xcf/xcf-load.c
|
||||
index ac9c4ea248..67bc766390 100644
|
||||
--- a/app/xcf/xcf-load.c
|
||||
+++ b/app/xcf/xcf-load.c
|
||||
@@ -1168,7 +1168,12 @@ xcf_load_image_props (XcfInfo *info,
|
||||
break;
|
||||
|
||||
case PROP_PATHS:
|
||||
- xcf_load_old_paths (info, image);
|
||||
+ {
|
||||
+ goffset base = info->cp;
|
||||
+
|
||||
+ if (! xcf_load_old_paths (info, image))
|
||||
+ xcf_seek_pos (info, base + prop_size, NULL);
|
||||
+ }
|
||||
break;
|
||||
|
||||
case PROP_USER_UNIT:
|
||||
@@ -3035,8 +3040,11 @@ xcf_load_old_paths (XcfInfo *info,
|
||||
xcf_read_int32 (info, &last_selected_row, 1);
|
||||
xcf_read_int32 (info, &num_paths, 1);
|
||||
|
||||
+ GIMP_LOG (XCF, "Number of old paths: %u", num_paths);
|
||||
+
|
||||
while (num_paths-- > 0)
|
||||
- xcf_load_old_path (info, image);
|
||||
+ if (! xcf_load_old_path (info, image))
|
||||
+ return FALSE;
|
||||
|
||||
active_vectors =
|
||||
GIMP_VECTORS (gimp_container_get_child_by_index (gimp_image_get_vectors (image),
|
||||
@@ -3087,7 +3095,7 @@ xcf_load_old_path (XcfInfo *info,
|
||||
}
|
||||
else if (version != 1)
|
||||
{
|
||||
- g_printerr ("Unknown path type. Possibly corrupt XCF file");
|
||||
+ g_printerr ("Unknown path type (version: %u). Possibly corrupt XCF file.\n", version);
|
||||
|
||||
g_free (name);
|
||||
return FALSE;
|
||||
--
|
||||
GitLab
|
||||
@ -1,31 +0,0 @@
|
||||
From 22af0bcfe67c1c86381f33975ca7fdbde6b36b39 Mon Sep 17 00:00:00 2001
|
||||
From: Jacob Boerema <jgboerema@gmail.com>
|
||||
Date: Sun, 5 Jun 2022 15:38:24 -0400
|
||||
Subject: [PATCH] app: fix #8230 crash in gimp_layer_invalidate_boundary when
|
||||
channel is NULL
|
||||
|
||||
gimp_channel_is_empty returns FALSE if channel is NULL. This causes
|
||||
gimp_layer_invalidate_boundary to crash if the mask channel is NULL.
|
||||
|
||||
With a NULL channel gimp_channel_is_empty should return TRUE, just like
|
||||
the similar gimp_image_is_empty does, because returning FALSE here
|
||||
suggests we have a non empty channel.
|
||||
---
|
||||
app/core/gimpchannel.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/app/core/gimpchannel.c b/app/core/gimpchannel.c
|
||||
index 7b6a9851ae..502821ba58 100644
|
||||
--- a/app/core/gimpchannel.c
|
||||
+++ b/app/core/gimpchannel.c
|
||||
@@ -1827,7 +1827,7 @@ gimp_channel_boundary (GimpChannel *channel,
|
||||
gboolean
|
||||
gimp_channel_is_empty (GimpChannel *channel)
|
||||
{
|
||||
- g_return_val_if_fail (GIMP_IS_CHANNEL (channel), FALSE);
|
||||
+ g_return_val_if_fail (GIMP_IS_CHANNEL (channel), TRUE);
|
||||
|
||||
return GIMP_CHANNEL_GET_CLASS (channel)->is_empty (channel);
|
||||
}
|
||||
--
|
||||
GitLab
|
||||
@ -1,159 +0,0 @@
|
||||
diff --git a/plug-ins/common/file-tga.c b/plug-ins/common/file-tga.c
|
||||
index f6f24a13194..c0d7ad94c20 100644
|
||||
--- a/plug-ins/common/file-tga.c
|
||||
+++ b/plug-ins/common/file-tga.c
|
||||
@@ -982,9 +982,9 @@ ReadImage (FILE *fp,
|
||||
cmap_bytes = (info->colorMapSize + 7 ) / 8;
|
||||
tga_cmap = g_new (guchar, info->colorMapLength * cmap_bytes);
|
||||
|
||||
- if (info->colorMapSize > 24)
|
||||
+ if (info->colorMapSize > 24 || info->alphaBits > 0)
|
||||
{
|
||||
- /* indexed + full alpha => promoted to RGBA */
|
||||
+ /* indexed + full alpha, or alpha exists => promoted to RGBA */
|
||||
itype = GIMP_RGB;
|
||||
dtype = GIMP_RGBA_IMAGE;
|
||||
convert_cmap = g_new (guchar, info->colorMapLength * 4);
|
||||
@@ -996,13 +996,6 @@ ReadImage (FILE *fp,
|
||||
dtype = GIMP_RGB_IMAGE;
|
||||
convert_cmap = g_new (guchar, info->colorMapLength * 3);
|
||||
}
|
||||
- else if (info->alphaBits > 0)
|
||||
- {
|
||||
- /* if alpha exists here, promote to RGB */
|
||||
- itype = GIMP_RGB;
|
||||
- dtype = GIMP_RGBA_IMAGE;
|
||||
- convert_cmap = g_new (guchar, info->colorMapLength * 4);
|
||||
- }
|
||||
else
|
||||
{
|
||||
itype = GIMP_INDEXED;
|
||||
---
|
||||
diff --git a/plug-ins/common/file-tga.c b/plug-ins/common/file-tga.c
|
||||
index c0d7ad94c20..433410ff471 100644
|
||||
--- a/plug-ins/common/file-tga.c
|
||||
+++ b/plug-ins/common/file-tga.c
|
||||
@@ -539,7 +539,7 @@ load_image (GFile *file,
|
||||
switch (info.imageType)
|
||||
{
|
||||
case TGA_TYPE_MAPPED:
|
||||
- if (info.bpp != 8)
|
||||
+ if (info.bpp != 8 || !info.colorMapLength)
|
||||
{
|
||||
g_message ("Unhandled sub-format in '%s' (type = %u, bpp = %u)",
|
||||
gimp_file_get_utf8_name (file),
|
||||
@@ -862,32 +862,31 @@ apply_colormap (guchar *dest,
|
||||
guint width,
|
||||
const guchar *cmap,
|
||||
gboolean alpha,
|
||||
- guint16 index)
|
||||
+ guint16 colorMapIndex,
|
||||
+ guint16 colorMapLength)
|
||||
{
|
||||
guint x;
|
||||
|
||||
- if (alpha)
|
||||
- {
|
||||
- for (x = 0; x < width; x++)
|
||||
- {
|
||||
- *(dest++) = cmap[(*src - index) * 4];
|
||||
- *(dest++) = cmap[(*src - index) * 4 + 1];
|
||||
- *(dest++) = cmap[(*src - index) * 4 + 2];
|
||||
- *(dest++) = cmap[(*src - index) * 4 + 3];
|
||||
-
|
||||
- src++;
|
||||
- }
|
||||
- }
|
||||
- else
|
||||
+ for (x = 0; x < width; x++)
|
||||
{
|
||||
- for (x = 0; x < width; x++)
|
||||
- {
|
||||
- *(dest++) = cmap[(*src - index) * 3];
|
||||
- *(dest++) = cmap[(*src - index) * 3 + 1];
|
||||
- *(dest++) = cmap[(*src - index) * 3 + 2];
|
||||
-
|
||||
- src++;
|
||||
- }
|
||||
+ guchar entryIndex = src[x] - colorMapIndex;
|
||||
+
|
||||
+ if (src[x] < colorMapIndex || entryIndex >= colorMapLength) {
|
||||
+ g_message ("Unsupported colormap entry: %u",
|
||||
+ src[x]);
|
||||
+ entryIndex = 0;
|
||||
+ }
|
||||
+
|
||||
+ if (alpha) {
|
||||
+ *(dest++) = cmap[entryIndex * 4];
|
||||
+ *(dest++) = cmap[entryIndex * 4 + 1];
|
||||
+ *(dest++) = cmap[entryIndex * 4 + 2];
|
||||
+ *(dest++) = cmap[entryIndex * 4 + 3];
|
||||
+ } else {
|
||||
+ *(dest++) = cmap[entryIndex * 3];
|
||||
+ *(dest++) = cmap[entryIndex * 3 + 1];
|
||||
+ *(dest++) = cmap[entryIndex * 3 + 2];
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -943,7 +942,7 @@ read_line (FILE *fp,
|
||||
gboolean has_alpha = (info->alphaBits > 0);
|
||||
|
||||
apply_colormap (row, buf, info->width, convert_cmap, has_alpha,
|
||||
- info->colorMapIndex);
|
||||
+ info->colorMapIndex, info->colorMapLength);
|
||||
}
|
||||
else if (info->imageType == TGA_TYPE_MAPPED)
|
||||
{
|
||||
---
|
||||
diff --git a/plug-ins/common/file-tga.c b/plug-ins/common/file-tga.c
|
||||
index 433410ff471..a171a264772 100644
|
||||
--- a/plug-ins/common/file-tga.c
|
||||
+++ b/plug-ins/common/file-tga.c
|
||||
@@ -952,7 +952,7 @@ read_line (FILE *fp,
|
||||
}
|
||||
else
|
||||
{
|
||||
- memcpy (row, buf, info->width * bpp);
|
||||
+ memcpy (row, buf, info->width * info->bytes);
|
||||
}
|
||||
}
|
||||
|
||||
---
|
||||
diff --git a/plug-ins/common/file-tga.c b/plug-ins/common/file-tga.c
|
||||
index a171a264772..abecde86857 100644
|
||||
--- a/plug-ins/common/file-tga.c
|
||||
+++ b/plug-ins/common/file-tga.c
|
||||
@@ -866,14 +866,29 @@ apply_colormap (guchar *dest,
|
||||
guint16 colorMapLength)
|
||||
{
|
||||
guint x;
|
||||
+ gint errcnt = 0;
|
||||
|
||||
for (x = 0; x < width; x++)
|
||||
{
|
||||
guchar entryIndex = src[x] - colorMapIndex;
|
||||
|
||||
if (src[x] < colorMapIndex || entryIndex >= colorMapLength) {
|
||||
- g_message ("Unsupported colormap entry: %u",
|
||||
- src[x]);
|
||||
+ /* On Windows the error console can run out of resources when
|
||||
+ * producing a huge amount of messages. This can happen when using
|
||||
+ * fuzzed test images. This causes unresponsiveness at first and
|
||||
+ * finally crashes GIMP. Eventually this needs to be fixed at the
|
||||
+ * source, but for now let's limit the error messages to 10
|
||||
+ * per line (this function is called once per read_line). */
|
||||
+ if (errcnt < 10)
|
||||
+ {
|
||||
+ g_message ("Unsupported colormap entry: %u",
|
||||
+ src[x]);
|
||||
+ }
|
||||
+ else if (errcnt == 10)
|
||||
+ {
|
||||
+ g_message ("Too many colormap errors. Image may be corrupt.");
|
||||
+ }
|
||||
+ errcnt++;
|
||||
entryIndex = 0;
|
||||
}
|
||||
|
||||
---
|
||||
@ -1,93 +0,0 @@
|
||||
diff -urNp a/app/xcf/xcf-load.c b/app/xcf/xcf-load.c
|
||||
--- a/app/xcf/xcf-load.c 2025-06-14 13:08:43.443446885 +0200
|
||||
+++ b/app/xcf/xcf-load.c 2025-06-14 13:22:09.771911460 +0200
|
||||
@@ -102,7 +102,8 @@ static gboolean xcf_check_layer_p
|
||||
gboolean *is_text_layer);
|
||||
static gboolean xcf_load_channel_props (XcfInfo *info,
|
||||
GimpImage *image,
|
||||
- GimpChannel **channel);
|
||||
+ GimpChannel **channel,
|
||||
+ gboolean is_mask);
|
||||
static gboolean xcf_load_prop (XcfInfo *info,
|
||||
PropType *prop_type,
|
||||
guint32 *prop_size);
|
||||
@@ -1213,6 +1214,14 @@ xcf_load_layer_props (XcfInfo *info,
|
||||
|
||||
case PROP_ACTIVE_LAYER:
|
||||
info->selected_layers = g_list_prepend (info->selected_layers, *layer);
|
||||
+ {
|
||||
+ if (g_list_index (info->selected_layers, *layer) < 0)
|
||||
+ info->selected_layers = g_list_prepend (info->selected_layers, *layer);
|
||||
+ else
|
||||
+ gimp_message_literal (info->gimp, G_OBJECT (info->progress),
|
||||
+ GIMP_MESSAGE_WARNING,
|
||||
+ "Invalid duplicate selected layer detected");
|
||||
+ }
|
||||
break;
|
||||
|
||||
case PROP_FLOATING_SELECTION:
|
||||
@@ -1663,7 +1672,8 @@ xcf_check_layer_props (XcfInfo *info,
|
||||
static gboolean
|
||||
xcf_load_channel_props (XcfInfo *info,
|
||||
GimpImage *image,
|
||||
- GimpChannel **channel)
|
||||
+ GimpChannel **channel,
|
||||
+ gboolean is_mask)
|
||||
{
|
||||
PropType prop_type;
|
||||
guint32 prop_size;
|
||||
@@ -1686,6 +1696,36 @@ xcf_load_channel_props (XcfInfo *in
|
||||
{
|
||||
GimpChannel *mask;
|
||||
|
||||
+ if (is_mask)
|
||||
+ {
|
||||
+ /* PROP_SELECTION is not valid for masks, and we have to avoid
|
||||
+ * overwriting the channel.
|
||||
+ */
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ if (*channel == gimp_image_get_mask (image))
|
||||
+ {
|
||||
+ /* PROP_SELECTION was already seen once for this
|
||||
+ * channel. Let's silently ignore the second identical
|
||||
+ * property to avoid a double free.
|
||||
+ */
|
||||
+ continue;
|
||||
+ }
|
||||
+ else if (gimp_image_get_mask (image) != NULL &&
|
||||
+ ! gimp_channel_is_empty (gimp_image_get_mask (image)))
|
||||
+ {
|
||||
+ /* This would happen when PROP_SELECTION was already set
|
||||
+ * on a previous channel. This is a minor case of data
|
||||
+ * loss (we don't know which selection was the right one
|
||||
+ * and we drop the non-first ones), and also means it's
|
||||
+ * a broken XCF, though it's not a major bug either. So
|
||||
+ * let's go with a stderr print.
|
||||
+ */
|
||||
+ g_printerr ("PROP_SELECTION property was set on 2 channels (skipping)\n");
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
/* We're going to delete *channel, Don't leave its pointer
|
||||
* in @info. See bug #767873.
|
||||
*/
|
||||
@@ -2155,7 +2195,7 @@ xcf_load_channel (XcfInfo *info,
|
||||
return NULL;
|
||||
|
||||
/* read in the channel properties */
|
||||
- if (! xcf_load_channel_props (info, image, &channel))
|
||||
+ if (! xcf_load_channel_props (info, image, &channel, FALSE))
|
||||
goto error;
|
||||
|
||||
xcf_progress_update (info);
|
||||
@@ -2228,7 +2268,7 @@ xcf_load_layer_mask (XcfInfo *info,
|
||||
|
||||
/* read in the layer_mask properties */
|
||||
channel = GIMP_CHANNEL (layer_mask);
|
||||
- if (! xcf_load_channel_props (info, image, &channel))
|
||||
+ if (! xcf_load_channel_props (info, image, &channel, TRUE))
|
||||
goto error;
|
||||
|
||||
xcf_progress_update (info);
|
||||
@ -1,18 +0,0 @@
|
||||
diff --git a/plug-ins/file-ico/ico-load.c b/plug-ins/file-ico/ico-load.c
|
||||
index 9a222998bc1..818cf23cd31 100644
|
||||
--- a/plug-ins/file-ico/ico-load.c
|
||||
+++ b/plug-ins/file-ico/ico-load.c
|
||||
@@ -299,7 +299,11 @@ ico_read_png (FILE *fp,
|
||||
png_read_info (png_ptr, info);
|
||||
png_get_IHDR (png_ptr, info, &w, &h, &bit_depth, &color_type,
|
||||
NULL, NULL, NULL);
|
||||
- if (w*h*4 > maxsize)
|
||||
+ /* Check for overflow */
|
||||
+ if ((w * h * 4) < w ||
|
||||
+ (w * h * 4) < h ||
|
||||
+ (w * h * 4) < (w * h) ||
|
||||
+ (w * h * 4) > maxsize)
|
||||
{
|
||||
png_destroy_read_struct (&png_ptr, &info, NULL);
|
||||
return FALSE;
|
||||
---
|
||||
@ -1,371 +0,0 @@
|
||||
diff -urNp a/extensions/goat-exercises/goat-exercise-lua.lua b/extensions/goat-exercises/goat-exercise-lua.lua
|
||||
--- a/extensions/goat-exercises/goat-exercise-lua.lua 2022-03-09 09:39:44.007314944 +0100
|
||||
+++ b/extensions/goat-exercises/goat-exercise-lua.lua 1970-01-01 01:00:00.000000000 +0100
|
||||
@@ -1,184 +0,0 @@
|
||||
-#!/usr/bin/env luajit
|
||||
-
|
||||
--- GIMP - The GNU Image Manipulation Program
|
||||
--- Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
||||
---
|
||||
--- goat-exercise-lua.lua
|
||||
--- Copyright (C) Jehan
|
||||
---
|
||||
--- This program is free software: you can redistribute it and/or modify
|
||||
--- it under the terms of the GNU General Public License as published by
|
||||
--- the Free Software Foundation; either version 3 of the License, or
|
||||
--- (at your option) any later version.
|
||||
---
|
||||
--- This program is distributed in the hope that it will be useful,
|
||||
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
--- GNU General Public License for more details.
|
||||
---
|
||||
--- You should have received a copy of the GNU General Public License
|
||||
--- along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
-
|
||||
-local lgi = require 'lgi'
|
||||
-
|
||||
-local GLib = lgi.GLib
|
||||
-local GObject = lgi.GObject
|
||||
-local Gio = lgi.Gio
|
||||
-local Gegl = lgi.Gegl
|
||||
-local Gimp = lgi.Gimp
|
||||
-local GimpUi = lgi.GimpUi
|
||||
-local Gtk = lgi.Gtk
|
||||
-local Gdk = lgi.Gdk
|
||||
-
|
||||
-local Goat = lgi.package 'Goat'
|
||||
-local Goat = lgi.Goat
|
||||
-
|
||||
-function run(procedure, run_mode, image, drawables, args, run_data)
|
||||
- -- procedure:new_return_values() crashes LGI so we construct the
|
||||
- -- GimpValueArray manually.
|
||||
- local retval = Gimp.ValueArray(1)
|
||||
-
|
||||
- if table.getn(drawables) ~= 1 then
|
||||
- local calling_err = GObject.Value(Gimp.PDBStatusType, Gimp.PDBStatusType.CALLING_ERROR)
|
||||
- local msg = "Procedure '%s' only works with one drawable."
|
||||
-
|
||||
- msg = string.format(msg, procedure:get_name())
|
||||
-
|
||||
- retval:append(calling_err)
|
||||
- retval:append(GObject.Value(GObject.Type.STRING, msg))
|
||||
- return retval
|
||||
- end
|
||||
-
|
||||
- local drawable = drawables[1]
|
||||
-
|
||||
- -- Not sure why run_mode has become a string instead of testing
|
||||
- -- against Gimp.RunMode.INTERACTIVE.
|
||||
- if run_mode == "INTERACTIVE" then
|
||||
- GimpUi.init("goat-exercise-lua");
|
||||
- local dialog = GimpUi.Dialog {
|
||||
- title = "Exercise a goat (Lua)",
|
||||
- role = "goat-exercise-Lua",
|
||||
- use_header_bar = 1
|
||||
- }
|
||||
- dialog:add_button("_Cancel", Gtk.ResponseType.CANCEL);
|
||||
- dialog:add_button("_Source", Gtk.ResponseType.APPLY);
|
||||
- dialog:add_button("_OK", Gtk.ResponseType.OK);
|
||||
-
|
||||
- local geometry = Gdk.Geometry()
|
||||
- geometry.min_aspect = 0.5;
|
||||
- geometry.max_aspect = 1.0;
|
||||
- dialog:set_geometry_hints (nil, geometry, Gdk.WindowHints.ASPECT);
|
||||
-
|
||||
- local box = Gtk.Box {
|
||||
- orientation = Gtk.Orientation.VERTICAL,
|
||||
- spacing = 2
|
||||
- }
|
||||
- dialog:get_content_area():add(box)
|
||||
- box:show()
|
||||
-
|
||||
- local lang = "Lua"
|
||||
- local head_text = "This plug-in is an exercise in '%s' to demo plug-in creation.\n" ..
|
||||
- "Check out the last version of the source code online by clicking the \"Source\" button."
|
||||
-
|
||||
- local label = Gtk.Label { label = string.format(head_text, lang) }
|
||||
- box:pack_start(label, false, false, 1)
|
||||
- label:show()
|
||||
-
|
||||
- local contents = GLib.file_get_contents(arg[0])
|
||||
- if (contents) then
|
||||
- local scrolled = Gtk.ScrolledWindow()
|
||||
- scrolled:set_vexpand (true)
|
||||
- box:pack_start(scrolled, true, true, 1)
|
||||
- scrolled:show()
|
||||
-
|
||||
- local view = Gtk.TextView()
|
||||
- view:set_wrap_mode(Gtk.WrapMode.WORD)
|
||||
- view:set_editable(false)
|
||||
- local buffer = view:get_buffer()
|
||||
- buffer:set_text(contents, -1)
|
||||
- scrolled:add(view)
|
||||
- view:show()
|
||||
- end
|
||||
-
|
||||
- while (true) do
|
||||
- local response = dialog:run()
|
||||
- local url = 'https://gitlab.gnome.org/GNOME/gimp/blob/master/extensions/goat-exercises/goat-exercise-lua.lua'
|
||||
-
|
||||
- if response == Gtk.ResponseType.OK then
|
||||
- dialog:destroy()
|
||||
- break
|
||||
- elseif (response == Gtk.ResponseType.APPLY) then
|
||||
- Gio.app_info_launch_default_for_uri(url, nil);
|
||||
- else -- CANCEL, CLOSE, DELETE_EVENT
|
||||
- dialog:destroy()
|
||||
- local cancel = GObject.Value(Gimp.PDBStatusType, Gimp.PDBStatusType.CANCEL)
|
||||
- retval:append(cancel)
|
||||
- return retval
|
||||
- end
|
||||
- end
|
||||
- end
|
||||
-
|
||||
- local x, y, width, height = drawable:mask_intersect()
|
||||
- if width ~= nill and height ~= nil and width > 0 and height > 0 then
|
||||
- Gegl.init(nil)
|
||||
-
|
||||
- local buffer = drawable:get_buffer()
|
||||
- local shadow_buffer = drawable:get_shadow_buffer()
|
||||
-
|
||||
- local graph = Gegl.Node()
|
||||
- local input = graph:create_child("gegl:buffer-source")
|
||||
- input:set_property("buffer", GObject.Value(Gegl.Buffer, buffer))
|
||||
- local invert = graph:create_child("gegl:invert")
|
||||
- local output = graph:create_child("gegl:write-buffer")
|
||||
- output:set_property("buffer", GObject.Value(Gegl.Buffer, shadow_buffer))
|
||||
- input:link(invert)
|
||||
- invert:link(output)
|
||||
- output:process()
|
||||
-
|
||||
- shadow_buffer:flush()
|
||||
-
|
||||
- drawable:merge_shadow(true)
|
||||
- drawable:update(x, y, width, height)
|
||||
- Gimp.displays_flush()
|
||||
- end
|
||||
-
|
||||
- local success = GObject.Value(Gimp.PDBStatusType, Gimp.PDBStatusType.SUCCESS)
|
||||
- retval:append(success)
|
||||
- return retval
|
||||
-end
|
||||
-
|
||||
-Goat:class('Exercise', Gimp.PlugIn)
|
||||
-
|
||||
-function Goat.Exercise:do_query_procedures()
|
||||
- return { 'plug-in-goat-exercise-lua' }
|
||||
-end
|
||||
-
|
||||
-function Goat.Exercise:do_create_procedure(name)
|
||||
- local procedure = Gimp.ImageProcedure.new(self, name,
|
||||
- Gimp.PDBProcType.PLUGIN,
|
||||
- run, nil)
|
||||
-
|
||||
- procedure:set_image_types("*");
|
||||
- procedure:set_sensitivity_mask(Gimp.ProcedureSensitivityMask.DRAWABLE);
|
||||
-
|
||||
- procedure:set_menu_label("Exercise a Lua goat");
|
||||
- procedure:set_icon_name(GimpUi.ICON_GEGL);
|
||||
- procedure:add_menu_path('<Image>/Filters/Development/Goat exercises/');
|
||||
-
|
||||
- procedure:set_documentation("Exercise a goat in the Lua language",
|
||||
- "Takes a goat for a walk in Lua",
|
||||
- name);
|
||||
- procedure:set_attribution("Jehan", "Jehan", "2019");
|
||||
-
|
||||
- return procedure
|
||||
-end
|
||||
-
|
||||
--- 'arg' is a Lua table. When automatically converted to an array, the
|
||||
--- value 0 is deleted (because Lua arrays start at 1!), which breaks
|
||||
--- Gimp.main() call. So let's create our own array starting at 1.
|
||||
-argv = {}
|
||||
-for k, v in pairs(arg) do
|
||||
- argv[k+1] = v
|
||||
-end
|
||||
-
|
||||
-Gimp.main(GObject.Type.name(Goat.Exercise), argv)
|
||||
diff -urNp a/extensions/goat-exercises/Makefile.am b/extensions/goat-exercises/Makefile.am
|
||||
--- a/extensions/goat-exercises/Makefile.am 2022-03-09 09:39:44.007314944 +0100
|
||||
+++ b/extensions/goat-exercises/Makefile.am 2022-03-09 10:27:14.623108639 +0100
|
||||
@@ -72,10 +72,10 @@ endif
|
||||
|
||||
# Lua (lua-jit + LGI) version.
|
||||
|
||||
-if BUILD_LUA
|
||||
-goat_exercise_luadir = $(goat_exercise_c_libexecdir)
|
||||
-goat_exercise_lua_SCRIPTS = goat-exercise-lua.lua
|
||||
-endif
|
||||
+#if BUILD_LUA
|
||||
+#goat_exercise_luadir = $(goat_exercise_c_libexecdir)
|
||||
+#goat_exercise_lua_SCRIPTS = goat-exercise-lua.lua
|
||||
+#endif
|
||||
|
||||
# Python 3 (pygobject) version.
|
||||
|
||||
@@ -135,7 +135,6 @@ org.gimp.extension.goat-exercises.metain
|
||||
|
||||
EXTRA_DIST = \
|
||||
goat-exercise-gjs.js \
|
||||
- goat-exercise-lua.lua \
|
||||
goat-exercise-py3.py \
|
||||
$(appstream_in_files)
|
||||
|
||||
diff -urNp a/extensions/goat-exercises/Makefile.in b/extensions/goat-exercises/Makefile.in
|
||||
--- a/extensions/goat-exercises/Makefile.in 2022-03-09 09:39:44.006314936 +0100
|
||||
+++ b/extensions/goat-exercises/Makefile.in 2022-03-09 10:28:59.224986448 +0100
|
||||
@@ -118,7 +118,6 @@ CONFIG_CLEAN_VPATH_FILES =
|
||||
am__installdirs = "$(DESTDIR)$(goat_exercise_c_libexecdir)" \
|
||||
"$(DESTDIR)$(goat_exercise_vala_libexecdir)" \
|
||||
"$(DESTDIR)$(goat_exercise_gjsdir)" \
|
||||
- "$(DESTDIR)$(goat_exercise_luadir)" \
|
||||
"$(DESTDIR)$(goat_exercise_py3dir)" "$(DESTDIR)$(appdatadir)" \
|
||||
"$(DESTDIR)$(goat_exercise_c_libexecdir)" \
|
||||
"$(DESTDIR)$(goat_exercise_vala_libexecdir)"
|
||||
@@ -183,7 +182,7 @@ am__uninstall_files_from_dir = { \
|
||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||
}
|
||||
-SCRIPTS = $(goat_exercise_gjs_SCRIPTS) $(goat_exercise_lua_SCRIPTS) \
|
||||
+SCRIPTS = $(goat_exercise_gjs_SCRIPTS) \
|
||||
$(goat_exercise_py3_SCRIPTS)
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
@@ -753,8 +752,8 @@ goat_exercise_c_LDADD = \
|
||||
@BUILD_JAVASCRIPT_TRUE@goat_exercise_gjs_SCRIPTS = goat-exercise-gjs.js
|
||||
|
||||
# Lua (lua-jit + LGI) version.
|
||||
-@BUILD_LUA_TRUE@goat_exercise_luadir = $(goat_exercise_c_libexecdir)
|
||||
-@BUILD_LUA_TRUE@goat_exercise_lua_SCRIPTS = goat-exercise-lua.lua
|
||||
+#@BUILD_LUA_TRUE@goat_exercise_luadir = $(goat_exercise_c_libexecdir)
|
||||
+#@BUILD_LUA_TRUE@goat_exercise_lua_SCRIPTS = goat-exercise-lua.lua
|
||||
|
||||
# Python 3 (pygobject) version.
|
||||
@BUILD_PYTHON_TRUE@goat_exercise_py3dir = $(goat_exercise_c_libexecdir)
|
||||
@@ -795,7 +794,6 @@ appdatadir = $(goat_exercise_c_libexecdi
|
||||
appdata_DATA = $(appstream_files)
|
||||
EXTRA_DIST = \
|
||||
goat-exercise-gjs.js \
|
||||
- goat-exercise-lua.lua \
|
||||
goat-exercise-py3.py \
|
||||
$(appstream_in_files)
|
||||
|
||||
@@ -977,41 +975,41 @@ uninstall-goat_exercise_gjsSCRIPTS:
|
||||
files=`for p in $$list; do echo "$$p"; done | \
|
||||
sed -e 's,.*/,,;$(transform)'`; \
|
||||
dir='$(DESTDIR)$(goat_exercise_gjsdir)'; $(am__uninstall_files_from_dir)
|
||||
-install-goat_exercise_luaSCRIPTS: $(goat_exercise_lua_SCRIPTS)
|
||||
- @$(NORMAL_INSTALL)
|
||||
- @list='$(goat_exercise_lua_SCRIPTS)'; test -n "$(goat_exercise_luadir)" || list=; \
|
||||
- if test -n "$$list"; then \
|
||||
- echo " $(MKDIR_P) '$(DESTDIR)$(goat_exercise_luadir)'"; \
|
||||
- $(MKDIR_P) "$(DESTDIR)$(goat_exercise_luadir)" || exit 1; \
|
||||
- fi; \
|
||||
- for p in $$list; do \
|
||||
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
- if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
|
||||
- done | \
|
||||
- sed -e 'p;s,.*/,,;n' \
|
||||
- -e 'h;s|.*|.|' \
|
||||
- -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
|
||||
- $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
|
||||
- { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
|
||||
- if ($$2 == $$4) { files[d] = files[d] " " $$1; \
|
||||
- if (++n[d] == $(am__install_max)) { \
|
||||
- print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
|
||||
- else { print "f", d "/" $$4, $$1 } } \
|
||||
- END { for (d in files) print "f", d, files[d] }' | \
|
||||
- while read type dir files; do \
|
||||
- if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
|
||||
- test -z "$$files" || { \
|
||||
- echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(goat_exercise_luadir)$$dir'"; \
|
||||
- $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(goat_exercise_luadir)$$dir" || exit $$?; \
|
||||
- } \
|
||||
- ; done
|
||||
-
|
||||
-uninstall-goat_exercise_luaSCRIPTS:
|
||||
- @$(NORMAL_UNINSTALL)
|
||||
- @list='$(goat_exercise_lua_SCRIPTS)'; test -n "$(goat_exercise_luadir)" || exit 0; \
|
||||
- files=`for p in $$list; do echo "$$p"; done | \
|
||||
- sed -e 's,.*/,,;$(transform)'`; \
|
||||
- dir='$(DESTDIR)$(goat_exercise_luadir)'; $(am__uninstall_files_from_dir)
|
||||
+#install-goat_exercise_luaSCRIPTS: $(goat_exercise_lua_SCRIPTS)
|
||||
+# @$(NORMAL_INSTALL)
|
||||
+# @list='$(goat_exercise_lua_SCRIPTS)'; test -n "$(goat_exercise_luadir)" || list=; \
|
||||
+# if test -n "$$list"; then \
|
||||
+# echo " $(MKDIR_P) '$(DESTDIR)$(goat_exercise_luadir)'"; \
|
||||
+# $(MKDIR_P) "$(DESTDIR)$(goat_exercise_luadir)" || exit 1; \
|
||||
+# fi; \
|
||||
+# for p in $$list; do \
|
||||
+# if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
+# if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
|
||||
+# done | \
|
||||
+# sed -e 'p;s,.*/,,;n' \
|
||||
+# -e 'h;s|.*|.|' \
|
||||
+# -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
|
||||
+# $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
|
||||
+# { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
|
||||
+# if ($$2 == $$4) { files[d] = files[d] " " $$1; \
|
||||
+# if (++n[d] == $(am__install_max)) { \
|
||||
+# print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
|
||||
+# else { print "f", d "/" $$4, $$1 } } \
|
||||
+# END { for (d in files) print "f", d, files[d] }' | \
|
||||
+# while read type dir files; do \
|
||||
+# if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
|
||||
+# test -z "$$files" || { \
|
||||
+# echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(goat_exercise_luadir)$$dir'"; \
|
||||
+# $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(goat_exercise_luadir)$$dir" || exit $$?; \
|
||||
+# } \
|
||||
+# ; done
|
||||
+
|
||||
+#uninstall-goat_exercise_luaSCRIPTS:
|
||||
+# @$(NORMAL_UNINSTALL)
|
||||
+# @list='$(goat_exercise_lua_SCRIPTS)'; test -n "$(goat_exercise_luadir)" || exit 0; \
|
||||
+# files=`for p in $$list; do echo "$$p"; done | \
|
||||
+# sed -e 's,.*/,,;$(transform)'`; \
|
||||
+# dir='$(DESTDIR)$(goat_exercise_luadir)'; $(am__uninstall_files_from_dir)
|
||||
install-goat_exercise_py3SCRIPTS: $(goat_exercise_py3_SCRIPTS)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(goat_exercise_py3_SCRIPTS)'; test -n "$(goat_exercise_py3dir)" || list=; \
|
||||
@@ -1266,7 +1264,7 @@ check-am: all-am
|
||||
check: check-am
|
||||
all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(DATA)
|
||||
installdirs:
|
||||
- for dir in "$(DESTDIR)$(goat_exercise_c_libexecdir)" "$(DESTDIR)$(goat_exercise_vala_libexecdir)" "$(DESTDIR)$(goat_exercise_gjsdir)" "$(DESTDIR)$(goat_exercise_luadir)" "$(DESTDIR)$(goat_exercise_py3dir)" "$(DESTDIR)$(appdatadir)" "$(DESTDIR)$(goat_exercise_c_libexecdir)" "$(DESTDIR)$(goat_exercise_vala_libexecdir)"; do \
|
||||
+ for dir in "$(DESTDIR)$(goat_exercise_c_libexecdir)" "$(DESTDIR)$(goat_exercise_vala_libexecdir)" "$(DESTDIR)$(goat_exercise_gjsdir)" "$(DESTDIR)$(goat_exercise_py3dir)" "$(DESTDIR)$(appdatadir)" "$(DESTDIR)$(goat_exercise_c_libexecdir)" "$(DESTDIR)$(goat_exercise_vala_libexecdir)"; do \
|
||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||
done
|
||||
install: install-am
|
||||
@@ -1330,7 +1328,6 @@ info: info-am
|
||||
info-am:
|
||||
|
||||
install-data-am: install-appdataDATA install-goat_exercise_gjsSCRIPTS \
|
||||
- install-goat_exercise_luaSCRIPTS \
|
||||
install-goat_exercise_py3SCRIPTS
|
||||
|
||||
install-dvi: install-dvi-am
|
||||
@@ -1385,7 +1382,6 @@ uninstall-am: uninstall-appdataDATA \
|
||||
uninstall-goat_exercise_c_libexecDATA \
|
||||
uninstall-goat_exercise_c_libexecPROGRAMS \
|
||||
uninstall-goat_exercise_gjsSCRIPTS \
|
||||
- uninstall-goat_exercise_luaSCRIPTS \
|
||||
uninstall-goat_exercise_py3SCRIPTS \
|
||||
uninstall-goat_exercise_vala_libexecDATA \
|
||||
uninstall-goat_exercise_vala_libexecPROGRAMS
|
||||
@@ -1403,7 +1399,6 @@ uninstall-am: uninstall-appdataDATA \
|
||||
install-goat_exercise_c_libexecDATA \
|
||||
install-goat_exercise_c_libexecPROGRAMS \
|
||||
install-goat_exercise_gjsSCRIPTS \
|
||||
- install-goat_exercise_luaSCRIPTS \
|
||||
install-goat_exercise_py3SCRIPTS \
|
||||
install-goat_exercise_vala_libexecDATA \
|
||||
install-goat_exercise_vala_libexecPROGRAMS install-html \
|
||||
@@ -1416,7 +1411,6 @@ uninstall-am: uninstall-appdataDATA \
|
||||
uninstall-appdataDATA uninstall-goat_exercise_c_libexecDATA \
|
||||
uninstall-goat_exercise_c_libexecPROGRAMS \
|
||||
uninstall-goat_exercise_gjsSCRIPTS \
|
||||
- uninstall-goat_exercise_luaSCRIPTS \
|
||||
uninstall-goat_exercise_py3SCRIPTS \
|
||||
uninstall-goat_exercise_vala_libexecDATA \
|
||||
uninstall-goat_exercise_vala_libexecPROGRAMS
|
||||
964
SPECS/gimp.spec
964
SPECS/gimp.spec
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user