/* 画像ビューア */

#include "../api/api.h"
#include <stdio.h>

unsigned char rgb2pal(int r, int g, int b, int x, int y);
void error(char *s);

void HariMain(void)
{
	char wbuf[1040 * 805];
	struct pict pict;
	int win, xsize;
	int i, j, fh;
	char s[60], *p;

	/* ファイル名の取得 */
	p = api_getcmd(s, 30, 0);

	/* ファイルの読み込み */
	fh = api_fopen(p, 'r');
	if(fh == 0) {
		error("このファイルは存在しません。");
	}
	j = api_fsize(fh, 0);
	if(j > 512 * 1024) {
		error("このファイルは大きすぎます。");
	}

	/* ファイルのチェック */
	i = api_getpinfo(fh, &pict);
	if(i != 0) {
		error("このファイルは画像ファイルではありません。");
	}

	/* ウィンドウの準備 */
	xsize= pict.sx + 16;
	if(xsize < 148) {
		xsize = 148;
	}
	sprintf(s, "%s", p);
	win = api_wopen(wbuf, xsize, pict.sy + 37, -1, s);

	/* 表示 */
	i = api_wpict(fh, win, 8, 29, pict.sx, pict.sy);
	if(i != 0) {
		error("このファイルを表示できません。");
	}
	api_wrefresh(win, 8, 29, pict.sx + 8, pict.sy + 37);

	for(;;) {
		api_getd(1);
	}
	api_exit();
}

unsigned char rgb2pal(int r, int g, int b, int x, int y)
{
	static int t[4] = {3, 1, 0, 2};
	int i;

	x &= 1;	/* 奇数か偶数か */
	y &= 1;
	i = t[y * 2 + x];	/* 中間色を作るための定数 */
	r = (r * 21) / 256;	/* 0〜20にする */
	g = (g * 21) / 256;
	b = (b * 21) / 256;
	r = (r + i) / 4;	/* 0〜5にする */
	g = (g + i) / 4;
	b = (b + i) / 4;
	return 16 + r + g * 6 + b * 36;
}

void error(char *s)
{
	if(s != 0) {
		api_puts(s);
	}
	api_exit();
}
