#!/bin/bash

###############################################################################
# rul3r v1.4 by SFR'2015													  #
# GNU GPL v2 applies														  #
# Req.: bash, xrandr, awk, gtkdialog, xmessage								  #
###############################################################################

# =============================================================================
# Init
# =============================================================================

APPNAME="rul3r v1.4"

LANG=C	# to always have . as a decimal separator

IMG=/tmp/rul3r.${USER}.svg

# =============================================================================
# Get and calculate screen properties
# =============================================================================

XRANDR="`xrandr`"

SCREEN_X=`echo "$XRANDR" | awk 'match($0,"current ([0-9]+) x [0-9]+",a) {print a[1]}'`
SCREEN_Y=`echo "$XRANDR" | awk 'match($0,"current [0-9]+ x ([0-9]+)",a) {print a[1]}'`

MM_X=`echo "$XRANDR" | awk 'match($0,"([0-9]+)mm x [0-9]+mm",a) {print a[1]}'`
MM_Y=`echo "$XRANDR" | awk 'match($0,"[0-9]+mm x ([0-9]+)mm",a) {print a[1]}'`

if [ $MM_X -eq 0 ]; then
  if [ -e "${HOME}/.rul3r" ]; then
    MM_X=`cat "${HOME}/.rul3r"`
  else
    xmessage -title "$APPNAME" -center -bg orange "Unable to detect physical size of the display!
Please obtain the necessary info (from manual?) and issue the following command:

echo \"X_MM Y_MM\"> \$HOME/.rul3r

where X_MM is horizontal and Y_MM vertical size of your display, in millimeters.
Then launch the application again."
  exit
  fi
fi

[ $SCREEN_X -lt $SCREEN_Y ] && [ $MM_X -gt $MM_Y ] && MM_X=$MM_Y

DPI=`awk 'BEGIN {printf "%0.20f", (('${SCREEN_X}' / '${MM_X}') * 25.4) }'`

# =============================================================================
# Generate SVG
# =============================================================================

XGAP=50
YGAP=32
IMG_WIDTH=$((SCREEN_X-100))
IMG_HEIGHT=200

echo '<svg shape-rendering="crispEdges" xmlns="http://www.w3.org/2000/svg">
<rect x="2" y="2" width="'${IMG_WIDTH}'" height="'${IMG_HEIGHT}'" stroke-width="3" stroke="black" fill="yellow" />
' > $IMG

# -----------------------------------------------------------------------------
# Pixels
# -----------------------------------------------------------------------------

PX=20

echo '<defs><g id="px">' >> $IMG
for i in {0..10}; do
  if [ $i -eq 0 -o $i -eq 10 ]; then
    YVAL=$YGAP
  elif [ $((i%2)) -eq 0 ]; then
    YVAL=$((YGAP+10))
  else
    YVAL=$((YGAP+20))
  fi
  echo '<line x1="'$((XGAP+(2*i)))'" y1="'${YVAL}'" x2="'$((XGAP+(2*i)))'" y2="'$((YGAP+30))'" stroke="black" />' >> $IMG
done
echo '</g></defs>' >> $IMG

echo '<text x="'$((XGAP/2))'" y="'$((YGAP+16))'" font-family="monospace" font-size="16" text-anchor="middle" fill="black">Px</text>' >> $IMG

MAX=$(( (IMG_WIDTH - XGAP - PX) / PX ))
for ((i=0; i<=${MAX}; i++)); do
  echo '<use xlink:href="#px" x="'$((PX*i))'" />' >> $IMG
  VALUE=$((PX*i))
  [ $VALUE -ge 1000 ] && FONTSIZE=7 || FONTSIZE=10
  echo '<text x="'$((PX*i+(XGAP-1)))'" y="'$((YGAP-8))'" font-family="monospace" font-size="'${FONTSIZE}'" text-anchor="middle" fill="black">'${VALUE}'</text>' >> $IMG
done
echo '<text x="'$((PX*i+(XGAP-1)))'" y="'$((YGAP-8))'" font-family="monospace" font-size="'${FONTSIZE}'" text-anchor="middle" fill="black">'$((VALUE+PX))'</text>' >> $IMG

# -----------------------------------------------------------------------------
# Centimeters
# -----------------------------------------------------------------------------

YGAP=$((YGAP+64))
CM=`awk 'BEGIN {printf "%0.0f", '${DPI}'/2.54 }'`

