// 画像ファイルの表示 / Graphic file display
// スクロールテスト付き / with scroll test
// 全機種対応 / Compatuble for all device

int fTestEachPage=NO:// YES=gTransform()/gAnimation()がページ別なのを確認する
					 // YES=For check as gTransform()/gAnimation() is enable at each page.

int WX=48
width(WX)
int bx=128,by=128
switch deviceType()
	case DEVICE_IPODTOUCH: // iPod touch
	case DEVICE_IPHONE: // iPhone
	case DEVICE_IPHONE_SIMURATOR
//		print "deviceType=";deviceType()
		width(32,30)
		bx=0:by=0
//		hitKey(YES)
endswitch
print "機種=";devicePlatform()
//
vpriority(TPAGE,GPAGE0,GPAGE1,GPAGE2,GPAGE3)
vpage(B_TPAGE+B_GPAGE0+B_GPAGE1+B_GPAGE2+B_GPAGE3)
//
// 全ファイルリストを得る / get all file list
dim str fileList(256):// ()内は扱える最大ファイル数
int allcnt
int i,ret,outcnt,j
str ext
setFuncKey()
beep2(13,YES):// beep2(13)の音声データ先行読み込み / Pre-loading of beep2(13) sound data
//
// 拡張子(大文字小文字を区別するので注意) / extension (case sensitive)
// 正規表現 / Regular expression
ext="^(PIC|pic|PNG|png|JPG|jpg|CUT|cut|MAG|mag|GIF|gif|BMP|bmp|TIF|tif)$":
allcnt=files(fileList,"",ext,YES,FILES_FILE,YES,FILES_FAREA_ALL):// システム領域も検索対象
//// テストのためシステム領域内にある画像を加えておく / Add system area image files for test
//fileList(allcnt)="IMG1.JPG" :allcnt=allcnt+1
//fileList(allcnt)="IMG2.PIC" :allcnt=allcnt+1
//fileList(allcnt)="GAROU.CUT":allcnt=allcnt+1
//fileList(allcnt)="girl1.png":allcnt=allcnt+1
//fileList(allcnt)="girl2.jpg":allcnt=allcnt+1
//fileList(allcnt)="girl3.png":allcnt=allcnt+1
//fileList(allcnt)="girl4.jpg":allcnt=allcnt+1
//
if allcnt<=0 then {
	locate(0,0)
	print localizedString("画像ファイルがありません":"image file not found.")
} else {
	outcnt=0
	int page=GPAGE0,nextPage
	for i=0 to allcnt-1
		locate(0,0):print fileList(i);chr$(DISP_CTRL_CLEARLINE);
		if fTestEachPage then {
			nextPage=page+1:if nextPage>GPAGE3 then nextPage=GPAGE0
			switch page
				case GPAGE0:vpriority(TPAGE,page,GPAGE1,GPAGE2,GPAGE3):break
				case GPAGE1:vpriority(TPAGE,page,GPAGE2,GPAGE3,GPAGE0):break
				case GPAGE2:vpriority(TPAGE,page,GPAGE3,GPAGE0,GPAGE1):break
				case GPAGE3:vpriority(TPAGE,page,GPAGE0,GPAGE1,GPAGE2):break
			endswitch
			locate(WX-10,0):print "page=";page-GPAGE0+1:// GPAGE0<>0なのでわかりやすくするため
		}
		apage(page)
		wipe()
		str comment,comment8
		int wx,wy,mode,bitLength
		str pext=pathExtension(fileList(i))
		strupr(pext)
		switch pext
			case "MAG"
				str machine,username,machine8,username8
				magHeader(fileList(i),comment,wx,wy,mode,machine,username)
				// ヘッダー内コメントはSHIFT-JISなのでUTF-8に変換してから表示する
				sjisToUtf8$(machine,machine8)
				sjisToUtf8$(username,username8)
				sjisToUtf8$(comment,comment8)
				int cols=16:if mode and BIT7 then cols=256
				locate(0,2):print "mag size="wx;"*";wy;"/";cols;localizedString("色","colors");"/";machine8;"/";username8;"/";comment8;chr$(DISP_CTRL_CLEAR_EOS)
				ret=magLoader(0,0,fileList(i))
				if ret<>0 then {
					locate(0,1):print "Error=";ret
				}
				wy=getBitmapSize(wx)
				locate(0,3):print "bitmapSize=";wx;"*";wy
				break
			case "PIC"
				// picは4:3画面比なので、変形して元のアスペクト比を再現する
				// PIC aspect ratio is 4:3. So, it reproduces the original aspect ratio by transforming.
				int square
				picHeader(fileList(i),comment,square,mode,bitLength,wx,wy)
				// ヘッダー内コメントはSHIFT-JISなのでUTF-8に変換してから表示する
				sjisToUtf8$(comment,comment8)
				locate(0,2):print "pic size=";wx;"*";wy;"/";comment8;"/";chr$(DISP_CTRL_CLEAR_EOS);
				if not square then {
					print "4:3"
					gTransform(0,0,1,3.0/4.0):// 変形 / transform
				} else {
					print "1:1"
					gTransform(0,0,1.0,1):// 変形解除 / reset transform
				}
				ret=picLoader(bx,by,fileList(i))
				if ret<>0 then {
					locate(0,1):print "Error=";ret
				}
				wy=getBitmapSize(wx)
				locate(0,3):print "bitmapSize=";wx;"*";wy
				break
			case "CUT"
				gTransform():// 変形キャンセル / cancel transform
				cutHeader(fileList(i),wx,wy)
				locate(0,2):print "cut size="wx;"*";wy;chr$(DISP_CTRL_CLEAR_EOS)
				ret=cutLoader(bx,by,fileList(i))
				if ret<>0 then {
					locate(0,1):print "Error=";ret
				}
				wy=getBitmapSize(wx)
				locate(0,3):print "bitmapSize=";wx;"*";wy
				break
			case "BMP"
				bmpHeader(fileList(i),wx,wy,bitLength)
				goto "PNGJPEG"
			case "GIF"
				gifHeader(fileList(i),wx,wy)
				goto "PNGJPEG"
			case "PNG"
				pngHeader(fileList(i),wx,wy,bitLength)
				goto "PNGJPEG"
			case "JPG"
				jpegHeader(fileList(i),wx,wy)
			label "PNGJPEG"
				locate(0,2):print "size="wx;"*";wy;chr$(DISP_CTRL_CLEAR_EOS)
				gTransform():// 変形キャンセル / cancel transform
				bitmapOpen(0,0):// 画面サイズで確保
				ret=bitmapImageFile(fileList(i),0,0,0,0):// 画面サイズで縮小の指定
				if ret<>0 then {
					locate(0,1):print "Error=";ret
				}
				bitmapImgLoad():// 表示
				bitmapClose()
				wy=getBitmapSize(wx)
				locate(0,3):print "bitmapSize=";wx;"*";wy
				break
			default:
				gTransform():// 変形キャンセル / cancel transform
				locate(0,1):print chr$(DISP_CTRL_CLEAR_EOS);
				ret=imgLoad(0,0,0,0,fileList(i))
				break
		endswitch
		//
		int acnt=0
		printAmode(acnt)
		float aa=pi(1)
		repeat :// キー入力待ち / wait key enter
			str fname
			fname="screen"+str$(outcnt)+"."
			int ky=inkey()
			switch ky
				case 'X':
					page=page+1:if page>GPAGE3 then page=GPAGE0
					switch page
						case GPAGE0:vpriority(page,TPAGE,GPAGE1,GPAGE2,GPAGE3):break
						case GPAGE1:vpriority(page,GPAGE2,TPAGE,GPAGE3,GPAGE0):break
						case GPAGE2:vpriority(page,GPAGE3,GPAGE0,TPAGE,GPAGE1):break
						case GPAGE3:vpriority(page,GPAGE0,GPAGE1,GPAGE2,TPAGE):break
					endswitch
					locate(0,1):print "page=";page-GPAGE0+1:// GPAGE0<>0なのでわかりやすくするため
					break
				case 'A':// animation start
					acnt=acnt+1
					if acnt>8 then acnt=1
					printAmode(acnt)
//// これが基本		gAnimationParameter(tx,ty,scaleX,scaleY,degree,axis)
					switch acnt
						case 1:// 平行移動
							gAnimationParameter(100,200)
//							gAnimationMatrix(,,,,,,,,,100,200)
							gAnimation(ANIMATION_LAYER,1.0,2,YES)
							//
							if fTestEachPage then {
								apage(nextPage)
								gAnimationParameter(,,0.5,0.5)
								gAnimation(ANIMATION_LAYER,1.0,2,YES)
								apage(page)
							}
							break
						case 2:// 拡大縮小
							gAnimationParameter(,,0.5,0.5)
//							gAnimationMatrix(0.5,0,0, 0,0.5,0)
							gAnimation(ANIMATION_LAYER,1.0,2,YES)
							//
							if fTestEachPage then {
								apage(nextPage)
								gAnimationParameter(100,200)
								gAnimation(ANIMATION_LAYER,1.0,2,YES)
								apage(page)
							}
							break
						case 3:// 回転
							gAnimationParameter(,,,,pi(1.0/2.0),AXIS_X)
							gAnimation(ANIMATION_LAYER,1.0,2,YES)
							if fTestEachPage then {
								apage(nextPage)
								gAnimationMatrix(,,,,cos(aa),sin(aa),,-sin(aa),cos(aa),100,100)
								gAnimation(ANIMATION_LAYER,1.0,2,YES)
								apage(page)
							}
							break
						case 4:// matrix
							gAnimationMatrix(,,,,cos(aa),sin(aa),,-sin(aa),cos(aa),100,100)
							gAnimation(ANIMATION_LAYER,1.0,2,YES)
							if fTestEachPage then {
								apage(nextPage)
								gAnimationParameter(,,,,-pi(1.0/2.0),AXIS_X)
								gAnimation(ANIMATION_LAYER,1.0,2,YES)
								apage(page)
							}
							break
						case 5:// ANIMATION_FLIPFROMLEFT
							gAnimation(ANIMATION_FLIPFROMLEFT	,2.0,2,YES,ANIMATIONCURVE_ERASEINOUT)
							if fTestEachPage then {
								apage(nextPage)
								gAnimationMatrix(,,,,cos(aa),sin(aa),,-sin(aa),cos(aa),100,100)
								gAnimation(ANIMATION_LAYER,1.0,2,YES)
								apage(page)
							}
							break
						case 6:
							gAnimation(ANIMATION_FLIPFROMRIGHT		,2.0,2,YES,ANIMATIONCURVE_ERASEIN)
							if fTestEachPage then {
								apage(nextPage)
								gAnimation(ANIMATION_FLIPFROMLEFT	,2.0,2,YES,ANIMATIONCURVE_ERASEINOUT)
								apage(page)
							}
							break
						case 7:
							gAnimation(ANIMATION_CURLUP				,2.0, ,   ,ANIMATIONCURVE_ERASEOUT)
							if fTestEachPage then {
								apage(nextPage)
								gAnimation(ANIMATION_FLIPFROMRIGHT	,2.0,2,YES,ANIMATIONCURVE_ERASEIN)
								apage(page)
							}
							break
						case 8:
							gAnimation(ANIMATION_CURLDOWN		,2.0, ,   ,ANIMATIONCURVE_LINEAR)
							if fTestEachPage then {
								apage(nextPage)
								gAnimation(ANIMATION_CURLUP		,2.0, ,   ,ANIMATIONCURVE_ERASEOUT)
								apage(page)
							}
							break
					endswitch
					beep2(13)
					break
				
				case '0':// animation stop
					gAnimation(ANIMATION_STOP)
					if fTestEachPage then {
						apage(nextPage)
						gAnimation(ANIMATION_STOP)
					}
					beep2(13)
					break

				case 'u':// up scroll
					gScroll(SCROLL_UP,16)
					break
				case 'd':// down scroll
					gScroll(SCROLL_DOWN,16)
					break
				case 'l':// left scroll
					for j=0 to 15
						gScroll(SCROLL_LEFT)
					next
					break
				case 'r':// right scroll
					for j=0 to 15
						gScroll(SCROLL_RIGHT)
					next
					break
			
				case 'E':// Each page
					if fTestEachPage then fTestEachPage=NO else fTestEachPage=YES
					beep2(13)
					locate(WX-10,0):print localizedString("ページごと":"Each page")
					nextPage=page:// 初期ページ設定 / Set initial page
					// 実際に有効になるのは次の画像ロード時から / Effective at next image load
					break

				case 'n':// next : 操作音のみ鳴らす / click sound only
					beep2(13)
					break
				default
					break
			endswitch
		until ky='n' or ky='!'
		if ky='!' then break
		if fTestEachPage then {
			page=nextPage
		}
	next
}
end
//---------
func printAmode(acnt;int)
	locate(WX-2,0):print acnt
endfunc
//---------
func setFuncKey()
	// ファンクションキー / fuallcntion key
	str exit$,next$
	if isLocalizeJapan() then {
		exit$="終了"
		next$="次"
	} else {
		exit$="exit"
		next$="Next"
	}
	setFunctionKey(0,"Up"	,'u')
	setFunctionKey(1,"Down"	,'d')
	setFunctionKey(2,"Left"	,'l')
	setFunctionKey(3,"Right",'r')
	setFunctionKey(4,"PageX",'X')
	setFunctionKey(5,next$ 	,'n')
	setFunctionKey(6,"Anime",'A')
	setFunctionKey(7,"Astop",'0')
	setFunctionKey(8,"Each" ,'E')
	setFunctionKey(9,exit$ 	,'!')

	setFunctionKeyBackgroundImage("funcBackR1.png")
	displayFunctionKeyAll(YES,YES)
endfunc
