C:\home\SVGCats_src\src\susie.c
1|/************************************************************************** 2| 1. <<< Susie プラグイン (Susie) >>> 3|***************************************************************************/ 4| 5|#include "mixer_precomp.h" 6| 7|#ifdef USES_MXP_AUTOINC 8| #include <Susie.ah> /* Auto include header, Look at mixer-... folder */ 9|#endif 10| 11|#include <stdio.h> 12|#include <string.h> 13| 14| 15| 16| 17|/*---------------------------------------------------------------------*/ 18|/* 2. <<<<◆(Susie) Susie プラグイン >>>> */ 19|/*---------------------------------------------------------------------*/ 20| 21| 22|/*********************************************************************** 23| 2-1. <<< [Susie_init] 初期化して、プラグインとリンクする >>> 24|【引数】 25| ・Susie* m; Susie プラグイン(クラス) 26| ・char* spi_path; Susie プラグインファイルのパス(拡張子 .spi) 27|************************************************************************/ 28|void Susie_init( Susie* m, const char* spi_path ) 29|{ 30| m->bitmapInfo = 0; 31| m->image = 0; 32| 33| m->spi = LoadLibrary( spi_path ); 34| if ( m->spi == NULL ) 35| error2_1( Susie_Err_CannotLoadSPI, "プラグインがロードできません:%s", spi_path ); 36| 37| m->SPI_getPluginInfo = (SPI_getPluginInfo_F)GetProcAddress( m->spi, "GetPluginInfo" ); 38| m->SPI_isSupported = (SPI_isSupported_F)GetProcAddress( m->spi, "IsSupported" ); 39| m->SPI_getPictureInfo = (SPI_getPictureInfo_F)GetProcAddress( m->spi, "GetPictureInfo" ); 40| m->SPI_getPicture = (SPI_getPicture_F)GetProcAddress( m->spi, "GetPicture" ); 41|} 42| 43| 44|/*********************************************************************** 45| 2-2. <<< [Susie_finish] 後始末する >>> 46|************************************************************************/ 47|void Susie_finish( Susie* m ) 48|{ 49| if ( m->bitmapInfo != 0 ) LocalFree( m->bitmapInfo ); 50| if ( m->image != 0 ) LocalFree( m->image ); 51| FreeLibrary( m->spi ); 52|} 53| 54| 55|/************************************************************************** 56| 2-3. <<< [Susie_attach] 画像ファイルと関連付けする >>> 57|【補足】 58|・本関数を呼び出すと、プラグインが画像ファイルを読み込んで、画像情報のメンバ変数を 59| 設定します。 bitmapInfo, image, size, width, height, bpp, nPalette 60|・Susie_Err_NotSupportImgType や FileX_Err_CannotReadOpen の例外が投げられることが 61| あります。 62|***************************************************************************/ 63|void Susie_attach( Susie* m, const char* pic_path ) 64|{ 65| enum { header_size = 2048 }; 66| char header[header_size]; 67| FILE* f; 68| int r; 69| SPI_PicInfo info; 70| BITMAPINFO* bitmapInfo; 71| 72| /* 画像ファイルのヘッダ部分を読み込む */ 73| f = FileX_open( pic_path, "rb" ); 74| memset( header, 0, sizeof(header) ); 75| fread( header, 1, sizeof(header), f ); 76| fclose( f ); 77| 78| /* 展開できるか判定する */ 79| if ( m->SPI_isSupported( pic_path, (DWORD)header ) == 0 ) 80| error2_1( Susie_Err_NotSupportImgType, "対応していない画像形式です:%s", pic_path ); 81| 82| /* 画像の情報を取得する */ 83| r = m->SPI_getPictureInfo( (LPSTR)pic_path, 0, 0, &info ); 84| if ( r != 0 ) 85| error2_1( Susie_Err_GetPictureInfo, "SPI_getPictureInfo エラー:%d", r ); 86| 87| m->width = info.width; 88| m->height = info.height; 89| m->bpp = info.colorDepth; 90| if ( info.info != NULL ) LocalFree( info.info ); 91| 92| /* 画像データを読み込む */ 93| if ( m->bitmapInfo != 0 ) LocalFree( m->bitmapInfo ); 94| if ( m->image != 0 ) LocalFree( m->image ); 95| r = m->SPI_getPicture( (LPSTR)pic_path, 0, 0, &m->bitmapInfo, &m->image, NULL, 0 ); 96| if ( r != 0 ) 97| error2_1( Susie_Err_GetPicture, "SPI_getPicture エラー:%d", r ); 98| 99| bitmapInfo = (LPBITMAPINFO)LocalLock( m->bitmapInfo ); 100| m->size = bitmapInfo->bmiHeader.biSizeImage; 101| m->nPalette = bitmapInfo->bmiHeader.biClrUsed; 102| LocalUnlock( m->bitmapInfo ); 103|} 104| 105| 106| 107|/************************************************************************** 108| 2-4. <<< [Susie_draw] 画像をデバイスコンテキストへ描画する >>> 109|【引数】 110| ・int x, y; 描画位置 111|【補足】 112|・Susie_attach で関連付けされている画像ファイルが対象となります。 113|・内部で画像のフォーマット(色数など)を画面のフォーマットに自動的に変換しています。 114|***************************************************************************/ 115|void Susie_draw( Susie* m, HDC dc, int x, int y ) 116|{ 117| void* image; 118| BITMAPINFO* bitmapInfo; 119| 120| image = (void*)LocalLock( m->image ); 121| bitmapInfo = (LPBITMAPINFO)LocalLock( m->bitmapInfo ); 122| 123| StretchDIBits( dc, x, y, m->width, m->height, 124| 0, 0, m->width, m->height, image, bitmapInfo, 125| DIB_RGB_COLORS, SRCCOPY ); 126| 127| LocalUnlock( m->image ); 128| LocalUnlock( m->bitmapInfo ); 129|} 130| 131| 132| 133|/************************************************************************** 134| 2-5. <<< [Susie_drawMul] 画像を拡大してデバイスコンテキストへ描画する >>> 135|【引数】 136| ・int x, y; 描画位置 137| ・float x_mul, y_mul; 拡大率(1=等倍) 138|【補足】 139|・拡大縮小機能を持った、Susie_draw です。 140|***************************************************************************/ 141|void Susie_drawMul( Susie* m, HDC dc, int x, int y, float x_mul, float y_mul ) 142|{ 143| Susie_drawStretch( m, dc, x, y, (int)(m->width * x_mul), (int)(m->height * y_mul) ); 144|} 145| 146| 147|/************************************************************************** 148| 2-6. <<< [Susie_drawStretch] 画像を拡大してデバイスコンテキストへ描画する >>> 149|【引数】 150| ・int x, y; 描画位置 151| ・int w, h; 描画する幅と高さ 152|【補足】 153|・拡大縮小機能を持った、Susie_draw です。 154|***************************************************************************/ 155|void Susie_drawStretch( Susie* m, HDC dc, int x, int y, int w, int h ) 156|{ 157| void* image; 158| BITMAPINFO* bitmapInfo; 159| 160| image = (void*)LocalLock( m->image ); 161| bitmapInfo = (LPBITMAPINFO)LocalLock( m->bitmapInfo ); 162| 163| SetBrushOrgEx( dc, 0, 0, NULL ); 164| SetStretchBltMode( dc, HALFTONE ); 165| StretchDIBits( dc, x, y, w, h, 0, 0, m->width, m->height, image, bitmapInfo, 166| DIB_RGB_COLORS, SRCCOPY ); 167| 168| LocalUnlock( m->image ); 169| LocalUnlock( m->bitmapInfo ); 170|} 171| 172| 173|/************************************************************************** 174| 2-7. <<< [Susie_getImage] 画像データを取得する >>> 175|【引数】 176| ・void* p; 画像データを格納する先頭アドレス 177| ・int p_size; p のメモリサイズ(m->size 以上) 178|【補足】 179|・Susie_attach で関連付けされている画像ファイルが対象となります。 180|***************************************************************************/ 181|void Susie_getImage( Susie* m, void* p, int p_size ) 182|{ 183| char* image; 184| 185| ASSERT( p_size >= m->size ); 186| 187| image = (char*)LocalLock( m->image ); 188| memcpy( p, image, m->size ); 189| LocalUnlock( m->image ); 190|} 191| 192|/************************************************************************** 193| 2-8. <<< [Susie_getPalette] パレットデータを取得する >>> 194|【引数】 195| ・void* p; パレットデータを格納する先頭アドレス 196| ・int p_size; p のメモリサイズ(m->nPalette * 4 以上) 197|【補足】 198|・Susie_attach で関連付けされている画像ファイルが対象となります。 199|***************************************************************************/ 200|void Susie_getPalette( Susie* m, void* p, int p_size ) 201|{ 202| BITMAPINFO* bitmapInfo; 203| 204| ASSERT( p_size >= m->nPalette * 4 ); 205| 206| bitmapInfo = (LPBITMAPINFO)LocalLock( m->bitmapInfo ); 207| memcpy( p, bitmapInfo->bmiColors, m->nPalette * 4 ); 208| LocalUnlock( m->bitmapInfo ); 209|} 210| 211|/*---------------------------------------------------------------------*/ 212|/* 3. <<<<◆(Susies) Susie プラグインの集合 >>>> */ 213|/*---------------------------------------------------------------------*/ 214| 215|Susies Susies_globl; 216| 217| 218|/*********************************************************************** 219| 3-1. <<< [Susies_init] 初期化して、プラグインとリンクする >>> 220|【引数】 221| ・Susie* m; Susie プラグイン(クラス) 222| ・char* spi_folder_path; Susie プラグインの入ったフォルダのパス(拡張子 .spi) 223|【補足】 224|・spi_folder_path に NULL を指定すると、プラグインと関連付けしません。 225| "." を指定すると、カレントフォルダにあるプラグインと関連付けします。 226|・サブディレクトリに入ったプラグインも関連付けします。 227|************************************************************************/ 228|void Susies_init( Susies* m, const char* spi_folder_path ) 229|{ 230| ListX_init( &m->susies ); 231| m->selectingSPI = NULL; 232| 233| if ( spi_folder_path != NULL ) { 234| NestFind f; 235| char* path; 236| 237| NestFind_init( &f, spi_folder_path, false ); 238| 239| while ( NestFind_next( &f ) ) { 240| path = NestFind_getAbsPath( &f ); 241| if ( stricmp( StrX_refExt( path ), "spi" ) == 0 ) 242| Susies_addSPI( m, path ); 243| } 244| 245| NestFind_finish( &f ); 246| } 247|} 248| 249| 250| 251| 252|/*********************************************************************** 253| 3-2. <<< [Susies_finish] 後始末する >>> 254|************************************************************************/ 255|void Susies_finish( Susies* m ) 256|{ 257| ListX_finish2( &m->susies, Susie, Susie_finish ); 258|} 259| 260| 261| 262|/*********************************************************************** 263| 3-3. <<< [Susies_addSPI] プラグインを追加する >>> 264|************************************************************************/ 265|void Susies_addSPI( Susies* m, const char* spi_path ) 266|{ 267| Susie* s; 268| 269| s = ListX_addFirstMalloc( &m->susies, Susie ); 270| Susie_init( s, spi_path ); 271|} 272| 273| 274| 275| 276|/*********************************************************************** 277| 3-4. <<< [Susies_attach] プラグイン自動選択版 Susie_attach >>> 278|************************************************************************/ 279|void Susies_attach( Susies* m, const char* pic_path ) 280|{ 281| enum { header_size = 2048 }; 282| char header[header_size]; 283| FILE* f; 284| Susie* s; 285| 286| /* 画像ファイルのヘッダ部分を読み込む */ 287| f = FileX_open( pic_path, "rb" ); 288| memset( header, 0, sizeof(header) ); 289| fread( header, 1, sizeof(header), f ); 290| fclose( f ); 291| 292| /* 展開できるか判定して、対象となるプラグインを決定する */ 293| for ( ListX_forEach( &m->susies, &s, Susie ) ) { 294| if ( s->SPI_isSupported( pic_path, (DWORD)header ) != 0 ) 295| break; 296| } 297| if ( s == NULL ) 298| error2_1( Susie_Err_NotSupportImgType, "対応していない画像形式です:%s", pic_path ); 299| 300| /* プラグインと画像ファイルを関連付けする */ 301| Susie_attach( s, pic_path ); 302| m->selectingSPI = s; 303|} 304| 305| 306|