72 lines
1.5 KiB
Bash
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}
|
|
}
|
|
}
|