#! /bin/bash # # flix: Convert ePiX file(s) to png/mng/gif # # Options: --help for usage, --version for version and license # # Compiler flags may be specified on the command line or in the config # file ~/.epixrc, just as for epix. # # LaTeX packages may be specified on the command line or in the config # file ~/.dvipsrc, just as for elaps # # Copyright (C) 2004, 2005, 2006, 2007 # Andrew D. Hwang # . "@pkglibdir@/epix-lib.sh" EPIX_CONFIG_FILE="$HOME/.epixrc" FLIX_CONFIG_FILE="$HOME/.flixrc" # Search these extensions in order of preference FLIX_EXTENSIONS="flx xp cc c C cpp" # or NULL FLIX_DOT_EXT=".${FLIX_EXTENSIONS// /|.}" # for usage message # Path to standard header and library and compiler HDR_PATH="-I@includedir@" LIB_PATH="-L@pkglibdir@" COMPILER="@RUNTIME_COMPILER@" # default values FLIX_TMAX=1 FLIX_FRAME_COUNT=24 FLIX_DELAY=8 # filename variables declare FLIX_FRAME # $EPIX_INROOT-frameXX declare FLIX_MOVIE # actual output filename FLIX_SUFFIX=mng # flags FLIX_PROGRESS="yes" # Show progress bar? FLIX_ONLY_EEPIC="no" # Create eepic files only? FLIX_ONLY_PNG="no" # Create png and eepic files only? FLIX_SAVE_EEPIC="no" # Save eepic files after run? FLIX_SAVE_PNG="no" # Save png files after run? FLIX_FRAME_PAD="" # zero or more zeros, dep. on number of frames FLIX_1ST_FRAME= # filename, to test success of compile trap '[ -n "$EPIX_TEMPDIR" ] && rm -rf "$EPIX_TEMPDIR"' 0 1 2 3 7 10 13 15 # options for external programs declare -a ELAPS_OPTS # compiler variables declare GXX_INCLUDES declare GXX_LIBDIRS GXX_LIBS="-lm" GXX_POSTLIBS="-lepix" declare -a GXX_DEFINES function flix_help { cat < remove all rm -f "$FLIX_FRAME"*.png fi # and create new frames for i in $(seq 1 $FLIX_FRAME_COUNT); do flix_png "${EPIX_TEMPDIR}/$TEMP_BIN" $i # bomb out if we can't create first new frame if [ ! -f "${FLIX_1ST_FRAME}" ]; then ePiX_fail "Couldn't create frames" continue 2 fi done if [ "$FLIX_ONLY_PNG" = "no" -a "$FLIX_ONLY_EEPIC" = "no" ]; then FLIX_MOVIE="${EPIX_OUTROOT}.$FLIX_SUFFIX" TMP_CMD=(convert -delay $FLIX_DELAY "$FLIX_FRAME"*.png "$FLIX_MOVIE") ePiX_command "${TMP_CMD[@]}" if [ -f "$FLIX_MOVIE" ]; then let success=success+1 else ePiX_fail "Couldn't assemble frames" continue fi fi echo -e "\nTranscript written on $EPIX_LOGFILE" > "$EPIX_STDOUT" # clean up if [ "$EPIX_OUTROOT" = "$EPIX_INROOT" ]; then unset EPIX_OUTROOT; fi rm -f "$FLIX_FRAME"*.eps "$FLIX_FRAME"*.log if [ "$FLIX_SAVE_EEPIC" = "no" ]; then rm -f "$FLIX_FRAME"*.eepic fi if [ "$FLIX_SAVE_PNG" = "no" ]; then rm -f "$FLIX_FRAME"*.png fi # Newline after progress bar? if [ "$FLIX_PROGRESS" = "yes" ]; then echo; fi done # for EPIX_INFILE in $FLIX_INFILE_LIST if [ $processed -gt 1 ]; then echo "$processed files processed: $success movie(s) written, $failure failed" > "$EPIX_STDERR" fi if [ -d "$EPIX_TEMPDIR" ]; then rm -Rf "$EPIX_TEMPDIR"; fi } # end of flix_compile_files() # Prints ....|....10....|....20 function progress_bar() { if [ $(($1 % 10)) -eq 0 ]; then echo -n "$1" elif [ $(($1 % 5)) -eq 0 ]; then echo -n "|" else echo -n "." fi } # Create a single eepic, eps, and/or png file: # flix_png file.exe frame_number function flix_png() { local TEMP_BIN="$1" local INDEX="$2" TIME=$(echo ${FLIX_TMAX}*${INDEX} | bc) # Calculate number of 0s in output filename TMP_CT=$(( ${INDEX}/10 )) TMP_PAD="$FLIX_FRAME_PAD" # progress bar if [ "$FLIX_PROGRESS" = "yes" ]; then progress_bar $INDEX else ePiX_msg "Frame $INDEX.eps" fi # each time we're divisible by ten, remove a 0 from padding while [ $TMP_CT -ne 0 ] do TMP_CT=$(($TMP_CT/10)) TMP_PAD="${TMP_PAD%%0}" done INDEX="$TMP_PAD$INDEX" # pad with 0s if [ $2 -eq 1 ]; then FLIX_1ST_FRAME="$FLIX_FRAME"${TMP_PAD}1.eepic; fi TMP_NAME="${FLIX_FRAME}${INDEX}" "./$TEMP_BIN" $TIME $FLIX_FRAME_COUNT > "$TMP_NAME".eepic if [ $? -ne 0 ]; then ePiX_warn "Could not create frames" return fi if [ "$FLIX_ONLY_EEPIC" = "no" ]; then # create eps TEMPFILES=("{TEMPFILES[@]}" "$TMP_NAME".eps) TMP_CMD=(elaps "${ELAPS_OPTS[@]}" -o "$TMP_NAME".eps "$TMP_NAME".eepic) ePiX_command "${TMP_CMD[@]}" TMP_CMD=(convert "$TMP_NAME".eps "$TMP_NAME".png) ePiX_command "${TMP_CMD[@]}" fi } # end of flix_png() ## Script proper starts here ## if [ $# -eq 0 ]; then ePiX_usage flix $FLIX_DOT_EXT flix_help exit 0 fi # Read options from config files, if any if [ -f "$EPIX_CONFIG_FILE" ]; then cat "$EPIX_CONFIG_FILE" | grep -v "#" | \ while read line; do flix_parse_options "$line" done fi if [ -f "$FLIX_CONFIG_FILE" ]; then cat "$FLIX_CONFIG_FILE" | grep -v "#" | \ while read line; do flix_parse_options "$line" done fi flix_parse_options "$@" flix_pad_init # Suppress all warnings if none are requested if [ "$FLIX_WARNS" = "" ]; then FLIX_WARNS="-w"; fi flix_compile_files "${FLIX_FILE_LIST[@]}" exit 0