#!/bin/sh # # compose_table [options] [output_file] # # Generate images showing the results of compose methods with various # test images. If no output filename "show:" the result in background. # # Options: # -i compose using the just build test via "imagick.sh" # -b Do gradient testing of duff-poster blending # -m output mathematical and shading compose methods # -mb Do testing of the alpha blending with mathematical methods # #### # # Anthony Thyssen !3 July 2009 # PROGNAME=`type $0 | awk '{print $3}'` # search for executable on path PROGDIR=`dirname $PROGNAME` # extract directory of program PROGNAME=`basename $PROGNAME` # base name of program Usage() { # output the script comments as docs echo >&2 "$PROGNAME:" "$@" sed >&2 -n '/^###/q; /^#/!q; s/^#//; s/^ //; 3s/^/Usage: /; 2,$ p' \ "$PROGDIR/$PROGNAME" exit 10; } # # Generalized Otion handling. # while [ $# -gt 0 ]; do case "$1" in --help|--doc*) Usage ;; -i) #IM=imagick.sh ;; # test using the just test build version of IM IM=im ;; -b) DUFF_BLEND=true ;; # testing duff-porter gradient blending -m) MATH=true ;; # ouput math operator blending -mb) MATH_BLEND=true ;; # testing math operator blending --) shift; break ;; # end of user options -*) Usage "Unknown option \"$1\"" ;; *) break ;; # end of user options esac shift # next option done DUFF=true [ "$MATH_BLEND" ] && MATH=true [ "$MATH" ] && DUFF= ops_duff='Src Dst Clear Xor Over In Out Atop Dst_Over Dst_In Dst_Out Dst_Atop ' ops_math='Plus Add Minus Subtract Screen Multiply Difference Exclusion Lighten Darken -none- Divide LinearDodge LinearBurn ColorBurn ColorDodge Overlay SoftLight PegtopLight -none- HardLight PinLight LinearLight VividLight ' # Bumpmap page_bg_color=LightSteelBlue tmpdir=/tmp/compose_table.$$ trap "cd ..; rm -rf $tmpdir; exit 10" 1 2 3 15 trap "cd ..; rm -rf $tmpdir; exit 0" 0 mkdir $tmpdir pwd=`pwd` # save current directory (for results) cd $tmpdir # Change to the temporary working directory # Get the error image #convert http://www.imagemagick.org/Usage/images/image_error.gif \ # compose_error.png convert $HOME/im/images/image_error.gif compose_error.png # Empty Image convert -size 1x1 xc:$page_bg_color compose_none.png # --------------------------------------------------------- # # Do the montage given the images P, Q, and M (source, destination, mask) # do_montage() { [ -f $P -a -f $Q ] || { echo >&2 "$0: Images $P $Q failed to build" exit 10 } rm -f compose_op_*.png # precaution convert -label 'Overlay (Src)' $P \ -bordercolor blue -compose Copy -border 1 \ compose_op_P.png convert -label 'Backgnd (Dst)' $Q \ -bordercolor blue -compose Copy -border 1 \ compose_op_Q.png list="" if [ "$M" ]; then list="$list compose_op_P.png" list="$list label:method" list="$list compose_op_Q.png" list="$list compose_op_M.png" convert -label 'mask' $M \ -bordercolor blue -compose Copy -border 1 \ compose_op_M.png else list="$list compose_op_P.png" list="$list label:method" list="$list compose_op_Q.png" list="$list compose_none.png" fi for op in $methods do if [ X$op = X-none- ]; then list="$list compose_none.png" else #composite -gravity center -compose $op $P $Q $M miff:- |\ # convert -label $op - \ # -bordercolor blue -compose Copy -border 1 \ # ${png_format}compose_op_$op.png $IM convert -label $op $Q $P \ -gravity center -compose $op -composite \ -bordercolor blue -compose Copy -border 1 \ compose_op_$op.png if [ ! -f compose_op_$op.png ]; then convert -label $op compose_error.png \ compose_op_$op.png fi list="$list compose_op_$op.png" fi done eval "montage -tile 4x -geometry +4+4 -background $page_bg_color \ -compose Copy $list \"$1\"" rm -f compose_op_*.png } # ---------------------------------------------------------------------------- # # Duff Porter compose methods # if [ "$DUFF" ]; then methods="$ops_duff" # Test blending operators using triangles convert -size 50x50 xc:none -fill gold \ -draw 'polyline 0,0 0,49 49,0' compose_P.png convert -size 64x64 xc:none -fill blue \ -draw 'polyline 0,0 63,63 63,0' compose_Q.png P=compose_P.png Q=compose_Q.png do_montage montage_triangle.png rm -f $P $Q montages="${montages:+$montages,}triangle" # Test blending operators using gradients if [ "$DUFF_BLEND" ]; then convert -size 64x5 xc: xc:none -size 64x54 gradient:black-none +swap \ -append -fill gold -colorize 100 gradient_none_v.png convert gradient_none_v.png -transverse \ -fill blue -colorize 100 gradient_none_h.png P=gradient_none_v.png Q=gradient_none_h.png do_montage montage_blending.png rm -f $P $Q montages="${montages:+$montages,}blending" fi # if DUFF_BLEND fi # if DUFF # ------------------------------------ # # Math Composite Methods # if [ "$MATH" ]; then methods="$ops_math" # gradient test convert -size 64x64 gradient: \ -write gradient_grey_v.png -transverse gradient_grey_h.png P=gradient_grey_v.png Q=gradient_grey_h.png do_montage montage_gradient.png montages="${montages:+$montages,}gradient" if [ "$MATH_BLEND" ]; then # # testing of the 'blend mode' of mathematical operators # convert -size 64x64 xc:none -draw 'rectangle 20,0 43,63' \ gradient_grey_v.png -compose In -composite gradient_rect_v.png convert -size 64x64 xc:none -draw 'rectangle 0,20 63,43' \ gradient_grey_h.png -compose In -composite gradient_rect_h.png P=gradient_rect_v.png Q=gradient_rect_h.png do_montage montage_grad_rect.png montages="${montages:+$montages,}grad_rect" # Alternative.. #convert -size 64x64 gradient: \ # -background black -alpha shape gradient_trans_v.png convert -size 64x64 gradient:black-none gradient_trans_v.png convert gradient_trans_v.png -transverse gradient_trans_h.png P=gradient_trans_v.png Q=gradient_trans_h.png do_montage montage_grad_trans.png montages="${montages:+$montages,}grad_trans" fi # if MATH_BLEND rm -f gradient_* fi # if MATH # ------------------------------------ # # Finish up into final chart # cd $pwd # do back to the original directory convert null: $tmpdir/montage_null.png eval convert "$tmpdir/montage_{$montages,null}.png" +delete \ '-frame 3x3+0+2 +append -frame 3x3+2+0 "${1:-show:}"'