susie.c

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|