[PR]

水無瀬の部屋 > Programming > sample > cur2cpp > loadcur.cpp
最終更新日: 2007/03/12

   1: //*********************************************************
   2: // プロジェクト: cur2cpp
   3: //   ファイル名: loadcur.cpp
   4: //*********************************************************
   5: #include "loadcur.h"
   6: #include <filefmt/curfile.h>
   7: #include <filefmt/bmpfile.h>
   8: 
   9: 
  10: //---------------------------------------------------------
  11: // マクロ の 定義
  12: //---------------------------------------------------------
  13: #define DBG_ALLOCNAME          "LoadMonochromeCursorFileData"
  14: #define CALC_MASK_SIZE( cih )  ((cih).width * (cih).height / CHAR_BIT)
  15: 
  16: 
  17: //---------------------------------------------------------
  18: // ファイルスコープ関数 の 宣言
  19: //---------------------------------------------------------
  20: static bool IsValidMonochromeCursorFileData( const MONOCHROMECURSORFILEDATA_t *cursor );
  21: 
  22: 
  23: //*********************************************************
  24: // ReleaseMonochromeCursorFileData
  25: //*********************************************************
  26: bool
  27: ReleaseMonochromeCursorFileData
  28: 	(
  29: 		MONOCHROMECURSORFILEDATA_t *cursor
  30: 	)
  31: {
  32: 	// パラメタの仮定
  33: 	ASSERT( IsValidMonochromeCursorFileData( cursor ) );
  34: 	
  35: 	DBG_UNLOCK_ALLOCED_MEMORY( cursor, DBG_ALLOCNAME ); // [DBG]
  36: 	free( cursor );
  37: 
  38: 	return true;
  39: }//ReleaseMonochromeCursorFileData
  40: 
  41: //*********************************************************
  42: // LoadMonochromeCursorFileData
  43: //*********************************************************
  44: MONOCHROMECURSORFILEDATA_t * // 読み込んだカーソル
  45: LoadMonochromeCursorFileData
  46: 	(
  47: 		FILE *fp
  48: 	)
  49: {
  50: 	// パラメタの仮定
  51: 	ASSERT( IsValidFilePtr( fp ) );
  52: 
  53: 	// ファイルヘッダを読み込む
  54: 	CURSORFILEHEAD cfh;
  55: 	if ( !ReadCursorFileHeader( fp, &cfh ) )
  56: 	{
  57: 		return null;
  58: 	}
  59: 	unless ( (0 == cfh.unknown)
  60: 	      && (2 == cfh.type)
  61: 	      && (1 == cfh.num) )
  62: 	{
  63: 		return null;
  64: 	}
  65: 
  66: 	// カーソル情報ヘッダを読み込む
  67: 	CURSORINFOHEAD cih;
  68: 	if ( !ReadCursorInfoHeader( fp, &cih ) )
  69: 	{
  70: 		return null;
  71: 	}
  72: 	unless ( (0 == cih.color)
  73: 	      && (0 == cih.unknown) )
  74: 	{
  75: 		return null;
  76: 	}
  77: 
  78: 	// ビットパターンヘッダを読み込む
  79: 	BITMAPINFOHEADER bih;
  80: 	if ( !ReadBitmapInfoHeader( fp, &bih ) )
  81: 	{
  82: 		return null;
  83: 	}
  84: 	unless ( (sizeof(BITMAPINFOHEADER) == bih.biSize)
  85: 	      && (                       1 == bih.biPlanes)
  86: 	      && (                       1 == bih.biBitCount)
  87: 	      && (                       0 == bih.biCompression) )
  88: 	{
  89: 		return null;
  90: 	}
  91: 
  92: 	// 不明(おそらくパレット)を読み込む
  93: 	DWORD buffer[ 2 ];
  94: 	if ( 2 != fread( buffer, sizeof( *buffer ), 2, fp ) )
  95: 	{
  96: 		return null;
  97: 	}
  98: 
  99: 	// 
 100: 	const size_t size = CALC_MASK_SIZE( cih );
 101: 	MONOCHROMECURSORFILEDATA_t *cursor = (MONOCHROMECURSORFILEDATA_t *)malloc( sizeof( *cursor ) + (2 * size) );
 102: 	if ( !cursor )
 103: 		return null;
 104: 
 105: 	//
 106: 	cursor->cfh = cfh;
 107: 	cursor->cih = cih;
 108: 	cursor->bih = bih;
 109: 	
 110: 	// XOR ビットパターンを読み込む
 111: 	{
 112: 		BYTE *buf = static_cast<BYTE *>( static_cast<void *>(cursor) ) + sizeof( *cursor );
 113: 		if ( size != fread( buf, 1, size, fp ) )
 114: 		{
 115: 			free( cursor );
 116: 			return null;
 117: 		}
 118: 		cursor->maskXOR = buf;
 119: 	}
 120: 
 121: 	// AND ビットパターンを読み込む
 122: 	{
 123: 		BYTE *buf = static_cast<BYTE *>( static_cast<void *>(cursor) ) + sizeof( *cursor ) + size;
 124: 		if ( size != fread( buf, 1, size, fp ) )
 125: 		{
 126: 			free( cursor );
 127: 			return null;
 128: 		}
 129: 		cursor->maskAND = buf;
 130: 	}
 131: 
 132: 	//
 133: 	ASSERT( IsValidMonochromeCursorFileData( cursor ) );
 134: 
 135: 	//
 136: 	DBG_LOCK_ALLOCED_MEMORY( cursor, DBG_ALLOCNAME ); // [DBG]
 137: 	return cursor;
 138: }//LoadMonochromeCursorFileData
 139: 
 140: 
 141: //******************************************************************************************************************
 142: //
 143: //******************************************************************************************************************
 144: //*********************************************************
 145: // IsValidMonochromeCursorFileData
 146: //*********************************************************
 147: static
 148: bool
 149: IsValidMonochromeCursorFileData
 150: 	(
 151: 		const MONOCHROMECURSORFILEDATA_t *cursor
 152: 	)
 153: {
 154: 	VALID_TEST( IsValidReadPtr( cursor, sizeof( cursor ) ) );
 155: 	VALID_TEST( 0 == cursor->cfh.unknown );
 156: 	VALID_TEST( 2 == cursor->cfh.type );
 157: 	VALID_TEST( 1 == cursor->cfh.num );
 158: 	VALID_TEST( 0 == cursor->cih.color );
 159: 	VALID_TEST( 0 == cursor->cih.unknown );
 160: 	VALID_TEST( sizeof( cursor->bih ) == cursor->bih.biSize );
 161: 	VALID_TEST( 1 == cursor->bih.biPlanes );
 162: 	VALID_TEST( 1 == cursor->bih.biBitCount );
 163: 	VALID_TEST( 0 == cursor->bih.biCompression );
 164: 
 165: 	const size_t size = CALC_MASK_SIZE( cursor->cih );
 166: 	VALID_TEST( IsValidReadPtr( cursor, size ) );
 167: 	VALID_TEST( cursor->maskXOR == ((BYTE *)cursor) + sizeof( *cursor ) );
 168: 	VALID_TEST( cursor->maskAND == ((BYTE *)cursor) + sizeof( *cursor ) + size );
 169: 	VALID_TEST( (cursor->maskXOR + size <= cursor->maskAND)
 170: 	         || (cursor->maskAND + size <= cursor->maskXOR) );
 171: 
 172: 	return true;
 173: }//IsValidMonochromeCursorFileData
 174: 
 175: 
 176: //** end **

参照:


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

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

水無瀬の部屋 > sample > cur2cpp > loadcur.cpp

このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/cur2cpp/loadcur_cpp.shtml
『新妻LOVELY×CATION』を応援しています!