#!/bin/bash
# original filename: xboard-xiangqi-piece2svg.sh
#
# v0.5-1beta1, 2020-3-01 updated, by Careone
# v0.6, 2020-5-08 updated, by Careone

APPNAME="xboard-xiangqi-piece2svg"
APPVER="0.6"
APPDESC=""

### HEAD ###
## debug switches
DEBUG=0
DEL_TMP_PIC=0


user_xxq_dir="$HOME/xboard/xiangqi"
user_theme_dir="$HOME/xboard/themes"

##
SUFFIX=
declare -i ID=1

## for option -ttxq
# TianTian Xiangqi alpha piece picture filenames
#SUBDIR="xiangqi-ttxq"
new_piece_bg=

declare -a blk_pic_orig red_pic_orig

blk_pic_orig[6]=blackBing0.png
blk_pic_orig[4]=blackJu0.png
blk_pic_orig[3]=blackMa0.png
blk_pic_orig[5]=blackPao0.png
blk_pic_orig[1]=blackShi0.png
blk_pic_orig[0]=blackShuai0.png
blk_pic_orig[2]=blackXiang0.png

red_pic_orig[6]=redBing0.png
red_pic_orig[4]=redJu0.png
red_pic_orig[3]=redMa0.png
red_pic_orig[5]=redPao0.png
red_pic_orig[1]=redShi0.png
red_pic_orig[0]=redShuai0.png
red_pic_orig[2]=redXiang0.png

# ---

# useful commands
#   -transparent white: 把白色背景，替换成 透明
# convert xqboard-57.png -fuzz 2% -transparent white xqboard-alpha.png
#
#   -flatten 平整图像。即使用指定的背景色，替换原来的透明背景
# convert xqboard-alpha.png -background blue -flatten xqboard-gray.png

# 自定义棋盘图片的技巧：
# 1. 推荐图片的 宽:高 = 9:10, 必须为PNG格式。默认尺寸 441x490.适用于 49x49棋格;
# 2. 棋盘河界不要有“楚河汉界”或其它文字。不然缩放棋格大小时，文字会变形残缺;
# 3. 自定义的棋盘图片，使用时，九宫斜线中间可能会残缺断点、错位、变双线；
# 4. 自定义的棋盘图片，棋子的定位可能不在中间，需要特别调整图片；
# 5. 如果原始棋盘图片的棋格大小是大于 49x49,则可以直接使用这个图片，不一定要缩放
#    到 441x490 尺寸。理由：原始大图片，通常使用时，九宫斜线中间会出现断点；
#    如果使用缩放后的标准尺寸图片，使用时，九宫斜线中间，会变成双线段，或者突起;
	       
## hot colors
COL_GTK_GRAY='#eae9e7' 	#GTK 主题灰, 可用作象棋引擎 LOGO 图片的底色

COL_BD_WHITE='#f6d9a6'	#白格底色
COL_BD_YELLOW1='#d6904e' 	#棋盘黄木色/黑格底色
COL_BD_YELLOW2='#eb9a31' #棋盘鵝黃色

COL_BD_PINK='#f7c094' #淡粉红色

COL_DPXQ_WHITE='#11' 	#东萍象棋-棋盘底色白
COL_DPXQ_GRAY='#11' 	#东萍象棋-棋格线条灰

# Dir defines
#global_logo_dir="/usr/share/games/plugins/logos"

user_piece_dir= 		#for option --convert-piece
# sample:
#user_piece_dir="$user_theme_dir/xiangqi-01"

user_board_dir="$HOME/xboard/themes/textures" 	#for option --make-board
#user_logo_dir="$HOME/xboard/plugins/logos"	#for option --make-logo

# TODO: for option --make-board 
declare -a box box_color box_size
declare -a frame_color
XQ_BOARD_PICNAME=	
#xq_board_picname=

# for option --nologo
AUTOLOGO=true	#optional: true (recommened), false

# for option --board
XQBOARD=xiangqi-9x10
## 中国象棋棋盘图片的主文件名，不带扩展名。
#    如: xiangqi-9x10, 对应 xiangqi-9x10.png
# 说明: xboard 选项      ~~/themes/textures/${XQBOARD}.png
# = /usr/share/games/xboard/themes/textures/${XQBOARD}.png
# 注: 棋盘图片必须是 PNG 格式，宽:高 = 9:10. 默认为 441x490, 即 49x49 的倍数

# for option --make-logo
declare -i POINTSIZE=18
declare -a program_name program_cmd fill_col bg_col

xqfont="$HOME/fonts/Alibaba-PuHuiTi-Bold.ttf" #可免费商用的字体，Bold 粗体
USE_CUSTOM_FONT=	#是否找到特定的字体
test_pic=
#test_pic="$user_piece_dir/WhiteGold.svg" #红帅图片
#test_pic="$user_piece_dir/BlackGold.svg" #黑将图片

# TODO: for option -md, --make-board

# xxq: Xboard XiangQi

declare -i XXQ_PIECE_THEME_ID
XXQ_PIECE_THEME_STR=	# 用于把 数字 XXQ_PIECE_THEME_ID ，强制转换成2位数字 

# for option --convert-piece
xxq_piece_theme_index="$user_xxq_dir/.xboard-xiangqi-piece-theme.index"

declare -a dpxq_picname dpxq_pic_desc
dpxq_picname=( ln_49.gif r8_36.gif b8_36.gif r0_49.gif b0_49.gif )

