wonx/WWScreen.c
Hiroaki Sakai 1d5ebf4867 When executing a function related to text display, (although characters are not displayed as usual)
At the very least I output the character string to the terminal.

We implemented the window function of screen 2.

Version 0.0.2 alpha - from wonx-a02.tar.gz
2000-09-27 12:00:00 +09:00

222 lines
8.3 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"
/*****************************************************************************/
/* メンバ関数の定義 */
/*****************************************************************************/
/*===========================================================================*/
/* プライベートなもの */
/*===========================================================================*/
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)
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)
{ return (WWScreen_GetScreenCharacter(s, x, y)->horizontal); }
int WWScreen_GetVertical(WWScreen s, int x, int y)
{ return (WWScreen_GetScreenCharacter(s, x, y)->vertical); }
WWPalette WWScreen_GetPalette(WWScreen s, int x, int y)
{ return (WWScreen_GetScreenCharacter(s, x, y)->palette); }
WWCharacter WWScreen_GetCharacter(WWScreen s, int x, int y)
{ return (WWScreen_GetScreenCharacter(s, x, y)->character); }
int WWScreen_SetHorizontal(WWScreen s, int x, int y, int f)
{ return (WWScreen_GetScreenCharacter(s, x, y)->horizontal = f); }
int WWScreen_SetVertical(WWScreen s, int x, int y, int f)
{ return (WWScreen_GetScreenCharacter(s, x, y)->vertical = f); }
WWPalette WWScreen_SetPalette(WWScreen s, int x, int y, WWPalette palette)
{ return (WWScreen_GetScreenCharacter(s, x, y)->palette = palette); }
WWCharacter WWScreen_SetCharacter(WWScreen s, int x, int y, WWCharacter c)
{ return (WWScreen_GetScreenCharacter(s, x, y)->character = 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) 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. */
/*****************************************************************************/