コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

ndsでのjpeg表示に再挑戦(6)

ndsjpegデータを表示するために、jpegのデコードの仕組みを読み取ろうと思って、Jpeg-6bのVS2008C++用のプログラムを読み込んで、PPMファイルが作れることを確認したのですが、ちょっとここで、方針を変更したいと思います。
PPMファイルはRGBのrawデータなので、先ず、JpegPPMファイル変換した後、ndsPPMファイルを読み込んで画像を表示することにします。オンメモリでやりたくなったら、オンメモリを考えたいと思います。そうと決まれば、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系のプログラム