水無瀬の部屋 > Programming > sample > goddess > savedib.cpp |
---|
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:
参照:
水無瀬の部屋 > 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 『たまゆら童子』 へ
>> 楽天ブックス 『たまゆら童子』 へ