diff --git a/GRRLIB/GRRLIB/GRRLIB.c b/GRRLIB/GRRLIB/GRRLIB.c index e9fc998..95a52a2 100644 --- a/GRRLIB/GRRLIB/GRRLIB.c +++ b/GRRLIB/GRRLIB/GRRLIB.c @@ -241,75 +241,118 @@ GRRLIB_texImg GRRLIB_LoadTextureJPG(const unsigned char my_jpg[]) { return my_texture; } +/** + * Print formatted output. + * @param xpos + * @param ypos + * @param tex + * @param color + * @param zoom + * @param text + * @param ... Optional arguments. + */ +void GRRLIB_PrintBMF(f32 xpos, f32 ypos, GRRLIB_bytemapFont bmf, f32 zoom, const char *text, ...) { + unsigned int i, j, x, y, n, size; + char tmp[1024]; + + va_list argp; + va_start(argp, text); + size = vsprintf(tmp, text, argp); + va_end(argp); + + GRRLIB_texImg tex_BMfont = GRRLIB_CreateEmptyTexture(800, 600); + + + for(i=0; i0 do begin - blockread(f,c,1); - s:=s+c; - dec(i); - end; - blockread(f,i,2); - for i:=pred(i) downto 0 do begin - blockread(f,c,1); - blockread(f,tablo[c],5); - with tablo[c] do - if w or h<>0 then begin - getmem(d,w*h); - blockread(f,d^,w*h); - end; - end; - end; -*/ -GRRLIB_texImg my_texture; +GRRLIB_bytemapFont GRRLIB_LoadTextureBMF(const unsigned char my_bmf[]) { + GRRLIB_bytemapFont fontArray; + fontArray.nbChar = 0; + fontArray.charDef = NULL; - int i, j = 0; + int i, j = 1; u8 lineheight; u8 usedcolors, highestcolor; - short int sizeover, sizeunder, addspace, sizeinner, numcolpal, numchars; - u32 palette[64]; - - lineheight = my_bmf[5]; - sizeover = my_bmf[6]; - sizeunder = my_bmf[7]; - addspace = my_bmf[8]; - sizeinner = my_bmf[9]; - usedcolors = my_bmf[10]; - highestcolor = my_bmf[11]; - numcolpal = 3 * my_bmf[16]; - for(i=0; i < numcolpal; i+=3) - { // Font palette - palette[j++] = ((my_bmf[i+17]<<24) | (my_bmf[i+18]<<16) | (my_bmf[i+19]<<8) | 0xFF); + short int sizeover, sizeunder, addspace, sizeinner, numcolpal; + u16 nbPixels; + + if(my_bmf[0]==0xE1 && my_bmf[1]==0xE6 && my_bmf[2]==0xD5 && my_bmf[3]==0x1A) { + lineheight = my_bmf[5]; + sizeover = my_bmf[6]; + sizeunder = my_bmf[7]; + addspace = my_bmf[8]; + sizeinner = my_bmf[9]; + usedcolors = my_bmf[10]; + highestcolor = my_bmf[11]; + numcolpal = 3 * my_bmf[16]; + memset(fontArray.palette, 0, sizeof(*fontArray.palette)); + for(i=0; i < numcolpal; i+=3) + { // Font palette + fontArray.palette[j++] = ((my_bmf[i+17]<<24) | (my_bmf[i+18]<<16) | (my_bmf[i+19]<<8) | 0xFF); + } + j = 18 + numcolpal + my_bmf[17 + numcolpal]; + fontArray.nbChar = (my_bmf[j] | my_bmf[j+1]<<8); + fontArray.charDef = (GRRLIB_bytemapChar *)calloc(fontArray.nbChar, sizeof(GRRLIB_bytemapChar)); + + j++; + for(i=0; i < fontArray.nbChar; i++) //fontArray.nbChar + { // Bitmap character definitions + fontArray.charDef[i].character = my_bmf[++j]; + fontArray.charDef[i].width = my_bmf[++j]; + fontArray.charDef[i].height = my_bmf[++j]; + fontArray.charDef[i].relx = my_bmf[++j]; + fontArray.charDef[i].rely = my_bmf[++j]; + fontArray.charDef[i].shift = my_bmf[++j]; + nbPixels = fontArray.charDef[i].width * fontArray.charDef[i].height; + //fontArray.charDef[i].data = malloc(nbPixels); + fontArray.charDef[i].data = (u8 *)calloc(nbPixels, 8); + if(nbPixels && fontArray.charDef[i].data) { + memcpy(fontArray.charDef[i].data, &my_bmf[++j], nbPixels); + j += (nbPixels - 1); + } + } } - numchars = my_bmf[18 + numcolpal + my_bmf[17 + numcolpal]]; + return fontArray; +} - for(i=0; i < numchars; i++) - { // Bitmap character definitions +/** + * Free memory. + * @param bmf a GRRLIB_bytemapFont structure. + */ +void GRRLIB_FreeBMF(GRRLIB_bytemapFont bmf) +{ - } - - return my_texture; // Need another kind of struct } /** @@ -322,9 +365,6 @@ GRRLIB_texImg GRRLIB_LoadTexture(const unsigned char my_img[]) { if(my_img[0]==0xFF && my_img[1]==0xD8 && my_img[2]==0xFF) { return(GRRLIB_LoadTextureJPG(my_img)); } - else if(my_img[0]==0xE1 && my_img[1]==0xE6 && my_img[2]==0xD5 && my_img[3]==0x1A) { - return GRRLIB_LoadTextureBMF(my_img); - } /* else if(my_img[0]==0x42 && my_img[1]==0x4D) { // Bitmap not supported diff --git a/GRRLIB/GRRLIB/GRRLIB.h b/GRRLIB/GRRLIB/GRRLIB.h index 2519f15..0bccff0 100644 --- a/GRRLIB/GRRLIB/GRRLIB.h +++ b/GRRLIB/GRRLIB/GRRLIB.h @@ -33,6 +33,29 @@ typedef struct GRRLIB_texImg{ void *data; /**< pointer to the texture data. */ } GRRLIB_texImg; +/** + * Structure to hold the bytemap character informations. + */ +typedef struct GRRLIB_bytemapChar{ + u8 character; /**< Which character. */ + u8 width; /**< Character width. */ + u8 height; /**< Character height. */ + u8 relx; /**< Horizontal offset according to cursor (-128..127). */ + u8 rely; /**< Vertical offset according to cursor (-128..127). */ + u8 shift; /**< Horizontal cursor shift after drawing the character. */ + u8 *data; /**< Character data itself (uncompressed, 8 bits per pixel). */ +} GRRLIB_bytemapChar; + +/** + * Structure to hold the bytemap font informations. + */ +typedef struct GRRLIB_bytemapFont{ + u32 palette[64]; + u16 nbChar; + GRRLIB_bytemapChar *charDef; +} GRRLIB_bytemapFont; + + extern Mtx GXmodelView2D; inline void GRRLIB_FillScreen(u32 color); @@ -49,7 +72,8 @@ void GRRLIB_NGoneFilled(Vector v[], u32 color, long n); GRRLIB_texImg GRRLIB_CreateEmptyTexture(unsigned int, unsigned int); GRRLIB_texImg GRRLIB_LoadTexture(const unsigned char my_img[]); - +GRRLIB_bytemapFont GRRLIB_LoadTextureBMF(const unsigned char my_bmf[]); +void GRRLIB_FreeBMF(GRRLIB_bytemapFont bmf); void GRRLIB_InitTileSet(struct GRRLIB_texImg *tex, unsigned int tilew, unsigned int tileh, unsigned int tilestart); @@ -57,6 +81,7 @@ inline void GRRLIB_DrawImg(f32 xpos, f32 ypos, GRRLIB_texImg tex, float degrees, inline void GRRLIB_DrawTile(f32 xpos, f32 ypos, GRRLIB_texImg tex, float degrees, float scaleX, f32 scaleY, u32 color, int frame); void GRRLIB_Printf(f32 xpos, f32 ypos, GRRLIB_texImg tex, u32 color, f32 zoom, const char *text, ...); +void GRRLIB_PrintBMF(f32 xpos, f32 ypos, GRRLIB_bytemapFont bmf, f32 zoom, const char *text, ...); bool GRRLIB_PtInRect(int hotx, int hoty, int hotw, int hoth, int wpadx, int wpady); bool GRRLIB_RectInRect(int rect1x, int rect1y, int rect1w, int rect1h, int rect2x, int rect2y, int rect2w, int rect2h); diff --git a/examples/lesson1/source/main.c b/examples/lesson1/source/main.c index d3a09fc..85f4bfb 100644 --- a/examples/lesson1/source/main.c +++ b/examples/lesson1/source/main.c @@ -72,7 +72,7 @@ int main() { GRRLIB_texImg tex_test_jpg = GRRLIB_LoadTexture(test_jpg); - GRRLIB_texImg tex_test_bmf = GRRLIB_LoadTexture(ocean); + GRRLIB_bytemapFont bmf_Font = GRRLIB_LoadTextureBMF(ocean); GRRLIB_texImg tex_sprite_png = GRRLIB_LoadTexture(sprite); GRRLIB_InitTileSet(&tex_sprite_png, 24, 32, 0); @@ -162,6 +162,7 @@ int main() { GRRLIB_Printf(left, top+300, tex_BMfont3, GRRLIB_WHITE, 1, "IR Y VALUE: %d", (int)ir1.y); GRRLIB_Printf(left, top+350, tex_BMfont3, 0XFFFFFF50, 1, "TEXT WITH ALPHA"); GRRLIB_Printf(left, top+400, tex_BMfont5, GRRLIB_LIME, 1, "This font has the 128 ASCII characters"); + GRRLIB_PrintBMF(left, top+420, bmf_Font, 1, "OCEAN"); } GRRLIB_Printf(500, 27, tex_BMfont5, GRRLIB_WHITE, 1, "Current FPS: %d", FPS); GRRLIB_Render(); @@ -214,13 +215,13 @@ int main() { GRRLIB_Exit(); // Be a good boy, clear the memory allocated by GRRLIB // Free some textures free(tex_test_jpg.data); - free(tex_test_bmf.data); free(tex_sprite_png.data); free(tex_BMfont1.data); free(tex_BMfont2.data); free(tex_BMfont3.data); free(tex_BMfont4.data); free(tex_BMfont5.data); + GRRLIB_FreeBMF(bmf_Font); return 0; }