| #!/bin/bash | |
| trap "exit" INT | |
| dirname=`dirname "$0"` | |
| # Parse options | |
| output_dir= | |
| font_file= | |
| face_index=0 | |
| hb_view=hb-view | |
| hb_info=hb-info | |
| hb_svg_compare=$dirname/hb-svg-compare | |
| tolerance=0 | |
| font_size=upem | |
| features= | |
| variations= | |
| face_loader=ot | |
| shaper=ot | |
| font_funcs1=ot | |
| font_funcs2=fontations | |
| clear1=false | |
| clear2=false | |
| unicodes= | |
| glyphs= | |
| quiet=false | |
| help=false | |
| while test $# -gt 0; do | |
| case "$1" in | |
| -o|--output-dir) | |
| shift | |
| output_dir=$1 | |
| shift | |
| ;; | |
| --font-file) | |
| shift | |
| font_file=$1 | |
| shift | |
| ;; | |
| --face-index) | |
| shift | |
| face_index=$1 | |
| shift | |
| ;; | |
| --hb-view) | |
| shift | |
| hb_view=$1 | |
| shift | |
| ;; | |
| --hb-info) | |
| shift | |
| hb_info=$1 | |
| shift | |
| ;; | |
| --hb-svg-compare) | |
| shift | |
| hb_svg_compare=$1 | |
| shift | |
| ;; | |
| --tolerance) | |
| shift | |
| tolerance=$1 | |
| shift | |
| ;; | |
| --font-size) | |
| shift | |
| font_size=$1 | |
| shift | |
| ;; | |
| --features) | |
| shift | |
| features=$1 | |
| shift | |
| ;; | |
| --variations) | |
| shift | |
| variations=$1 | |
| shift | |
| ;; | |
| --unicodes) | |
| shift | |
| unicodes=$1 | |
| shift | |
| ;; | |
| --face-loader) | |
| shift | |
| face_loader=$1 | |
| shift | |
| ;; | |
| --shaper) | |
| shift | |
| shaper=$1 | |
| shift | |
| ;; | |
| --font-funcs1) | |
| shift | |
| font_funcs1=$1 | |
| shift | |
| ;; | |
| --font-funcs2) | |
| shift | |
| font_funcs2=$1 | |
| shift | |
| ;; | |
| --clear1) | |
| shift | |
| clear1=true | |
| ;; | |
| --clear2) | |
| shift | |
| clear2=true | |
| ;; | |
| --quiet) | |
| quiet=true | |
| shift | |
| ;; | |
| --help) | |
| help=true | |
| shift | |
| ;; | |
| *) | |
| if test "x$font_file" == x; then | |
| font_file=$1 | |
| shift | |
| else | |
| glyphs="$glyphs $1" | |
| shift | |
| fi | |
| ;; | |
| esac | |
| done | |
| if $help; then | |
| cmd=`basename "$0"` | |
| echo "Usage: $cmd [OPTIONS] FONTFILE [GLYPH...]" | |
| echo "Render a font with two font backends and compare the results." | |
| echo | |
| echo "Options:" | |
| echo " -o, --output-dir DIR: Output in DIR" | |
| echo " --font-file FONTFILE: Font file to render" | |
| echo " --hb-view HB_VIEW: Path to hb-view; default $hb_view" | |
| echo " --hb-info HB_INFO: Path to hb-info; default $hb_info" | |
| echo " --hb-svg-compare HB_SVG_COMPARE: Path to hb-svg-compare; default $hb_svg_compare" | |
| echo " --tolerance TOLERANCE: Tolerance for SVG comparison; default $tolerance" | |
| echo " --font-size SIZE: Font size; default $font_size" | |
| echo " --features FEATURES: Font features; default none" | |
| echo " --variations VARIATIONS: Font variations; default none" | |
| echo " --face-loader: Face loader; default $face_loader" | |
| echo " --shaper: Shaper; default $shaper" | |
| echo " --font-funcs1 font_funcs: First font-funcs; default $font_funcs1" | |
| echo " --font-funcs2 font_funcs: Second font-funcs; default $font_funcs2" | |
| echo " --clear1: Clear first font backend output if exists" | |
| echo " --clear2: Clear second font backend output if exists" | |
| echo " --unicodes CODES: Unicodes to render" | |
| echo " --quiet: Quiet mode" | |
| echo " --help: Print help" | |
| exit 0 | |
| fi | |
| if test "x$font_file" == x; then | |
| echo "No font file specified." >&2 | |
| exit 2 | |
| fi | |
| if ! which "$hb_view" 2>/dev/null >/dev/null; then | |
| echo "'$hb_view' not found" >&2 | |
| exit 2 | |
| fi | |
| if ! which "$hb_info" 2>/dev/null >/dev/null; then | |
| echo "'$hb_info' not found" >&2 | |
| exit 2 | |
| fi | |
| if ! test -f "$font_file"; then | |
| echo "Font file '$font_file' not found" >&2 | |
| exit 2 | |
| fi | |
| # Sanity check Unicode values | |
| if test "x$unicodes" != x; then | |
| echo "$unicodes" | | |
| tr ' ' '\n' | | |
| grep -v '^U[+][0-9a-fA-F]\+$' && | |
| { | |
| echo "Invalid Unicode values" >&2 | |
| exit 2 | |
| } | |
| fi | |
| $quiet || echo "Comparing '$font_file' with '$font_funcs1' and '$font_funcs2' font backends. " >&2 | |
| if test "x$output_dir" == x; then | |
| output_dir=`mktemp -d` | |
| echo "Output in '$output_dir'" >&2 | |
| fi | |
| mkdir -p "$output_dir" || exit 1 | |
| # Populate glyphs file | |
| glyphs_file="$output_dir/glyphs" | |
| > "$glyphs_file" | |
| echo "$unicodes" | | |
| sed 's/^U+//' | | |
| grep . | | |
| while read unicode; do | |
| echo "uni$unicode" | |
| done >> "$glyphs_file" | |
| echo "$glyphs" | | |
| tr ' ' '\n' | | |
| grep . >> "$glyphs_file" | |
| if test "x$unicodes" == x -a "x$glyphs" == x; then | |
| $quiet || echo "No unicodes or glyphs specified. Comparing all glyphs in the font." >&2 | |
| num_glyphs=`$hb_info --quiet --show-glyph-count "$font_file"` | |
| $quiet || echo "Font has $num_glyphs glyphs." >&2 | |
| seq 0 $((num_glyphs - 1)) | | |
| sed 's/^/gid/' >> "$glyphs_file" | |
| fi | |
| num_glyphs=`cat "$glyphs_file" | wc -l` | |
| flavor= | |
| if test "$features" != ""; then | |
| flavor="$flavor.features=$features" | |
| fi | |
| if test "$variations" != ""; then | |
| flavor="$flavor.variations=$variations" | |
| fi | |
| # Render with both font backends | |
| if $clear1; then | |
| funcs_prefix="$output_dir/$font_funcs1$flavor" | |
| $quiet || echo "Clearing '$funcs_prefix'... " >&2 | |
| rm -rf "$funcs_prefix" | |
| fi | |
| if $clear2; then | |
| funcs_prefix="$output_dir/$font_funcs2$flavor" | |
| $quiet || echo "Clearing '$funcs_prefix'... " >&2 | |
| rm -rf "$funcs_prefix" | |
| fi | |
| for font_funcs in "$font_funcs1" "$font_funcs2"; do | |
| test "x$font_funcs" == x && continue | |
| $quiet || echo "Rendering with font backend '$font_funcs'..." >&2 | |
| funcs_prefix="$output_dir/$font_funcs$flavor" | |
| mkdir -p "$funcs_prefix" | |
| count=0 | |
| cat "$glyphs_file" | | |
| while read glyph; do | |
| dir="$funcs_prefix" | |
| svg="$dir/$glyph.svg" | |
| if test -f "$svg"; then | |
| continue | |
| fi | |
| count=$((count + 1)) | |
| if test $((count % 100)) == 0; then | |
| $quiet || echo -n . >&2 | |
| fi | |
| echo \ | |
| --font-file="$font_file" \ | |
| --face-index=$face_index \ | |
| --glyphs \ | |
| --face-loader=$face_loader \ | |
| --shaper=$this_shaper \ | |
| --font-funcs=$font_funcs \ | |
| --features="$features" \ | |
| --variations="$variations" \ | |
| --output-format=svg \ | |
| --font-size=$font_size \ | |
| --output-file="$svg" \ | |
| "$glyph" | |
| done | | |
| sed 's/ /;/g' | | |
| "$hb_view" --batch >/dev/null | |
| $quiet || echo "" >&2 | |
| done | |
| test "x$font_funcs1" == x || test "x$font_funcs2" == x && exit 0 | |
| diff="$output_dir/diff$flavor" | |
| rm -f "$diff" | |
| > "$diff" | |
| test "x$flavor" == x || ln -f -s "diff$flavor" "$output_dir/diff" | |
| $quiet || echo "Comparing SVGs into '$diff'..." >&2 | |
| funcs1_prefix="$output_dir/$font_funcs1$flavor" | |
| funcs2_prefix="$output_dir/$font_funcs2$flavor" | |
| count=0 | |
| cat "$glyphs_file" | | |
| while read glyph; do | |
| count=$((count + 1)) | |
| if test $((count % 100)) == 0; then | |
| $quiet || echo -n . >&2 | |
| fi | |
| svg1="$funcs1_prefix/$glyph.svg" | |
| svg2="$funcs2_prefix/$glyph.svg" | |
| if ! test -f "$svg1" || ! test -f "$svg2"; then | |
| echo -e "\n$glyph not rendered." >&2 | |
| exit 1 | |
| fi | |
| echo -e "$svg1\t$svg2" | |
| done | | |
| "$hb_svg_compare" "$tolerance" | | |
| while read line; do | |
| $quiet || echo -e "\n$line" | |
| echo "$line" >> "$diff" | |
| done | |
| # Sort diff by error | |
| sort -n -o "$diff.tmp" "$diff" && mv "$diff.tmp" "$diff" || exit 1 | |
| # Count number of differences | |
| num_diffs=`cat "$diff" | wc -l` | |
| $quiet || echo -e "\nFound $num_diffs differences in $num_glyphs glyphs." >&2 |