ndsでのjpeg表示に再挑戦(6)
ndsでjpegデータを表示するために、jpegのデコードの仕組みを読み取ろうと思って、Jpeg-6bのVS2008C++用のプログラムを読み込んで、PPMファイルが作れることを確認したのですが、ちょっとここで、方針を変更したいと思います。
PPMファイルはRGBのrawデータなので、先ず、Jpeg→PPMファイル変換した後、ndsでPPMファイルを読み込んで画像を表示することにします。オンメモリでやりたくなったら、オンメモリを考えたいと思います。そうと決まれば、DevkitProに今使っているdjpegプログラム一式を移植します。
jpeglibフォルダにコピー
"arm9\source\jpeglib"というフォルダを作り、ここに下記のファイルを全てコピーしました。
cderror.h, cdjpeg.c, cdjpeg.h, jcomapi.c, jdapimin.c, jdapistd.c, jdatasrc.c, jdcoefct.c, jdcolor.c, jdct.h, jddctmgr.c, jdhuff.c, jdhuff.h, jdinput.c, jdmainct.c, jdmarker.c, jdmaster.c, jdmerge.c, jdphuff.c, jdpostct.c, jdsample.c, jerror.c, jerror.h, jidctflt.c, jidctfst.c, jidctint.c, jidctred.c, jinclude.h, jmemmgr.c, jmemsys.h, jmorecfg.h, jpegint.h, jpeglib.h, jquant1.c, jquant2.c, jutils.c, jversion.h, rdcolmap.c, wrppm.c
上記以外、あと2つ、jconfig.hとjmemnds.cを追加します。
jconfig.hの修正
そして、今回用にjconfig.hを作りました。ほとんど同じですが、PPMのみ使うことにしています。
/* jconfig.dns --- jconfig.h for Nintendo DS on DevkitPro. */ /* see jconfig.doc for explanations */ #define HAVE_PROTOTYPES #define HAVE_UNSIGNED_CHAR #define HAVE_UNSIGNED_SHORT /* #define void char */ /* #define const */ #undef CHAR_IS_UNSIGNED #define HAVE_STDDEF_H #define HAVE_STDLIB_H #undef NEED_BSD_STRINGS #undef NEED_SYS_TYPES_H #undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */ #undef NEED_SHORT_EXTERNAL_NAMES #undef INCOMPLETE_TYPES_BROKEN // /* Define "boolean" as unsigned char, not int, per Windows custom */ // #ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ // typedef unsigned char boolean; // #endif // #define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ #ifdef JPEG_INTERNALS #undef RIGHT_SHIFT_IS_UNSIGNED #endif /* JPEG_INTERNALS */ #ifdef JPEG_CJPEG_DJPEG #undef BMP_SUPPORTED /* BMP image file format */ #undef GIF_SUPPORTED /* GIF image file format */ #define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ #undef RLE_SUPPORTED /* Utah RLE image file format */ #undef TARGA_SUPPORTED /* Targa image file format */ #define TWO_FILE_COMMANDLINE /* optional */ //#define USE_SETMODE /* Microsoft has setmode() */ #undef NEED_SIGNAL_CATCHER #undef DONT_USE_B_MODE #undef PROGRESS_REPORT /* optional */ #endif /* JPEG_CJPEG_DJPEG */
jmemnds.cの作成
これも、jmemansi.cとほぼ同じですが、tmpfile()の処理がうまく動作しなかったので、同様の処理をコーディングしました。static int next_file_numを宣言して、jpeg_mem_init()で初期化しています。
そして、jpeg_open_backing_store()が呼び出される度にテンポラリファイルを生成します。
最後に処理が終わるときに、テンポラリファイルを消去するように、jpeg_mem_term()にremove()プログラムを追加しました。
static int next_file_num; /* to distinguish among several temp files */GLOBAL(long) jpeg_mem_init (j_common_ptr cinfo) { next_file_num = 0; return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ }/* * Initial opening of a backing-store object. */ GLOBAL(void) jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, long total_bytes_needed) { char fn[20]; sprintf( fn, "tmpfile%d.tmp", next_file_num ); next_file_num++; info->temp_file = fopen( fn, "wb+" ); if ( info->temp_file== NULL ) ERREXITS(cinfo, JERR_TFILE_CREATE, ""); info->read_backing_store = read_backing_store; info->write_backing_store = write_backing_store; info->close_backing_store = close_backing_store; }GLOBAL(void) jpeg_mem_term (j_common_ptr cinfo) { char fn[20]; int i; for( i=0; i<next_file_num; i++ ){ sprintf( fn, "tmpfile%d.tmp", i ); remove( fn ); } }
makefile修正
makefileはSOURCEとINCLUDEにjpeglibフォルダを追加しただけです。
#--------------------------------------------------------------------------------- # BUILD is the directory where object files & intermediate files will be placed # SOURCES is a list of directories containing source code # INCLUDES is a list of directories containing extra header files # DATA is a list of directories containing binary files # all directories are relative to this makefile #--------------------------------------------------------------------------------- BUILD := build SOURCES := source source/jpeglib INCLUDES := include source/jpeglib DATA := data
これで、makeは通りました。
今日はこの辺で・・・。
本当にやりたいことリスト
(ブログの終わりにやりたいことを書いておきたいと思います)
- 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
- Androidプログラム
- Web系のプログラム