declare -a picname_src picname_desc picname_samp
declare -i PICNAME_ID=0

# array id  0: 适用于未知的棋子图片主题
picname_src[0]=
picname_desc[0]=
picname_samp[0]=

picname_src[1]="gmchess"
picname_desc[1]="Gmchess 天书棋谈 (Linux版)"
picname_samp[1]="red_king.png (红帅)"

picname_src[2]="xiangQiXuanFeng.exe"
picname_desc[2]="象棋旋风(Windows版)"
picname_samp[2]="rk.png (红帅)"

picname_src[3]="xqwzard.apk"
picname_desc[3]="象棋巫师(安卓版)"
picname_samp[3]="rk.png (红帅1/木纹), rk2.png (红帅2/红绿卡通)"

picname_src[4]="tianTianXiangqi.apk"
picname_desc[4]="腾迅天天象棋(安卓版)"
picname_samp[4]="redShuai0.png (红帅)"

picname_src[5]="ccbridge.exe"
picname_desc[5]="CCBridge 象棋桥 (Windows版)"
picname_samp[5]="r1k.png (红帅)"

picname_src[6]="xqstudio.exe"
picname_desc[6]="XQStudio 象棋演播室(Windows版)"
picname_samp[6]="z1_r5_60.png (红帅1), z2_r5_60.png (红帅2), r5_38.gif (红帅3)"

picname_src[7]="dpxq.html"
picname_desc[7]="东萍象棋(网页版)"
picname_samp[7]="zhcn/r8_36.gif (红方7子文字/简体), zhtw/r8_36.gif (红方7子文字/繁体)"


## for option --theme
# 已适配的中国象棋的棋子-棋盘配对主题
declare -a xxq_theme
XXQ_THEME=
# xxq_theme=( wood mono redblack redblack2 ccbridge dpxq dpxq-cn dpxq-tw )
xxq_theme=( wood mono ccbridge dpxq dpxq-cn dpxq-tw )
## 
# package 1: pgn-extract
# /usr/share/pgn-extract/eco.pgn
#
# package 2: gnome-chess
# /etc/gnome-chess/engines.conf
# [HoiChess]
# protocol=cecp
# binary=hoichess

### defines ###
declare -i ID=1
prefix="/usr/share/games/xboard"

# -----------
# 棋盘配色参考:
# 东萍棋盘粉底：#ecd2b4
# 东萍棋盘粗边灰：#646664

# xqboard-9x10.png 默认淡绿：#acf8f4
# -----------

## pid, Piece Image Directory, 棋子图片目录。默认为
# ~~/themes/xiangqi, 即
# /usr/share/games/xboard/themes/xiangqi
XXQ_PID=xiangqi

## ---------------------------
## tag 45: defines for option --convert-piece
BG_RED_CIRCLE=white	#红方棋子圆圈的底色。主要用于为腾迅天天象棋棋子主题添加底色
BG_BLK_CIRCLE=white

declare -a tmp_id 	
## 用于 xiangqi-xx 子目录对应的两位数字 xx 。常用于索引数字文件被错误删除，导致数值
#    重新从 1 开始编号的问题

declare -a red_picname blk_picname
# Xboard Xiangqi piece picture filenames
red_picname[0]="WhiteGold"
red_picname[1]="WhiteAdvisor"
red_picname[2]="WhiteElephant"
red_picname[3]="WhiteKnight"
red_picname[4]="WhiteRook"
red_picname[5]="WhiteCanon"
red_picname[6]="WhitePawn"

blk_picname[0]="BlackGold"
blk_picname[1]="BlackAdvisor"
blk_picname[2]="BlackElephant"
blk_picname[3]="BlackKnight"
blk_picname[4]="BlackRook"
blk_picname[5]="BlackCanon"
blk_picname[6]="BlackPawn"

# function 1.
	_usage_cn () {
cat<<EOF
  转换中国象棋棋子 PNG/GIF 图片为 Xboard 象棋的 SVG 图片格式
Usage: $APPNAME [选项]

Options:
  -p, --convert-piece  把当前目录下的图片，转换为 SVG 图片格式 (最多14张图片)
    如：自动转换其它程序包含的中国象棋棋子图片(PNG/GIF/BMP/JPG)。
    可以自动识别部分常见中国象棋程序的图片命名规则 
        技术说明: 先用 ImageMagick 的 convert 命令，转换成 PDF 图片；
        再用 pdf2svg 命令，转换成 SVG 图片 (注: 需要先安装软件包 pdf2svg)
  --gif, --png   显示原始 GIF 或者 PNG 棋子图片文件命名规则示例

  -a, --about-filename   显示已经适配的原始棋子图片文件命名规则

  -x, --extra       显示附加功能选项
  --tips           显示 xboard 常用选项和参数
  -v, --version    显示版本信息并退出
  -h, --help       显示帮助信息并退出

See also:
     命令: convert, identify, display, pdf2svg

Bugs: 
请发送缺陷报告给 Careone <emacslocale@126.com>. 

Homepage: 
https://gitee.com/atzlinux/xboard-xiangqi
EOF
}

# function 2.
	_option_extra () {
cat<<EOF
 $APPNAME 附加功能选项: 
  --dpxq, --ready4dpxq  对东萍象棋(网络版)的图片素材进行预处理。处理完成后，
    需要再对生成的 GIF 棋子图片，运行 $APPNAME -p 命令才能得到 SVG 棋子图片
  --ttxq  读取当前目录下的腾迅天天象棋(安卓版)的图片素材进行处理，生成 PNG 棋子图片

EOF
}

