Origin: upstream,https://github.com/OpenTTD/OpenGFX/commit/39c35c7678c0aa22d209e1eb4bb1d5f898c85f99
Origin: upstream,https://github.com/OpenTTD/OpenGFX/commit/a1f615152a01b58a4d1f6c915900ecd17a8fe628
Origin: upstream,https://github.com/OpenTTD/OpenGFX/commit/9b8a707ef4ebef14e3725e139b072a3d05deb074
Description: Fix build with gimp3
 This backports three commits from upstream intended to work with gimp3,
 which has made some backward-incompatible gimpscript changes and now
 requires an explicit --batch-interpreter option. It also switches from
 gimp to gimp-console, to work around a bug
 https://gitlab.gnome.org/GNOME/gimp/-/issues/12042

 This slightly modified the patches to backport them, since upstream
 switched from "which" to "command", which was not done in this version
 yet (so this sticks to "which").

 This change should still be compatible with gimp2 as well.
Index: openttd-opengfx/Makefile
===================================================================
--- openttd-opengfx.orig/Makefile
+++ openttd-opengfx/Makefile
@@ -97,8 +97,14 @@ GREP           ?= grep
 PYTHON         ?= python
 
 # Graphics processing
-GIMP           ?= $(shell which gimp)
-GIMP_FLAGS     ?= -n -i
+GIMP           ?= $(shell which gimp-console)
+GIMP_FLAGS     ?= -n -i --batch-interpreter=plug-in-script-fu-eval
+
+ifneq ($(findstring GNU Image Manipulation Program version 2., $(shell $(GIMP) --version)),)
+GIMP_SCRIPT     ?= $(SCRIPT_DIR)/gimpscript-v2
+else
+GIMP_SCRIPT     ?= $(SCRIPT_DIR)/gimpscript
+endif
 
 # NML
 NML            ?= nmlc
@@ -250,7 +256,7 @@ Makefile.gfx: $(GFX_SCRIPT_LIST_FILES) M
 			for i in `cat $$j | grep "\([pP][cCnN][xXgG]\)" | grep -v "^#" | cut -d\  -f1 | sed "s/\.\([pP][cCnN][xXgG]\)//"`; do\
 				echo "$$i.scm: $$j" >> $@;\
 				echo "GFX_FILES += $$i.png" >> $@;\
-				cat $(SCRIPT_DIR)/gimpscript > $$i.scm.new;\
+				cat $(GIMP_SCRIPT) > $$i.scm.new;\
 				grep $$i.png $$j | sed -f $(SCRIPT_DIR)/gimp.sed >> $$i.scm.new;\
 				echo "(gimp-quit 0)" >> $$i.scm.new;\
 				cmp -s $$i.scm.new $$i.scm || cp $$i.scm.new $$i.scm;\
