-

LIBRARIES PUBLIC DOCUMENT GFX

提供: HI-TECH C for CP/M Fan WIKI(JP)
移動先: 案内検索

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);
表面部??にラインを描画します。

[2]

extern void line(int x1, int y1, int x2, int y2);
ビデオにラインを描画します。

[3]

extern void line_slow(int x1, int y1, int x2, int y2);
ビデオにラインを描画します(低速)。

[4]

extern void calculate_side(int x1, int y1, int x2, int y2, int low[], int high[]);
三角形の辺を計算します。

[5]

extern void hline(int x1, int y1, int x2, u_char value);
ビデオに水平方向のラインを描画します。引数"value"はビットパターンも可能です。注意:x1 <= x2

[6]

extern void surface_hline(surface_t *s, int x1, int y1, int x2, u_char value);

表面部???に水平方向のラインを描画します。引数"value"はビットパターンも可能です。注意:x1 <= x2

[7]

註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

=========================================================================*/
  1. 2005年当時
  2. cf:ex11.c,ex5.c
  3. cf:N/A
  4. cf:N/A
  5. cf:ex10.c
  6. cf:ex10.c
  7. cf:ex10.c