## function 3a. for option --convert-piece
	_about_piece_theme () {
cat<<EOF
  1.建议删除目录下多余的图片；或者把需要的图片，移动/复制到其它目录再运行;
  2.如果当前目录有多套棋子图片，建议把多余的棋子图片，移动/复制到其它目录再运行;
  3.如果当前目录的图片文件名，不能被有效识别、自动重命名，请先转换图片，再手动
    修改 SVG 图片的文件名
EOF
}


## function 3b. for option --convert-piece
	_about_supported_piece_theme () {
cat<<EOF
   转换 SVG 图片时，支持的象棋软件棋子图片目录、命名规则:
    ------------------------ 
   1. Gmchess 天书棋谈(Linux版)。如: /usr/share/gmchess/themes/wood/red_king.png 
   2. 象棋巫师(安卓版)。     如: assets/540/rk.png (红帅), rk2.png (红帅)
   3. 象棋旋风(Windows版)。命名规则同“2. 象棋巫师(安卓版)”
 * 4. 腾迅天天象棋(安卓版)。 如: assets/Images/redShuai0.png (红帅) 
     (提示: 从 天天象棋 转换生成的 SVG 图片为半成品，需要手动添加圆圈背景底色)
   5. CCBridge 象棋桥 (Windows版)。如: r1k.png, b1k.png 

   6. XQStudio 象棋演播室(Windows版)。棋子图片有三款，两种命名规则，如: 
      * z1_r5_60.png (红帅), z2_r5_60.png
      * r5_38.gif (红帅)
   7. 东萍象棋(网页版)。如: zhcn/r5_24.gif (红帅), zhtw/r5_24.gif 
   ------------------------ 
   
EOF
}


## xiangqi piece name style 2: xqwdroid.apk (xiangqiWuShi)
# assets/540/ , 57x57
# ba2.png  bc2.png  bn2.png  bp2.png  ra2.png  rc2.png  rn2.png  rr2.png
# bb2.png  bk2.png  br2.png  rb2.png  rk2.png  rp2.png
## ---------------------------
              

## XQStudio 象棋演播室(Windows版)，主题 6-1, 6-2：
#    图片命名规则：z[12]_[rb][1-7]_60.png (1-7: 车马相仕帅炮兵) 
## XQStudio 象棋演播室(Windows版)，主题 6-3：
#    图片命名规则：[rb][1-7]_38.gif (1-7: 车马相仕帅炮兵)
# b1_38.gif  b2_38.gif  b3_38.gif  b4_38.gif  b5_38.gif  b6_38.gif  b7_38.gif
# r1_38.gif  r2_38.gif  r3_38.gif  r4_38.gif  r5_38.gif  r6_38.gif  r7_38.gif
#

## function 4:
	_about_pic_src () {
cat<<EOF
   棋子图片来源: ${picname_src[PICNAME_ID]}
   棋子图片主题: ${picname_desc[PICNAME_ID]}
   棋子图片示例: ${picname_samp[PICNAME_ID]}
EOF
}

# function 5a.
	_about_filename () {
cat<<EOF
  $SUFFIX 棋子图片文件名示例

数字: 1  2     3      4      5    6    7
棋子: 车 马  相/象  仕/士  帅/将  炮  兵/卒

红方(r): r1.$SUFFIX(车) r2.$SUFFIX(马) r3.$SUFFIX(相) r4.$SUFFIX(仕)
         r5.$SUFFIX(帅) r6.$SUFFIX(炮) r7.$SUFFIX(兵)
黑方(b): b1.$SUFFIX(车) b2.$SUFFIX(马) b3.$SUFFIX(象) b4.$SUFFIX(士)
         b5.$SUFFIX(将) b6.$SUFFIX(炮) b7.$SUFFIX(卒)
EOF
}
    
## function 5:
	
		_show_tips () {
cat<<EOF

EOF
}
 
### defines ###

### HEAD ###

### BODY ###

