#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "display.h"

/*
  Ｐファイル読み込み
*/
pic_t  *PIC_load(char *name)
{
    FILE   *fp;
    pic_t  *pic;
    int     size;
    char    header[8];
    char    ver;

    if ((pic = (pic_t *) malloc(sizeof(pic_t))) == NULL)
	return NULL;

    if ((fp = fopen(name, "rb")) == NULL)
	return NULL;

    fread(header, 1, 8, fp);
    if (memcmp(header, "P-No.1-", 7) != 0) {
	fclose(fp);
	return NULL;
    }
    pic->ver = *(header + 7) - '0';

    fread(&pic->size, sizeof(point_t), 1, fp);

    size = DSP_pic_size(16, pic->size.x, pic->size.y);

    if ((pic->buf = (char *) malloc(size)) == NULL) {
	fclose(fp);
	return NULL;
    }
    fread(pic->buf, 1, size, fp);
    pic->color = 16;

    fclose(fp);
    return pic;
}

/*
  PICデータを表示
*/
int     PIC_put(point_t * p, pic_t * pic)
{
    box_t   b = BOX(p->x, p->y, p->x + pic->size.x, p->y + pic->size.y);
    DSP_put(pic->buf, &b);
    return 0;
}

/*
  PICデータ開放
*/
int     PIC_free(pic_t * pic)
{
    free(pic->buf);
    free(pic);
    return 0;
}

/*
  Ｐ２ファイルオープン
*/
PIC_FILE *PIC2_open(char *name)
{
    PIC_FILE *p;
    char    header[8];
    char    ver;

    if ((p = (PIC_FILE *) malloc(sizeof(PIC_FILE))) == NULL)
	return NULL;
    if ((p->fp = fopen(name, "rb")) == NULL) {
	free(p);
	return NULL;
    }
    fread(header, 1, 8, p->fp);

    if (memcmp(header, "P-No.2-", 7) != 0) {
	fclose(p->fp);
	free(p);
	return NULL;
    }
    p->ver = *(header + 7) - '0';
    p->isARTemis = FALSE;

    return p;
}

PIC_FILE *ARTemis_open(char *name)
{
    PIC_FILE *p;

    if ((p = (PIC_FILE *) malloc(sizeof(PIC_FILE))) == NULL)
	return NULL;
    if ((p->fp = fopen(name, "rb")) == NULL) {
	free(p);
	return NULL;
    }
    p->isARTemis = TRUE;

    return p;
}

#define PATBUFSIZE 76
#define XLEN	60
#define YLEN	64

/*
  Ｐ２ファイルから読み込み
*/
pic_t  *PIC2_read(PIC_FILE * p)
{
    pic_t  *pic;
    char    header[128];
    int     size;

    if ((pic = (pic_t *) malloc(sizeof(pic_t))) == NULL)
	return NULL;

    if (p->isARTemis == TRUE) {
	if(fread(header, 1, 128, p->fp) < 128) {
	    free(pic);
	    return NULL;
	}
	pic->size.x = DWORD(header + XLEN) - 1;
	pic->size.y = DWORD(header + YLEN) - 1;
	size = DWORD(header + PATBUFSIZE);
	if ((pic->buf = (char *) malloc(size)) == NULL) {
	    free(pic);
	    return NULL;
	}
	fread(pic->buf, 1, size, p->fp);
	pic->color = 32768;
    } else {
	if(fread(&pic->size, sizeof(point_t), 1, p->fp) < 1) {
	    free(pic);
	    return NULL;
	}

	size = DSP_pic_size(16, pic->size.x, pic->size.y);

	if ((pic->buf = (char *) malloc(size)) == NULL) {
	    free(pic);
	    return NULL;
	}
	fread(pic->buf, 1, size, p->fp);
	pic->color = 16;
    }
    
    return pic;
}

/*
  Ｐ２ファイルクローズ
*/
int     PIC2_close(PIC_FILE * p)
{
    fclose(p->fp);
    free(p);
    return 0;
}

