/*
 * $Id: m_font_rect.c,v 1.1 2003/06/06 00:15:12 tong Exp $
 *
 *	文字表示のライブラリーのインクルードソースファイル
 *      "gsDPTextureRectangle"による文字表示のライブラリー
 *
 * $Log: m_font_rect.c,v $
 * Revision 1.1  2003/06/06 00:15:12  tong
 * source files for localization from Nintendo.
 *
 * Revision 1.11  2001-01-11 22:37:05+09  hayakawa
 * gSPTextureRectangleをgfx_gSPTextureRectangle1に変更（ハイレゾ対応含む）
 *
 * Revision 1.10  2000-07-10 11:50:59+09  sakakibara
 * ↓ の部分を完全消去
 *
 * Revision 1.9  2000-07-07 17:51:47+09  sakakibara
 * 削除予定関数の抜き出し。
 * (こんなの⇒  ЖЖ  テクスチャ領域確保に関わる関数など  ЖЖ)
 *
 * Revision 1.8  2000-06-06 15:27:27+09  sakakibara
 * ★ 変更色々
 *
 * Revision 1.7  2000-05-26 21:56:46+09  sakakibara
 * Rectangle 表示設定の	G_TF_POINT を G_TF_BILERP に、
 * 			G_RM_XLU_SURF を G_RM_RA_XLU_SURF に変更
 *
 */

/*
 **********************************************************************
 *	gDPTextureRectangleを使って文字を書く初期設定
 **********************************************************************
 */

/* Arg. Gfx ** Type */
extern void mFont_gppSetRectMode(Gfx **gpp)
{
    static Gfx disp[] = {
	gsDPPipeSync(),
	gsSPTexture(0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON ),     
	gsSPClearGeometryMode(G_ZBUFFER | G_SHADE |\
			      G_SHADING_SMOOTH | G_CULL_BOTH |\
			      G_FOG | G_LIGHTING |\
			      G_TEXTURE_GEN |\
			      G_TEXTURE_GEN_LINEAR | G_LOD),
	gsDPSetTextureLOD (G_TL_TILE),
	gsDPSetTextureConvert(G_TC_FILT),
	gsDPSetTextureLUT (G_TT_NONE),
	gsDPSetTextureFilter(G_TF_BILERP),
////	gsDPSetTextureFilter(G_TF_POINT),
	
	gsDPSetCycleType(G_CYC_1CYCLE),
	gsDPSetTexturePersp(G_TP_NONE),
	gsDPSetCombineMode(M_FONT_CC_NORMAL_FONT, M_FONT_CC_NORMAL_FONT),
//	gsDPSetCombineMode(M_FONT_CC_REVERT_FONT, M_FONT_CC_REVERT_FONT),
	gsDPSetRenderMode(G_RM_RA_XLU_SURF, G_RM_RA_XLU_SURF2),
////	gsDPSetRenderMode(G_RM_XLU_SURF, G_RM_XLU_SURF2),
	
	gsDPSetPrimColor(0, 0,
			 M_FONT_FONT_BASIC_R,
			 M_FONT_FONT_BASIC_G,
			 M_FONT_FONT_BASIC_B,
			 M_FONT_FONT_BASIC_A),
	gsSPEndDisplayList(),
    };
    
    gSPDisplayList((*gpp)++, disp);
}

/* Open/Close Type */
extern void mFont_SetRectMode(GRAPH *graph_p, int entry_disp_type)
{
    Gfx *gp;
    
    OPEN_DISP(graph_p);
    
    if (entry_disp_type == M_FONT_ENTRY_NEXT_DISP) {
	gp = NOW_POLY_OPA_DISP;
	mFont_gppSetRectMode(&gp);
        SET_NOW_POLY_OPA_DISP(gp);
    } else {	/* else .... font type */
	gp = NOW_FONT_DISP;
        mFont_gppSetRectMode(&gp);
        SET_NOW_FONT_DISP(gp);
    }
    
    CLOSE_DISP(graph_p);
}