for option in "$@"; do

    	case "$option" in

    	 -h | --help)
	   _usage_cn
	   exit 0 ;;

    	 -a | --about-piece)
	   _about_supported_piece_theme
	   exit 0 ;;

    	 -c | --convert-piece)
		ID=1	#init
	   echo " 把当前目录下的中国象棋棋子图片，转换成 XBoard 支持的 SVG 图片格式..."
	   echo -e " (转换过程: xxx -> PDF -> (pdf2svg) -> SVG  注: 无法直接转换生成 SVG)\n"
   	   echo " 提示：对于某些常见的中国象棋软件，转换成 SVG 图片格式后，还会自动"
   	   echo "       调整生成的图片文件名。详情请参考命令: $APPNAME -ap"
   	   
	       if [ ! -d "$user_xxq_dir/" ]; then
	         mkdir -p "$user_xxq_dir/"
	       fi
	       	    
	       	#如果 索引编号文件 不存在，或者数值错误，则默认值 = 1    
	       if [ ! -s "$xxq_piece_theme_index" ]; then
	         XXQ_PIECE_THEME_ID=1
	       else
	         XXQ_PIECE_THEME_ID=`head -1 "$xxq_piece_theme_index"`
	         if [ "$XXQ_PIECE_THEME_ID" = 0 ]; then
	           XXQ_PIECE_THEME_ID=1
	         fi  
	       fi
	       
	       if [ "$XXQ_PIECE_THEME_ID" -le 9 ]; then
	         # 如果 象棋主题目录 的编号是 1-9,则前面补0,强制转换为两位数字
	         XXQ_PIECE_THEME_STR="0${XXQ_PIECE_THEME_ID}"
	       else XXQ_PIECE_THEME_STR="${XXQ_PIECE_THEME_ID}"
	       fi
	       
	       ## 保险：如果索引编号文件 被错误地删除，或者文件不可读
	       # 或者文件不可写（无法更新数值），或者用户手动创建了类似于 xiangqi-xx
	       # 之类的目录名，则检测用户 user_piece_dir 目录名列表，得到最大的编号 
	       # 数字，再确定最终采用的子目录名称
	        
		user_piece_dir="$user_xxq_dir/xiangqi-${XXQ_PIECE_THEME_STR}"
		
		# --------------		  
		  ###
		  if [ -d "$user_piece_dir" ]; then
		    
		    tmp_id=( `ls $user_xxq_dir | grep xiangqi-[0-9][0-9] | cut -d'-' -f2 | sort` ) 
		    # array tmp_id value output: 01 - 99 
		    
		    ## 数组 tmp_id 的最后一个数值(2位数字)，即最大数字，用作
		    #    新的子目录名 xiangqi-xx 的序号
		    b="${#tmp_id[@]}"; let "b -= 1"
		    XXQ_PIECE_THEME_STR="${#tmp_id[b]}"
		    
		    # 1.如果 XXQ_PIECE_THEME_STR 的值是 00-09,如果有，则强行指定 
		    #   子目录名为 xiangqi-10, 不再检测 xiangqi-10/ 是否存在; 
		    # 2.如果值是 10-99, 则数值 +1; 
		    # 3.如果值是 99，则强行指定子目录名为 xiangqi-100, 且不再检测 
		    #   xiangqi-100/ 是否已经存在（如果存在，可能会覆盖目录下的
		    #   棋子图片文件）。说明：没必要永无休止地检测目录名。默认方案
		    #   支持 01-99 共99个子目录，常规使用完全足够；
		    
		    case "$XXQ_PIECE_THEME_STR" in
		      0[1-9]) #去除2位数前面的 0，转换成1位数字 1-9
			XXQ_PIECE_THEME_ID=`echo "$XXQ_PIECE_THEME_STR" | sed '/0/s///'`; 
			XXQ_PIECE_THEME_STR="0${XXQ_PIECE_THEME_ID}" 
				;;
		      [1-9][0-9]) 
			let "XXQ_PIECE_THEME_ID += 1"; 
			XXQ_PIECE_THEME_STR="$XXQ_PIECE_THEME_ID" ;;
		      *) XXQ_PIECE_THEME_ID=100; XXQ_PIECE_THEME_STR=100 ;;  
		    esac
		    
		    user_piece_dir="$user_xxq_dir/xiangqi-${XXQ_PIECE_THEME_STR}"
		    
		    if [ ! -d "$user_piece_dir" ]; then
		      mkdir -p "$user_piece_dir"
		    fi

	          else
	            mkdir -p "$user_piece_dir/"
	          fi
		# --------------
					       
	   sleep 1
	   _about_piece_theme
	   #_about_supported_piece_theme
	   
	   sleep 2
	   echo
	   
# tag 590:
	   echo " 检测图片命名规则..."

	   for a in *.png *.gif; do
	     if [ ! -s "$a" ]; then
	       continue
	     fi
	     
	     case "$a" in
	       red_king.png | black_king.png) echo -n " * $ID"; #break; 
	       	 	PICNAME_ID=1; echo " (${picname_desc[PICNAME_ID]})" ;;
	       
	       [rb][kabnrcp]2.png |[rb][kabnrcp].png) echo -n " * $ID"; #break; 
	       	 	PICNAME_ID=3; echo " (${picname_desc[PICNAME_ID]})" ;;
	       [rb][kabnrcp].png) echo -n " * $ID"; break; 
	       		PICNAME_ID=2; echo " (${picname_desc[PICNAME_ID]})" ;;
	       
	       redShuai0.png | blackShuai0.png) echo -n " * $ID"; #break; 
	       		PICNAME_ID=4; echo " (${picname_desc[PICNAME_ID]})" ;;
	       [rb][1-7][kabnrcp].png) echo -n " * $ID"; #break; 
	       		PICNAME_ID=5; echo " (${picname_desc[PICNAME_ID]})" ;;
	       
	       z[12]_[rb][1-7]_60.png | [rb][1-7]_38.gif) echo -n " * $ID"; #break; 
	       		PICNAME_ID=6; echo " (${picname_desc[PICNAME_ID]})" ;;
	       [rb][1-7]_24.gif | [rb][1-7].gif) echo -n " * $ID"; #break; 
	       		PICNAME_ID=7; echo " (${picname_desc[PICNAME_ID]})" ;;

	       	*) #PICNAME_ID=0; 
		 	echo " * $ID 未知图片: $a";
	       		;;
	     esac
	     let "ID += 1"
	     #sleep 1
	   done
	
