/*============================================================================
NuSYSTEM sample program SNAKE TAIL HACK
font.c
Copyright (C) 1997, NINTENDO Co,Ltd.
============================================================================*/
#include <PR/mbi.h>
#include <PR/os.h>
#include "graphic.h"
#include "font.h"
#include "fontimg.h"
/*The buffer for the font output*/
char outstring[100];
/*The texture pallet*/
u16 default_tlut[16] = {
GPACK_RGBA5551( 0, 0, 0, 0),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255)
};
u16 white_tlut[16] = {
GPACK_RGBA5551( 0, 0, 0, 0),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255),
GPACK_RGBA5551( 255, 255, 255, 255)
};
u16 black_tlut[16] = {
GPACK_RGBA5551( 0, 0, 0, 0),
GPACK_RGBA5551( 0, 0, 0, 255),
GPACK_RGBA5551( 0, 0, 0, 255),
GPACK_RGBA5551( 0, 0, 0, 255),
GPACK_RGBA5551( 0, 0, 0, 255),
GPACK_RGBA5551( 0, 0, 0, 255),
GPACK_RGBA5551( 0, 0, 0, 255),
GPACK_RGBA5551( 0, 0, 0, 255),
GPACK_RGBA5551( 0, 0, 0, 255),
GPACK_RGBA5551( 0, 0, 0, 255),
GPACK_RGBA5551( 0, 0, 0, 255),
GPACK_RGBA5551( 0, 0, 0, 255),
GPACK_RGBA5551( 0, 0, 0, 255),
GPACK_RGBA5551( 0, 0, 0, 255),
GPACK_RGBA5551( 0, 0, 0, 255),
GPACK_RGBA5551( 0, 0, 0, 255)
};
u16 red_tlut[16] = {
GPACK_RGBA5551( 0, 0, 0, 0),
GPACK_RGBA5551( 255, 0, 0, 255),
GPACK_RGBA5551( 255, 0, 0, 255),
GPACK_RGBA5551( 255, 0, 0, 255),
GPACK_RGBA5551( 255, 0, 0, 255),
GPACK_RGBA5551( 255, 0, 0, 255),
GPACK_RGBA5551( 255, 0, 0, 255),
GPACK_RGBA5551( 255, 0, 0, 255),
GPACK_RGBA5551( 255, 0, 0, 255),
GPACK_RGBA5551( 255, 0, 0, 255),
GPACK_RGBA5551( 255, 0, 0, 255),
GPACK_RGBA5551( 255, 0, 0, 255),
GPACK_RGBA5551( 255, 0, 0, 255),
GPACK_RGBA5551( 255, 0, 0, 255),
GPACK_RGBA5551( 255, 0, 0, 255),
GPACK_RGBA5551( 255, 0, 0, 255),
};
u16 green_tlut[16] = {
GPACK_RGBA5551( 0, 0, 0, 0),
GPACK_RGBA5551( 0, 255, 0, 255),
GPACK_RGBA5551( 0, 255, 0, 255),
GPACK_RGBA5551( 0, 255, 0, 255),
GPACK_RGBA5551( 0, 255, 0, 255),
GPACK_RGBA5551( 0, 255, 0, 255),
GPACK_RGBA5551( 0, 255, 0, 255),
GPACK_RGBA5551( 0, 255, 0, 255),
GPACK_RGBA5551( 0, 255, 0, 255),
GPACK_RGBA5551( 0, 255, 0, 255),
GPACK_RGBA5551( 0, 255, 0, 255),
GPACK_RGBA5551( 0, 255, 0, 255),
GPACK_RGBA5551( 0, 255, 0, 255),
GPACK_RGBA5551( 0, 255, 0, 255),
GPACK_RGBA5551( 0, 255, 0, 255),
GPACK_RGBA5551( 0, 255, 0, 255),
};
u16 blue_tlut[16] = {
GPACK_RGBA5551( 0, 0, 0, 0),
GPACK_RGBA5551( 0, 0, 255, 255),
GPACK_RGBA5551( 0, 0, 255, 255),
GPACK_RGBA5551( 0, 0, 255, 255),
GPACK_RGBA5551( 0, 0, 255, 255),
GPACK_RGBA5551( 0, 0, 255, 255),
GPACK_RGBA5551( 0, 0, 255, 255),
GPACK_RGBA5551( 0, 0, 255, 255),
GPACK_RGBA5551( 0, 0, 255, 255),
GPACK_RGBA5551( 0, 0, 255, 255),
GPACK_RGBA5551( 0, 0, 255, 255),
GPACK_RGBA5551( 0, 0, 255, 255),
GPACK_RGBA5551( 0, 0, 255, 255),
GPACK_RGBA5551( 0, 0, 255, 255),
GPACK_RGBA5551( 0, 0, 255, 255),
GPACK_RGBA5551( 0, 0, 255, 255)
};
u16 yellow_tlut[16] = {
GPACK_RGBA5551( 0, 0, 0, 0),
GPACK_RGBA5551( 255, 255, 0, 255),
GPACK_RGBA5551( 255, 255, 0, 255),
GPACK_RGBA5551( 255, 255, 0, 255),
GPACK_RGBA5551( 255, 255, 0, 255),
GPACK_RGBA5551( 255, 255, 0, 255),
GPACK_RGBA5551( 255, 255, 0, 255),
GPACK_RGBA5551( 255, 255, 0, 255),
GPACK_RGBA5551( 255, 255, 0, 255),
GPACK_RGBA5551( 255, 255, 0, 255),
GPACK_RGBA5551( 255, 255, 0, 255),
GPACK_RGBA5551( 255, 255, 0, 255),
GPACK_RGBA5551( 255, 255, 0, 255),
GPACK_RGBA5551( 255, 255, 0, 255),
GPACK_RGBA5551( 255, 255, 0, 255),
GPACK_RGBA5551( 255, 255, 0, 255),
};
u16 purple_tlut[16] = {
GPACK_RGBA5551( 0, 0, 0, 0),
GPACK_RGBA5551( 255, 0, 255, 255),
GPACK_RGBA5551( 255, 0, 255, 255),
GPACK_RGBA5551( 255, 0, 255, 255),
GPACK_RGBA5551( 255, 0, 255, 255),
GPACK_RGBA5551( 255, 0, 255, 255),
GPACK_RGBA5551( 255, 0, 255, 255),
GPACK_RGBA5551( 255, 0, 255, 255),
GPACK_RGBA5551( 255, 0, 255, 255),
GPACK_RGBA5551( 255, 0, 255, 255),
GPACK_RGBA5551( 255, 0, 255, 255),
GPACK_RGBA5551( 255, 0, 255, 255),
GPACK_RGBA5551( 255, 0, 255, 255),
GPACK_RGBA5551( 255, 0, 255, 255),
GPACK_RGBA5551( 255, 0, 255, 255),
GPACK_RGBA5551( 255, 0, 255, 255),
};
u16 aqua_tlut[16] = {
GPACK_RGBA5551( 0, 0, 0, 0),
GPACK_RGBA5551( 0, 255, 255, 255),
GPACK_RGBA5551( 0, 255, 255, 255),
GPACK_RGBA5551( 0, 255, 255, 255),
GPACK_RGBA5551( 0, 255, 255, 255),
GPACK_RGBA5551( 0, 255, 255, 255),
GPACK_RGBA5551( 0, 255, 255, 255),
GPACK_RGBA5551( 0, 255, 255, 255),
GPACK_RGBA5551( 0, 255, 255, 255),
GPACK_RGBA5551( 0, 255, 255, 255),
GPACK_RGBA5551( 0, 255, 255, 255),
GPACK_RGBA5551( 0, 255, 255, 255),
GPACK_RGBA5551( 0, 255, 255, 255),
GPACK_RGBA5551( 0, 255, 255, 255),
GPACK_RGBA5551( 0, 255, 255, 255),
GPACK_RGBA5551( 0, 255, 255, 255),
};
/*The offset table of the font texture*/
static int FontIdx[] = {
0+256*0, 4+256*0, 8+256*0, 12+256*0, 16+256*0, 20+256*0, 24+256*0, 28+256*0,
0+256*1, 4+256*1, 8+256*1, 12+256*1, 16+256*1, 20+256*1, 24+256*1, 28+256*1,
0+256*2, 4+256*2, 8+256*2, 12+256*2, 16+256*2, 20+256*2, 24+256*2, 28+256*2,
0+256*3, 4+256*3, 8+256*3, 12+256*3, 16+256*3, 20+256*3, 24+256*3, 28+256*3,
0+256*4, 4+256*4, 8+256*4, 12+256*4, 16+256*4, 20+256*4, 24+256*4, 28+256*4,
0+256*5, 4+256*5, 8+256*5, 12+256*5, 16+256*5, 20+256*5, 24+256*5, 28+256*5,
0+256*6, 4+256*6, 8+256*6, 12+256*6, 16+256*6, 20+256*6, 24+256*6, 28+256*6,
0+256*7, 4+256*7, 8+256*7, 12+256*7, 16+256*7, 20+256*7, 24+256*7, 28+256*7,
0+256*8, 4+256*8, 8+256*8, 12+256*8, 16+256*8, 20+256*8, 24+256*8, 28+256*8,
0+256*9, 4+256*9, 8+256*9, 12+256*9, 16+256*9, 20+256*9, 24+256*9, 28+256*9,
0+256*10, 4+256*10, 8+256*10, 12+256*10, 16+256*10,20+256*10,24+256*10,28+256*10,
};
/*The table for string search*/
static char letters_string[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890.,`'\"@:+-=!_/?()[]";
/*----------------------------------------------------------------------*/
/* Draw8Font - Display characters of 8x8 or 4x8 on the screen */
/* IN: posx The displaying X-coordinate */
/* posy The displaying Y-coordinate */
/* texcol The displaying X color */
/* texsize The displaying size */
/* RET: None */
/*----------------------------------------------------------------------*/
void
Draw8Font( int posx, int posy, int texcol, int texsize )
{
int idx, idx2;
gDPSetCycleType(glistp++, G_CYC_1CYCLE);
gDPSetTextureFilter(glistp++, G_TF_POINT);
gDPSetRenderMode(glistp++, G_RM_TEX_EDGE, G_RM_TEX_EDGE);
gSPTexture(glistp++, 0xffff, 0xffff, 0, G_TX_RENDERTILE, G_ON);
gDPSetCombineMode(glistp++, G_CC_DECALRGBA, G_CC_DECALRGBA);
gDPSetTexturePersp(glistp++, G_TP_NONE);
switch(texcol){
case TEX_COL_WHITE:
gDPLoadTLUT_pal16(glistp++, 0, white_tlut);
break;
case TEX_COL_BLACK:
gDPLoadTLUT_pal16(glistp++, 0, black_tlut);
break;
case TEX_COL_RED:
gDPLoadTLUT_pal16(glistp++, 0, red_tlut);
break;
case TEX_COL_GREEN:
gDPLoadTLUT_pal16(glistp++, 0, green_tlut);
break;
case TEX_COL_BLUE:
gDPLoadTLUT_pal16(glistp++, 0, blue_tlut);
break;
case TEX_COL_YELLOW:
gDPLoadTLUT_pal16(glistp++, 0, yellow_tlut);
break;
case TEX_COL_PURPLE:
gDPLoadTLUT_pal16(glistp++, 0, purple_tlut);
break;
case TEX_COL_AQUA:
gDPLoadTLUT_pal16(glistp++, 0, aqua_tlut);
break;
default:
break;
}
gDPLoadTLUT_pal16(glistp++, 15, default_tlut);
gDPSetTextureLUT(glistp++, G_TT_RGBA16);
for(idx = 0; outstring[idx] != 0x0; idx++){
for(idx2 = 0; idx2 < 80; idx2++){
if(outstring[idx] == letters_string[idx2]){
gDPLoadTextureTile_4b(glistp++,
font_img+(sizeof(char))*FontIdx[idx2],
G_IM_FMT_I,
64, 80,
0, 0, 7, 7,
0,
G_TX_WRAP, G_TX_WRAP,
G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
if(texsize == 0){/*8x8 font*/
gSPTextureRectangle(glistp++,
(int)( posx + idx * 8 ) << 2,
(int)( posy ) << 2,
(int)( posx + idx * 8 + 7) << 2,
(int)( posy + 7 ) << 2,
G_TX_RENDERTILE,
(0 << 5),
(0 << 5),
(int)(1 << 10),
(int)(1 << 10)
);
}else{/*4x8 font*/
gSPTextureRectangle(glistp++,
(int)( posx + idx * 5 ) << 2,
(int)( posy ) << 2,
(int)( posx + idx * 8 + 4) << 2,
(int)( posy + 7 ) << 2,
G_TX_RENDERTILE,
(0 << 6),
(0 << 5),
(int)(1 << 11),
(int)(1 << 10)
);
}
gDPPipeSync(glistp++);
}
gDPPipeSync(glistp++);
}
}
}