echo '<defs><g id="cm">' >> $IMG
for i in {0..10}; do
  XVAL=`awk 'BEGIN {printf "%0.20f", '${XGAP}' + (( '${DPI}'/25.4) * '${i}') }'`
  if [ $i -eq 0 -o $i -eq 10 ]; then
    YVAL=$YGAP
  elif [ $i -eq 5 ]; then
    YVAL=$((YGAP+10))
  else
    YVAL=$((YGAP+20))
  fi
  echo '<line x1="'${XVAL}'" y1="'${YVAL}'" x2="'${XVAL}'" y2="'$((YGAP+30))'" stroke="black" />' >> $IMG
done
echo '</g></defs>' >> $IMG

echo '<text x="'$((XGAP/2))'" y="'$((YGAP+16))'" font-family="monospace" font-size="16" text-anchor="middle" fill="black">Cm</text>' >> $IMG

MAX=`awk 'BEGIN {printf "%0.0f", (('${IMG_WIDTH}' - '${XGAP}' - ('${CM}' / 1.5) ) / ('${DPI}' / 2.54)) -1 }'`
for ((i=0; i<=${MAX}; i++)); do
  XVAL=`awk 'BEGIN {printf "%0.20f", ('${DPI}' / 2.54) * '$i' }'`
  echo '<use xlink:href="#cm" x="'${XVAL}'" />' >> $IMG
  XVAL=`awk 'BEGIN {printf "%0.20f", ('${XGAP}' - 1) + (('${DPI}' / 2.54) * '$i') }'`
  echo '<text x="'${XVAL}'" y="'$((YGAP-8))'" font-family="monospace" font-size="14" text-anchor="middle" fill="black">'${i}'</text>' >> $IMG
done
XVAL=`awk 'BEGIN {printf "%0.20f", ('${XGAP}' - 1) + (('${DPI}' / 2.54) * '${i}') }'`
echo '<text x="'${XVAL}'" y="'$((YGAP-8))'" font-family="monospace" font-size="14" text-anchor="middle" fill="black">'${i}'</text>' >> $IMG

# -----------------------------------------------------------------------------
# Inches
# -----------------------------------------------------------------------------

YGAP=$((YGAP+64))
IN=${DPI}

echo '<defs><g id="in">' >> $IMG
for i in {0..8}; do
  XVAL=`awk 'BEGIN {printf "%0.20f", '${XGAP}' + ('${DPI}' / 8) * '${i}' }'`
  if [ $i -eq 0 -o $i -eq 8 ]; then
    YVAL=$YGAP
  elif [ $((i%2)) -eq 0 ]; then
    YVAL=$((YGAP+10))
  else
    YVAL=$((YGAP+20))
  fi
  echo '<line x1="'${XVAL}'" y1="'${YVAL}'" x2="'${XVAL}'" y2="'$((YGAP+30))'" stroke="black" />' >> $IMG
done
echo '</g></defs>' >> $IMG

echo '<text x="'$((XGAP/2))'" y="'$((YGAP+16))'" font-family="monospace" font-size="16" text-anchor="middle" fill="black">In</text>' >> $IMG

MAX=`awk 'BEGIN {printf "%0.0f", ('${IMG_WIDTH}' - '${XGAP}' - ('${IN}' / 1.5) ) / '${DPI}' - 1}'`
for ((i=0; i<=${MAX}; i++)); do
  XVAL=`awk 'BEGIN {printf "%0.20f", '${DPI}' * '$i' }'`
  echo '<use xlink:href="#in" x="'${XVAL}'" />' >> $IMG
  XVAL=`awk 'BEGIN {printf "%0.20f", '$((XGAP - 1))' + ('${DPI}' * '$i') }'`
  echo '<text x="'${XVAL}'" y="'$((YGAP-8))'" font-family="monospace" font-size="16" text-anchor="middle" fill="black">'${i}'</text>' >> $IMG
done
XVAL=`awk 'BEGIN {printf "%0.20f", '$((XGAP - 1))' + ('${DPI}' * '$i') }'`
echo '<text x="'${XVAL}'" y="'$((YGAP-8))'" font-family="monospace" font-size="16" text-anchor="middle" fill="black">'${i}'</text>' >> $IMG

# -----------------------------------------------------------------------------

echo '</svg>' >> $IMG

# =============================================================================
# Display the ruler
# =============================================================================

echo '
<window title="'${APPNAME}'" resizable="false" image-name="/usr/share/pixmaps/rul3r.png">
  <pixmap>
    <input file>'${IMG}'</input>
  </pixmap>
</window>' | gtkdialog -sc

rm "${IMG}"
exit