# tag 560:
	ID=1	# init
 	   if ! which pdf2svg &>/dev/null; then
	     echo " 警告 (W180): 找不到命令 pdf2svg ! 请先安装软件包 pdf2svg, 然后重试" 1>&2
	     exit 1;
	   else
	     #OLD_PWD="`pwd`"
	     echo " 当前目录: '`pwd`'"
	     
	     # supported pic formats: png, gif, bmp, jpg/jpeg
	     
	     # ----------------
	     #for a in *.[pP][nN][gG]; do
	     for a in *.[pP][nN][gG] *.[gG][iI][fF] *.[bB][mM][pP] *.[jJ][pP][gG] *.[jJ][pP][eE][gG]; do
	       if [ ! -s "$a" ]; then
	         continue
	       fi
	       
	       echo -n " $ID"
	       
	       if [ ! -d "$user_piece_dir/_pdf/" ]; then
	         mkdir -p "$user_piece_dir/_pdf/"
	       fi
	      
## check pictures name style
	# 如果是 DPXQ 网页版的图片资源，或者腾迅天天象棋，先对原始图片做预处理，
	# 再提示 手动进行后续操作。
        # tag 590-4 (tianTianXiangqi, PNG):

	if ls redShuai0.png &>/dev/null; then
	  PICNAME_ID=4; _about_pic_src;
	  echo -e "\n 提示 (N600): 请切换到子目录 _png/ ，为透明图片添加\
 [背景颜色] (红/黑), 或者添加 [棋子背景图片] 后，再重新运行一次"

	# tag 590-7 (for DPXQ_HTML, GIF):   	
	elif ls [rb][1-7]_24.gif &>/dev/null; then
	  PICNAME_ID=7; _about_pic_src;
	  echo -e "\n 提示 (N600): 请切换到子目录 _png/ ，为透明图片添加\
 [背景颜色] (红/黑), 或者添加 [棋子背景图片] 后，再重新运行一次"

	else :
	fi
       # ============================	      
       ## piece filename style 2: 
	#	tencent tianTianXiangqi.apk (assets/Images/*.png)
       # 	 TODO
       # 注意：此主题下，棋子图片并非四面居中，需要 -trim +repage 自动裁切白边
       #   并居中。另外，棋子图片圆圈底色为透明，需要手动添加圆圈底色
       #  （红/黑/空白棋子底图）
        # blackBing0.png  blackMa0.png   blackShi0.png    blackXiang0.png
	# blackJu0.png    blackPao0.png  blackShuai0.png
	#
	# redBing0.png  redMa0.png   redShi0.png    redXiang0.png
	# redJu0.png    redPao0.png  redShuai0.png
 # ============================	      
 # piece filename style 1: gmchess for Linux
 # 	/usr/share/gmchess/themes/wood/
 #	/usr/share/gmchess/themes/west/
 # red_advisor.png  red_cannon.png    red_king.png    red_pawn.png
 # red_bishop.png   red_knight.png  red_rook.png
 # 
 # black_advisor.png  black_cannon.png    black_king.png    black_pawn.png
 # black_bishop.png   black_knight.png  black_rook.png

# tag 540: about DPXQ_Xiangqi_HTML theme
# r0_49.gif (48x48): 红色圆圈，用于红方棋子的背景底图
# b0_49.gif (48x48): 黑色圆圈，用于黑方棋子的背景底图
#
# b8_36.gif (258x36): 黑方7个连体字，车马象士将炮卒 
# r8_36.gif (258x36): 红方7个连体字，车马相仕帅炮兵
#
# ln_49.gif (443x492): 49x49 棋盘, 比最小参考尺寸 441x490 略大。可使用命令
# 直接裁切、格式转换，得到适用于 xboard-xianqi 的棋盘图片 xqboard-dpxq.png
# convert ln_49.gif -crop 441x490+1+1 xqboard-dpxq.png

# tag 705: for tianTianXiangqi.apk
         _piece_bg="piece-bg.png"

	       case "$a" in
	        # case 1: 
		# 如果检测东萍象棋 24x24 GIF 小图片,提示不采用。改为从其它棋子文字
		#   连体图片裁切、添加红/黑圆圈底图，生成棋子图。另外再自动剪切生成
		#   一张棋盘图
		 
## tag 625:
		 [rb][1-7]_24.gif) 
		   #if [ "$PICNAME_ID" = 6 ]; then
		   #  break
		   #fi
		   
		   echo " 提示: 当前目录发现 [东萍象棋] 24x24 GIF 小图片。缺点：清晰度不够。不采用。"
		   echo "     改为从其它棋子文字连体图片裁切、添加红/黑圆圈底图，生成棋子图..."

# ln_49.gif		棋盘图片，适用 49x49 棋格 
# r8_36.gif b8_36.gif 	红方/黑方棋子文字（背景透明）
# r0_39.gif b0_39.gif	红方/黑方圆圈底图

