#!/bin/bash
# png2all
# last edited Sunday, 07/24/2022
# script by Paul Sherman <psherman2001@gmail.com>
# c2018-2022, GPL3
################################################################################
# Help                                                                         #
################################################################################
Help()
{
	echo ""
	echo "Converts a PNG file:"
	echo "Formats include:"
	echo ""
	echo "JPG, WEBP, AVIF and JXL"
	echo ""
	echo "If you are starting with a transparent PNG,"
	echo "rename the file to end with"
	echo "_T.png"
	echo "prior to conversions."
	echo ""
   echo
}
while getopts ":h" option; do
   case $option in
      h) # display Help
         Help
         exit;;
   esac
done

if [[ "$DISPLAY" && "$(which Xdialog 2>&1 | grep -v "which: no")" ]]; then
	dialog="Xdialog"
else
	dialog="dialog"
fi
if [ ! -e "$1" ]; then
	$dialog --title "No File Specified" --msgbox "\nMust be passed a PNG file\n" 10 36
	exit
fi
ISPNG=`gm identify "$1" | cut -d " " -f 2`
if [ ! "$ISPNG" = "PNG" ]; then
	$dialog --title "Not a PNG" --msgbox "\nThe file does not appear\nto be a valid PNG.\n" 10 36
	exit
fi
pth=`dirname "$1"`
cd $pth

echo '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
uf3PHv8DFMHdkAeXazMAAAAASUVORK5CYII=
' | base64 -d > /tmp/icon.png

tmpfile=/tmp/1.png
cp -f "$1" "$tmpfile" 2> /dev/null
# to get rid of png color profile errors
gm mogrify -strip "$tmpfile" 2>/dev/null

bname=$(basename "$1")
isOpaque=`gm identify -format '%[opaque]' $tmpfile`

# first, if NOT transparent
if [ isOpaque == true ]; then

	if [[ "$bname" =~ "_T.png" ]]; then
		noAlpha=`echo "$bname" | sed 's/\_T.png/\.png/'`
		toAlpha="$(echo "$noAlpha" | sed 's/ /_/g')"
		newname="$pth/$noAlpha"
	else
		newname="$(echo "$bname" | sed 's/ /_/g')"
		newname="$pth/$newname"	
	fi
# if transparent
else
	if [[ "$bname" =~ "_T.png" ]]; then
		newname="$(echo "$bname" | sed 's/ /_/g')"
		newname="$pth/$newname"	
	else
		toAlpha=`echo "$bname" | sed 's/\.png/\_T.png/'`
		toAlpha="$(echo "$toAlpha" | sed 's/ /_/g')"
		newname="$pth/$toAlpha"
	fi
fi


function CLOSE_EXIT() 
{ 
    echo "Close and exit..." 
	# stop any of the conversions...
	killall -9 cwebp 2>/dev/null
	killall -9 avifenc 2>/dev/null
	killall -9 gm 2>/dev/null
	killall -9 cjxl 2>/dev/null
	# dump the dialog
    kill $(ps aux | grep 'yad' | awk '{print $2}') 2>/dev/null 
	pkill -f $0
} ; export -f CLOSE_EXIT 


start_process () {

if [[ ! "$newname" =~ "_T.png" ]]; then
	jname=`echo "$newname" | sed 's/\.png/\.jpg/'`
	wname=`echo "$newname" | sed 's/\.png/\.webp/'`
	avname=`echo "$newname" | sed 's/\.png/\.avif/'`
	xlname=`echo "$newname" | sed 's/\.png/\.jxl/'`
	cwebp -q 90 "$tmpfile" -o "$wname"
	avifenc --min 30 --max 30 "$tmpfile" "$avname"
	cjxl "$tmpfile" "$xlname" -q 85
    gm convert -background white -extent 0x0 +matte -flatten -quality 85 "$newname" "$jname"
	echo "Done."
	rm -f /tmp/icon.png 2>/dev/null
	exit 0
fi

# leaves script already if we did not start with a transparent PNG
##################################################################################################

flatpng=`echo "$newname" | sed 's/\_T.png/\.png/'`
jname=`echo "$flatpng" | sed 's/\.png/\.jpg/'`
wname=`echo "$flatpng" | sed 's/\.png/\.webp/'`
avname=`echo "$flatpng" | sed 's/\.png/\.avif/'`
xlname=`echo "$flatpng" | sed 's/\.png/\.jxl/'`

gm convert -background white -extent 0x0 +matte "$tmpfile" "$flatpng"
gm convert -quality 85 "$flatpng" "$jname"
cwebp -q 90 "$tmpfile" -o "$wname"
avifenc --min 30 --max 30 "$tmpfile" "$avname"
cjxl "$tmpfile" "$xlname" -q 85
rm -f /tmp/icon.png 2>/dev/null
rm -f $tmpfile
echo "Done."

}
# swing yad dialog to top-right of screen
XX=`xdpyinfo | grep dimensions | awk '{print $2}' | awk -Fx '{print $1}'`
XXX=$(( ${XX}-414 ))
# Show the conversion dialog
yad --info --posx=$XXX --width=400 --title="Converting" --on-top --window-icon="/tmp/icon.png" --text-align center --button="EXIT:bash -c CLOSE_EXIT"  --text="\n<b>\nNow converting to<big><big>\n\nwebp, jpeg, \navif and jxl \n\n</big></big>This dialog will close when complete...\n(clicking EXIT will stop conversions)</b>\n\n\n\nIf you start with a transparent PNG,\nthen rename it to end with\n<b>_T.png</b>\nprior to conversions." &
# Do the conversions
start_process
sleep 2
kill $(ps aux | grep 'yad' | awk '{print $2}') 2>/dev/null
