/*
 * $Id: PreRender.h,v 1.1 2003/06/06 00:15:11 tong Exp $
 *
 * プリレンダリング処理
 * レンダリングされた画面をバッファに取り込み
 * それをテクスチャレクタングル命令で表示することにより、
 * 緻密な背景を高速に表示する。
 *
 * Ｚバッファやカバレッジにも対応している
 * ただし、dzは上位２ビットのみ
 *
 */

#ifndef __PRERENDER_H_
#define __PRERENDER_H_

#include <ultra64.h>			/* rgba_t */
#include "listalloc.h"			/* listalloc_t */

/*
 * 型定義
 */
typedef struct {
    unsigned short wd, ht;		/* フレームバッファの横／縦サイズ */
    unsigned short wd_save, ht_save;	/* フレームバッファを保持する領域の横／縦サイズ */
    char __aligner1[8];			/* アライメント用 */
    void *fbuf;				/* フレームバッファへのポインタ */
    void *fbuf_save;			/* フレームバッファを保持する領域 RGBA5551 */
    void *cvg_save;			/* カバレッジを保持する領域 A4/A8 */
    void *zbuf;				/* Ｚバッファへのポインタ */
    void *zbuf_save;			/* Ｚバッファを保持する領域 Z14DZ2 */
    unsigned short uls, ult, lrs, lrt;	/* 有効範囲 */
    unsigned short ulx, uly, lrx, lry;	/* 描画範囲 */
    char __aligner2[16];			/* アライメント用 */
    listalloc_t listalloc;
    char is_alloc_myself;		/* !0:自分自身でアロケートした */
    char cvgcvt_status;			/* カバレッジ変換状態 0:なし 1:変換中 2:変換完了 */
    char __aligner3[2];			/* アライメント用 */
} PreRender_t;

#define PreRender_set_xoff(this) ((this)->xoff)



#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif
#if 0
}
#endif

/*
     * 関数プロトタイプ
     */

/*
 * 初期化
 * ヒープ領域から337.5Kバイト使用する
 */
extern void PreRender_init(PreRender_t *this);

/*
 * フレームバッファとＺバッファのポインタを設定する
 */
extern void PreRender_setbuf(PreRender_t *this, void *fbuf, void *zbuf);
/*
 * バッファ設定
 */
extern void PreRender_setup_savebuf(PreRender_t *this, int wd, int ht, void *fbuf, void *zbuf, void *cvgbuf);
/*
 * レンダリング用の
 * フレームバッファとＺバッファのポインタを設定する
 */
extern void PreRender_setup_renderbuf(PreRender_t *this, int wd, int ht, void *fbuf, void *zbuf);

/*
 * 後始末
 */
extern void PreRender_cleanup(PreRender_t *this);

/*
 * Ｚバッファ内容セーブ
 * Ｚバッファ→プリレンダー用Ｚバッファ
 */
extern void PreRender_saveZBuffer(PreRender_t *this, Gfx **glistpp);

/*
 * フレームバッファ内容セーブ
 * フレームバッファ→プリレンダー用カラーバッファ
 */
extern void PreRender_saveFrameBuffer(PreRender_t *this, Gfx **glistpp);

/*
 * カバレッジ内容セーブ
 * フレームバッファのカバレッジ→プリレンダー用カバレッジバッファ
 */
extern void PreRender_saveCVG(PreRender_t *this, Gfx **glistpp);

/*
 * Ｚバッファ内容ロード
 * プリレンダー用Ｚバッファ→Ｚバッファ
 */
extern void PreRender_loadZBuffer(PreRender_t *this, Gfx **glistpp);

/*
 * フレームバッファ内容ロード
 * プリレンダー用カラー＋プリレンダー用カバレッジバッファ→フレームバッファ
 */
extern void PreRender_loadFrameBuffer(PreRender_t *this, Gfx **glistpp);

/*
 * フレームバッファ内容ロード
 * カラーのみ
 */
extern void PreRender_loadFrameBufferAlpha(PreRender_t *this, Gfx **glistpp, int alpha);

/*
 * アンチエリアスコンバート
 * プリレンダー用カラー＋プリレンダー用カバレッジバッファ→プリレンダー用カラー
 */
extern void PreRender_ConvertFrameBuffer(PreRender_t *this);
extern void PreRender_ConvertFrameBuffer_fg(PreRender_t *this);
#if 0
extern void PreRender_ConvertFrameBuffer_bg(PreRender_t *this);
extern void PreRender_ConvertFrameBuffer_kill(PreRender_t *this);
#endif

/*
 * フレームバッファ内容ロード
 * カラーのみ
 * プリレンダー用カラー→フレームバッファ
 */
extern void PreRender_loadFrameBufferCopy(PreRender_t *this, Gfx **glistpp);

/*
 * フレームバッファ内容ロード
 * カラーのみ
 * カラーバッファがフレームバッファより大きい場合
 * プリレンダー用カラー→フレームバッファ
 */
extern void PreRender_loadFrameBufferCopyX(PreRender_t *this, Gfx **glistpp);

extern void PreRender_TransBufferCopy(PreRender_t *this, Gfx **glistpp, void *srcbuf, void *dstbuf, u32 g_ac);
extern void PreRender_TransBuffer1(PreRender_t *this, Gfx **glistpp, void *srcbuf, void *dstbuf);

/*
 * どうぶつの森スペシャルバージョン！！
 * カラー＆カバレッジコピー
 */
extern void
PreRender_CopyRGBC(PreRender_t *this, Gfx **gpp, s32 xoff, s32 yoff);



/*
 * 壁紙表示
 * S2DEXマイクロコードを利用しています
 */
typedef struct {
    u16	*timg;		/* プリレンダー画面テクスチャ */
    u16	*tlut;		/* !NULL:パレットテーブル */
    u16 	width;		/* テクスチャ横幅 320 */
    u16 	height;		/* テクスチャ高さ 240 */
    u8	txlfmt;		/* G_IM_FMT_* */
    u8	txlsiz;		/* G_IM_SIZ_* */
    u16	g_tt;		/* G_TT_ */
    u16	pnum;		/* パレット数0-256 */
    float	xpos;		/* 表示左上座標X */
    float	ypos;		/* 表示左上座標Y */
    float	xscl;		/* 表示スケールX */
    float	yscl;		/* 表示スケールY */
    u32	flags;		/* &1:RM &2:CC &4:AC_TH */
} wp_param_t;

extern void
wallpaper_draw1(
    wp_param_t  *const this,
    Gfx 	**const gpp
    );

extern void
wallpaper_draw(
    Gfx 	**const glistpp,
    u16	*const timg,		/* プリレンダー画面テクスチャ */
    u16	*const tlut,		/* !NULL:パレットテーブル */
    u16 	const width,		/* テクスチャ横幅 320 */
    u16 	const height,		/* テクスチャ高さ 240 */
    u8	const txlfmt,		/* G_IM_FMT_* */
    u8	const txlsiz,		/* G_IM_SIZ_* */
    u16	const g_tt,		/* G_TT_ */
    u16	const pnum,		/* パレット数0-256 */
    float	const xpos,		/* 表示左上座標X */
    float	const ypos,		/* 表示左上座標Y */
    float	const xscl,		/* 表示スケールX */
    float	const yscl,		/* 表示スケールY */
    u32	const flags		/* &1:RM &2:CC &4:AC_TH */
    );

#if 0
{
#endif
#ifdef _LANGUAGE_C_PLUS_PLUS
}					/* extern "C" */
#endif
#endif					/* __PRERENDER_H_ */
