BMPファイルの展開ルーチンを試し書きしてみた。
フェイスプレートをユーザが用意した任意の画像に差し替えれるという機能を持たすため。
…フェイスプレート画像を作ること自体が実は面倒と分かって…誰も使わないかも知れない機能w
24 ビット、 256x192 ピクセル、ファイル名固定とした場合、チェック処理の手間はあまり無さ気。
BMP なら前もって容量分かるし、仮に BMP ファイルじゃなくても
容量さえ合えば強引に NDS LCD サイズ分の画像データとして展開できてしまえるし。
見ての通りのベタなコードなので展開はすこぶる遅い。表示まで大体 2〜3 秒(笑)。
実際の実装は展開中を非表示とし、展開完了後に表示とすることになるかと。
bmp module test
main.c
/*--------------------------------------------------------------------------------- shtwatch bmp module test version 0.01 Mar 07, 2010 By REGEKATSU ---------------------------------------------------------------------------------*/ #include <stdio.h> #include <nds.h> #include <fat.h> #define FILE_NAME "HARUHI.BMP" #define RGB24(r,g,b) ( (1 << 15) | RGB8((r), (g), (b)) ) //--------------------------------------------------------------------------------- int main(void){ //--------------------------------------------------------------------------------- FILE *fp; videoSetMode(MODE_5_2D); vramSetBankA(VRAM_A_MAIN_BG); consoleDemoInit(); bgInit(3, BgType_Bmp16, BgSize_B16_256x256, 0, 0); while(1) { swiWaitForVBlank(); scanKeys(); if(keysDown() & KEY_START){ break; } } printf("fat init..."); if(!fatInitDefault()){ printf("error!\n"); return 1; } printf("ok!\n"); printf("file open..."); if( ( fp = fopen(FILE_NAME, "rb") ) == NULL ){ printf("error!\n"); fclose(fp); return 1; } printf("ok!\n"); long size; fseek(fp, 0L, SEEK_END); size = ftell(fp); printf("bmp size...%ldbyte...", size); if( size != 147510 ){ printf("error!\n"); fclose(fp); return 1; } printf("ok!\n"); printf("bmp load..."); fseek(fp, 54L, SEEK_SET); int x, y; char r, g, b; for(y = 0;y < 192;y++){ for(x = 0;x < 256;x++){ b = fgetc(fp); g = fgetc(fp); r = fgetc(fp); BG_GFX[x + ((191 - y) * 256)] = RGB24(r, g, b); } } fclose(fp); printf("ok!\n"); return 0; } //---------------------------------------------------------------------------------