blind-primary-key (3235B)
1 #!/usr/bin/env bash 2 3 set -e 4 5 if printf '%s\n' "$0" | grep / >/dev/null 2>/dev/null; then 6 export PATH="$(printf '%s\n' "$0" | tr '/\n' '\n/' | sed \$d | tr '/\n' '\n/'):${PATH}" 7 fi 8 9 pid=$$ 10 o='0 0 0 0' 11 E='1 1 1 1' 12 13 x=x; y=y; z=z 14 ciexyy=0 15 zflag= 16 grey=0 17 keep=0 18 19 usage () { 20 xyy="-z x1 y1 x2 y2 x3 y3 [white-x white-y]" 21 xyz="X1 Y1 Z1 X2 Y2 Z2 X3 Y3 Z3 [white-X white-Y white-Z]" 22 printf 'usage: %s [-1 | -2 | -3] [-gk] [%s | %s]\n' "$0" "$xyy" "$xyz" >&2 23 exit 1 24 } 25 26 while ! test $# = 0; do 27 if test "$1" = --; then 28 shift 1 29 break 30 elif test "$(printf '%s\n' "$1" | sed 's/^\(.\).*$/\1/')" = -; then 31 arg="$(printf '%s\n' "$1" | sed 's/^.//')" 32 shift 1 33 while test -n "$arg"; do 34 flag="$(printf '%s\n' "$arg" | sed 's/^\(.\).*$/\1/')" 35 arg="$(printf '%s\n' "$arg" | sed 's/^.//')" 36 if test "$flag" = 1; then 37 x=x; y=y; z=z 38 elif test "$flag" = 2; then 39 x=y; y=z; z=x 40 elif test "$flag" = 3; then 41 x=z; y=x; z=y 42 elif test "$flag" = g; then 43 grey=1 44 elif test "$flag" = k; then 45 keep=1 46 elif test "$flag" = z; then 47 ciexyy=1 48 else 49 usage 50 fi 51 done 52 else 53 break 54 fi 55 done 56 57 a=$(( ( 3 - $ciexyy ) * 3 )) 58 b=$(( ( 3 - $ciexyy ) * 4 )) 59 if test $# != 0 && test $# != $a && test $# != $b; then 60 usage 61 elif test $ciexyy = 1 && test $# = 0; then 62 usage 63 fi 64 65 read frames width height pixfmt < <(blind-read-head) 66 67 if test $# = 0; then 68 convert () { cat; } 69 unconvert () { cat; } 70 else 71 if test $ciexyy = 1; then 72 zflag=-z 73 fi 74 convert () { 75 blind-affine-colour -al \ 76 <(blind-colour-matrix -F "$pixfmt" $zflag -- "$@" | \ 77 blind-tee \ 78 >(blind-invert-matrix -e | \blind-to-named -a blind-${pid}-invmat) | \ 79 blind-repeat inf -) 80 } 81 unconvert () { 82 blind-affine-colour -al \ 83 <(blind-from-named -a blind-${pid}-invmat \ 84 blind-arithm -xyz max <(blind-single-colour -w 3 -h 3 1) | \ 85 blind-repeat inf -) 86 } 87 fi 88 89 if test $keep = 0; then 90 primary () { blind-from-named -a blind-${pid}-$x "$@"; } 91 keep_primary () { "$@"; } 92 else 93 primary () { 94 blind-from-named -a blind-${pid}-$x \ 95 blind-tee >(blind-to-named -a blind-${pid}-k) | \ 96 "$@" 97 } 98 keep_primary () { 99 if test $x = x; then 100 X=; Y=y; Z=z 101 elif test $x = y; then 102 X=x; Y=; Z=z 103 else 104 X=x; Y=y; Z= 105 fi 106 blind-from-named -f 7 -a blind-${pid}-k \ 107 blind-arithm -a$X$Y$Z add /dev/fd/7 | \ 108 "$@" 109 } 110 fi 111 112 if test $grey = 0; then 113 finalise () { unconvert; } 114 else 115 finalise () { 116 unconvert | blind-set-saturation <(blind-single-colour -f inf -w $width -h $height 0) 117 } 118 fi 119 120 (blind-write-head $frames $width $height "$pixfmt" ; cat) | \ 121 convert "$@" | \ 122 blind-split-chans -c \ 123 >(blind-to-named -a blind-${pid}-x) \ 124 >(blind-to-named -a blind-${pid}-y) \ 125 >(blind-to-named -a blind-${pid}-z) \ 126 - | \ 127 blind-arithm mul \ 128 <(blind-single-colour -f inf -w $width -h $height 0 0 0 1 | \ 129 blind-arithm sub \ 130 <(primary blind-affine-colour -l \ 131 <(printf '%s %s %s %s\n' \ 132 1 4 4 xyza \ 133 $o $o $o $o \ 134 $o $o $o $o \ 135 $o $o $o $o \ 136 $E $E $E $o | \ 137 blind-from-text | \ 138 blind-repeat inf -))) | \ 139 keep_primary \ 140 blind-from-named -f 8 -a blind-${pid}-$y blind-arithm add /dev/fd/8 | \ 141 blind-from-named -f 9 -a blind-${pid}-$z blind-arithm add /dev/fd/9 | \ 142 finalise