| #!/bin/bash -eu |
| # Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| # |
| # Generate a new DEFAULT.yaml file using hwid_unknown.bmp as a placeholder. |
| # |
| yaml_file="DEFAULT.yaml" |
| |
| # I'm sorting the locales in more-or-less geographical order. Right should move |
| # east, left should move west. Of course we'll start in the US. :-) |
| locales="en es_419 pt_BR en_GB fr es pt_PT ca it de el nl da no sv fi et lv "\ |
| "lt ru pl cs sk hu sl sr hr bg ro uk tr iw ar fa hi th vi id fil zh_CN zh_TW "\ |
| "ko ja" |
| localedir="./locale" |
| |
| # These render right-to-left |
| rtol="ar fa iw" |
| |
| # Accept optional args which are the locales to emit. Default is all of 'em. |
| if [ -n "$*" ]; then |
| # Make sure all the args actually match |
| for arg in "$@"; do |
| if [ ! -d "$localedir/$arg" ]; then |
| echo "$0: locale \"$arg\" is unknown" 1>&2 |
| exit 1 |
| fi |
| done |
| locales="$*" |
| fi |
| |
| # Arbitrary padding |
| ypad=5 |
| xpad=5 |
| |
| # Globals used to specify location images are inserted. |
| cur_x=0 |
| cur_y=0 |
| |
| reset_pos() { |
| cur_x=0 |
| cur_y=0 |
| } |
| |
| move_pos_up() { |
| cur_y=$(expr $cur_y - $1 ) |
| } |
| |
| move_pos_down() { |
| cur_y=$(expr $cur_y + $1 ) |
| } |
| |
| move_pos_left() { |
| cur_x=$(expr $cur_x - $1 ) |
| } |
| |
| move_pos_right() { |
| cur_x=$(expr $cur_x + $1 ) |
| } |
| |
| # Move insert location to the vertical midline of a specified image. |
| # Example: set_centered_y_percent 'some_image' 80 |
| # Sets insert point to the center of an image specified by a variable name, |
| # 80% towards the bottom. Assumes image was inserted at 0,0 so only good |
| # for the background image. |
| set_centered_y_percent() { |
| cur_x=$(expr $(get_width $1) / 2 ) |
| cur_y=$(expr $(get_height $1) \* $2 / 100 ) |
| } |
| |
| # Return width of a .bmp file specified by a variable. |
| get_width() { |
| local filename="$(eval "echo \$$1")" |
| identify -format "%[fx:w]" "$filename" |
| } |
| |
| # Return the width of a list of images. |
| total_width() { |
| local width=$(expr 0 - $xpad) |
| for filename in "$@"; do |
| width=$(expr $width + $(get_width ${filename}) + $xpad) |
| done |
| echo $width |
| } |
| |
| # Return height of a .bmp file specified by a variable. |
| get_height() { |
| local filename="$(eval "echo \$${1}")" |
| identify -format "%[fx:h]" "$filename" |
| } |
| |
| # Returns the max height of a list of images. |
| get_max_height() { |
| local max_height=0 |
| local height |
| for filename in $@; do |
| height=$(get_height ${filename}) |
| [ $max_height -gt $height ] || max_height=$height |
| done |
| echo $max_height |
| } |
| |
| # Guess the locale based on the filename, set a global "newlocales" list |
| # accordingly. |
| guess_locale() { |
| local lc |
| local islc |
| local matches |
| islc= |
| |
| matches=0 |
| for lc in $locales; do |
| case "$1" in |
| *[_-]${lc}_* ) |
| matches=$(expr $matches + 1) |
| islc=$lc |
| ;; |
| esac |
| done |
| if (( $matches != 1 )); then |
| islc='en' |
| fi |
| |
| local newlist |
| newlist="$islc" |
| for lc in $locales; do |
| if [ "$lc" != "$islc" ]; then |
| newlist="$newlist $lc" |
| fi |
| done |
| |
| newlocales=$newlist |
| } |
| |
| # Add a list of images at provided location. |
| # Images of different heights are added centered on the tallest image. |
| add_images() { |
| local x=$1 |
| local y=$2 |
| local files=${@:3} |
| local max_height=$(get_max_height $files) |
| |
| for fname in $files; do |
| tmp_y=$(echo $( expr $y + "(" $max_height - $(get_height $fname) ")" / 2 ) ) |
| if [ "$fname" = "th_model_text" ]; then |
| tmp_y=$(expr $y - 9) |
| fi |
| echo " - [$x, $tmp_y, $fname]" >> "$yaml_file" |
| x=$(expr $x + $(get_width $fname) + $xpad) |
| done |
| } |
| |
| add_centered_below() { |
| local images=$@ |
| local width |
| local height |
| local x |
| local y |
| |
| height=$(get_max_height $images) |
| y=$(expr $cur_y + $height) |
| |
| width=$(total_width $images) |
| x=$(expr $cur_x - $width / 2) |
| |
| add_images $x $y $images |
| } |
| |
| # This adds a list of images and updates the insert location |
| # below the new images with a padding of $xpad. |
| insert_centered_below() { |
| local images=$@ |
| local width |
| local height |
| local x |
| local y |
| |
| height=$(get_max_height $images) |
| y=$(expr $cur_y + $height) |
| |
| width=$(total_width $images) |
| x=$(expr $cur_x - $width / 2) |
| |
| add_images $x $y $images |
| move_pos_down $(expr $height + $ypad) |
| } |
| |
| add_right_above() { |
| local images=$@ |
| local height |
| local x |
| local y |
| |
| height=$(get_max_height $images) |
| y=$(expr $cur_y - $height) |
| |
| add_images $cur_x $y $images |
| } |
| |
| add_right_below() { |
| add_images $cur_x $cur_y $@ |
| } |
| |
| add_left_above() { |
| local images=$@ |
| local width |
| local height |
| local x |
| local y |
| |
| height=$(get_max_height $images) |
| y=$(expr $cur_y - $height) |
| |
| width=$(total_width $images) |
| x=$(expr $cur_x - $width) |
| |
| add_images $x $y $images |
| } |
| |
| add_centered() { |
| local images=$@ |
| local width |
| local height |
| local x |
| local y |
| |
| height=$(get_max_height $images) |
| y=$(expr $cur_y - $height / 2) |
| |
| width=$(total_width $images) |
| x=$(expr $cur_x - $width / 2) |
| |
| add_images $x $y $images |
| } |
| |
| add_header() { |
| local lc=$1 |
| set_centered_y_percent "white_bg" 17 |
| add_centered_below "divider_top" |
| move_pos_left $(expr $(get_width "divider_top") / 2 ) |
| move_pos_up $ypad |
| add_right_above "chrome_logo" |
| move_pos_right $(get_width "divider_top") |
| add_left_above "arrow_left" "${lc}_language_text" "arrow_right" |
| } |
| |
| add_footer_with_url() { |
| local lc=$1 |
| set_centered_y_percent "white_bg" 80 |
| insert_centered_below "divider_btm" |
| insert_centered_below "${lc}_help_left_text" "url" "${lc}_help_right_text" |
| if echo "$rtol" | grep -q -w "$lc" ; then |
| insert_centered_below 'hwid' "${lc}_model_text" |
| else |
| insert_centered_below "${lc}_model_text" 'hwid' |
| fi |
| echo "" >> "$yaml_file" |
| } |
| |
| add_footer_without_url() { |
| local lc=$1 |
| set_centered_y_percent "white_bg" 80 |
| insert_centered_below "divider_btm" |
| if echo "$rtol" | grep -q -w "$lc" ; then |
| insert_centered_below 'hwid' "${lc}_model_text" |
| else |
| insert_centered_below "${lc}_model_text" 'hwid' |
| fi |
| echo "" >> "$yaml_file" |
| } |
| |
| # TODO(hungte) Remove the unnecessary hwid_*.bmp loop below. |
| # Generate a new yaml file for each specified hwid_*.bmp file. |
| for hwid_bmp in hwid_unknown.bmp; do |
| echo "$yaml_file" |
| |
| # Global variables matching the yaml definitions |
| arrow_left='arrow_left.bmp' |
| arrow_right='arrow_right.bmp' |
| chrome_logo='chrome_logo.bmp' |
| divider_btm='divider_btm.bmp' |
| divider_top='divider_top.bmp' |
| insert_graphic='Insert_graphic.bmp' |
| remove_graphic='Remove_graphic.bmp' |
| url='Url.bmp' |
| white_bg='Background_white.bmp' |
| |
| asset_BadSD='BadSD.bmp' |
| asset_BadUSB='BadUSB.bmp' |
| asset_RemoveDevices='RemoveDevices.bmp' |
| asset_VerificationOff='VerificationOff.bmp' |
| asset_VerificationOn='VerificationOn.bmp' |
| asset_Warning='Warning.bmp' |
| |
| hwid=$hwid_bmp |
| |
| # List the images. The major difference is the HWID. |
| cat >"$yaml_file" <<EOF1 |
| bmpblock: 2.0 |
| |
| compression: 2 |
| |
| images: |
| |
| # We must specify a font blob to use to render the HWID |
| \$HWID: hwid_fonts.bin |
| |
| # This URL never changes |
| url: $(eval echo \$url) |
| |
| # Various UI elements |
| arrow_left: $(eval echo \$arrow_left) |
| arrow_right: $(eval echo \$arrow_right) |
| chrome_logo: $(eval echo \$chrome_logo) |
| divider_btm: $(eval echo \$divider_btm) |
| divider_top: $(eval echo \$divider_top) |
| remove_graphic: $(eval echo \$remove_graphic) |
| insert_graphic: $(eval echo \$insert_graphic) |
| white_bg: $(eval echo \$white_bg) |
| |
| asset_VerificationOn: $(eval echo \$asset_VerificationOn) |
| asset_VerificationOff: $(eval echo \$asset_VerificationOff) |
| asset_BadSD: $(eval echo \$asset_BadSD) |
| asset_BadUSB: $(eval echo \$asset_BadUSB) |
| |
| # The following strings must be approved by the localization people |
| EOF1 |
| |
| |
| # Enumerate the bitmaps for each locale-specific string. |
| for lc in $locales; do |
| # Locale-specific variables matching those in the yaml file. |
| eval "${lc}_model_text=${localedir}/$lc/model.bmp" |
| eval "${lc}_devmode_text=${localedir}/$lc/devmode.bmp" |
| eval "${lc}_remove_text=${localedir}/$lc/remove.bmp" |
| eval "${lc}_yuck_text=${localedir}/$lc/yuck.bmp" |
| eval "${lc}_insert_text=${localedir}/$lc/insert.bmp" |
| eval "${lc}_language_text=${localedir}/$lc/language.bmp" |
| eval "${lc}_for_help_text=${localedir}/$lc/for_help.bmp" |
| eval "${lc}_help_left_text=${localedir}/$lc/for_help_left.bmp" |
| eval "${lc}_help_right_text=${localedir}/$lc/for_help_right.bmp" |
| eval "${lc}_todev_text=${localedir}/$lc/todev.bmp" |
| eval "${lc}_tonorm_text=${localedir}/$lc/tonorm.bmp" |
| eval "${lc}_tonorm_confirm_text=${localedir}/$lc/tonorm_confirmation.bmp" |
| eval "${lc}_back_help_text=${localedir}/$lc/back_help.bmp" |
| eval "${lc}_update_text=${localedir}/$lc/update.bmp" |
| |
| cat >>"$yaml_file" <<EOF2 |
| ${lc}_model_text: $(eval echo \$${lc}_model_text) |
| ${lc}_devmode_text: $(eval echo \$${lc}_devmode_text) |
| ${lc}_remove_text: $(eval echo \$${lc}_remove_text) |
| ${lc}_yuck_text: $(eval echo \$${lc}_yuck_text) |
| ${lc}_insert_text: $(eval echo \$${lc}_insert_text) |
| ${lc}_language_text: $(eval echo \$${lc}_language_text) |
| ${lc}_help_left_text: $(eval echo \$${lc}_help_left_text) |
| ${lc}_help_right_text: $(eval echo \$${lc}_help_right_text) |
| ${lc}_todev_text: $(eval echo \$${lc}_todev_text) |
| ${lc}_tonorm_text: $(eval echo \$${lc}_tonorm_text) |
| ${lc}_back_help_text: $(eval echo \$${lc}_back_help_text) |
| ${lc}_update_text: $(eval echo \$${lc}_update_text) |
| |
| ${lc}_tonorm_confirm_text: $(eval echo \$${lc}_tonorm_confirm_text) |
| |
| EOF2 |
| |
| done |
| |
| # List the screens. We need to composite four screens for each locale. |
| echo "screens:" >> "$yaml_file" |
| |
| for lc in $locales; do |
| echo -n " $lc" |
| |
| # Dev Screen |
| echo " ${lc}_devel:" >> "$yaml_file" |
| reset_pos |
| add_right_below "white_bg" |
| add_header ${lc} |
| set_centered_y_percent "white_bg" 40 |
| add_centered "asset_VerificationOff" |
| set_centered_y_percent "white_bg" 50 |
| add_centered_below "${lc}_devmode_text" |
| add_footer_without_url ${lc} |
| |
| # Remove Screen |
| echo " ${lc}_remove:" >> "$yaml_file" |
| reset_pos |
| add_right_below "white_bg" |
| add_header ${lc} |
| set_centered_y_percent "white_bg" 25 |
| add_centered_below "${lc}_remove_text" |
| set_centered_y_percent "white_bg" 50 |
| add_centered "remove_graphic" |
| add_footer_with_url ${lc} |
| |
| # Yuck Screen |
| echo " ${lc}_yuck:" >> "$yaml_file" |
| reset_pos |
| add_right_below "white_bg" |
| add_header ${lc} |
| set_centered_y_percent "white_bg" 25 |
| add_centered_below "${lc}_yuck_text" |
| set_centered_y_percent "white_bg" 50 |
| add_centered "asset_BadSD" "asset_BadUSB" |
| add_footer_with_url ${lc} |
| |
| # Insert Screen |
| echo " ${lc}_insert:" >> "$yaml_file" |
| reset_pos |
| add_right_below "white_bg" |
| add_header ${lc} |
| set_centered_y_percent "white_bg" 40 |
| add_centered "insert_graphic" |
| set_centered_y_percent "white_bg" 50 |
| add_centered_below "${lc}_insert_text" |
| add_footer_with_url ${lc} |
| |
| # ToDeveloper Screen |
| echo " ${lc}_todev:" >> "$yaml_file" |
| reset_pos |
| add_right_below "white_bg" |
| add_header ${lc} |
| set_centered_y_percent "white_bg" 25 |
| add_centered_below "${lc}_todev_text" |
| set_centered_y_percent "white_bg" 50 |
| add_centered "${lc}_back_help_text" |
| add_footer_with_url ${lc} |
| |
| # ToNormal Screen |
| echo " ${lc}_tonorm:" >> "$yaml_file" |
| reset_pos |
| add_right_below "white_bg" |
| add_header ${lc} |
| set_centered_y_percent "white_bg" 30 |
| add_centered "asset_VerificationOff" |
| add_centered_below "${lc}_tonorm_text" |
| set_centered_y_percent "white_bg" 70 |
| add_centered "${lc}_back_help_text" |
| add_footer_with_url ${lc} |
| |
| # Update (WAIT) Screen |
| echo " ${lc}_update:" >> "$yaml_file" |
| reset_pos |
| add_right_below "white_bg" |
| add_header ${lc} |
| set_centered_y_percent "white_bg" 50 |
| add_centered "${lc}_update_text" |
| add_footer_with_url ${lc} |
| |
| # ToNormalConfirm Screen |
| echo " ${lc}_tonorm_confirm:" >> "$yaml_file" |
| reset_pos |
| add_right_below "white_bg" |
| add_header ${lc} |
| set_centered_y_percent "white_bg" 30 |
| add_centered "asset_VerificationOn" |
| set_centered_y_percent "white_bg" 40 |
| add_centered_below "${lc}_tonorm_confirm_text" |
| add_footer_with_url ${lc} |
| |
| done |
| |
| # Finally list the localizations. |
| |
| cat >>"$yaml_file" <<EOF2 |
| localizations: |
| |
| # This determines the order in which the localizations appear. The first |
| # one is the default. |
| |
| EOF2 |
| |
| # Let's try to use the native one first, if we can. |
| guess_locale "$yaml_file" |
| |
| for lc in $newlocales; do |
| screen_list="${lc}_devel, ${lc}_remove, ${lc}_yuck, ${lc}_insert" |
| # todev/tonorm/update are supported only by newer firmware. |
| screen_list="${screen_list}, ${lc}_todev, ${lc}_tonorm, ${lc}_update" |
| screen_list="${screen_list}, ${lc}_tonorm_confirm" |
| echo " - [ $screen_list ]" >>"$yaml_file" |
| done |
| |
| cat >>"$yaml_file" <<EOF3 |
| |
| locale_index: |
| |
| # List the locale names in order so we can choose the default at the factory |
| |
| EOF3 |
| |
| for lc in $newlocales; do |
| echo " - ${lc}" >> "$yaml_file" |
| done |
| |
| done |
| |
| # Now replace the 'hwid' string with '$HWID'. |
| sed -i 's/\bhwid\b/\$HWID/g' "$yaml_file" |
| |
| echo "" |