Index: openttd-opengfx/scripts/gimpscript
===================================================================
--- openttd-opengfx.orig/scripts/gimpscript
+++ openttd-opengfx/scripts/gimpscript
@@ -5,8 +5,8 @@
 (define (script-fu-set-all-layers-invisible inImage inDrawable)
         (let*  (
                 (layers (gimp-image-get-layers inImage))
-                (num-layers (car layers))
-                (layer-array (cadr layers))
+                (layer-array (car layers))
+                (num-layers (vector-length layer-array))
                 (theLayer)
                )
 
@@ -14,9 +14,9 @@
 
         (while (> num-layers 0)
                 (set! num-layers (- num-layers 1))
-                (set! theLayer (aref layer-array num-layers))
-                (if (= (car (gimp-drawable-get-visible theLayer) ) TRUE)
-					(gimp-drawable-set-visible theLayer FALSE)
+                (set! theLayer (vector-ref layer-array num-layers))
+                (if (= (car (gimp-item-get-visible theLayer) ) TRUE)
+					(gimp-item-set-visible theLayer FALSE)
                 )
         )
 
@@ -46,10 +46,10 @@
 	(let*
 		(
 			(image (car (gimp-file-load RUN-NONINTERACTIVE inImageName inImageName)))
-			(visibleStuff (car (gimp-image-get-active-layer image)))
+			(visibleStuff (vector-ref (car (gimp-image-get-selected-layers image)) 0))
         	(layers (gimp-image-get-layers image))
-        	(num-layers (car layers))
-        	(layer-array (cadr layers))
+		(layer-array (car layers))
+		(num-layers (vector-length layer-array))
         	(thisLayer -1)
 			(thisNumLayers 0)
 			(theseLayers layers)
@@ -66,8 +66,8 @@
 		; iterate through all layers of the image
 		(while (> num-layers 0)
 			(set! num-layers (- num-layers 1))
-            (set! thisLayer (aref layer-array num-layers))
-			(set! thisLayerName (car (gimp-drawable-get-name thisLayer)))
+            (set! thisLayer (vector-ref layer-array num-layers))
+			(set! thisLayerName (car (gimp-item-get-name thisLayer)))
 			; (gimp-message (string-append "Image Layer-Name: " thisLayerName))
 
 			; iterate through all layer Names we shall use
@@ -75,7 +75,7 @@
 			(while (not (null? layerNames))
 				; if layerName matches this user supplied layername: make it visible
 				(if (string=? (car layerNames) thisLayerName)
-					(gimp-drawable-set-visible thisLayer TRUE)
+					(gimp-item-set-visible thisLayer TRUE)
 				)
 				(set! layerNames (cdr layerNames))
 			)
@@ -83,7 +83,7 @@
 
 		; Merge all visible layers into one layer which we then save to the given filename
 		(set! visibleStuff (car (gimp-image-merge-visible-layers image CLIP-TO-IMAGE)))
-		(file-png-save RUN-NONINTERACTIVE image visibleStuff outImageName outImageName 0 9 0 0 0 0 0)
+		(file-png-export #:run-mode RUN-NONINTERACTIVE #:image image #:file outImageName #:interlaced FALSE #:compression 9 #:bkgd FALSE #:offs FALSE #:phys FALSE #:time FALSE #:save-transparent FALSE)
 		(gimp-image-delete image)
 	)
 )
Index: openttd-opengfx/scripts/gimpscript-v2
===================================================================
--- /dev/null
+++ openttd-opengfx/scripts/gimpscript-v2
@@ -0,0 +1,97 @@
+;----------script-fu-set-all-layers-invisible----------
+;procedure by Hevan53
+;------------------------------------------------------
+
+(define (script-fu-set-all-layers-invisible inImage inDrawable)
+        (let*  (
+                (layers (gimp-image-get-layers inImage))
+                (num-layers (car layers))
+                (layer-array (cadr layers))
+                (theLayer)
+               )
+
+        (gimp-image-undo-group-start inImage)
+
+        (while (> num-layers 0)
+                (set! num-layers (- num-layers 1))
+                (set! theLayer (aref layer-array num-layers))
+                (if (= (car (gimp-drawable-get-visible theLayer) ) TRUE)
+					(gimp-drawable-set-visible theLayer FALSE)
+                )
+        )
+
+        (gimp-image-undo-group-end inImage)
+        (gimp-displays-flush)
+
+        )
+)
+
+;--------------------save-layers-----------------------
+;procedure by planetmaker
+;
+; // List of source and target images followed by a list of layer names
+; // in the source image which will make up the target image.
+;
+; // Example:
+; // (save-layers "source-file-name" "target-file-name" '(layername1 layername2 layername3 ...))
+;------------------------------------------------------
+(define
+	(
+		save-layers
+
+		inImageName
+		outImageName
+		inLayerNames
+	)
+	(let*
+		(
+			(image (car (gimp-file-load RUN-NONINTERACTIVE inImageName inImageName)))
+			(visibleStuff (car (gimp-image-get-active-layer image)))
+        	(layers (gimp-image-get-layers image))
+        	(num-layers (car layers))
+        	(layer-array (cadr layers))
+        	(thisLayer -1)
+			(thisNumLayers 0)
+			(theseLayers layers)
+			(thisLayerName 0)
+
+			(layerNames inLayerNames)
+		)
+
+		; First make everything invisble
+		(script-fu-set-all-layers-invisible image image)
+
+		; Now make those layers visible which were asked to become visible
+
+		; iterate through all layers of the image
+		(while (> num-layers 0)
+			(set! num-layers (- num-layers 1))
+            (set! thisLayer (aref layer-array num-layers))
+			(set! thisLayerName (car (gimp-drawable-get-name thisLayer)))
+			; (gimp-message (string-append "Image Layer-Name: " thisLayerName))
+
+			; iterate through all layer Names we shall use
+			(set! layerNames inLayerNames)
+			(while (not (null? layerNames))
+				; if layerName matches this user supplied layername: make it visible
+				(if (string=? (car layerNames) thisLayerName)
+					(gimp-drawable-set-visible thisLayer TRUE)
+				)
+				(set! layerNames (cdr layerNames))
+			)
+		)
+
+		; Merge all visible layers into one layer which we then save to the given filename
+		(set! visibleStuff (car (gimp-image-merge-visible-layers image CLIP-TO-IMAGE)))
+		(file-png-save RUN-NONINTERACTIVE image visibleStuff outImageName outImageName 0 9 0 0 0 0 0)
+		(gimp-image-delete image)
+	)
+)
+
+
+; // ===================================================================
+; // List of source and target images followed by a list of layer names
+; // in the source image which will make up the target image.
+; // Example:
+; // (save-layers "source-file-name" "target-file-name" '(layername1 layername2 layername3 ...))
+; // ===================================================================
