139 lines
5.2 KiB
Bash
Executable File
139 lines
5.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# muxsa-pv
|
|
#
|
|
# part of muxsa, https://git-nks-public.tik.uni-stuttgart.de/edu/muxsa
|
|
#
|
|
# this script reads a series of png files (preferably created with
|
|
# muxsa-kvm2png) and creates new png files, with the current file
|
|
# large and the next file somewhat smaller. The result looks similar
|
|
# to the "presenter view" in slide presentation software.
|
|
|
|
# MIT License
|
|
#
|
|
# Copyright (c) 2023 Sebastian Kiesel <sebastian.kiesel@tik.uni-stuttgart.de>
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
# copy of this software and associated documentation files (the "Software"),
|
|
# to deal in the Software without restriction, including without limitation
|
|
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
# and/or sell copies of the Software, and to permit persons to whom the
|
|
# Software is furnished to do so, subject to the following conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be included
|
|
# in all copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
# OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
############################################################################
|
|
|
|
echo "This is muxsa-pv."
|
|
|
|
# various parameters can be set as an environment variable (export XX="y z")
|
|
# or can be set in our RC file. Otherwise we will assign default values below.
|
|
|
|
if [ -r "${HOME}/.muxsarc" ] ; then
|
|
echo "Found ${HOME}/.muxsarc ... will source it."
|
|
. "${HOME}/.muxsarc"
|
|
fi
|
|
|
|
echo "Will work with these settings:"
|
|
echo "MUXSA_KVM2PNG_SLIDE_PREFIX=${MUXSA_KVM2PNG_SLIDE_PREFIX:=""}"
|
|
echo "MUXSA_PV_OUT_DIR=${MUXSA_PV_OUT_DIR:="presenter-view"}"
|
|
echo "MUXSA_PV_RM_OUT_DIR=${MUXSA_PV_RM_OUT_DIR:="0"}"
|
|
echo "MUXSA_PV_SIZE_X=${MUXSA_PV_SIZE_X:="1680"}"
|
|
echo "MUXSA_PV_MARGIN_Y=${MUXSA_PV_MARGIN_Y:="4"}"
|
|
if [ ! "${MUXSA_PV_SIZE_Y}" ] ; then
|
|
# the left image will be scaled to a width of 64%
|
|
# of the width of the output image. assuming an aspect ratio of 16:9,
|
|
# its height will be 9/16 * 64% = 36% of that.
|
|
MUXSA_PV_SIZE_Y=$(( ${MUXSA_PV_SIZE_X} * 36/100 + 2*${MUXSA_PV_MARGIN_Y} ))
|
|
fi
|
|
echo "MUXSA_PV_SIZE_Y=${MUXSA_PV_SIZE_Y}"
|
|
echo
|
|
|
|
# left image is 64 % of target width, starting at an offset of 1%
|
|
# right image is 32 % of target width, starting at 1+64+2%, leaving 1% right
|
|
X01=$(( ${MUXSA_PV_SIZE_X} * 1 / 100 ))
|
|
X32=$(( ${MUXSA_PV_SIZE_X} * 32 / 100 ))
|
|
X64=$(( ${MUXSA_PV_SIZE_X} * 64 / 100 ))
|
|
X67=$(( ${MUXSA_PV_SIZE_X} * 67 / 100 ))
|
|
|
|
MAX_Y=$(( ${MUXSA_PV_SIZE_Y} - 2 * ${MUXSA_PV_MARGIN_Y} ))
|
|
|
|
############################################################################
|
|
|
|
if [ -e "${MUXSA_PV_OUT_DIR}" ] ; then
|
|
echo "Output dir ${MUXSA_PV_OUT_DIR} exists."
|
|
if [ "${MUXSA_PV_RM_OUT_DIR}" = "1" ] ; then
|
|
echo "Removal requested by MUXSA_PV_RM_OUT_DIR. rm -rf ..."
|
|
rm -rf "${MUXSA_PV_OUT_DIR}"
|
|
else
|
|
echo "Removal NOT requested by MUXSA_PV_RM_OUT_DIR. abort."
|
|
exit 1
|
|
fi
|
|
fi
|
|
mkdir -p "${MUXSA_PV_OUT_DIR}"
|
|
if [ ! -d "${MUXSA_PV_OUT_DIR}" ] ; then
|
|
echo "Could not create output dir ${MUXSA_PV_OUT_DIR}. abort."
|
|
exit 1
|
|
fi
|
|
|
|
############################################################################
|
|
|
|
TMP_FILE_LEFT="$(mktemp -t muxsa-pv-XXXXXXXXXX.ppm)"
|
|
if [ ! -w "${TMP_FILE_LEFT}" ] ; then
|
|
echo "Error: cannot create tmp_file. abort."
|
|
exit 1
|
|
fi
|
|
TMP_FILE_RIGHT="$(mktemp -t muxsa-pv-XXXXXXXXXX.ppm)"
|
|
if [ ! -w "${TMP_FILE_RIGHT}" ] ; then
|
|
rm -f -- "${TMP_FILE_LEFT}"
|
|
echo "Error: cannot create tmp_file. abort."
|
|
exit 1
|
|
fi
|
|
trap 'rm -f -- "${TMP_FILE_LEFT}" "${TMP_FILE_RIGHT}"' EXIT
|
|
|
|
############################################################################
|
|
|
|
# find . -maxdepth 1 -name "${MUXSA_KVM2PNG_SLIDE_PREFIX}????.png" | sort | \
|
|
# while read RIGHT_FN ; do
|
|
|
|
for RIGHT_FN in ${MUXSA_KVM2PNG_SLIDE_PREFIX}????.png "" ; do
|
|
if [ ! -f "${LEFT_FN}" ] ; then
|
|
LEFT_FN="${RIGHT_FN}"
|
|
continue
|
|
fi
|
|
|
|
OUTFILE="${MUXSA_PV_OUT_DIR}/${LEFT_FN}"
|
|
echo "muxsa-pv: processing ${LEFT_FN} + ${RIGHT_FN:-(null)} to ${OUTFILE}"
|
|
|
|
pngtopnm "${LEFT_FN}" | \
|
|
pnmscale -xysize ${X64} ${MAX_Y} | \
|
|
pnmpad -width ${X64} -height ${MAX_Y} > "${TMP_FILE_LEFT}"
|
|
|
|
if [ -f "${RIGHT_FN}" ] ; then
|
|
pngtopnm "${RIGHT_FN}" | \
|
|
pnmscale -xysize ${X32} ${MAX_Y} | \
|
|
pnmpad -width ${X32} -height ${MAX_Y} > "${TMP_FILE_RIGHT}"
|
|
else
|
|
pbmmake -black ${X32} ${MAX_Y} > "${TMP_FILE_RIGHT}"
|
|
fi
|
|
|
|
pbmmake -black ${MUXSA_PV_SIZE_X} ${MUXSA_PV_SIZE_Y} | \
|
|
pnmpaste -replace "${TMP_FILE_LEFT}" ${X01} ${MUXSA_PV_MARGIN_Y} | \
|
|
pnmpaste -replace "${TMP_FILE_RIGHT}" ${X67} ${MUXSA_PV_MARGIN_Y} | \
|
|
pnmtopng -force > "${OUTFILE}"
|
|
|
|
LEFT_FN="${RIGHT_FN}"
|
|
done
|
|
|
|
echo "muxsa-pv finished successfully!"
|
|
############################################################################
|