2: 2004-01-23 (金) 00:15:46 [6] | 3: 2004-01-24 (土) 13:34:51 [7] | ||
---|---|---|---|
Line 181: | Line 181: | ||
#endif | #endif | ||
-たぶん僕の言う「そのうち」はなかなかこないので、上記をコピーして自分のソースに貼り付けてもいいです。 | -たぶん僕の言う「そのうち」はなかなかこないので、上記をコピーして自分のソースに貼り付けてもいいです。 | ||
+ | |||
+ | *** 修正した説明(案) | ||
+ | -説明がt_xor0と重複しすぎていて、読み手が飛ばし読みをする恐れがあったので、違いのみをピックアップして書き直しました。 | ||
+ | |||
+ | |||
+ | "mt_xor1.c"の解説 | ||
+ | 2004/01/24 | ||
+ | 川合秀実(kawai@osask.jp) | ||
+ | |||
+ | このドキュメントは、"mt_xor1.c"の説明だけをするものです。最初に読むべきドキュ | ||
+ | メントではありません。最初に読むべきドキュメントは"document.txt"です。 | ||
+ | |||
+ | |||
+ | 1.アルゴリズム | ||
+ | |||
+ | このmt_xor1は、mt_xor0の改造版に相当します。違いは8ビットグラフィックボックス | ||
+ | ではなく32ビットグラフィックボックスを使うことです。mt_xor0を理解してから読んで | ||
+ | ください。 | ||
+ | |||
+ | グラフィックボックスのバッファ構造は、LIB_GBOX_BUF32(gbox)から後ろのxsize * | ||
+ | ysize * 4がそっくりそのままバッファになっています。詳しいことはソースをご覧く | ||
+ | ださい。1ドットが4バイトで構成され、 | ||
+ | bit 0- 7:青成分(0-255) | ||
+ | bit 8-15:緑成分(0-255) | ||
+ | bit16-23:赤成分(0-255) | ||
+ | bit24-31:リザーブで必ず0 | ||
+ | となっています。8bitグラフィックボックスと同様に、自由に読み書きして、必要に応 | ||
+ | じてflushしてください。 | ||
+ | |||
+ | |||
+ | 2.ライブラリ関数の説明 | ||
+ | |||
+ | 引数の型については、guigui00.hを参照してください。 | ||
+ | |||
+ | lib_flushgraphbox(opt, win, x, y, sx, sy, skip, p) : | ||
+ | |||
+ | グラフィックボックスをflushします。optは0x8004か0x8024にしてください。winは | ||
+ | グラフィックボックスが所属するウィンドウです。残りのパラメーターが少々ややこし | ||
+ | いです。まずグラフィックボックス全体をflushするなら、 | ||
+ | |||
+ | x, y : グラフィックボックスオープン時に指定したx_pos, y_posの値 | ||
+ | sx, sy : グラフィックボックスオープン時に指定したx_size, y_sizeの値 | ||
+ | skip : 必ず0 | ||
+ | p : LIB_GBOX_BUF32(gox) | ||
+ | |||
+ | という風に指定します。 | ||
+ | |||
+ | 32ビットグラフィックボックスで部分フラッシュをすることもできます。その場合は | ||
+ | 次のように引数を指定します。 | ||
+ | |||
+ | x, y : 部分flushしたい範囲の左上の座標(window内の座標系で指定・・・gboxの | ||
+ | 座標ではない) | ||
+ | sx, sy : 部分flushしたい範囲のサイズ | ||
+ | skip : (グラフィックボックスオープン時に指定したx_size - この時のsx) * 4 | ||
+ | p : x, yで指定した座標に相当するドットを指し示すポインタ | ||
+ | |||
+ | optの違いについてですが、通常は0x8004を使います。色表現力が犠牲になってもいい | ||
+ | から、速度を速くしてほしいという場合に限って(もしくはすべての画面モードで細い | ||
+ | 線がタイリングで点線に化けたりするのが不都合な場合)、0x8024を指定します。 | ||
+ | |||
+ | 3.改造への指針 | ||
+ | |||
+ | これをつかえば8ビットグラフィックボックスでは得られなかった高い表現力が得られ | ||
+ | るでしょう。今のところ(完成度が低いせいで)32ビットグラフィックボックス内でラ | ||
+ | インを引くなどができませんが、それでもバッファに書いてflushすれば、一応どんな絵 | ||
+ | でもかけます。ラインなどの基本描画機能のサポートはもうしばらくお待ちください。 | ||
+ | |||
+ | -[[K]]の視点で改良したソース。 | ||
+ | |||
+ | // "mt_xor1.c" | ||
+ | // stack:4k malloc:20k | ||
+ | // copyright(C) 2004 Hidemi KAWAI | ||
+ | |||
+ | #include <guigui00.h> | ||
+ | |||
+ | #define AUTO_MALLOC 0 | ||
+ | |||
+ | /* ちょっとしたマクロ */ | ||
+ | #define pixel(x, y) *(p + (y) * 100 + (x)) | ||
+ | #if (!defined(LIB_GBOX_BUF)) | ||
+ | #define LIB_GBOX_BUF(gbox) ((void *) ((char *) (gbox) + 64)) | ||
+ | #define LIB_GBOX_BUF32(gbox) ((unsigned int *) LIB_GBOX_BUF(gbox)) | ||
+ | #endif | ||
+ | |||
+ | void OsaskMain() | ||
+ | { | ||
+ | struct LIB_WINDOW *window; | ||
+ | struct LIB_TEXTBOX *wintitle; | ||
+ | struct LIB_GRAPHBOX *graphicbox; | ||
+ | int i, j; | ||
+ | int *p; | ||
+ | static colortable[8] = { | ||
+ | 0x000000, 0x840000, 0x008400, 0x848400, 0x000084, 0x840084, 0x008484, 0x848484 | ||
+ | }; | ||
+ | |||
+ | lib_init(AUTO_MALLOC); | ||
+ | window = lib_openwindow(AUTO_MALLOC, 0x0200, 136, 48); | ||
+ | wintitle = lib_opentextbox(0x1000, AUTO_MALLOC, 0, 7, 1, 0, 0, window, 0x00c0, 0); | ||
+ | lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "Mt.Xor1"); | ||
+ | |||
+ | /* グラフィックボックスをウィンドウに用意する */ | ||
+ | graphicbox = lib_opengraphbox(1, AUTO_MALLOC, 4, 0xc6c6c6, 100, 48, 18, 0, window); | ||
+ | /* パラメーターの意味は以下の通り: | ||
+ | opt : 1(固定) | ||
+ | mode : 4(固定) | ||
+ | mode_opt : 初期の背景色(バッファはこの値で初期化される) | ||
+ | x_size : グラフィックボックスの大きさ(ドット単位) | ||
+ | y_size : グラフィックボックスの大きさ(ドット単位) | ||
+ | x_pos : グラフィックボックスの位置(ドット単位) | ||
+ | y_pos : グラフィックボックスの位置(ドット単位) | ||
+ | */ | ||
+ | |||
+ | p = LIB_GBOX_BUF32(graphicbox); | ||
+ | |||
+ | /* 頂点に一つ点を打つ */ | ||
+ | pixel(49, 0) = 0x000000; /* 黒い点 */ | ||
+ | |||
+ | /* ちょっとした演算 */ | ||
+ | for (j = 0; j < 47; j++) { | ||
+ | for (i = 1; i < 99; i++) | ||
+ | pixel(i, j + 1) = pixel(i - 1, j) ^ pixel(i + 1, j) ^ 0xc6c6c6; | ||
+ | } | ||
+ | |||
+ | j = 0; | ||
+ | for (;;) { | ||
+ | /* バッファの内容を確実に画面に反映させる */ | ||
+ | lib_flushgraphbox(0x8004, window, 18, 0, 100, 48, 0, p); | ||
+ | /* パラメーターの意味は以下の通り: | ||
+ | opt : 0x8004 or 0x8024(固定) | ||
+ | win : グラフィックボックスが所属するウィンドウ | ||
+ | x : グラフィックボックスのx_pos | ||
+ | y : グラフィックボックスのy_pos | ||
+ | sx : グラフィックボックスのx_size | ||
+ | sy : グラフィックボックスのy_size | ||
+ | skip : 0(固定) | ||
+ | p : LIB_GBOX_BUF32(graphbox) | ||
+ | なお、上記の例はグラフィックボックス全体をflushしている | ||
+ | */ | ||
+ | |||
+ | lib_waitsignaltime(0x0007, 0, 0, 0x80000000, 0, 0); /* 500msec.-wait */ | ||
+ | |||
+ | /* 色変更 */ | ||
+ | j = (j + 1) & 7; | ||
+ | for (i = 0; i < 48 * 100; i++) { | ||
+ | if (p[i] != 0xc6c6c6) | ||
+ | p[i] = colortable[j]; | ||
+ | } | ||
+ | } | ||
+ | } |
(This host) = http://osask.net