bashfblib/bashfblib.sh
2015-12-17 11:33:02 +00:00

72 lines
1.5 KiB
Bash

#!/bin/sh
# Dependency, shell, printf, dd
# TODO: Dependency on dd can be removed, but will be really slow
# TODO: Implement double buffering
# TODO: Propose no dependency on printf
NO_DD=0
USE_DOUBLE_BUFFERING=0
NO_PRINTF=0
# NEED TO FILL THIS INFORMATION
# geometry 220 176 220 352 16
# rgba 5/11,6/5,5/0,0/0
# TODO: Adding a dependency on fbset we may be able to autoset this:
SCREEN_WIDTH=220
SCREEN_HEIGHT=176
RED_DEPTH=5
GREEN_DEPTH=6
BLUE_DEPTH=5
RED_POS=11
GREEN_POS=5
BLUE_POS=0
TEMP=`mktemp`
SCREEN_FB=/dev/fb0
###
# AUTOCALCULATED VALUES
BIT_PER_PIXEL=$((${RED_DEPTH}+${GREEN_DEPTH}+${BLUE_DEPTH}))
BYTE_PER_PIXEL=$((${BIT_PER_PIXEL}/8))
SCREEN_STRIDE=$((${BYTE_PER_PIXEL}*${SCREEN_WIDTH}))
RED_MAX=$((2**${RED_DEPTH}))
GREEN_MAX=$((2**${GREEN_DEPTH}))
BLUE_MAX=$((2**${BLUE_DEPTH}))
RED_SHIFT=$((2**${RED_POS}))
GREEN_SHIFT=$((2**${GREEN_POS}))
BLUE_SHIFT=$((2**${BLUE_POS}))
drawpixel()
{
x=$1; shift 1
y=$1; shift 1
r=$1; shift 1
g=$1; shift 1
b=$1; shift 1
skip=$(($((${x}*${BYTE_PER_PIXEL}-1))+$((${y}*${SCREEN_STRIDE}))))
rc=$((${r}*${RED_MAX}/256))
gc=$((${g}*${GREEN_MAX}/256))
bc=$((${b}*${BLUE_MAX}/256))
rs=$((${rc}*${RED_SHIFT}))
gs=$((${gc}*${GREEN_SHIFT}))
bs=$((${bc}*${BLUE_SHIFT}))
value=$((${rs}+${gs}+${bs}))
echo -ne "" > ${TEMP}
for i in `seq $((${BIT_PER_PIXEL}-8)) -8 0`; do
val=$(($((${value}/$((2**$i))))&255))
echo -ne "$(printf '\\x%x' ${val})" >> ${TEMP}
done
dd if=${TEMP} of=${SCREEN_FB} bs=1 seek=${skip} count=${BYTE_PER_PIXEL} 2&> /dev/null
}
fblib_cleanup()
{
rm ${TEMP}
}
}