diff --git a/HISTORY b/HISTORY index e69de29..183d957 100644 --- a/HISTORY +++ b/HISTORY @@ -0,0 +1,16 @@ +2000/9/27(水) + +Wonx-a02 公開 + +テキスト表示関連の関数を実行したときに,(あいかわらず文字は表示されないが) +せめてターミナルに文字列を出力するようにした. + +スクリーン2のウインドウ機能を実装した. + + + + +2000/9/26(火) + +Wonx-a01 公開 + diff --git a/Makefile b/Makefile index a7fb225..88e8735 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/WWDisplay.c b/WWDisplay.c index 187fd3c..0edff4f 100644 --- a/WWDisplay.c +++ b/WWDisplay.c @@ -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); /* 透明色の場合 */ diff --git a/WWDisplay.h b/WWDisplay.h index 135876e..48161db 100644 --- a/WWDisplay.h +++ b/WWDisplay.h @@ -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); diff --git a/WWDisplayP.h b/WWDisplayP.h index c3e44e3..cb9cfa1 100644 --- a/WWDisplayP.h +++ b/WWDisplayP.h @@ -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; /* ボーダーカラー.0〜7のカラーマップ番号 */ int foreground_color; /* モノクロフォント展開時の色 */ diff --git a/WWScreen.c b/WWScreen.c index 1fa3b97..e904c3c 100644 --- a/WWScreen.c +++ b/WWScreen.c @@ -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); } + /* カラーマップの色(0〜7)を返す(透明色は-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); diff --git a/WWScreen.h b/WWScreen.h index 5ab142e..22bfbd9 100644 --- a/WWScreen.h +++ b/WWScreen.h @@ -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); /*****************************************************************************/ diff --git a/WWScreenP.h b/WWScreenP.h index 70597f7..20f88f0 100644 --- a/WWScreenP.h +++ b/WWScreenP.h @@ -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; /*****************************************************************************/ diff --git a/disp.c b/disp.c index db3cabd..d16d115 100644 --- a/disp.c +++ b/disp.c @@ -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)