-
LIBRARIES PUBLIC DOCUMENT GFX
GFXLIB_jp
目次
このライブラリについて (ウェブサイトからの引用)
GFXLIBはMSXコンピューター用のグラフィックライブラリです。開発中のもの[1]で、HI-TECH Cコンパイラでコンパイルされたものです。
- 機能一覧(現在までの)
- VDPとVRAMへのアクセス関数
- ラインアルゴリズム
- ベクトル演算、3Dグラフィック
- スプライト制御
- PSG制御 (新機能!)
- ジョイスティック入力
- コメント付きのサンプルソースがたくさん
- いろいろなユーティリティ(定義、ヘルパーなど...)
基本的な定義とユーティリティ(defs.hから引用)
- #define map_pixel(x,y) (map_block(x,y) + ((y) & 7))
- 次のように動きます
// map the row start (by row I mean a block of 8 lines) addr = (y & ~(7)) << 5; // this is the same as (y / 8) * 256 // then we aim for the column (column = block of 8 pixels) addr += (x & ~(7)); // this is the same as (x / 8) * 8 // finally, aim for the remaining "sub-row" inside the row block addr += (y & 7);
- #define map_subpixel(x) (128 >> ((x) & 7))
- VRAM上でsubpixel (bit)をマッピングします。
- #define LONG(v) ((long)(v))
fixed point arithmetic
- #define i2f(v) ((v) << 6)
- 整数を固定小数点に変換します
- #define f2i(v) ((v) >> 6)
- 固定小数点を整数に変換します。
- #define mulfx(x,y) ((LONG(y) * LONG(x)) >> 6)
- 固定小数点を乗算します。
- #define divfx(x,y) ((LONG(x) << 6) / LONG(y))
- 固定小数点を除算します。
- #define sqrfx(x) ((LONG(x) * LONG(x)) >> 6)
- 固定小数点を二乗します。
- #define sqrtfx(x) (LONG(sqrt(x)) << 3)
- 固定小数点の平方根を求めます。
- 次式を使用します。
- formula: sqrt(N * 64) = sqrt(N) * sqrt(64) -> must compensate with 64/sqrt(64) = 8
- #define wgavgfx(x, y, w) (mulfx(i2f(1) - w, x) + mulfx(w, y))
- 加重平均を求めます (w=0.0 -> x, w=0.5->average, w=1.0 ->y)
malloc helpersメモリ割り当ての補助
- #define new(x) ((x*)malloc(sizeof(x)))
- 引数xの型の1個分のメモリを割り当てます。
- #define newa(x, c) ((x*)malloc(sizeof(x) * c))
- 引数xの型の引数c個分のメモリを割り当てます。
主要なライブラリ関数(gfx.hからの引用)
関数、列挙型
Video
VRAMとVDP関連の関数
- enum video_mode{}
- ビデオモード
enum video_mode { mode_0 = 0x6C, mode_1 = 0x6F, mode_2 = 0x72, mode_3 = 0x75 };
- enum screen_map{}
- 切り裂きスクリーンモードのセクション(3マップ)
- mangled screen sections (3 maps)
enum screen_map { place_1 = 1, place_2 = 2, place_3 = 4, place_all = 255 };
- #define MODE2_MAX (256 * 24)
- スクリーンのセクションのバイト数
- #define MODE2_ATTR (8192)
- スクリーンのアトリビュートの開始アドレス
- #define MODE2_WIDTH 256
- スクリーンのピクセル単位の幅
- #define MODE2_HEIGHT 192
- スクリーンのピクセル単位の高さ
VDPとVRAM関数
- extern void set_mode(u_int mode);
- スクリーンモードの設定
- extern void set_mangled_mode();
- スクリーンを切り裂きモードに設定(スクリーン 1 + 2)
- extern void set_color(u_char front, u_char back, u_char border);
- スクリーンカラーを設定します。
- extern void fill(u_int addr, u_char value, u_int count);
- fill vram from argument "addr", with argument "value", for argument "count" bytes
- VRAMの引数"addr"のアドレスから引数"count"バイト分のデータを引数"value"で埋めます
- extern void vpoke(u_int addr, u_char value);
- VRAMの引数"addr"のアドレスに引数"value"をセットします。
- extern u_char vpeek(u_int addr);
- 引数"addr"で与えられたVRAMアドレスの値を取得する
- extern void vmerge(u_int addr, u_char value);
- 引数"addr"で与えられたVRAMアドレスに存在する値に対して、引数"value"をビット演算(OR)して設定する
- extern void vwrite(void* source, u_int dest, u_int count);
- 引数"count"バイトをRAMからVRAMに転送する
- extern void vread(u_int source, void* dest, u_int count);
- 引数"count"バイトをVRAMからRAMに転送する
- extern void set_vdp(u_char reg, u_char value);
- 引数"value"の値をVDPレジスタにセットします。
- extern u_char get_vdp(u_char reg);
- 引数"value"の番号のVDPレジスタから値を読み込みます
- extern void locate(u_char x, u_char y);
- スクリーンカーソルを与えられた位置に移動します
primitives (not many yet :))
- extern void fill_v(u_int addr, u_char value, u_char count);
- 引数"addr"で与えられたVRAMのアドレスから、引数"count"で与えられた行数を引数"value"で垂直方向に埋めます。
- extern void pset(int x, int y);
- VRAMの与えられた座標にポイントをセットします。
mangled mode chars
- void set_char_form(char c, void* form, u_char place);
- 引数"place"で与えられたスクリーンマップ上に、引数"form"から、引数"c"の文字の形をセットします。
- void set_char_attr(char c, void *attr, u_char place);
- 引数"place"で与えられたスクリーンマップ上に、引数"attr"から、引数"c"のアトリビュートをセットします??。
- void set_char_color(char c, u_char color, u_char place);
- 引数"place"で与えられたスクリーンマップ上に、引数"color"の色設定で、引数"c"の文字をセットします。
- void set_char(char c, void* form, void *attr, u_char color, u_char place);
- アトリビュートと色を全ていっしょに、引数"c"の文字の形をセットします。
Sprites
- typedef struct {}sprite_t;
- スプライトデータです。
typedef struct { u_char y; ///< Y position u_char x; ///< X position u_char handle; ///< internal vdp handle u_char color; ///< sprite color } sprite_t;
- enum sprite_mode{}
- スプライトモードです。
enum sprite_mode { sprite_default = 0, sprite_scaled = 1, sprite_large = 2 };
- extern void set_sprite_mode(u_char mode);
- スプライトを引数"mode"のモードに設定します。
- extern void *set_sprite(u_char, void*);
- extern void *put_sprite(u_char, int, int, u_char, u_char);
- これらはコンパイルされません。#defineを代わりにつかうことをお勧めします。
- extern void set_sprite_8(u_char handle, void* data);
- 引数"handle"のスプライトを引数"data"で与えた形で設定します。(小サイズ)
- extern void set_sprite_16(u_char handle, void* data);
- 引数"handle"のスプライトを引数"data"で与えた形で設定します。(大サイズ)
- extern void put_sprite_8(u_char id, int x, int y, u_char handle, u_char color);
- put the sprite with argument "id" and shape from \a handle, into the given position with argument "color" (small size)
- 与えられた座標に、引数"color"の色と引数"data"で与えた形で、引数"id"のスプライトを設定します。(小サイズ)
- extern void put_sprite_16(u_char id, int x, int y, u_char handle, u_char color);
- 与えられた座標に、引数"color"の色と引数"data"で与えた形で、引数"id"のスプライトを設定します。(大サイズ)
surface
FIXME: this is not usable right now
- typedef struct {}surface_t;
- 描画する表面部?を表します
typedef struct { int width; int height; int type; union { u_char* ram; ///< RAMもしくはオフスクリーンの表面部?用 u_int vram; } data; } surface_t;
enum surface_type { surface_ram, surface_vram };
typedef struct { int x, y; int width, height; } rect_t;
- extern void blit(surface_t *source, surface_t *dest, rect_t *from, rect_t *to);
- extern void blit_ram_vram(u_char* source, u_int dest, u_char w, u_char h, int sjmp, int djmp);
- extern void blit_fill_vram(u_int dest, u_char value, u_char w, u_char h, int djmp);
コントローラー
- enum stick_direction{}
enum stick_direction { st_up = 1, st_right = 2, st_down = 4, st_left = 8 };
- extern u_char st_dir[];
- extern u_char get_stick(u_char id);
- get state of joystick number argument "id"
引数"id"で与えた番号のジョイスティックの状態を取得します。
- extern bool get_trigger(u_char id);
- 引数"id"で与えた番号のジョイスティックのトリガーの状態を取得します。
- 押されている場合は真になります。
乱数
速いけれども汚い偽乱数ジェネレーター
- extern void seed_rnd(int seed);
- 偽乱数ジェネレーターの種を与えます
- extern u_char get_rnd();
- 偽乱数ジェネレーターから次の値を取得します
PSG
PGS(サウンドジェネレータ)制御関数
- #define sound(reg, value) psg_set(reg, value)
- PSGレジスタ設定のエイリアス(BASICのファン向け)
- <nowiki>#define psgT(hz) ((int)(111760.0 / (hz)))<nowiki>
- 与えられた周波数をPSG用に適切な間隔(時間?)に変換する
enum { chanNone = 0, ///< チャンネルなし chan0 = 1, ///< 音声チャンネル1 chan1 = 2, ///< 音声チャンネル2 chan2 = 4, ///< 音声チャンネル3 chanAll = 7 ///< 全音声チャンネル };
- ボリュームのエンベロープ、Uは上げる、Dは下げる、Hは最高値
enum { envD = 0, ///< 消音に落とす envU = 4, ///< 最大音量に上げて、その後消音 envDD = 8, ///< 複数回消音に落とす envDUD = 10, ///< はじめは音量を落とし、その後三角波的な音量 envDH = 11, ///< 消音に落とし、突然最大音量に envUU = 12, ///< 複数回最大音量まで上げていく envUH = 13, ///< 最大音量まで上げていき、最大音量を保つ envUDUD = 14 ///< 三角派的な音量 };
- void psg_set(u_char reg, u_char value);
- 引数"value"をPSGレジスタに設定する
- u_char psg_get(u_char reg);
- PSGレジスタから値を取得する
- void psg_init();
- PSGの初期化
- void psg_tone(u_char channel, int period);
- 与えられたトーンをチャンネル(0-2)に設定する
- void psg_noise(u_char period);
- ノイズの間隔(時間?)を設定する
- void psg_volume(u_char channel, u_char volume);
- チャンネルのボリュームを設定する
- void psg_envelope(u_char waveform, int period, u_char channels);
- チャンネルのグループ(ORでビット指定)に対して、与えられた間隔(時間?)
- 引数"waveform"で与えられたエンベロープの型を設定する
- void psg_channels(u_char tone_channels, u_char noise_channels);
- ノイズ、もしくはトーンジェネレータをチャンネルのグループ(ORでビット指定)に対して設定する
- u_char psg_tone_channels();
- チャンネルのグループ(ORでビット指定)が現在生成しているトーンを取得する
- u_char psg_noise_channels();
チャンネルのグループ(ORでビット指定)が現在生成しているノイズを取得する
Line drawing functions(cited from line.h)
LINE.H : ライン描画関数 (ヘッダ)
- DITHER(I, Y) (dithpat[I][Y & 1])
- get a dithered pattern of intensity argument "I" on the screen line argument "Y"
スクリーン上で、引数"Y"で与えられたラインに引数"I"のディザーパターン?を取得します。
- extern u_char dithpat[5][2];
- extern void surface_line(surface_t*, int x1, int y1, int x2, int y2);
- 表面部??にラインを描画します。
- extern void line(int x1, int y1, int x2, int y2);
- ビデオにラインを描画します。
- extern void line_slow(int x1, int y1, int x2, int y2);
- ビデオにラインを描画します(低速)。
- extern void calculate_side(int x1, int y1, int x2, int y2, int low[], int high[]);
- 三角形の辺を計算します。
- extern void hline(int x1, int y1, int x2, u_char value);
- ビデオに水平方向のラインを描画します。引数"value"はビットパターンも可能です。注意:x1 <= x2
extern void surface_hline(surface_t *s, int x1, int y1, int x2, u_char value);
- 表面部???に水平方向のラインを描画します。引数"value"はビットパターンも可能です。注意:x1 <= x2
註1(gfx.hからの引用)
これは作業中のものです。つまり、ほとんどのコードが不安定で将来的には変更しなければいけないということです。さらに、ほとんどがハッカー的でクリーンアップされていないしテストもきちんとされてはいません。
註2(readmeからの引用)
現在も作業中です(現在はMSX1を対象としています)。
コードは未完成ですが、これをリリースしようと決めたのは...
- 動いている。サンプルも「実際動いている」よね。
- だれか他の人には役にたつかもしれない(コードを書いたり勉強したり...)
- 時間不足のため先に進めない。
なので...試して、クールなサンプルを見て、パッチを送ってください。
最近の機能についてはChangelogを確認してください。 楽しんでいただけることを望んでいます。どうぞハッピーなコーディングを!
WIKI編集者からの註
このパッケージには単体の技術文書あるいは仕様書がありませんが、それぞれのソースファイル、ヘッダファイルには詳細なコメントが記述されています。そのため、これらを抽出、編集、統合したものを、ここでは参照できるようにしています。
なお以下の点は変更しています。
- 元のドキュメントでは"\a" が"argument"を意味するので、それに合わせて訳出
- 文章の順序を1番目に定義文、二番目にコメントとなるよう変更
- サンプルファイル名を可能な限り記載
/*========================================================================= GFX - a small graphics library Copyright (C) 2004 Rafael de Oliveira Jannone This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact the author: by e-mail : rafael AT jannone DOT org homepage : http://jannone.org/gfxlib ICQ UIN : 10115284 See the License at http://www.gnu.org/copyleft/lesser.txt=========================================================================*/