wonx/WWScreen.c
Hiroaki Sakai 5e1a9795b7 Create your own header file. It became compilable with only Wonx.
Since there is a possibility that the Error () function will collide with libwonx.a when linking,
It changed to Wonx_Error ().
Added bios_exit ().
sprite_set_char, sprite_get_char, palette number minus 8
Fixed bug that was not specified.
font_set_monodata (), font_set_colordata (), font_get_data (), disp.c,
The arguments of screen_set_char (), screen_get_char (), sprite_set_data ()
Changed from void * to appropriate type.
Sample program and attached SpeedMac.
I added a document.

Version 0.3 beta - from wonx-b03.tar.gz
2018-03-07 23:06:08 +00:00

262 lines
8.8 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*****************************************************************************/
/* ここから */
/*****************************************************************************/
#include "WWScreenP.h"
#include "etc.h"
/*****************************************************************************/
/* メンバ関数の定義 */
/*****************************************************************************/
/*===========================================================================*/
/* プライベートなもの */
/*===========================================================================*/
static int WWScreenCharacter_GetHorizontal(WWScreenCharacter sc)
{ return (sc->horizontal); }
static int WWScreenCharacter_GetVertical(WWScreenCharacter sc)
{ return (sc->vertical); }
static WWPalette WWScreenCharacter_GetPalette(WWScreenCharacter sc)
{ return (sc->palette); }
static WWCharacter WWScreenCharacter_GetCharacter(WWScreenCharacter sc)
{ return (sc->character); }
static int WWScreenCharacter_SetHorizontal(WWScreenCharacter sc, int f)
{ return (sc->horizontal = f); }
static int WWScreenCharacter_SetVertical(WWScreenCharacter sc, int f)
{ return (sc->vertical = f); }
static WWPalette WWScreenCharacter_SetPalette(WWScreenCharacter sc,
WWPalette palette)
{ return (sc->palette = palette); }
static WWCharacter WWScreenCharacter_SetCharacter(WWScreenCharacter sc,
WWCharacter c)
{ return (sc->character = c); }
static WWScreenCharacter WWScreenCharacter_Create(int horizontal, int vertical,
WWPalette palette,
WWCharacter character)
{
WWScreenCharacter screen_character;
screen_character = (WWScreenCharacter)malloc(sizeof(_WWScreenCharacter));
if (screen_character == NULL)
Wonx_Error("WWScreenCharacter", "Cannot allocate memory.");
WWScreenCharacter_SetHorizontal(screen_character, horizontal);
WWScreenCharacter_SetVertical(screen_character, vertical);
WWScreenCharacter_SetPalette(screen_character, palette);
WWScreenCharacter_SetCharacter(screen_character, character);
return (screen_character);
}
static WWScreenCharacter WWScreenCharacter_Destroy(WWScreenCharacter
screen_character)
{
if (screen_character == NULL) return (NULL);
free(screen_character);
return (NULL);
}
static WWScreenCharacter WWScreen_GetScreenCharacter(WWScreen s, int x, int y)
{
return (s->screen_characters[y * WWScreen_GetWidth(s) + x]);
}
static WWScreenCharacter WWScreen_SetScreenCharacter(WWScreen s, int x, int y,
WWScreenCharacter sc)
{
return (s->screen_characters[y * WWScreen_GetWidth(s) + x] = sc);
}
/*===========================================================================*/
/* パブリックなもの */
/*===========================================================================*/
int WWScreen_GetHorizontal(WWScreen s, int x, int y)
{
WWScreenCharacter sc;
sc = WWScreen_GetScreenCharacter(s, x, y);
return (WWScreenCharacter_GetHorizontal(sc));
}
int WWScreen_GetVertical(WWScreen s, int x, int y)
{
WWScreenCharacter sc;
sc = WWScreen_GetScreenCharacter(s, x, y);
return (WWScreenCharacter_GetVertical(sc));
}
WWPalette WWScreen_GetPalette(WWScreen s, int x, int y)
{
WWScreenCharacter sc;
sc = WWScreen_GetScreenCharacter(s, x, y);
return (WWScreenCharacter_GetPalette(sc));
}
WWCharacter WWScreen_GetCharacter(WWScreen s, int x, int y)
{
WWScreenCharacter sc;
sc = WWScreen_GetScreenCharacter(s, x, y);
return (WWScreenCharacter_GetCharacter(sc));
}
int WWScreen_SetHorizontal(WWScreen s, int x, int y, int f)
{
WWScreenCharacter sc;
sc = WWScreen_GetScreenCharacter(s, x, y);
return (WWScreenCharacter_SetHorizontal(sc, f));
}
int WWScreen_SetVertical(WWScreen s, int x, int y, int f)
{
WWScreenCharacter sc;
sc = WWScreen_GetScreenCharacter(s, x, y);
return (WWScreenCharacter_SetVertical(sc, f));
}
WWPalette WWScreen_SetPalette(WWScreen s, int x, int y, WWPalette palette)
{
WWScreenCharacter sc;
sc = WWScreen_GetScreenCharacter(s, x, y);
return (WWScreenCharacter_SetPalette(sc, palette));
}
WWCharacter WWScreen_SetCharacter(WWScreen s, int x, int y, WWCharacter c)
{
WWScreenCharacter sc;
sc = WWScreen_GetScreenCharacter(s, x, y);
return (WWScreenCharacter_SetCharacter(sc, c));
}
int WWScreen_GetNumber(WWScreen s) { return (s->number); }
int WWScreen_GetWidth( WWScreen s) { return (s->width ); }
int WWScreen_GetHeight(WWScreen s) { return (s->height); }
int WWScreen_GetRollX( WWScreen s) { return (s->roll_x); }
int WWScreen_GetRollY( WWScreen s) { return (s->roll_y); }
int WWScreen_GetEnable(WWScreen s) { return (s->enable); }
int WWScreen_GetMode( WWScreen s) { return (s->mode ); }
int WWScreen_GetDrawX( WWScreen s) { return (s->draw_x ); }
int WWScreen_GetDrawY( WWScreen s) { return (s->draw_y ); }
int WWScreen_GetDrawWidth( WWScreen s) { return (s->draw_width ); }
int WWScreen_GetDrawHeight(WWScreen s) { return (s->draw_height); }
int WWScreen_SetNumber(WWScreen s, int n) { return (s->number = n); }
int WWScreen_SetWidth( WWScreen s, int n) { return (s->width = n); }
int WWScreen_SetHeight(WWScreen s, int n) { return (s->height = n); }
int WWScreen_SetRollX( WWScreen s, int r) { return (s->roll_x = r); }
int WWScreen_SetRollY( WWScreen s, int r) { return (s->roll_y = r); }
int WWScreen_SetEnable(WWScreen s, int n) { return (s->enable = n); }
int WWScreen_SetMode( WWScreen s, int n) { return (s->mode = n); }
int WWScreen_SetDrawX( WWScreen s, int n) { return (s->draw_x = n); }
int WWScreen_SetDrawY( WWScreen s, int n) { return (s->draw_y = n); }
int WWScreen_SetDrawWidth( WWScreen s, int n) { return (s->draw_width = n); }
int WWScreen_SetDrawHeight(WWScreen s, int n) { return (s->draw_height = n); }
/* カラーマップの色(07)を返す(透明色は-1を返す) */
int WWScreen_GetPixel(WWScreen screen, int x, int y)
{
int cx, cy, px, py;
int pixel;
WWCharacter character;
WWPalette palette;
/* x,y 座標が範囲外のときは,ロールオーバーする */
/* (スクリーンの端と端は,つながっている) */
while (x < 0) x += WWScreen_GetWidth( screen) * 8;
while (y < 0) y += WWScreen_GetHeight(screen) * 8;
x = x % (WWScreen_GetWidth( screen) * 8);
y = y % (WWScreen_GetHeight(screen) * 8);
cx = x / 8; cy = y / 8;
px = x % 8; py = y % 8;
if (WWScreen_GetHorizontal(screen, cx, cy)) px = 7 - px;
if (WWScreen_GetVertical( screen, cx, cy)) py = 7 - py;
character = WWScreen_GetCharacter(screen, cx, cy);
palette = WWScreen_GetPalette(screen, cx, cy);
pixel = WWCharacter_GetPixel(character, px, py);
pixel = WWPalette_GetMappedColor(palette, pixel);
return (pixel);
}
WWScreen WWScreen_Create(int number,
int width, int height,
WWPalette initial_palette,
WWCharacter initial_character,
int draw_x, int draw_y,
int draw_width, int draw_height)
{
WWScreen screen;
WWScreenCharacter sc;
int x, y;
screen = (WWScreen)malloc(sizeof(_WWScreen));
if (screen == NULL)
Wonx_Error("WWScreen_Create", "Cannot allocate memory.");
WWScreen_SetNumber(screen, number);
WWScreen_SetWidth( screen, width);
WWScreen_SetHeight(screen, height);
WWScreen_SetRollX( screen, 0);
WWScreen_SetRollY( screen, 0);
WWScreen_SetEnable(screen, 1);
WWScreen_SetMode( screen, WWSCREEN_DRAW_ALL);
WWScreen_SetDrawX( screen, draw_x);
WWScreen_SetDrawY( screen, draw_y);
WWScreen_SetDrawWidth( screen, draw_width);
WWScreen_SetDrawHeight(screen, draw_height);
screen->screen_characters =
(WWScreenCharacter *)malloc(sizeof(WWScreenCharacter) *
screen->width * screen->height);
for (y = 0; y < screen->height; y++) {
for (x = 0; x < screen->width; x++) {
sc = WWScreenCharacter_Create(0, 0, initial_palette, initial_character);
WWScreen_SetScreenCharacter(screen, x, y, sc);
}
}
return (screen);
}
WWScreen WWScreen_Destroy(WWScreen screen)
{
int x, y;
WWScreenCharacter sc;
if (screen == NULL) return (NULL);
for (y = 0; y < screen->height; y++) {
for (x = 0; x < screen->width; x++) {
sc = WWScreen_GetScreenCharacter(screen, x, y);
WWScreen_SetScreenCharacter(screen, x, y, WWScreenCharacter_Destroy(sc));
}
}
if (screen->screen_characters) free(screen->screen_characters);
free(screen);
return (NULL);
}
/*****************************************************************************/
/* ここまで */
/*****************************************************************************/
/*****************************************************************************/
/* End of File. */
/*****************************************************************************/