#!/bin/bash
# foto_histoparms
# Usage: foto_hostoparms [ -left | -right | -both ] img

TMPDIR=/tmp

if   [ "$1" = "-left" ]; then
   DIRECTION=LEFT
   shift
elif [ "$1" = "-right" ]; then
   DIRECTION=RIGHT
   shift
elif [ "$1" = "-both" ]; then
   DIRECTION=BOTH
   shift
else
   DIRECTION=BOTH
fi


IMG=$1

CLIPLEFT=0
CLIPRIGHT=0
LINE=0 # 0 - 99

CENTERPERCENT=95
PLUSP=1.0


_delif () {
   if [ -f $1 ]; then rm $1 ; fi
}

_max () {
  echo "a=$1;b=$2;c=$3;if (a>b) m=a else m=b; if (m>c) m else c" | bc
}

_min () {
  echo "a=$1;b=$2;c=$3;if (a<b) m=a else m=b; if (m<c) m else c" | bc
}


_clipline () { # $1 is tmpline-file $2 channel (R/G/B)
               # delivers $LEFTVAL and $RIGHTVAL
  TMPLINE=$1
  c=`expr $CLIPLEFT - 5`
  end=`expr 255 - $CLIPRIGHT`
  flag=0
  while [ $c -le $end -a $flag = 0 ]; do
    # echo -n "$c: "
    echo -n "." >&2
    if [ 0 -le $c -a $c -le 255 ]; then
       flag=`convert $TMPLINE -crop 1x1+${c}+0 -channel $2 -format '%[max]' info:-`
    fi
    c=`expr $c + 10`
  done
  c=`expr $c - 20`
  flag=0
  while [ $c -le $end -a $flag = 0 ]; do
    # echo -n "$c: "
    echo -n "." >&2
    if [ 0 -le $c -a $c -le 255 ]; then
       flag=`convert $TMPLINE -crop 1x1+${c}+0 -channel $2 -format '%[max]' info:-`
    fi
    c=`expr $c + 1`
  done

  export LEFTVAL=`echo "scale=1; x = ( ( $c - $CLIPLEFT ) * 100 / $XLEN ) - $PLUSP ; if ( x < 0 ) 0 else x" | bc`

  end=$CLIPLEFT
  c=`expr 255 - $CLIPRIGHT + 5`
  flag=0
  while [ $c -ge $end -a $flag = 0 ]; do
    # echo -n "$c: "
    echo -n "_" >&2
    if [ 0 -le $c -a $c -le 255 ]; then
      flag=`convert $TMPLINE -crop 1x1+${c}+0 -channel $2 -format '%[max]' info:-`
    fi
    c=`expr $c - 10`
  done
  c=`expr $c + 20`
  flag=0
  while [ $c -ge $end -a $flag = 0 ]; do
    # echo -n "$c: "
    echo -n "_" >&2
    if [ 0 -le $c -a $c -le 255 ]; then
      flag=`convert $TMPLINE -crop 1x1+${c}+0 -channel $2 -format '%[max]' info:-`
    fi
    c=`expr $c - 1`
  done

  export RIGHTVAL=`echo "scale=1; x = ( ( $c - $CLIPLEFT ) * 100 / $XLEN ) + $PLUSP ; if ( x > 100 ) 100 else x " | bc`
  
  echo -n " " >&2
}

TMPIMG=$TMPDIR/img$$.png

TMPLINEBLUE=$TMPDIR/hline_blue_$$.png
TMPLINERED=$TMPDIR/hline_red_$$.png
TMPLINEGREEN=$TMPDIR/hline_green_$$.png

YOFF=`expr 99 - $LINE`
XLEN=`expr 256 - $CLIPLEFT - $CLIPRIGHT`

# set -x
convert $IMG -gravity Center -crop $CENTERPERCENT%x$CENTERPERCENT% +repage -resize 800x800 +repage $TMPIMG
# set +x

# convert $TMPIMG -colorspace RGB -channel B -separate +repage histogram:- | identify - ;  exit
# set -x
convert $TMPIMG -channel R +repage histogram:miff:- | convert miff:- -scale 256x100! +repage miff:- | \
      convert miff:- -crop ${XLEN}x1+$CLIPLEFT+$YOFF +repage $TMPLINERED
# set +x

_clipline $TMPLINERED R
REDLEFT=$LEFTVAL
REDRIGHT=$RIGHTVAL

# set -x
convert $TMPIMG -channel G +repage histogram:miff:- | convert miff:- -scale 256x100! +repage miff:- | \
      convert miff:- -crop ${XLEN}x1+$CLIPLEFT+$YOFF +repage $TMPLINEGREEN
# set +x

_clipline $TMPLINEGREEN G
GREENLEFT=$LEFTVAL
GREENRIGHT=$RIGHTVAL

# set -x
convert $TMPIMG -channel B +repage histogram:miff:- | convert miff:- -scale 256x100! +repage miff:- | \
      convert miff:- -crop ${XLEN}x1+$CLIPLEFT+$YOFF +repage $TMPLINEBLUE
# set +x

_clipline $TMPLINEBLUE B
BLUELEFT=$LEFTVAL
BLUERIGHT=$RIGHTVAL

if [ $DIRECTION = BOTH ]; then
   echo "$REDLEFT,$REDRIGHT,1 $GREENLEFT,$GREENRIGHT,1 $BLUELEFT,$BLUERIGHT,1"
elif [ $DIRECTION = LEFT ]; then
   MAXRIGHT=`_max $REDRIGHT $GREENRIGHT $BLUERIGHT`
   echo "$REDLEFT,$MAXRIGHT,1 $GREENLEFT,$MAXRIGHT,1 $BLUELEFT,$MAXRIGHT,1"  
elif [ $DIRECTION = RIGHT ]; then
   MINLEFT=`_min $REDLEFT $GREENLEFT $BLUELEFT`
   echo "$MINLEFT,$REDRIGHT,1 $MINLEFT,$GREENRIGHT,1 $MINLEFT,$BLUERIGHT,1"
else
   echo "$REDLEFT,$REDRIGHT,1 $GREENLEFT,$GREENRIGHT,1 $BLUELEFT,$BLUERIGHT,1"
fi



_delif $TMPIMG
_delif $TMPLINEBLUE
_delif $TMPLINERED
_delif $TMPLINEGREEN