#if 0
{

    OPEN_DISP(graph_p);
    if(entry_disp_type == M_FONT_ENTRY_FONT_DISP) {
	gSPDisplayList(NEXT_FONT_DISP, disp);
    }
    else {
	gSPDisplayList(NEXT_DISP, disp);
    }
    CLOSE_DISP(graph_p);
}
#endif


#if 0
/*
 **********************************************************************
 *	指定した文字のgsDPTextureRectangleを登録
 **********************************************************************
 */
extern float mFont_SetRectangle(Gfx **gfx_pp,
				unchar code,		/* 指定した文字 */
				float leftX,		/* 画面表示系上座標 */
				float upY,		/* 画面表示系下座標 */
				float offset_upT,	/* 上のテクスチャカット量 */
				float offset_lowT,	/* 下のテクスチャカット量 */
				float scaleX,		/* 表示スケールX */
				float scaleY,		/* 表示スケールY */
				int cut)		/* 文字詰めをするか */
{
    unchar *tex_p = mFont_Get_FontTex_p();

    if(tex_p != NULL) {
	Gfx *gfx_p = *gfx_pp;
	int div;
	int surplus;
	int load_leftS;
	int load_upT;
    
	/* 与えられたコードの文字位置を求める */
	mFont_GetCodeTexPosition(code, &div, &surplus);
	load_leftS = surplus * M_FONT_1TEXSIZE_DOT_S;
	load_upT = div * M_FONT_1TEXSIZE_DOT_T;

	/* テクスチャのロード */
	gDPPipeSync(gfx_p++);
	gDPLoadTextureTile_4b(gfx_p++,
			      tex_p,
			      G_IM_FMT_I,
			      M_FONT_TOTAL_MOJI_W * M_FONT_1TEXSIZE_DOT_S,
			      M_FONT_TOTAL_MOJI_H * M_FONT_1TEXSIZE_DOT_T,
			      load_leftS,
			      load_upT,
			      load_leftS + M_FONT_1TEXSIZE_DOT_S - 1,
			      load_upT + M_FONT_1TEXSIZE_DOT_T - 1,
			      0,
			      G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR,
			      G_TX_NOMASK, G_TX_NOMASK,
			      G_TX_NOLOD, G_TX_NOLOD);
	
	/* "gSPTextureRectangle"の登録 */
	{
	    /* テクスチャ座標Ｓ */
	    float rect_leftS = (float)load_leftS;
	    float rect_widthS = ((float)M_FONT_1TEXSIZE_DOT_S)
		- ((cut)?((float)mFont_Get_FontOffset((int)code)):(0.0F));
	    /* 描画位置右 */
	    float rightX = leftX + rect_widthS * scaleX;
	    
	    /* テクスチャ座標Ｔ */
	    float rect_upT = (float)load_upT + offset_upT;
	    float rect_heightT = ((float)M_FONT_1TEXSIZE_DOT_T) - offset_upT - offset_lowT;
	    /* 描画位置下 */
	    float lowY = upY + rect_heightT * scaleY;
	    
	    gfx_p = gfx_gSPTextureRectangle1(gfx_p,
				(int)(leftX*4.0F), 	(int)(upY*4.0F),
				(int)(rightX*4.0F),	(int)(lowY*4.0F),
				G_TX_RENDERTILE,
				(int)(rect_leftS * 32.0F),
				(int)(rect_upT * 32.0F),
				(int)((1.0F/scaleX) * 1024.0F),
				(int)((1.0F/scaleY) * 1024.0F));

	    /* 与えられたディスプレイリストポインタを更新 */
	    *gfx_pp = gfx_p;
	    /* 次の描画位置 */
	    return(rightX);
	}
    }
#if DEBUG    
    else {
	PRINTF(ESC_ERROR
	       "mFont_SetRectangle;今はメッセージを読んではいけない!!!!!!!!!!!!!"
	       ESC_NORMAL);
    }
#endif    
    
    return(leftX);
}
#endif