## 对于36x36 的棋子汉字，推荐选择 [rb]0_49.gif 或更大号圆圈底图。
#  如果底图圆圈小于49，红方 帅/炮/兵，这三子的左下角，可能超出圆圈外
# 
	    	   dpxq_pic_desc[0]="棋盘图片，适用 49x49 棋格"
	    	   dpxq_pic_desc[1]="红方棋子文字，背景透明"
	    	   dpxq_pic_desc[2]="黑方棋子文字，背景透明"
	    	   dpxq_pic_desc[3]="红色圆圈底图" 
	    	   dpxq_pic_desc[4]="黑色圆圈底图"  	   
	    	   
		  		   
		   if [ ! -d "$user_piece_dir/_gif-src" ]; then
		     mkdir -p "$user_piece_dir/_gif-src"
		   fi

		   if [ ! -d "$user_piece_dir/_alpha" ]; then
		     mkdir -p "$user_piece_dir/_alpha"
		   fi
		   if [ ! -d "$user_piece_dir/_png" ]; then
		     mkdir -p "$user_piece_dir/_png"
		   fi
		   if [ ! -d "$user_piece_dir/_pdf" ]; then
		     mkdir -p "$user_piece_dir/_pdf"
		   fi		   
		   echo
		   
		   # pic 1: board pic (ln_XX.gif)
		   if [ -s "${dpxq_picname[0]}" ] && [ ! -s "_png/${dpxq_picname[0]}" ]; then 
		     DPXQ_BOARD_PNG="xqboard-dpxq.png"
		     echo " * 找到原始图片: ${dpxq_picname[0]} (${dpxq_pic_desc[0]})"
		     echo "   生成 [棋盘] 图片 ( _png/$DPXQ_BOARD_PNG )..."
		     
		     convert -crop 441x490+1+1 "${dpxq_picname[0]}" -strip "_png/$DPXQ_BOARD_PNG"
		   elif [ -s "_png/${dpxq_picname[0]}" ]; then
			 echo " * 已存在 [棋盘] 图片: _png/$DPXQ_BOARD_PNG" 
		   else :
		   fi
		   
		   # pic 2-5: 原图: [rb]8.gif 红黑棋子连体图片；[rb]0_XX.gif 红黑圆圈

		   for a in `seq 1 4`; do
		     if [ -s "${dpxq_picname[a]}" ]; then 
		       echo "  * 找到原始图片: ${dpxq_picname[a]} (${dpxq_pic_desc[a]})"
		       cp "${dpxq_picname[a]}" "_gif-src/${dpxq_picname[a]}"
		     fi
		   done

		   
		   echo " 复制需要的 [棋子] 相关图片到新目录: _gif-src/"
			cd _gif-src

		   if [ -s "${dpxq_picname[1]}" ] || [ -s "${dpxq_picname[2]}" ]; then
		     echo " * 裁切棋子文字图片 (红方原图 = ${dpxq_picname[1]}  黑方原图 = ${dpxq_picname[2]})..."
		     # cmd: identify xxx.gif
		     # output: ln_49.gif GIF 443x492 443x492+0+0 8-bit sRGB 4c ...
		     
		     # a: piece size. example: 36 
		     a=`identify "${dpxq_picname[1]}" | cut -d' ' -f3 | cut -d'x' -f2`
		     #echo " L687: a = $a"; sleep 1;

		     declare -i x=0 y=0
		     
		     for b in `seq 1 7`; do
		        #echo " L693: option: -crop ${a}x${a}+${x}+${y}"; sleep 1

		        convert "${dpxq_picname[1]}" -crop "${a}x${a}+${x}+0" "../_alpha/r${b}_.gif"
			convert "${dpxq_picname[1]}" "../_alpha/r${b}_.gif" -gravity Center -composite "../_png/r${b}.gif"  

			#convert -crop "${a}x${a}+${x}+${y}" "${dpxq_picname[2]}" "_png/r${b}.png"
		       let "x += 37";
		     done
		   fi

# tag 720:		   
		  new_dir="../_alpha"; cd "$new_dir"

		   echo -e " L651: * 图片预处理 完成。切换到新的图片目录 \n `pwd`\n 请重新运行 $0 $1 转换图片。退出"
		   
		   #$APPNAME -cp
			#$0 -cp
		   
			exit;
		   #exit 
		   ## --- dpxq piece theme end
		   
		  ;;

# tag 808: for tencent tianTianXiangqi.apk
# ttxq-1
	         blackBing0.png) 
#黑卒的图片。文件名按字母顺序，这个图片通常会被最先读取
		   _bg_misc="body_default.png"

		   if [ ! -s "$_piece_bg" ]; then
			if [ -s "$_bg_misc" ]; then 
# 从棋子背景图片素材文件中，裁切第6个图片，另存为棋子底图（木纹）			
		     	  convert -crop 80x80+322+0 "$_bg_misc" "$_piece_bg"
			fi
		   else "  "
	           fi 
			b="${blk_picname[6]}"
			convert -trim "$a" +repage "$user_piece_dir/_png/$b.png"
# -composite: 把上一步修正得到的透明的棋子文字，添加到棋子底图上
	       convert "$_piece_bg" "$user_piece_dir/_png/$b.png" -gravity Center -composite "$user_piece_dir/_png/$b.png"
	       convert "$user_piece_dir/_png/$b.png" "$user_piece_dir/_pdf/$b.pdf"
	       pdf2svg "$user_piece_dir/_pdf/$b.pdf" "$user_piece_dir/$b.svg"
			 ;;
# ttxq-2
	         blackMa0.png) 
			b="${blk_picname[3]}"
			convert -trim "$a" +repage "$user_piece_dir/_png/$b.png"
# -composite: 把上一步修正得到的透明的棋子文字，添加到棋子底图上
	       convert "$_piece_bg" "$user_piece_dir/_png/$b.png" -gravity Center -composite "$user_piece_dir/_png/$b.png"
	       convert "$user_piece_dir/_png/$b.png" "$user_piece_dir/_pdf/$b.pdf"
	       pdf2svg "$user_piece_dir/_pdf/$b.pdf" "$user_piece_dir/$b.svg"
			 ;;
			#;;

