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
This commit is contained in:
Hiroaki Sakai 2000-09-27 12:00:00 +09:00 committed by Godzil
parent 3c624a304e
commit 1d5ebf4867
9 changed files with 186 additions and 57 deletions

16
HISTORY
View File

@ -0,0 +1,16 @@
2000/9/27(水)
Wonx-a02 公開
テキスト表示関連の関数を実行したときに,(あいかわらず文字は表示されないが)
せめてターミナルに文字列を出力するようにした.
スクリーン2のウインドウ機能を実装した.
2000/9/26(火)
Wonx-a01 公開

View File

@ -2,8 +2,8 @@ XINCLUDEDIR = /usr/X11R6/include
INCLUDEDIR = .
XLIBDIR = /usr/X11R6/lib
VERSION = Wonx-a01
PKGNAME = wonx-a01
VERSION = Wonx-a02
PKGNAME = wonx-a02
OBJS = WWCharacter.o WWColorMap.o WWDisplay.o WWLCDPanel.o WWPalette.o WWScreen.o WWSprite.o WonxDisplay.o XDisplay.o bank.o comm.o disp.o text.o key.o sound.o system.o timer.o etc.o wonx.o

View File

@ -20,14 +20,10 @@ WWSprite WWDisplay_GetSprite(WWDisplay d, int n) { return (d->sprite[n]); }
WWScreen WWDisplay_GetScreen(WWDisplay d, int n) { return (d->screen[n]); }
WWLCDPanel WWDisplay_GetLCDPanel(WWDisplay d) { return (d->lcd_panel); }
int WWDisplay_GetScreenEnable(WWDisplay d, int n)
{ return (d->screen_enable[n]); }
int WWDisplay_GetSpriteEnable(WWDisplay d) { return (d->sprite_enable); }
int WWDisplay_GetSpriteWindowEnable(WWDisplay d)
{ return (d->sprite_window_enable); }
int WWDisplay_GetScreen2WindowMode(WWDisplay d)
{ return (d->screen2_window_mode); }
int WWDisplay_GetBorder(WWDisplay d) { return (d->border); }
int WWDisplay_GetForegroundColor(WWDisplay d) { return (d->foreground_color); }
@ -53,15 +49,11 @@ WWScreen WWDisplay_SetScreen(WWDisplay d, int n, WWScreen s)
WWLCDPanel WWDisplay_SetLCDPanel(WWDisplay d, WWLCDPanel p)
{ return (d->lcd_panel = p); }
int WWDisplay_SetScreenEnable(WWDisplay d, int n, int f)
{ return (d->screen_enable[n] = f); }
int WWDisplay_SetSpriteEnable(WWDisplay d, int f)
{ return (d->sprite_enable = f); }
int WWDisplay_SetSpriteWindowEnable(WWDisplay d, int f)
{ return (d->sprite_window_enable = f); }
int WWDisplay_SetScreen2WindowMode(WWDisplay d, int mode)
{ return (d->screen2_window_mode = mode); }
int WWDisplay_SetBorder(WWDisplay d, int b) { return (d->border = b); }
int WWDisplay_SetForegroundColor(WWDisplay d, int c)
@ -109,18 +101,17 @@ WWDisplay WWDisplay_Create(int lcd_panel_width, int lcd_panel_height,
WWDisplay_SetScreen(display, i,
WWScreen_Create(i, screen_width, screen_height,
WWDisplay_GetPalette(display, 0),
WWDisplay_GetCharacter(display, 0)));
WWDisplay_GetCharacter(display, 0),
0, 0,
lcd_panel_width, lcd_panel_height));
}
WWDisplay_SetLCDPanel(display, WWLCDPanel_Create(lcd_panel_width,
lcd_panel_height));
WWDisplay_SetScreenEnable(display, 0, 0);
WWDisplay_SetScreenEnable(display, 1, 0);
WWDisplay_SetSpriteEnable(display, 0);
WWDisplay_SetSpriteWindowEnable(display, 0);
WWDisplay_SetScreen2WindowMode(display, 0);
WWDisplay_SetBorder(display, 0);
WWDisplay_SetForegroundColor(display, 3);
@ -189,16 +180,47 @@ static int WWDisplay_DrawScreen(WWDisplay display, WWScreen screen)
int pixel;
int x, y, px, py;
int sx, sy, ex, ey;
int mode;
if (!WWScreen_GetEnable(screen)) return (0);
lcd_panel = WWDisplay_GetLCDPanel(display);
lcd_panel_width = WWLCDPanel_GetWidth( lcd_panel);
lcd_panel_height = WWLCDPanel_GetHeight(lcd_panel);
if ( (WWScreen_GetMode(screen) == WWSCREEN_INSIDE_ONLY) ||
(WWScreen_GetMode(screen) == WWSCREEN_OUTSIDE_ONLY) ) {
sx = WWScreen_GetDrawX(screen);
sy = WWScreen_GetDrawX(screen);
ex = sx + WWScreen_GetDrawWidth( screen) - 1;
ey = sy + WWScreen_GetDrawHeight(screen) - 1;
}
mode = WWScreen_GetMode(screen);
/* 以下はホットスポットになるので,そのうちループアンローリング */
/* したほうがいいかも */
for (y = 0; y < lcd_panel_height; y++) {
for (x = 0; x < lcd_panel_width; x++) {
px = x + WWScreen_GetRollX(screen);
py = y + WWScreen_GetRollY(screen);
if (mode == WWSCREEN_INSIDE_ONLY) {
if (y > ey) {
x = lcd_panel_width - 1; y = lcd_panel_height - 1; continue;
}
if (y < sy) { x = lcd_panel_width - 1; y = sy - 1; continue; }
if (x > ex) { x = lcd_panel_width - 1; continue; }
if (x < sx) { x = sx - 1; continue; }
} else if (mode == WWSCREEN_OUTSIDE_ONLY) {
if ( (x >= sx) && (x <= ex) && (y >= sy) && (y <= ey) ) {
x = ex;
continue;
}
}
pixel = WWScreen_GetPixel(screen, px, py);
/* Æ©ÌÀ¿§¤Î¾ì¹ç */

View File

@ -32,11 +32,9 @@ WWCharacter WWDisplay_GetCharacter(WWDisplay d, int n);
WWSprite WWDisplay_GetSprite(WWDisplay d, int n);
WWScreen WWDisplay_GetScreen(WWDisplay d, int n);
WWLCDPanel WWDisplay_GetLCDPanel(WWDisplay d);
int WWDisplay_GetScreenEnable(WWDisplay d, int n);
int WWDisplay_GetSpriteEnable(WWDisplay d);
int WWDisplay_GetSpriteWindowEnable(WWDisplay d);
int WWDisplay_GetScreen2WindowMode(WWDisplay d);
int WWDisplay_GetBorder(WWDisplay d);
int WWDisplay_GetForegroundColor(WWDisplay d);
@ -56,11 +54,9 @@ WWSprite WWDisplay_SetSprite(WWDisplay d, int n, WWSprite s);
WWScreen WWDisplay_SetScreen(WWDisplay d, int n, WWScreen s);
WWLCDPanel WWDisplay_SetLCDPanel(WWDisplay d, WWLCDPanel p);
int WWDisplay_SetScreenEnable(WWDisplay d, int n, int f);
int WWDisplay_SetSpriteEnable(WWDisplay d, int f);
int WWDisplay_SetSpriteWindowEnable(WWDisplay d, int f);
int WWDisplay_SetScreen2WindowMode(WWDisplay d, int mode);
int WWDisplay_SetBorder(WWDisplay d, int b);
int WWDisplay_SetForegroundColor(WWDisplay d, int c);

View File

@ -21,14 +21,9 @@ typedef struct _WWDisplay {
WWLCDPanel lcd_panel;
/* ディスプレイの属性情報 */
int screen_enable[2]; /* スクリーン表示イネーブルフラグ */
int sprite_enable; /* スプライト表示イネーブルフラグ */
int sprite_window_enable; /* スプライトウインドウ機能イネーブルフラグ */
/* スクリーン2ウインドウモード */
/* 0,1... 無効 2...ウインドウの内側を表示 3...ウインドウの外側を表示 */
int screen2_window_mode;
int border; /* ボーダーカラー07のカラーマップ番号 */
int foreground_color; /* モノクロフォント展開時の色 */

View File

@ -73,7 +73,6 @@ static WWScreenCharacter WWScreen_SetScreenCharacter(WWScreen s, int x, int y,
/* パブリックなもの */
/*===========================================================================*/
int WWScreen_GetNumber(WWScreen s) { return (s->number); }
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)
@ -83,7 +82,6 @@ WWPalette WWScreen_GetPalette(WWScreen s, int x, int y)
WWCharacter WWScreen_GetCharacter(WWScreen s, int x, int y)
{ return (WWScreen_GetScreenCharacter(s, x, y)->character); }
int WWScreen_SetNumber(WWScreen s, int n) { return (s->number = n); }
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)
@ -93,16 +91,34 @@ WWPalette WWScreen_SetPalette(WWScreen s, int x, int y, WWPalette 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)
{
@ -133,9 +149,12 @@ int WWScreen_GetPixel(WWScreen screen, int x, int y)
return (pixel);
}
WWScreen WWScreen_Create(int number, int width, int height,
WWScreen WWScreen_Create(int number,
int width, int height,
WWPalette initial_palette,
WWCharacter initial_character)
WWCharacter initial_character,
int draw_x, int draw_y,
int draw_width, int draw_height)
{
WWScreen screen;
WWScreenCharacter sc;
@ -150,6 +169,14 @@ WWScreen WWScreen_Create(int number, int width, int 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);

View File

@ -16,37 +16,64 @@
typedef struct _WWScreen * WWScreen;
/*****************************************************************************/
/* Äê¿ô¤ÎÄêµÁ */
/*****************************************************************************/
#define WWSCREEN_DRAW_ALL 0
#define WWSCREEN_INSIDE_ONLY 1
#define WWSCREEN_OUTSIDE_ONLY 2
/*****************************************************************************/
/* ¥á¥ó¥Ð´Ø¿ô¤ÎÀë¸À */
/*****************************************************************************/
int WWScreen_GetNumber(WWScreen s);
int WWScreen_GetHorizontal(WWScreen s, int x, int y);
int WWScreen_GetVertical(WWScreen s, int x, int y);
WWPalette WWScreen_GetPalette(WWScreen s, int x, int y);
WWCharacter WWScreen_GetCharacter(WWScreen s, int x, int y);
int WWScreen_SetNumber(WWScreen s, int n);
int WWScreen_SetHorizontal(WWScreen s, int x, int y, int f);
int WWScreen_SetVertical(WWScreen s, int x, int y, int f);
WWPalette WWScreen_SetPalette(WWScreen s, int x, int y, WWPalette palette);
WWCharacter WWScreen_SetCharacter(WWScreen s, int x, int y, WWCharacter c);
int WWScreen_GetNumber(WWScreen s);
int WWScreen_GetWidth( WWScreen s);
int WWScreen_GetHeight(WWScreen s);
int WWScreen_GetRollX( WWScreen s);
int WWScreen_GetRollY( WWScreen s);
int WWScreen_GetEnable(WWScreen s);
int WWScreen_GetMode( WWScreen s);
int WWScreen_GetDrawX( WWScreen s);
int WWScreen_GetDrawY( WWScreen s);
int WWScreen_GetDrawWidth( WWScreen s);
int WWScreen_GetDrawHeight(WWScreen s);
int WWScreen_SetNumber(WWScreen s, int n);
int WWScreen_SetWidth( WWScreen s, int n);
int WWScreen_SetHeight(WWScreen s, int n);
int WWScreen_SetRollX( WWScreen s, int r);
int WWScreen_SetRollY( WWScreen s, int r);
int WWScreen_SetEnable(WWScreen s, int n);
int WWScreen_SetMode( WWScreen s, int n);
int WWScreen_SetDrawX( WWScreen s, int n);
int WWScreen_SetDrawY( WWScreen s, int n);
int WWScreen_SetDrawWidth( WWScreen s, int n);
int WWScreen_SetDrawHeight(WWScreen s, int n);
int WWScreen_GetPixel(WWScreen screen, int x, int y);
WWScreen WWScreen_Create(int number, int width, int height,
WWScreen WWScreen_Create(int number,
int width, int height,
WWPalette initial_palette,
WWCharacter initial_character);
WWCharacter initial_character,
int draw_x, int draw_y,
int draw_width, int draw_height);
WWScreen WWScreen_Destroy(WWScreen screen);
/*****************************************************************************/

View File

@ -27,7 +27,19 @@ typedef struct _WWScreen {
int height;
int roll_x;
int roll_y;
WWScreenCharacter * screen_characters;
int enable; /* 表示/非表示のフラグ */
int mode; /* 表示モード */
/* WWSCREEN_DRAW_ALL, WWSCREEN_INSIDE_ONLY, WWSCREEN_OUTSIDE_ONLY の */
/* いずれかの値を取る */
/* 表示領域(スクリーン2のウインドウ機能用.スクリーン1では未使用) */
int draw_x, draw_y;
int draw_width, draw_height;
} _WWScreen;
/*****************************************************************************/

86
disp.c
View File

@ -17,31 +17,32 @@
void display_control(unsigned int flags)
{
WWDisplay ww_display;
printf("display_control(): flags = %ud, ", flags); fflush(stdout);
if (wonx_display == NULL) Wonx_Create();
WWDisplay_SetScreenEnable(WonxDisplay_GetWWDisplay(wonx_display),
SCREEN1,
(flags & DCM_SCR1) ? 1 : 0);
ww_display = WonxDisplay_GetWWDisplay(wonx_display);
WWDisplay_SetScreenEnable(WonxDisplay_GetWWDisplay(wonx_display),
SCREEN2,
(flags & DCM_SCR2) ? 1 : 0);
WWScreen_SetEnable(WWDisplay_GetScreen(ww_display, SCREEN1),
(flags & DCM_SCR1) ? 1 : 0);
WWDisplay_SetSpriteEnable(WonxDisplay_GetWWDisplay(wonx_display),
(flags & DCM_SPR) ? 1 : 0);
WWScreen_SetEnable(WWDisplay_GetScreen(ww_display, SCREEN2),
(flags & DCM_SCR2) ? 1 : 0);
WWDisplay_SetSpriteWindowEnable(WonxDisplay_GetWWDisplay(wonx_display),
(flags & DCM_SPR_WIN) ? 1 : 0);
WWDisplay_SetSpriteEnable(ww_display, (flags & DCM_SPR) ? 1 : 0);
WWDisplay_SetSpriteWindowEnable(ww_display, (flags & DCM_SPR_WIN) ? 1 : 0);
if ((flags & 0x0030) == DCM_SCR2_WIN_INSIDE)
WWDisplay_SetScreen2WindowMode(WonxDisplay_GetWWDisplay(wonx_display), 2);
WWScreen_SetMode(WWDisplay_GetScreen(ww_display, SCREEN2),
WWSCREEN_INSIDE_ONLY);
else if ((flags & 0x0030) == DCM_SCR2_WIN_OUTSIDE)
WWDisplay_SetScreen2WindowMode(WonxDisplay_GetWWDisplay(wonx_display), 3);
WWScreen_SetMode(WWDisplay_GetScreen(ww_display, SCREEN2),
WWSCREEN_OUTSIDE_ONLY);
WWDisplay_SetBorder(WonxDisplay_GetWWDisplay(wonx_display),
(flags & DCM_BORDER_COLOR) >> 7);
WWDisplay_SetBorder(ww_display, (flags & DCM_BORDER_COLOR) >> 7);
WonxDisplay_Flush(wonx_display);
@ -52,20 +53,21 @@ void display_control(unsigned int flags)
unsigned int display_status()
{
WWDisplay ww_display;
unsigned short int ret;
printf("display_status(): "); fflush(stdout);
if (wonx_display == NULL) Wonx_Create();
ww_display = WonxDisplay_GetWWDisplay(wonx_display);
ret = 0;
if (WWDisplay_GetScreenEnable(WonxDisplay_GetWWDisplay(wonx_display),
SCREEN1))
if (WWScreen_GetEnable(WWDisplay_GetScreen(ww_display, SCREEN1)))
ret |= DCM_SCR1;
if (WWDisplay_GetScreenEnable(WonxDisplay_GetWWDisplay(wonx_display),
SCREEN2))
if (WWScreen_GetEnable(WWDisplay_GetScreen(ww_display, SCREEN2)))
ret |= DCM_SCR2;
if (WWDisplay_GetSpriteEnable(WonxDisplay_GetWWDisplay(wonx_display)))
@ -74,12 +76,11 @@ unsigned int display_status()
if (WWDisplay_GetSpriteWindowEnable(WonxDisplay_GetWWDisplay(wonx_display)))
ret |= DCM_SPR_WIN;
switch
(WWDisplay_GetScreen2WindowMode(WonxDisplay_GetWWDisplay(wonx_display))) {
case 2:
switch (WWScreen_GetMode(WWDisplay_GetScreen(ww_display, SCREEN2))) {
case WWSCREEN_INSIDE_ONLY:
ret |= DCM_SCR2_WIN_INSIDE;
break;
case 3:
case WWSCREEN_OUTSIDE_ONLY:
ret |= DCM_SCR2_WIN_OUTSIDE;
break;
default:
@ -94,8 +95,7 @@ unsigned int display_status()
return (ret);
}
void font_set_monodata(unsigned int number,
unsigned int count, void * data)
void font_set_monodata(unsigned int number, unsigned int count, void * data)
{
WWCharacter c;
int i, x, y, n, p;
@ -669,18 +669,52 @@ unsigned int screen_get_scroll(int screen)
void screen2_set_window(int x, int y, int w, int h)
{
WWScreen s;
printf("screen2_set_window(): x = %d, y = %d, width = %d, height = %d, ",
x, y, w, h); fflush(stdout);
if (wonx_display == NULL) Wonx_Create();
/* あとで書くこと */
s = WWDisplay_GetScreen(WonxDisplay_GetWWDisplay(wonx_display), SCREEN2);
WWScreen_SetDrawX(s, x);
WWScreen_SetDrawY(s, y);
WWScreen_SetDrawWidth( s, w);
WWScreen_SetDrawHeight(s, h);
WonxDisplay_Flush(wonx_display);
printf("return value = none\n"); fflush(stdout);
return;
}
unsigned long int screen2_get_window(void)
{
WWScreen s;
unsigned short int xy;
unsigned short int wh;
unsigned long int ret;
if (wonx_display == NULL) Wonx_Create();
/* あとで書くこと */
printf("screen2_get_window(): "); fflush(stdout);
s = WWDisplay_GetScreen(WonxDisplay_GetWWDisplay(wonx_display), SCREEN2);
xy =
((WWScreen_GetDrawY(s) << 8) & 0xff00) |
(WWScreen_GetDrawX(s) & 0x00ff);
wh =
((WWScreen_GetDrawHeight(s) << 8) & 0xff00) |
(WWScreen_GetDrawWidth(s) & 0x00ff);
ret = ((unsigned long int)wh) << 16 | xy;
WonxDisplay_Flush(wonx_display);
printf("return value = %ul\n", ret); fflush(stdout);
return (ret);
}
void sprite_set_window(int x, int y, int w, int h)