#!/bin/bash

gimp -i -b - <<END

; some colors
;
(define beige        '(245 245 220))
(define forest-green '( 34 139  34))
(define light-gray   '(211 211 211))
(define dark-gray    '(169 169 169))
(define white        '(255 255 255))
(define black        '(  0   0   0))

; some patterns
;
(define light-wood "Wood of some sort")
(define dark-wood  "Wood #2")

; square colors may be either an RGB vector or the name of a GIMP pattern
; piece colors must be RGB vectors
;
(define light-square-color light-wood)
(define  dark-square-color dark-wood)
(define  light-piece-color white)
(define   dark-piece-color black)

(define directory "pixmaps2")

(define pieces '(king queen bishop knight rook pawn))
(define sizes  '(129 116 108 95 87 80 72 64 58 54 49 45 40 37 33 29 25 21))

(define font "xboard_new")

(define light-glyphs '((king "k") (queen "q") (bishop "b") (knight "n") (rook "r") (pawn "p")))
(define  dark-glyphs '((king "K") (queen "Q") (bishop "B") (knight "N") (rook "R") (pawn "P")))

(define (add-background-layer image color position)
  (let* ((width  (car (gimp-image-width  image)))
         (height (car (gimp-image-height image)))
         (layer  (car (gimp-layer-new image width height RGB-IMAGE "Background" 100 NORMAL-MODE)))
         (pattern (string? color)))

    (gimp-image-add-layer image layer position)

    (gimp-edit-clear layer)
    (if pattern
        (gimp-context-set-pattern color)
        (gimp-context-set-foreground color))
    (gimp-selection-all image)
    (gimp-edit-bucket-fill layer (if pattern PATTERN-BUCKET-FILL FG-BUCKET-FILL) NORMAL-MODE 100 0 FALSE 0 0)
    (gimp-selection-none image)

    layer))

(define (make-pixmap size glyph square-color file)
  (let* ((isize        (* 2 size))
	 (image        (car (gimp-image-new isize isize RGB)))
	 (layer-piece  (car (gimp-layer-new image isize isize RGBA-IMAGE "piece"  100 NORMAL-MODE)))
	 (layer-font   (car (gimp-layer-new image isize isize RGBA-IMAGE "font"   100 NORMAL-MODE))))

    (gimp-image-add-layer image layer-piece -1)
    (gimp-image-add-layer image layer-font  -1)

    (gimp-edit-clear layer-piece)
    (gimp-context-set-foreground light-piece-color)
    (gimp-selection-all image)
    (gimp-edit-bucket-fill layer-piece FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0)
    (gimp-selection-none image)

    (gimp-edit-clear layer-font)
    (gimp-context-set-foreground dark-piece-color)
    (let ((layer (car (gimp-text-fontname image layer-font (/ isize 4) (/ isize 4) glyph -1 TRUE size POINTS font))))
      (gimp-floating-sel-anchor layer))

    (gimp-fuzzy-select layer-font 0 0 0 CHANNEL-OP-REPLACE FALSE FALSE 0 TRUE)
    (gimp-selection-grow image 1)
    (gimp-edit-cut layer-piece)

    (let ((merged (car (gimp-image-merge-visible-layers image EXPAND-AS-NECESSARY))))
      (gimp-fuzzy-select-full merged 0 0 0 CHANNEL-OP-REPLACE FALSE FALSE 0 0 0 TRUE SELECT-CRITERION-COMPOSITE)
      (gimp-selection-invert image)
      (gimp-edit-copy merged)

      (gimp-image-delete image)))

  (let* ((image        (car (gimp-edit-paste-as-new)))
	 (layer-piece  (car (gimp-image-get-active-drawable image)))
	 (width        (car (gimp-image-width  image)))
	 (height       (car (gimp-image-height image)))
	 (xoffset      (/ (- size width)  2))
	 (yoffset      (/ (- size height) 2))
         (pattern      (string? square-color)))

    (gimp-image-resize image size size xoffset yoffset)
    (gimp-layer-resize-to-image-size layer-piece)

    (let ((layer-square (add-background-layer image square-color 1)))
      (let ((merged (car (gimp-image-merge-visible-layers image EXPAND-AS-NECESSARY))))
	(file-xpm-save RUN-NONINTERACTIVE image merged file file 255)))

    (gimp-image-delete image)))

(define (make-empty-pixmap size color file)
  (let* ((image (car (gimp-image-new size size RGB)))
         (layer (add-background-layer image color 1)))

    (file-xpm-save RUN-NONINTERACTIVE image layer file file 255)

    (gimp-image-delete image)))

(define (filename glyph colors size)
  (string-append directory "/" glyph colors (number->string size) ".xpm"))

(map (lambda (s)
       (map (lambda (p)
	      (let ((light-glyph (cadr (assoc p light-glyphs)))
		    (dark-glyph  (cadr (assoc p dark-glyphs))))
		(make-pixmap s light-glyph light-square-color (filename light-glyph "ll" s))
		(make-pixmap s light-glyph dark-square-color  (filename light-glyph "ld" s))
		(make-pixmap s dark-glyph  light-square-color (filename light-glyph "dl" s))
		(make-pixmap s dark-glyph  dark-square-color  (filename light-glyph "dd" s))))
	    pieces)
       (make-empty-pixmap s light-square-color (filename "lsq" "" s))
       (make-empty-pixmap s dark-square-color  (filename "dsq" "" s)))
     sizes)

(gimp-quit 0)

END