# tag 812: for Red/White side
        
	         [rRwW][kK].* | [rRwW][kK]2.* | redShuai0.png | red_king.png | z[12]_r5_60.png | r5k.png | r5.gif | r5.png | r5_38.gif) 
			b="${red_picname[0]}" ;;
	         [rRwW][aA].* | [rRwW][aA]2.* | redShi0.png | red_advisor.png | z[12]_r4_60.png | r4a.png | r4.gif | r4.png | r4_38.gif) 
			b="${red_picname[1]}" ;;
	         [rRwW][bBeE].* | [rRwW][bBeE]2.* | redXiang0.png | red_bishop.png | z[12]_r3_60.png | r3b.png | r3.gif | r3.png | r3_38.gif) 
			b="${red_picname[2]}" ;;
	         [rRwW][nNhH].* | [rRwW][nNhH]2.* | redMa0.png | red_knight.png | z[12]_r2_60.png | r2n.png | r2.gif | r2.png | r2_38.gif) 
			b="${red_picname[3]}" ;;
	         [rRwW][rR].* | [rRwW][rR]2.* | redJu0.png | red_rook.png | z[12]_r1_60.png | r1r.png | r1.gif | r1.png | r1_38.gif) 
			b="${red_picname[4]}" ;;
	         [rRwW][cC].* | [rRwW][cC]2.* | redPao0.png | red_cannon.png | z[12]_r6_60.png | r6c.png | r6.gif | r6.png | r6_38.gif)
			 b="${red_picname[5]}" ;;
	         [rRwW][pP].* | [rRwW][pP]2.* | redBing0.png | red_pawn.png | z[12]_r7_60.png | r7p.png | r7.gif | r7.png | r7_38.gif)
			 b="${red_picname[6]}" ;;
	        
	        # for black side
	        
	         [bB][kK].* | [bB][kK]2.* | blackShuai0.png | black_king.png | z[12]_b5_60.png | b5k.png | b5.gif | b5.png | b5_38.gif)
		 	b="${blk_picname[0]}" ;;
	         [bB][aA].* | [bB][aA]2.* | blackShi0.png | black_advisor.png | z[12]_b4_60.png | b4a.png | b4.gif | b4.png | b4_38.gif) 
			b="${blk_picname[1]}" ;;
	         [bB][bBeE].* | [bB][bBeE]2.* | blackXiang0.png | black_bishop.png | z[12]_b3_60.png | b3b.png | b3.gif | b3.png | b3_38.gif) 
			b="${blk_picname[2]}" ;;
	         [bB][nNhH].* | [bB][nNhH]2.* | blackMa0.png | black_knight.png | z[12]_b2_60.png | b2n.png | b2.gif | b2.png | b2_38.gif) 
			b="${blk_picname[3]}" ;;
	         [bB][rR].* | [bB][rR]2.* | blackJu0.png | black_rook.png | z[12]_b1_60.png | b1r.png | b1.gif | b1.png | b1_38.gif) 
			b="${blk_picname[4]}" ;;
	         [bB][cC].* | [bB][cC]2.* | blackPao0.png | black_cannon.png | z[12]_b6_60.png | b6c.png | b6.gif | b6.png | b6_38.gif) 
			b="${blk_picname[5]}" ;;
	         [bB][pP].* | [bB][pP]2.* | blackBing0.png | black_pawn.png | z[12]_b7_60.png | b7p.png | b7.gif | b7.png | b7_38.gif) 
			b="${blk_picname[6]}" ;;
	          
	           *) # 如果无法识别棋子图片的命名规则 
	             b="${a%%.*}"	#获取主文件名，不带扩展名
		     # 风险：某些极端情况下，如果目录下有点号开头的 .png, .gif 
		     #   这类文件，得到的 b 值可能为空。注意添加避险方案 
	            ;;
	           
	       esac
	       # ============================
	       	       
	        #    批量文件的格式转换
    		# mogrify -path newdir -format png  *.gif
		echo " L885: PICNAME_ID = $PICNAME_ID"
		case "$PICNAME_ID" in
		  3) # for tianTianXiangqi
		convert -trim "$a" +repage "$user_piece_dir/_alpha/$b.png"
		convert "$_piece_bg" "$user_piece_dir/_alpha/$b.png" \
-gravity Center -composite "$user_piece_dir/_pdf/$b.pdf"
			;;
		  *) : 
	       convert -trim "$a" +repage "$user_piece_dir/_pdf/$b.pdf"

		;;

		esac
	       
	       
	       pdf2svg "$user_piece_dir/_pdf/$b.pdf" "$user_piece_dir/$b.svg"
	       #sleep 1

	       if [ "$DEL_TMP_PIC" = 1 ] && [ -e "$user_piece_dir/_pdf/$b.pdf" ]; then
	         #:
	         rm -f "$user_piece_dir/_pdf/$b.pdf" 
	       fi
	       let "ID += 1"
	     done 
	     # ----------------

	# 删除临时的子目录 ./_pdf/
	         if [ -d "$user_piece_dir/_pdf/" ]; then 
		  rmdir --ignore-fail-on-non-empty "$user_piece_dir/_pdf/"
		fi
	     echo
	   fi
	   
	## 对某些棋子图片来源特例，进行额外的转换处理。如：
	#  腾迅天天象棋（安卓版）：
	#  DPXQ 东萍象棋（网页版）：
 
	   echo -e " 查看生成的图片...\n 保存目录: $user_piece_dir/"
	   
	   test_pic="$user_piece_dir/WhiteGold.svg" #红帅图片

	   if [ -s "$test_pic" ]; then
	   	file "$test_pic"
	   	#identify "$test_pic"
		   sleep 1
	   fi
	   	   
	       if [ "$DEBUG" = 1 ] && [ -d "$user_piece_dir/" ]; then
	         xdg-open "$user_piece_dir/" &
	         #eog "$test_pic" &
	       fi
	       	
	   # 最后，更新棋子主题的目录编号 xiangqi-xx 数字 (+1), 新数值写入编号索引文件    	
	   let "XXQ_PIECE_THEME_ID += 1"
	   echo -n "$XXQ_PIECE_THEME_ID" > "$xxq_piece_theme_index"
	          
	   exit 0 ;;

