/*---------------------------------------------------------------------------
 * BMPSAVER ram0に画面を保存
 * bsram0.c (2000/07/19 - 2000/12/13)
 * Copyright (c) 2000, Kazuhide Hatsuyama, All rights reserved.
 *   mail    : hat@lares.dti.ne.jp
 *   HomePage: http://www.lares.dti.ne.jp/~hat/
 *---------------------------------------------------------------------------*/

#define BIOS_INLINE

#include <sys/bios.h>
#include <sys/oswork.h>
#include <stdio.h>
#include <fcntl.h>

#include "bsbmp_d.h"
#include "bmpsaver.h"

typedef
struct tagBMPSAVRAM0INFO {
	int				posx, posy;
	int				width, height;
	int				bpp;
	int				byte_per_line;
	unsigned char	packed_color;

	FILE far*		bmp_fp;
	char 			filename[30];
} BMPSAVRAM0INFO;

static BMPSAVRAM0INFO bsinfo;

/*------------------------------------------------*/

int bs_open(BMPFILEINFO far *bfi)
{
	sprintf(bsinfo.filename, "/ram0/%s", bfi->fn);

	bsinfo.width = bfi->w;
	bsinfo.height = bfi->h;

	/* １ラインにつき何バイト？ 色数は？*/
	bsinfo.bpp = bfi->bpp;
	bsinfo.byte_per_line = bsinfo.width;
	if(bsinfo.bpp==4) bsinfo.byte_per_line = (bsinfo.byte_per_line+1)/2;
	/* 4バイト境界に合わせる */
	bsinfo.byte_per_line = (bsinfo.byte_per_line+3)&(~3);

	/*----- 書き込み ---------------------------------------*/
	/* ファイルを開く */
	unlink(bsinfo.filename);
	if(fs_getil(cwfs)->_space(ram0_fs) < bitMapFileHeader.bfSize ||
	   creat(bsinfo.filename, 6, (bitMapFileHeader.bfSize+127)/128)!=E_FS_SUCCESS ||
	   !(bsinfo.bmp_fp = fopen(bsinfo.filename, "w")))
	{
		return KH_BS_ERROR;
	}

	/* ヘッダー書き込み */
	fwrite(&bitMapFileHeader, sizeof(BITMAPFILEHEADER), 1, bsinfo.bmp_fp);
	fwrite(&bitMapInfoHeader, sizeof(BITMAPINFOHEADER), 1, bsinfo.bmp_fp);
	fwrite(&colortable, sizeof(RGBQUAD)*(1<<bsinfo.bpp), 1, bsinfo.bmp_fp);

	bsinfo.posx = 0;
	bsinfo.posy = 0;

	return KH_BS_OK;
}

/*------------------------------------------------*/

int bs_putcolor(unsigned char color)
{
	if(bsinfo.bpp==4) {
		/* グレースケール */
		if(bsinfo.posx&1) {
			bsinfo.packed_color += color;
			fputc(bsinfo.packed_color, bsinfo.bmp_fp);
		} else {
			bsinfo.packed_color = color<<4;
		}
		bsinfo.posx++;
		/* 次の行？ */
		if(bsinfo.posx>=bsinfo.width) {
			int i, n;
			if(bsinfo.posx&1) fputc(bsinfo.packed_color, bsinfo.bmp_fp);
			n = bsinfo.byte_per_line - (bsinfo.width+1)/2;
			for(i=0;i<n;i++) fputc(0, bsinfo.bmp_fp);
			bsinfo.posx = 0;
			bsinfo.posy++;
		}
	} else {
		/* 256カラー */
		fputc(color, bsinfo.bmp_fp);
		bsinfo.posx++;
		/* 次の行？ */
		if(bsinfo.posx>=bsinfo.width) {
			int i, n;
			n = bsinfo.byte_per_line - bsinfo.width;
			for(i=0;i<n;i++) fputc(0, bsinfo.bmp_fp);
			bsinfo.posx = 0;
			bsinfo.posy++;
		}
	}
	return KH_BS_OK;
}

/*------------------------------------------------*/

int bs_close()
{
	int i, n;
	/* 途中で書き込みが中断している時の処理 */
	if(bsinfo.bpp==4) {
		/* グレースケール */
		if(bsinfo.posy<bsinfo.height) {
			if(bsinfo.posx<bsinfo.width) {
				if(bsinfo.posx&1) fputc(bsinfo.packed_color, bsinfo.bmp_fp);
				n = bsinfo.byte_per_line - (bsinfo.posx+1)/2;
				for(i=0;i<n;i++) fputc(0, bsinfo.bmp_fp);
				bsinfo.posy++;
			}
			n = (bsinfo.height-bsinfo.posy)*bsinfo.byte_per_line;
			for(i=0;i<n;i++) fputc(0, bsinfo.bmp_fp);
		}
	} else {
		/* カラー */
		if(bsinfo.posy<bsinfo.height) {
			if(bsinfo.posx<bsinfo.width) {
				n = bsinfo.byte_per_line - bsinfo.posx;
				for(i=0;i<n;i++) fputc(0, bsinfo.bmp_fp);
				bsinfo.posy++;
			}
			n = (bsinfo.height-bsinfo.posy)*bsinfo.byte_per_line;
			for(i=0;i<n;i++) fputc(0, bsinfo.bmp_fp);
		}
	}
	fclose(bsinfo.bmp_fp);
	return KH_BS_OK;
}

