home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix Heaven Sunny 2
/
APPARE2.BIN
/
oh_towns
/
art2
/
src.lzh
/
SCREEN.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-18
|
2KB
|
107 lines
/*
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);
}