##

    	 --tips)
	   _show_tips
	   exit 0 ;;

    	 --gif)
	    SUFFIX=gif
	   _about_filename
	   exit 0 ;;

    	 --png)
	    SUFFIX=png
	   _about_filename
	   exit 0 ;;

	   
## removed option, since v0.5
#    	 -ml | --make-logo)
## ---

## tag 890:
    	 -dpxq | --dpxq | --ready4dpxq)
# piece picture sources from Dpxq_html
	  echo " TODO..."
	  echo " 对 东萍象棋(网络版) 的图片素材进行预处理..."
	  echo "   说明: 预处理完成后，需要继续运行 $APPNAME -p 才能生成 SVG 棋子图片"
	   exit 0 ;;

##

## tag 920: v0.6 updated, 2020-5-08
    	 -ttxq | --ttxq)
# piece picture sources from tianTianXiangqi.apk

	SUBDIR=xiangqi-ttxq
	SUFFIX=png
	new_piece_bg="$user_theme_dir/$SUBDIR/piece_bg.$SUFFIX"

  if [ ! -d "$user_theme_dir/$SUBDIR" ]; then
    mkdir -p "$user_theme_dir/$SUBDIR"
  fi

  echo " 对 腾迅天天象棋 (安卓版) 的棋子图片素材进行处理..."
# echo " make TianTianXiangqi piece theme pictures..."

  echo "   图片素材参考目录 (APK: /assets/Images/)"
  echo "   pwd: `pwd`/"
  echo

# step 0:
echo " * 检测图片素材是否存在..."

THEME=2
  case "$THEME" in
    1)  src_piece_bg="__auto___Auto_CommonPacker_3.png"
	XY_BG="107x107+2+0"	# 截取第1个图形为棋子背景底图
	XY_PIECE="+16+13"
		;;
    2 | *)  src_piece_bg="body_default.png"
	XY_BG="101x101+797+95" ## 截取第2行，倒数第2个图形为棋子背景底图
	XY_PIECE="+13+13"
		;;
  esac

  if [ -s "${src_piece_bg}" ]; then
    echo " **   [Found] ${src_piece_bg}"
  else echo "   Error(E861): no pic found (${src_piece_bg}). quit" 1>&2
    exit 0
  fi
 
  echo
   
for a in "${red_pic_orig[@]}" "${blk_pic_orig[@]}"; do
  if [ -s "$a" ]; then
    echo " ** $ID [Found] $a"
    
    if [ "$ID" -eq 7 ]; then
      echo
    fi
    let "ID += 1"
  else echo "   Error(E862): no pic found ($a). quit" 1>&2
    exit 0
  fi
done

  echo
  ID=1
  
# step 1: make piece null background pic

if [ ! -s "$new_piece_bg" ]; then
  echo " * make new piece background picture..."

  echo "  src_piece_bg: $src_piece_bg"
  echo "  new_piece_bg: $new_piece_bg"

  convert -crop "$XY_BG" $src_piece_bg -strip "$new_piece_bg"
else echo " * found: piece background picture ($new_piece_bg)"
  #identify "$new_piece_bg"
  #sleep 1
fi

# step 2: make 7+7 piece pics

if [ -s "$new_piece_bg" ]; then
  echo -en " * 检测新图片...\n   "
  identify "$new_piece_bg"
  sleep 1
#  eog "$new_piece_bg" &
else echo " Error(E30): no piece background pic '$new_piece_bg' found!" 1>&2
  exit 0  
fi

#exit 0

for a in `seq 0 6`; do
  convert -geometry "$XY_PIECE" "$new_piece_bg" "${blk_pic_orig[a]}" -composite \
    -depth 4 -strip "$user_theme_dir/$SUBDIR/${blk_picname[a]}.$SUFFIX"
  convert -geometry "$XY_PIECE" "$new_piece_bg" "${red_pic_orig[a]}" -composite \
    -depth 4 -strip "$user_theme_dir/$SUBDIR/${red_picname[a]}.$SUFFIX"
done

if [ "$?" = 0 ]; then
  echo " Done."
fi

# show new piece pictures
test_pic="$user_theme_dir/$SUBDIR/${blk_picname[0]}.$SUFFIX"
if [ -s "$test_pic" ]; then
  echo -en " * 查看新图片...\n   "
  identify "$test_pic"
  sleep 1

  eog "$test_pic" &
  sleep 1
  xdg-open "$user_theme_dir/$SUBDIR" &
else echo " Error(E50): no piece pic '$test_pic' found!" 1>&2
  exit 0  
fi

	   exit 0 ;;

##
	   	   
    	 -x | --extra)
	   _option_extra
	   exit 0 ;;
	   
	   	#
    	-v | --version)
	  echo "  $APPNAME $APPVER"
	  exit 0 ;;

    	-*)
	  echo "Unrecognized option \`$option'" 1>&2
	  exit 1 ;;	
	esac
	
done

# ---

### BODY ###

exit 0;
