#!/usr/local/bin/ruby18 -w

# Demonstrate the effects of various composite operators.
# Based on ImageMagick's composite test.

require 'RMagick'
include Magick

ROWS = 70
COLS = 70
COLOR_A = "#999966"
COLOR_B = "#990066"

img = Image.new(COLS, ROWS)
triangle = Draw.new
triangle.fill(COLOR_A)
triangle.stroke('transparent')
triangle.polygon(0,0, COLS,0, 0,ROWS, 0,0)
triangle.draw(img)
image_A = img.transparent('white', TransparentOpacity)
image_A['Label'] = 'A'

img = Image.new(COLS, ROWS)
triangle = Draw.new
triangle.fill(COLOR_B)
triangle.stroke('transparent')
triangle.polygon(0,0, COLS,ROWS, COLS,0, 0,0)
triangle.draw(img)
image_B = img.transparent('white', TransparentOpacity)
image_B['Label'] = 'B'

list = ImageList.new
null = Image.read("xc:white") { self.size = Geometry.new(COLS,ROWS) }
null = null.first.transparent('white', TransparentOpacity)
null.border_color = 'transparent'
granite =  Image.read("granite:")

list << null.copy
list << image_A
list << image_B
list << null.copy


list << image_B.composite(image_A, CenterGravity, OverCompositeOp)
list.cur_image['Label'] = 'A over B'
list << image_A.composite(image_B, CenterGravity, OverCompositeOp)
list.cur_image['Label'] = 'B over A'

list << image_B.composite(image_A, CenterGravity, InCompositeOp)
list.cur_image['Label'] = 'A in B'
list << image_A.composite(image_B, CenterGravity, InCompositeOp)
list.cur_image['Label'] = 'B in A'

list << image_B.composite(image_A, CenterGravity, OutCompositeOp)
list.cur_image['Label'] = 'A out B'
list << image_A.composite(image_B, CenterGravity, OutCompositeOp)
list.cur_image['Label'] = 'B out A'

list << image_B.composite(image_A, CenterGravity, AtopCompositeOp)
list.cur_image['Label'] = 'A atop B'
list << image_A.composite(image_B, CenterGravity, AtopCompositeOp)
list.cur_image['Label'] = 'B atop A'

list << image_B.composite(image_A, CenterGravity, XorCompositeOp)
list.cur_image['Label'] = 'A xor B'

list << image_B.composite(image_A, CenterGravity, MultiplyCompositeOp)
list.cur_image['Label'] = 'A multiply B'

list << image_B.composite(image_A, CenterGravity, ScreenCompositeOp)
list.cur_image['Label'] = 'A screen B'

list << image_B.composite(image_A, CenterGravity, DarkenCompositeOp)
list.cur_image['Label'] = 'A darken B'

list << image_B.composite(image_A, CenterGravity, LightenCompositeOp)
list.cur_image['Label'] = 'A lighten B'

list << image_B.composite(image_A, CenterGravity, PlusCompositeOp)
list.cur_image['Label'] = 'A plus B'

list << image_B.composite(image_A, CenterGravity, MinusCompositeOp)
list.cur_image['Label'] = 'A minus B'

list << image_B.composite(image_A, CenterGravity, AddCompositeOp)
list.cur_image['Label'] = 'A add B'

list << image_B.composite(image_A, CenterGravity, SubtractCompositeOp)
list.cur_image['Label'] = 'A subtract B'

list << image_B.composite(image_A, CenterGravity, DifferenceCompositeOp)
list.cur_image['Label'] = 'A difference B'

list << image_B.composite(image_A, CenterGravity, HueCompositeOp)
list.cur_image['Label'] = 'A hue B'

list << image_B.composite(image_A, CenterGravity, SaturateCompositeOp)
list.cur_image['Label'] = 'A saturate B'

list << image_B.composite(image_A, CenterGravity, LuminizeCompositeOp)
list.cur_image['Label'] = 'A luminize B'

list << image_B.composite(image_A, CenterGravity, ColorizeCompositeOp)
list.cur_image['Label'] = 'A colorize B'

list << image_B.composite(image_A, CenterGravity, BumpmapCompositeOp)
list.cur_image['Label'] = 'A bumpmap B'

list << image_B.composite(image_A, CenterGravity, DissolveCompositeOp)
list.cur_image['Label'] = 'A dissolve B'

list << image_B.composite(image_A, CenterGravity, ThresholdCompositeOp)
list.cur_image['Label'] = 'A threshold B'

list << image_B.composite(image_A, CenterGravity, ModulateCompositeOp)
list.cur_image['Label'] = 'A modulate B'

list << image_A.composite(image_B, CenterGravity, ModulateCompositeOp)
list.cur_image['Label'] = 'B modulate A'

list << image_B.composite(image_A, CenterGravity, OverlayCompositeOp)
list.cur_image['Label'] = 'A overlay B'

montage = list.montage {
    self.geometry = Geometry.new(COLS, ROWS, 3, 3)
    rows = (list.size+3) / 4
    self.tile = Geometry.new(4, rows)
    self.texture = granite[0]
    self.fill = 'white'
    self.stroke = 'transparent'
}

montage.write('composite.gif')
exit

