#ifndef HEADER_PIC
#define HEADER_PIC

#include "screen.h"
#include "pen.h"
#include "area.h"

  /* 画像 */

	typedef struct {
		int		wid,ht;
		char	*buf;
		FRAME	update;
		int pixelsize;
	} PIC;

  /* ピクセルの色 */

	typedef struct {
		char r,g,b;
	} PIXEL;

int		pic_init(void);
void	pic_close(void);
PIC		*pic_new(int pixelsize,int width,int height);
PIC* pic_dup(PIC* pic);
void	pic_destroy(PIC *pic);
#define	pic_delete pic_destroy

void pic_setPixelXy(PIC *pic, int x, int y, PIXEL *pixel);
void pic_getPixelXy(PIC *pic, int x, int y, PIXEL *pixel);

void pic_grayPset(PIC* pic,int x,int y,int gray,PIXEL *pixel);
void pic_grayhline(PIC *pic,int x1,int x2,int y,int gray,PIXEL *pixel);
void pic_psetpen(PIC *pic,int x,int y,Pen pen,PIXEL *pixel);
void pic_putGrayBlock(PIC *pic,int x,int y,
					  char *graypat,int wid,int ht, PIXEL *pixel);
void pic_clear(PIC *pic, PIXEL *pixel);
void pic_kosuriStart(PIC* pic,int x,int y,char* graypat,int wid,int ht);
void pic_kosuriDrag(PIC* pic,int x,int y,int r);

void pic_beginUpDate(PIC *pic);
void pic_endUpDate(PIC *pic, FRAME *frame);

void pic_copy(PIC* picSrc, FRAME* frSrc, PIC* picDest, POINT* ptDest);
	// update 管理を忘れないこと！
void pic_copyarea(PIC* picSrc, AREA areaSrc, PIC* picDest, POINT* ptDest);
void pic_paint(PIC *pic, int x,int y, PIXEL* pix);
void pic_blot(PIC *pic,int x,int y,int branch,int depth,PIXEL* pix);
void pic_diffusePen(PIC* pic,int x,int y,Pen pen);
void pic_sandPen(PIC* pic,int x,int y,Pen pen);
void pic_polygon(PIC* pic,POINT* points,int nPoint,PIXEL* pix);
void pic_fillarea(PIC* pic,AREA area,PIXEL* pix);

int pic_loadTIFF_(PIC *pic, char *fname);
int pic_saveTIFF_(PIC *pic, char *fname);
// void	pic_getRectImage( PIC *pic, char *buf, FRAME *fr );

void pic_getScrBitMap(PIC* pic, SCRBITMAP bm, int ofsx, int ofsy, FRAME *fr,
                      int zoom);
	// 画像内の fr(x,y,wid,ht) の領域を bm の ofsx, ofsy に転送する
#define	pic_getScrBitmap	pic_getScrBitMap

void	pixel_setRgb(PIXEL *pixel, int r, int g, int b);
void	pixel_getRgb(PIXEL *pixel, int *r, int *g, int *b);

#define	PICOFFSET(pic,x,y)		(((pic)->wid*(y)+(x))*(pic)->pixelsize /8)

#define PICADDR(pic,x,y)   ((pic)->buf + PICOFFSET(pic,x,y))

#define	CODE32K(pix)					\
	((((unsigned int)(pix).r >> 3) << 5)  |		\
	 (((unsigned int)(pix).g >> 3) << 10) |		\
	 (((unsigned int)(pix).b >> 3)))

#define CODE16M(pix)	\
	(((uint)(pix).g << 8) | ((uint)(pix).r) | ((uint)(pix).b << 16))

#define SETBYTE3(p,n)   \
	(*(ushort*)(p)=(ushort)((uint)(n) & 0xffff),	\
	 *(((char*)(p))+2) = ((uint)(n)>>16)&0xff)

#define GETBYTE3(p)  (*(ushort*)(p)) | (((uint)*((char*)(p)+2)) << 16)

#define GET3BYTE(ptr,a,b,c)	((a)=(ptr)[0],(b)=(ptr)[1],(c)=(ptr)[2])

#define COLCODE(pix)  (scrPixelSize==16 ? CODE32K(pix) : CODE16M(pix))

#define SETRGB32K(pix, col)									\
	((pix).r = ((((col) >> 5) & 31) * 255 + 15) / 31,		\
	 (pix).g = ((((col) >> 10) & 31) * 255 + 15) / 31,		\
	 (pix).b = ((((col)      ) & 31) * 255 + 15) / 31)

#define GETRGB31(code,r,g,b)		\
	((g) = ((uint)code >> 10) & 31,	\
	 (r) = ((uint)code >> 5) & 31,	\
	 (b) = ((uint)code) & 31)

#define	SETRGB31(code,r,g,b)	\
	((code) = ((uint)(g)<<10) | ((uint)(r)<<5) | ((uint)b))

#endif HEADER_PIC
