/*
	screen.c
	
	スクリーンビットマップオブジェクト実現部

	SCRBITMAP scrbitmap_new(int wid, int ht);
	void scrbitmap_delete(SCRBITMAP bm);
	void scrbitmap_draw(SCRBITMAP bm, int x,int y);

void scrbitmap_setpixel(SCRBITMAP bm, int x,int y, int r,int g,int b);
void scrbitmap_clear(SCRBITMAP bm);

*/
#define MODULE_SCREEN

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <fmcfrb.h>
#include <file_dlg.h>
#include <egb.h>
#include <wgb.h>
#include <msdos.cf>

#include "art.h"
#include "wgbmac.h"
#include "screen.h"

#include "pic.h"  // RGBコーディングマクロを使うため

SCRBITMAP scrbitmap_new(int wid, int ht)
{
	SCRBITMAP bm;
	bm = TL_calloc(1,sizeof(SCRBITMAP_DATA));
	if (bm == NULL)
		return NULL;
	bm->wid = wid;
	bm->ht = ht;
	bm->pixelsize = scrPixelSize;
	if ((bm->buf = TL_calloc(1,bm->pixelsize*wid*ht/8)) == NULL)
	{
		TL_free(bm);
		return NULL;
	}
	return bm;
}

void scrbitmap_delete(SCRBITMAP bm)
{
	TL_free(bm->buf);
	TL_free(bm);
}

void scrbitmap_draw(SCRBITMAP bm, int x,int y)
{
	WGB_PUTBLOCK(guiEgbPtr, bm->buf, x,y, bm->wid, bm->ht);
}

void scrbitmap_drawPart(SCRBITMAP bm, FRAME* frDraw, int ofsx,int ofsy)
// frDraw:SCRBITMAP 内座標(x,y,wid,ht)
// ofsx,ofsy:SCRBITMAPの原点の画面上での座標
{
	char *tempBuf;
	tempBuf = TL_calloc(1,frDraw->WID*frDraw->HT*bm->pixelsize/8);
	if (tempBuf == NULL)
		return;
	int i;
	for (i=0; i<frDraw->HT; i++)
	{
		if (frDraw->Y + i >= bm->ht)
			break;
		char *destptr;
		char *srcptr;
		destptr = tempBuf + (frDraw->WID*i) * bm->pixelsize / 8;
		srcptr = bm->buf+(bm->wid*(frDraw->Y+i)+frDraw->X) * bm->pixelsize / 8;
		int size = _min(frDraw->WID, bm->wid-frDraw->X) * bm->pixelsize / 8;
		memcpy(destptr, srcptr, size);
	}
	WGB_PUTBLOCK(guiEgbPtr, tempBuf,
		ofsx+frDraw->X, ofsy+frDraw->Y, frDraw->WID,frDraw->HT);
	TL_free(tempBuf);
}

void scrbitmap_setpixel(SCRBITMAP bm, int x,int y, int r,int g,int b)
{
	if (bm==NULL || bm->buf == NULL)
		return;
	if (x < 0 || bm->wid <= x || y < 0 || bm->ht <= y)
		return;
	char *dp = bm->buf + BMOFFSET(bm,x,y);
	if (bm->pixelsize == 16)
		SETRGB31(WORD(dp), r>>3,g>>3,b>>3);
	else
		dp[0]=r,dp[1]=g,dp[2]=b;
}

void scrbitmap_clear(SCRBITMAP bm)
{
	if (bm==NULL)
		return;
	memset(bm->buf,0xff,bm->wid*bm->ht*bm->pixelsize/8);
}
