[PR]

水無瀬の部屋 > Programming > sample > goddess > savedib.cpp
最終更新日: 2007/03/24

   1: //*********************************************************
   2: // プロジェクト: ああっ壁神さまっ
   3: //   ファイル名: savedib.cpp
   4: //*********************************************************
   5: #include "savedib.h"
   6: #include <filefmt/bmpfile.h>
   7: 
   8: 
   9: //---------------------------------------------------------
  10: // ファイルスコープ関数 の 宣言
  11: //---------------------------------------------------------
  12: //static FILE *CreateTemporaryFile( char *path, int bufsize );
  13: static bool  WriteBitmapFile( FILE *fw, const BITMAPINFOHEADER *bih, const RGBQUAD *rgb, const BYTE *pBits );
  14: 
  15: 
  16: //*********************************************************
  17: // SaveBitmapFile
  18: //*********************************************************
  19: bool
  20: SaveBitmapFile
  21: 	(
  22: 		const char             *bmpname, 
  23: 		const BITMAPINFOHEADER *bih,
  24: 		const RGBQUAD          *rgb,
  25: 		const BYTE             *img
  26: 	)
  27: {
  28: 	// パラメタの仮定
  29: 	ASSERT( IsValidStringPtr( bmpname ) );
  30: 	ASSERT( IsValidReadPtr( bih, sizeof( *bih ) ) );
  31: 	ASSERT( IsValidReadPtr( rgb, 256 * sizeof( *rgb ) ) );
  32: 	ASSERT( IsValidReadPtr( img, CalcBitmapImageSize( bih ) ) );
  33: 	
  34: 	// 作業ファイルを作る
  35: 	char tempname[ MAX_PATH_BUF ];
  36: 	FILE *fw = CreateTemporaryFile( tempname, numof(tempname), "wb" );
  37: 	if ( !fw )
  38: 	{
  39: 		return false;
  40: 	}
  41: 
  42: 	bool bSuccess;
  43: 	VERIFY( bSuccess = WriteBitmapFile( fw, bih, rgb, img ) );
  44: 	VERIFY( bSuccess = ((0 == fclose(fw)) && bSuccess));
  45: 
  46: 	if ( bSuccess && IsPathExist( tempname ) )
  47: 	{
  48: 		const DWORD dwFileAttributes = GetFileAttributes( bmpname );
  49: 		if ( INVALID_FILE_ATTRIBUTES != dwFileAttributes )
  50: 		{
  51: 			SetFileAttributes( bmpname, 0 );
  52: 		}
  53: 
  54: 		CopyFile( tempname, bmpname, false );
  55: 
  56: 		if ( INVALID_FILE_ATTRIBUTES != dwFileAttributes )
  57: 		{
  58: 			SetFileAttributes( bmpname, dwFileAttributes );
  59: 		}
  60: 	}
  61: 
  62: 	// 作業ファイルを削除する
  63: 	VERIFY( DeleteFile( tempname ) );
  64: 	return bSuccess && IsPathExist( bmpname );
  65: }//SaveBitmapFile
  66: 
  67: 
  68: //******************************************************************************************************************
  69: // private
  70: //******************************************************************************************************************
  71: /*
  72: //*********************************************************
  73: // CreateTemporaryFile
  74: // 出力用の一時ファイルを作成して
  75: // 作成した一時ファイルの名前を返す
  76: //*********************************************************
  77: static FILE *CreateTemporaryFile( char *path, int bufsize )
  78: {
  79: 	// パラメタの仮定
  80: 	ASSERT( IsEnoughPathBufferSize( bufsize ) ); // [WARN]
  81: 	ASSERT( IsValidPtr( path, bufsize ) );
  82: 
  83: 	// 複数のプロセスで作業ファイル名が競合しないよう
  84: 	// プロセス毎に異なる乱数列を使いたい
  85: 	srand( GetCurrentProcessId() );
  86: 
  87: 	// 
  88: 	const int offset = rand();
  89: 	for( int i = 0; i < 1000; i++ )
  90: 	{
  91: 		// 000-999
  92: 		char ext[ MAX_PATH_BUF ];
  93: 		snprintf( ext, sizeof(ext), ".%03d", (i + offset) % 1000 );
  94: 		ASSERT( 4 == strlen( ext ) );
  95: 
  96: 		GetModuleFile( path, bufsize, ext );
  97: 		if ( !IsPathExist( path ) )
  98: 		{
  99: 			FILE *fp = fopen( path, "wb" );
 100: 			if ( fp )
 101: 			{
 102: 				return fp;
 103: 			}
 104: 		}
 105: 	}
 106: 	return NULL;
 107: }//CreateTemporaryFile
 108: */
 109: 
 110: //*********************************************************
 111: // WriteBitmapFile
 112: //*********************************************************
 113: static bool WriteBitmapFile( FILE *fw, const BITMAPINFOHEADER *bih, const RGBQUAD *rgb, const BYTE *img )
 114: {
 115: 	// パラメタの仮定
 116: 	ASSERT( IsValidPtr( fw, sizeof(FILE) ) );
 117: 	ASSERT( IsValidReadPtr( bih, sizeof(BITMAPINFOHEADER) ) );
 118: 	ASSERT( IsValidReadPtr( rgb, 256 * sizeof(RGBQUAD) ) );
 119: 	ASSERT( IsValidReadPtr( img, CalcBitmapImageSize(bih) ) );
 120: 
 121: 	BITMAPFILEHEADER bfh;
 122: 	MakeBitmapFileHeader( &bfh, bih );
 123: 	if ( !WriteBitmapFileHeader( fw, &bfh ) ) return false;
 124: 	if ( !WriteBitmapInfoHeader( fw,  bih ) ) return false;
 125: 	if ( !WriteBitmapPalette( fw, rgb, bih ) ) return false;
 126: 
 127: 	// イメージの書き出し
 128: 	const int size = CalcBitmapImageSize( bih );
 129: 	// ASSERT( bih->biSizeImage == (DWORD)size );
 130: 	ASSERT( IsValidReadPtr( img, size ) );
 131: 	return size == (int)fwrite( img, 1, size, fw );
 132: }//WriteBitmapFile
 133: 
 134: 
 135: //******************************************************************************************************************
 136: // TEST
 137: //******************************************************************************************************************
 138: #ifdef _DEBUG // デバッグ時のみ
 139: //*********************************************************
 140: // test_savedib_cpp
 141: // ファイル savedib.cpp のコードをテストする
 142: // 見つけたエラーを報告する
 143: // エラーを見つけることができなかった場合は真を返す
 144: //*********************************************************
 145: bool test_savedib_cpp( void )
 146: {
 147: 	// エラーを見つけることができなかったので真を返す
 148: 	return true;
 149: }//test_savedib_cpp
 150: #endif // #ifdef _DEBUG
 151: 
 152: 
 153: //** end **
 154: 

参照:


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬の部屋 > sample > goddess > savedib.cpp

このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/goddess/savedib_cpp.shtml
>> Amazon.co.jp 『たまゆら童子』 へ
>> 楽天ブックス 『たまゆら童子』 へ