OSDN Git Service

#xxxxx DTXViewerのプロジェクトを追加。
[dtxmania/dtxmania.git] / DTXViewerプロジェクト / @FDK10プロジェクト / CSurface.cpp
diff --git a/DTXViewerプロジェクト/@FDK10プロジェクト/CSurface.cpp b/DTXViewerプロジェクト/@FDK10プロジェクト/CSurface.cpp
new file mode 100644 (file)
index 0000000..7f59d37
--- /dev/null
@@ -0,0 +1,1546 @@
+#include "stdafx.h"
+#include "FDKError.h"
+#include "CSurface.h"
+#include "LoadPNG.h"
+#include "LoadJPEG.h"
+#include "Debug.h"
+
+namespace FDK {
+       namespace Graphics {
+
+CSurface::CSurface()
+{
+       this->pSurface                  = NULL;
+       this->nAlphaConst               = 255;
+       this->dwWidth                   = 0;
+       this->dwHeight                  = 0;
+       this->place                             = LOADTO_VIDEO_OR_SYSTEM;
+       this->bColorKeyEnable   = false;
+       this->dwColorKey                = 0xFF000000;
+       this->strSurfaceName.clear();
+       this->strFileName.clear();
+       this->lpResourceName    = NULL;
+       this->lpResourceType    = NULL;
+       this->pData                             = NULL;
+       this->dwDataSize                = 0;
+
+       ::ZeroMemory( &this->ddpfReference, sizeof( DDPIXELFORMAT ) );
+}
+
+CSurface::~CSurface()
+{
+       SAFE_RELEASE( this->pSurface );
+}
+
+void   CSurface::InitDeviceObjects( LPCTSTR name, DWORD width, DWORD height, LOADPLACE place, LPDDPIXELFORMAT pFormat )
+{
+       this->InitParameters( name, NULL, NULL, NULL, NULL, 0, width, height, place, pFormat );
+}
+
+void   CSurface::InitDeviceObjectsFromFile( LPCTSTR name, LPCTSTR filename, DWORD width, DWORD height, LOADPLACE place, LPDDPIXELFORMAT pFormat )
+{
+       this->InitParameters( name, filename, NULL, NULL, NULL, 0, width, height, place, pFormat );
+}
+
+void   CSurface::InitDeviceObjectsFromMemory( LPCTSTR name, BYTE* pData, DWORD dwDataSize, DWORD width, DWORD height, LOADPLACE place, LPDDPIXELFORMAT pFormat )
+{
+       this->InitParameters( name, NULL, NULL, NULL, pData, dwDataSize, width, height, place, pFormat );
+}
+
+void   CSurface::InitDeviceObjectsFromResource( LPCTSTR name, LPCTSTR lpResourceName, LPCTSTR lpResourceType, DWORD width, DWORD height, LOADPLACE place, LPDDPIXELFORMAT pFormat )
+{
+       this->InitParameters( name, NULL, lpResourceName, lpResourceType, NULL, 0, width, height, place, pFormat );
+}
+
+void   CSurface::InitParameters( LPCTSTR name, LPCTSTR fname, LPCTSTR lpResourceName, LPCTSTR lpResourceType, BYTE* pData, DWORD dwDataSize, DWORD width, DWORD height, LOADPLACE place, LPDDPIXELFORMAT pFormat )
+{
+       // \96¼\91O
+       this->strSurfaceName.clear();
+       if( name )
+               this->strSurfaceName = name;
+       
+       this->strFileName.clear();
+       if( fname )
+               this->strFileName = fname;
+
+       // \83\8a\83\\81[\83X
+       this->lpResourceName    = lpResourceName;
+       this->lpResourceType    = lpResourceType;
+
+       // \83f\81[\83^\83|\83C\83\93\83^\81A\83f\81[\83^\83T\83C\83Y
+       this->pData                             = pData;
+       this->dwDataSize                = dwDataSize;
+
+       // \83T\83C\83Y
+       this->dwWidth                   = width;
+       this->dwHeight                  = height;
+
+       // \94z\92u\8fê\8f\8a
+       this->place                             = place;
+
+       // \83s\83N\83Z\83\8b\83t\83H\81[\83}\83b\83g
+       if( pFormat != NULL )
+               this->ddpfReference = *pFormat;
+       else
+               this->ddpfReference.dwSize = 0;         // \96³\8cø\82Ì\82µ\82é\82µ
+
+       // \82»\82Ì\91¼\81i\83f\83t\83H\83\8b\83g\92l\81j
+       this->nAlphaConst               = 255;
+       this->bColorKeyEnable   = false;
+       this->dwColorKey                = 0xFF000000;
+
+       SAFE_RELEASE( this->pSurface );
+}
+
+HRESULT        CSurface::RestoreDeviceObjects()
+{
+       HRESULT hr = D3D_OK;
+
+       // (1) \8ew\92è\83t\83@\83C\83\8b\82©\82ç\82Ì\90\90¬( BMP, PNG, JPEG )
+       if( ! this->strFileName.empty() )
+               hr = this->RestoreDeviceObjectsFromFile();
+
+       // (2) \83\81\83\82\83\8a\93à\83t\83@\83C\83\8b\82©\82ç\82Ì\90\90¬( PNG \82Ì\82Ý )
+       else if( this->pData != NULL && this->dwDataSize > 0 )
+               hr = this->RestoreDeviceObjectsFromFileInMemory();
+
+       // (3) \83\8a\83\\81[\83X\82©\82ç\82Ì\90\90¬( PNG \82Ì\82Ý )
+       else if( this->lpResourceName != NULL && this->lpResourceType != NULL )
+               hr = this->RestoreDeviceObjectsFromResource();
+
+       // (4) \8bó\90\90¬
+       else if( FAILED( hr = this->Create() ) )
+               return FDKERR_\83T\81[\83t\83F\83C\83X\82Ì\8dì\90¬\82É\8e¸\94s;
+
+       return hr;
+}
+
+HRESULT        CSurface::RestoreDeviceObjectsFromResource()
+{
+       HMODULE hModule = (HMODULE)::GetClassLongPtr( CD3DApplication::hWnd, GCL_HMODULE );
+
+       HRSRC hSrc = ::FindResource( hModule, this->lpResourceName, this->lpResourceType );
+       if( ! hSrc )
+               return FDKERR_\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý\8e¸\94s;
+
+       HGLOBAL hPNG = LoadResource( hModule, hSrc );
+       if( ! hPNG )
+               return FDKERR_\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý\8e¸\94s;
+
+       this->dwDataSize = SizeofResource( hModule, hSrc );
+       if( this->dwDataSize == 0 )
+               return FDKERR_\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý\8e¸\94s;
+
+       this->pData = (BYTE*) LockResource( hPNG );
+       if( ! this->pData )
+               return FDKERR_\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý\8e¸\94s;
+
+       return this->RestoreDeviceObjectsFromFileInMemory();
+}
+
+HRESULT        CSurface::RestoreDeviceObjectsFromFileInMemory()
+{
+       HRESULT hr = S_OK;
+
+       SAFE_RELEASE( this->pSurface );
+
+       // \8fó\91Ô\83`\83F\83b\83N
+       if( ! CD3DApplication::pDD ) 
+               return FDKERR_DirectDraw\82ªNULL;
+
+       // \83\81\83\82\83\8a\83C\83\81\81[\83W\83t\83@\83C\83\8b\82©\82ç\82Ì\90\90¬
+       if( this->pData && this->dwDataSize > 0 )
+       {
+               BITMAPINFO* pbinfo = NULL;
+               BYTE*           pbdata = NULL;
+
+               // PNG \82©\82ç\82Ì\90\90¬
+               if( LoadPNGtoDIB( this->pData, this->dwDataSize, &pbinfo, &pbdata ) )
+               {
+                       hr = RestoreFromBitmap( pbinfo, pbdata );
+                       SAFE_FREE( pbinfo );
+                       SAFE_FREE( pbdata );
+               }
+               else
+                       hr = FDKERR_DIB\82Ì\8dì\90¬\82É\8e¸\94s;
+       }
+       return hr;
+}
+
+HRESULT        CSurface::RestoreDeviceObjectsFromFile()
+{
+       HRESULT hr;
+
+       SAFE_RELEASE( this->pSurface );
+
+       // \8fó\91Ô\83`\83F\83b\83N
+       if( ! CD3DApplication::pDD )
+               return FDKERR_DirectDraw\82ªNULL;
+
+       // \83t\83@\83C\83\8b\82©\82ç\82Ì\89æ\91\9c\93Ç\82Ý\8d\9e\82Ý;
+       //      BMP ... LoadImage() \82ÅBITMAP\83n\83\93\83h\83\8b\82ð\8dì\90¬\82µ\82Ä RestoreFromBitmap()
+       //      JPG ... LoadJPEG() \82Å BITMAPINFO \82ð\8dì\90¬\82µ\82Ä\81@\81@\81@\81@\81V
+       //      PNG ... LoadPNG()  \82Å BITMAPINFO \82ð\8dì\90¬\82µ\82Ä\81@\81@\81@\81@\81V
+       if( ! this->strFileName.empty() )
+       {
+               //-----------------------------
+               // (A) \83r\83b\83g\83}\83b\83v\82Ì\8fê\8d\87
+               HBITMAP hBitmap;
+               if( ( hBitmap = (HBITMAP) ::LoadImage( NULL, this->strFileName.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ) ) != NULL )
+               {
+                       hr = RestoreFromBitmap( hBitmap );
+                       DeleteObject( hBitmap );
+                       return hr;
+               }
+
+               //-----------------------------
+               // (B) \82»\82Ì\91¼\82Ì\8fê\8d\87 \81¨ \83t\83@\83C\83\8b\82ð\83I\81[\83v\83\93\82µ\82Ä\8eí\95Ê\83`\83F\83b\83N
+               BITMAPINFO* pbinfo = NULL;
+               BYTE*           pbdata = NULL;
+
+               FILE* fp;
+               if( _tfopen_s( &fp, this->strFileName.c_str(), _T("rb") ) != 0 )
+                       return FDKERR_\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý\8e¸\94s;
+
+               //-----------------------------
+               // (B1) JPEG \82Ì\8fê\8d\87
+               int h = fgetc( fp ) * 256 + fgetc( fp );
+               fseek( fp, 0, SEEK_SET );
+               if( h == 0xFFD8 && LoadJPEG( fp, &pbinfo, &pbdata ) != 0 )
+               {
+                       hr = RestoreFromBitmap( pbinfo, pbdata );
+                       SAFE_FREE( pbinfo );
+                       SAFE_FREE( pbdata );
+                       fclose( fp );
+                       return hr;
+               }
+               else
+               {
+                       SAFE_FREE( pbinfo );
+                       SAFE_FREE( pbdata );
+               }
+
+               //-----------------------------
+               // (B2) PNG \82Ì\8fê\8d\87
+               fclose( fp );
+               if( LoadPNGtoDIB( this->strFileName.c_str(), &pbinfo, &pbdata ) )
+               {
+                       hr = RestoreFromBitmap( pbinfo, pbdata );
+                       SAFE_FREE( pbinfo );
+                       SAFE_FREE( pbdata );
+                       return hr;
+               }
+               else
+               {
+                       SAFE_FREE( pbinfo );
+                       SAFE_FREE( pbdata );
+               }
+       }
+       else
+               return FDKERR_\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý\8e¸\94s;           // \83t\83@\83C\83\8b\96¼\82Ì\8ew\92è\82ª\82È\82¢
+
+       return S_OK;
+}
+
+HRESULT CSurface::RestoreFromBitmap( HBITMAP hBitmap )
+{
+       HRESULT hr;
+
+       // Bitmap \8fî\95ñ\82Ì\8eæ\93¾ \81¨ bm
+       BITMAP bm;
+       ::GetObject( hBitmap, sizeof( BITMAP ), &bm );
+
+       // \83\81\83\82\83\8aDC \82Ì\8dì\90¬ \81¨ hBDC
+       HDC hBDC;
+       if( ( hBDC = ::CreateCompatibleDC( NULL ) ) == NULL )
+               return FDKERR_DC\82Ì\8eæ\93¾\82É\8e¸\94s;
+
+       // \83T\83C\83Y\92²\90®\81G this->dwWidth, this->dwHeight \82ª\82Æ\82à\82É 0 \82È\82ç\89æ\91\9c\83T\83C\83Y\82É\93\99\82µ\82­\82·\82é\81B
+       if( this->dwWidth == 0 && this->dwHeight == 0 )
+       {
+               this->dwWidth = bm.bmWidth;
+               this->dwHeight = bm.bmHeight;
+       }
+
+       // \83T\83C\83Y\82ª\81ithis->dwWidth, this->dwHeight\81j\82Å\82 \82é\8bó\82Ì\83T\81[\83t\83F\83C\83X\82Ì\8dì\90¬
+       if( FAILED( hr = Create() ) )
+       {
+               ::DeleteDC( hBDC );
+               return hr;      // \8e¸\94s
+       }
+
+       // \83T\81[\83t\83F\83C\83X\82Ì DC \82Ì\8eæ\93¾ \81¨ hSDC
+       HDC hSDC;
+       if( FAILED( hr = this->pSurface->GetDC( &hSDC ) ) )
+       {
+               ::DeleteDC( hBDC );
+               return hr;      // \8e¸\94s
+       }
+
+       // Bitmap DC \82©\82ç \83T\81[\83t\83F\83C\83XDC \82Ö\89æ\91\9c\82ð\93]\91\97\81G
+       // StretchBlt() \82È\82Ì\82Å\81A\83T\83C\83Y\82ª\88Ù\82È\82é\8fê\8d\87\82Í\83T\81[\83t\83F\83C\83X\82Ì\83T\83C\83Y\82É\8ag\91å\81E\8fk\8f¬\82³\82ê\82é\81B
+       ::SelectObject( hBDC, hBitmap );
+       if( ::StretchBlt(
+                       hSDC, 0, 0, this->dwWidth, this->dwHeight,              // \93]\91\97\90æ
+                       hBDC, 0, 0, bm.bmWidth, bm.bmHeight,    // \93]\91\97\8c³
+                       SRCCOPY ) == 0 )
+       {
+               this->pSurface->ReleaseDC( hSDC );
+               ::DeleteDC( hBDC );
+               return FDKERR_StretchBlt\82É\8e¸\94s;
+       }
+
+       // \90¬\8c÷\81A\8bA\8aÒ
+       this->pSurface->ReleaseDC( hSDC );
+       ::DeleteDC( hBDC );
+       return S_OK;
+}
+
+HRESULT CSurface::RestoreFromBitmap( BITMAPINFO* pbinfo, BYTE* pbdata )
+{
+       HRESULT hr;
+
+       // \83T\83C\83Y\92²\90®\81G this->dwWidth, this->dwHeight \82ª\82Æ\82à\82É 0 \82È\82ç\89æ\91\9c\83T\83C\83Y\82É\93\99\82µ\82­\82·\82é\81B
+       if( this->dwWidth == 0 && this->dwHeight == 0 )
+       {
+               this->dwWidth = pbinfo->bmiHeader.biWidth;
+               this->dwHeight = pbinfo->bmiHeader.biHeight;
+       }
+
+       // \83T\83C\83Y\82ª\81ithis->dwWidth, this->dwHeight\81j\82Å\82 \82é\8bó\82Ì\83T\81[\83t\83F\83C\83X\82Ì\8dì\90¬
+       if( FAILED( hr = Create() ) )
+               return hr;      // \8e¸\94s
+
+       // \83T\81[\83t\83F\83C\83X\82Ì DC \82Ì\8eæ\93¾ \81¨ hSDC
+       HDC hSDC;
+       if( FAILED( hr = this->pSurface->GetDC( &hSDC ) ) )
+               return hr;      // \8e¸\94s
+
+       // Jpeg DC \82©\82ç \83T\81[\83t\83F\83C\83XDC \82Ö\89æ\91\9c\82ð\93]\91\97\81G
+       // \81@StretchBlt() \82È\82Ì\82Å\81A\83T\83C\83Y\82ª\88Ù\82È\82é\8fê\8d\87\82Í\83T\81[\83t\83F\83C\83X\82Ì\83T\83C\83Y\82É\8ag\91å\81E\8fk\8f¬\82³\82ê\82é\81B
+       if( StretchDIBits(
+                       hSDC,                                                                                                                   // \93]\91\97\90æ DC
+                       0, 0, this->dwWidth, this->dwHeight,                                                                    // \93]\91\97\90æ\97Ì\88æ
+                       0, 0, pbinfo->bmiHeader.biWidth, pbinfo->bmiHeader.biHeight,    // \93]\91\97\8c³\97Ì\88æ
+                       (LPVOID) pbdata, pbinfo,                                                                                // \83r\83b\83g\83}\83b\83v
+                       DIB_RGB_COLORS, SRCCOPY ) == GDI_ERROR )
+       {
+               this->pSurface->ReleaseDC( hSDC );
+               return FDKERR_StretchBlt\82É\8e¸\94s;
+       }
+
+       // \90¬\8c÷\81A\8bA\8aÒ
+       this->pSurface->ReleaseDC( hSDC );
+       return S_OK;
+}
+
+HRESULT CSurface::Create()
+{
+       HRESULT hr;
+
+       for( int i = 0; i < 3; i++ )    // 3\92Ê\82è\82Ì\90\90¬\82É\92§\90í
+       {
+               DDSURFACEDESC2 ddsd;
+               ::ZeroMemory( &ddsd, sizeof( DDSURFACEDESC2 ) );
+               ddsd.dwSize     = sizeof( DDSURFACEDESC2 );
+
+               switch( i )
+               {
+               case 0:         // (1) \8ew\92è\82³\82ê\82½PIXELFRMAT
+               {
+                       if( this->ddpfReference.dwSize == 0 )
+                               continue;
+                       ddsd.dwFlags    = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
+                       ddsd.dwWidth    = this->dwWidth;
+                       ddsd.dwHeight   = this->dwHeight;
+                       ddsd.ddpfPixelFormat.dwFlags                    = this->ddpfReference.dwFlags;
+                       ddsd.ddpfPixelFormat.dwFourCC                   = this->ddpfReference.dwFourCC;
+                       ddsd.ddpfPixelFormat.dwRGBBitCount              = this->ddpfReference.dwRGBBitCount;
+                       ddsd.ddpfPixelFormat.dwRBitMask                 = this->ddpfReference.dwRBitMask;
+                       ddsd.ddpfPixelFormat.dwGBitMask                 = this->ddpfReference.dwGBitMask;
+                       ddsd.ddpfPixelFormat.dwBBitMask                 = this->ddpfReference.dwBBitMask;
+                       ddsd.ddpfPixelFormat.dwRGBAlphaBitMask  = this->ddpfReference.dwRGBAlphaBitMask;
+                       break;
+               }
+
+               case 1:         // (2) \89æ\96Ê\82Æ\93¯\82¶PIXELFORMAT
+               {
+                       DDSURFACEDESC2 ddsdscr;
+                       ZeroMemory( &ddsdscr, sizeof( DDSURFACEDESC2 ) );
+                       ddsdscr.dwSize = sizeof( DDSURFACEDESC2 );
+                       CD3DApplication::pDD->GetDisplayMode( &ddsdscr );
+                       ddsd.dwFlags    = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
+                       ddsd.dwWidth    = this->dwWidth;
+                       ddsd.dwHeight   = this->dwHeight;
+                       ddsd.ddpfPixelFormat.dwFlags                    = ddsdscr.ddpfPixelFormat.dwFlags;
+                       ddsd.ddpfPixelFormat.dwFourCC                   = ddsdscr.ddpfPixelFormat.dwFourCC;
+                       ddsd.ddpfPixelFormat.dwRGBBitCount              = ddsdscr.ddpfPixelFormat.dwRGBBitCount;
+                       ddsd.ddpfPixelFormat.dwRBitMask                 = ddsdscr.ddpfPixelFormat.dwRBitMask;
+                       ddsd.ddpfPixelFormat.dwGBitMask                 = ddsdscr.ddpfPixelFormat.dwGBitMask;
+                       ddsd.ddpfPixelFormat.dwBBitMask                 = ddsdscr.ddpfPixelFormat.dwBBitMask;
+                       ddsd.ddpfPixelFormat.dwRGBAlphaBitMask  = ddsdscr.ddpfPixelFormat.dwRGBAlphaBitMask;
+                       break;
+               }
+               case 2:         // (3) PIXELFORMAT \82È\82µ
+                       ddsd.dwFlags    = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
+                       ddsd.dwWidth    = this->dwWidth;
+                       ddsd.dwHeight   = this->dwHeight;
+                       break;
+
+               }
+retry:
+               ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | ( (this->place == LOADTO_SYSTEM) ? DDSCAPS_SYSTEMMEMORY : DDSCAPS_VIDEOMEMORY );
+
+               if( FAILED( hr = CD3DApplication::pDD->CreateSurface( &ddsd, &this->pSurface, NULL ) ) )
+               {
+                       if( this->place == LOADTO_VIDEO_OR_SYSTEM )             // LOADTO_VIDEO_OR_SYSTEM \82ª\8ew\92è\82³\82ê\82Ä\82¢\82é\82Æ\82«\82Í\81A
+                       {
+                               this->place = LOADTO_SYSTEM;                            // VIDEO \82É\8e¸\94s\82µ\82½\82ç SYSTEM \82Å\8dì\82è\92¼\82·\81B
+                               goto retry;
+                       }
+               }
+
+               // \8dì\90¬\82É\90¬\8c÷\82µ\82½\82ç\81A\8d\95\82ð\93§\89ß\83L\81[\82É\90Ý\92è\82µ\82Ä\8bA\8aÒ\81B
+               if( SUCCEEDED( hr ) )
+               {
+                       this->SetColorKey( /*( CD3DApplication::nBpp == 16 ) ? 0x0000F000 :*/ 0xFF000000 );
+                       break;
+               }
+       }
+
+       return hr;
+}
+
+HRESULT        CSurface::InvalidateDeviceObjects()
+{
+       SAFE_RELEASE( this->pSurface );
+       return S_OK;
+}
+
+HRESULT        CSurface::DeleteDeviceObjects()
+{
+       SAFE_RELEASE( this->pSurface );
+       this->InitParameters( NULL, NULL, NULL, NULL, NULL, 0, 0, 0, LOADTO_SYSTEM, NULL );
+       return S_OK;
+}
+
+void   CSurface::SetAlphaConst( int a )
+{
+       if( a <   0 ) a =   0;
+       if( a > 255 ) a = 255;
+       this->nAlphaConst = a;
+}
+
+HRESULT CSurface::SetColorKey()
+{
+       HRESULT hr = S_OK;
+
+       if( ! this->pSurface )
+               return FDKERR_\83T\81[\83t\83F\83C\83X\82ªNULL;
+
+       // \8d\8fã\8b÷\82Ì\93_\82Ì\90F\82ð\8eæ\93¾
+       DDSURFACEDESC2 ddsd;
+       ZeroMemory( &ddsd, sizeof(ddsd) );
+       ddsd.dwSize = sizeof(ddsd);
+       if( SUCCEEDED( hr = this->pSurface->Lock( NULL, &ddsd, DDLOCK_WAIT, NULL ) ) )
+       {
+               DWORD dwBits = ddsd.ddpfPixelFormat.dwRGBBitCount;
+               this->dwColorKey = (*(DWORD*)ddsd.lpSurface) & ((dwBits == 16) ? 0x0000FFFF : 0xFFFFFFFF);
+               this->pSurface->Unlock( NULL );
+
+        // \83J\83\89\81[\83L\81[\82Æ\82µ\82Ä\90Ý\92è
+               DDCOLORKEY ddck;
+               ddck.dwColorSpaceLowValue  = this->dwColorKey;
+               ddck.dwColorSpaceHighValue = this->dwColorKey;
+               this->pSurface->SetColorKey( DDCKEY_SRCBLT, &ddck );
+       }
+       else
+               return hr;
+
+       return S_OK;
+}
+
+HRESULT CSurface::SetColorKey( DWORD dwColor )
+{
+       if( ! this->pSurface )
+               return FDKERR_\83T\81[\83t\83F\83C\83X\82ªNULL;
+
+       // \83J\83\89\81[\83L\81[\82Æ\82µ\82Ä\90Ý\92è
+       DDCOLORKEY ddck;
+       ddck.dwColorSpaceLowValue  = dwColor;
+       ddck.dwColorSpaceHighValue = dwColor;
+       this->pSurface->SetColorKey( DDCKEY_SRCBLT, &ddck );
+       this->dwColorKey = dwColor;
+
+       return S_OK;
+}
+
+HRESULT CSurface::GetDC( HDC *phdc )
+{
+       if( ! this->pSurface )
+               return FDKERR_\83T\81[\83t\83F\83C\83X\82ªNULL;
+       if( ! phdc )
+               return E_INVALIDARG;
+
+       this->LostCheck();              // \83\8d\83X\83g\82µ\82Ä\82¢\82ê\82Î\95\9c\8b\8c\82·\82é
+
+       return this->pSurface->GetDC( phdc );
+}
+
+HRESULT CSurface::ReleaseDC( HDC &phdc )
+{
+       if( ! this->pSurface )
+               return FDKERR_\83T\81[\83t\83F\83C\83X\82ªNULL;
+
+       return this->pSurface->ReleaseDC( phdc );
+}
+
+HRESULT CSurface::Clear( LPRECT prc )
+{
+       if( this->pSurface == NULL )
+               return FDKERR_\83T\81[\83t\83F\83C\83X\82ªNULL;
+
+       this->LostCheck();              // \83\8d\83X\83g\82µ\82Ä\82¢\82ê\82Î\95\9c\8b\8c\82·\82é
+
+       DDBLTFX ddbltfx;
+       ::ZeroMemory( &ddbltfx, sizeof( ddbltfx ) );
+       ddbltfx.dwSize = sizeof( ddbltfx );
+       ddbltfx.dwFillColor = 0;
+       this->pSurface->Blt( prc, NULL, NULL, DDBLT_COLORFILL, &ddbltfx );
+       return S_OK;
+}
+
+DWORD  CSurface::GetSurfaceSize()
+{
+       if( ! this->pSurface )
+               return 0;
+
+       this->LostCheck();              // \83\8d\83X\83g\82µ\82Ä\82¢\82ê\82Î\95\9c\8b\8c\82·\82é
+
+       DDSURFACEDESC2 ddsd;
+       ZeroMemory( &ddsd, sizeof( ddsd ) );
+       ddsd.dwSize     = sizeof( ddsd );
+       if( FAILED( this->pSurface->GetSurfaceDesc( &ddsd ) ) )
+               return 0;
+
+       DWORD dwSize = 0;
+       for( DWORD y = 0; y < ddsd.dwHeight; y++ )
+               dwSize += ddsd.lPitch;
+
+       return dwSize;
+}
+HRESULT CSurface::Draw( LPDIRECTDRAWSURFACE7 pDest, int x, int y, LPCRECT pSrc )
+{
+       HRESULT hr;
+
+       // \83¿\82ª 255 \96¢\96\9e\82Ì\8fê\8d\87\82Í\81A\83\\83t\83g\83E\83F\83A\82Å\8d\87\90¬\95`\89æ\82·\82é\81B
+       if( this->nAlphaConst != 255 )
+               return this->BlendDraw( pDest, x, y, pSrc );
+
+       if( ! this->pSurface || ! pDest )
+               return FDKERR_\83T\81[\83t\83F\83C\83X\82ªNULL;
+
+       this->LostCheck();              // \83\8d\83X\83g\82µ\82Ä\82¢\82ê\82Î\95\9c\8b\8c\82·\82é
+
+       // \93]\91\97\8c³\97Ì\88æ(rcSrc)\82Ì\8eZ\8fo
+       RECT rcSrc = { 0, 0, this->dwWidth, this->dwHeight };
+       if( pSrc )
+               rcSrc = *pSrc;
+
+       // \93]\91\97\90æ\97Ì\88æ(rcDest)\82Ì\8eZ\8fo
+       RECT rcDest;
+       DDSURFACEDESC2 ddsd;
+       ::ZeroMemory( &ddsd, sizeof( ddsd ) );
+       ddsd.dwSize = sizeof( ddsd );
+       pDest->GetSurfaceDesc( &ddsd );
+       ::SetRect( &rcDest, 0, 0, ddsd.dwWidth, ddsd.dwHeight );
+
+       // \83N\83\8a\83b\83s\83\93\83O
+       int nSrcWidth   = rcSrc.right   - rcSrc.left;
+       int nSrcHeight  = rcSrc.bottom  - rcSrc.top;
+       int nDestWidth  = rcDest.right  - rcDest.left;
+       int nDestHeight = rcDest.bottom - rcDest.top;
+       if( ( x + nSrcWidth ) < 0 || ( y + nSrcHeight ) < 0 || x > nDestWidth || y > nDestHeight ) return S_OK;
+       if( x < 0 ) { rcSrc.left += (-x); x = 0; }
+       if( y < 0 ) { rcSrc.top  += (-y); y = 0; }
+       if( x + nSrcWidth  > nDestWidth  ) { rcSrc.right  -= x + nSrcWidth  - nDestWidth;  }
+       if( y + nSrcHeight > nDestHeight ) { rcSrc.bottom -= y + nSrcHeight - nDestHeight; }
+       if( rcSrc.right - rcSrc.left <= 0 || rcSrc.bottom - rcSrc.top <= 0 ) return S_OK;
+
+       // \95`\89æ
+       SetRect( &rcDest, x, y, x+rcSrc.right-rcSrc.left, y+rcSrc.bottom-rcSrc.top );
+       DWORD dwFlags = DDBLT_WAIT | ( this->bColorKeyEnable ? DDBLT_KEYSRC : 0L );
+       hr = pDest->Blt( &rcDest, this->pSurface, &rcSrc, dwFlags, NULL );
+
+/*
+       // \93]\91\97\90æ\82ª\83r\83f\83I\83\81\83\82\83\8a\82È\82ç bDestOnVideo = true
+       bool bDestOnVideo;
+       DDSCAPS2 ddsc;
+       ZeroMemory( &ddsc, sizeof( DDSCAPS2 ) );
+       pDest->GetCaps( &ddsc );
+       bDestOnVideo = ( ddsc.dwCaps & DDSCAPS_SYSTEMMEMORY ) ? false : true;
+
+       // \93]\91\97\81i\95`\89æ\81j
+       HRESULT hr;
+       if( bDestOnVideo )
+       {
+               // \93]\91\97\90æ\82ª\83r\83f\83I\83\81\83\82\83\8a\82È\82çBltFast()\82ð\8eg\82¤
+               DWORD dwFlags = DDBLTFAST_WAIT | ( this->bColorKeyEnable ? DDBLTFAST_SRCCOLORKEY : DDBLTFAST_NOCOLORKEY );
+               if( FAILED( hr = pDest->BltFast( x, y, m_pSurface, &rcSrc, dwFlags ) ) )
+               {
+                       // \8e¸\94s\82µ\82½\82çBlt()\82ð\8eg\82¤
+                       RECT rcDest = { x, y, x+rcSrc.right-rcSrc.left, y+rcSrc.bottom-rcSrc.top };
+                       dwFlags = DDBLT_WAIT | ( this->bColorKeyEnable ? DDBLT_KEYSRC : 0L );
+                       hr = pDest->Blt( &rcDest, m_pSurface, &rcSrc, dwFlags, NULL );
+                       return hr;
+               }
+       }
+       else
+       {
+               // \93]\91\97\90æ\82ª\83V\83X\83e\83\80\83\81\83\82\83\8a\82È\82çBlt()\82ð\8eg\82¤
+               RECT rcDest = { x, y, x+rcSrc.right-rcSrc.left, y+rcSrc.bottom-rcSrc.top };
+               DWORD dwFlags = DDBLT_WAIT | ( this->bColorKeyEnable ? DDBLT_KEYSRC : 0L );
+               hr = pDest->Blt( &rcDest, m_pSurface, &rcSrc, dwFlags, NULL );
+               return hr;
+       }
+*/
+       return hr;
+}
+
+HRESULT CSurface::BlendDraw( LPDIRECTDRAWSURFACE7 pDest, int x, int y, LPCRECT prcSrc )
+{
+       if( ! this->pSurface || ! pDest )
+               return FDKERR_\83T\81[\83t\83F\83C\83X\82ªNULL;
+
+       RECT rcSrc = { 0, 0, this->dwWidth, this->dwHeight };
+       if( prcSrc == NULL ) prcSrc = &rcSrc;
+
+       this->LostCheck();              // \83\8d\83X\83g\82µ\82Ä\82¢\82ê\82Î\95\9c\8b\8c\82·\82é
+
+       // \93]\91\97\90æ\83T\81[\83t\83F\83C\83X\82Ì\83\8d\83b\83N
+       DDSURFACEDESC2 ddsdDst;
+       ::ZeroMemory( &ddsdDst, sizeof(ddsdDst) );
+       ddsdDst.dwSize = sizeof(ddsdDst);
+       if( FAILED( pDest->Lock( NULL, &ddsdDst, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL ) ) )
+               return FDKERR_Lock\82É\8e¸\94s;
+
+       // \93]\91\97\8c³\83T\81[\83t\83F\83C\83X\82Ì\83\8d\83b\83N
+       DDSURFACEDESC2 ddsdSrc;
+       ::ZeroMemory( &ddsdSrc, sizeof(ddsdSrc) );
+       ddsdSrc.dwSize = sizeof(ddsdSrc);
+       if( FAILED( this->pSurface->Lock( NULL, &ddsdSrc, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL ) ) )
+               return FDKERR_Lock\82É\8e¸\94s;
+
+       switch( ddsdDst.ddpfPixelFormat.dwRGBBitCount )
+       {
+       case 4: //      16\90F\94ñ\91Î\89\9e
+       case 8: //      256\90F\94ñ\91Î\89\9e
+               break;
+
+       case 16:
+               switch( ddsdSrc.ddpfPixelFormat.dwRGBBitCount )
+               {
+               case 16: BlendDraw16to16( &ddsdSrc, prcSrc, &ddsdDst, x, y ); break;
+               case 24: BlendDraw24to16( &ddsdSrc, prcSrc, &ddsdDst, x, y ); break;
+               case 32: BlendDraw32to16( &ddsdSrc, prcSrc, &ddsdDst, x, y ); break;
+               }
+               break;
+
+       case 24: 
+       {
+               switch( ddsdSrc.ddpfPixelFormat.dwRGBBitCount )
+               {
+               case 16: BlendDraw16to24( &ddsdSrc, prcSrc, &ddsdDst, x, y ); break;
+               case 24: BlendDraw24to24( &ddsdSrc, prcSrc, &ddsdDst, x, y ); break;
+               case 32: BlendDraw32to24( &ddsdSrc, prcSrc, &ddsdDst, x, y ); break;
+               }
+       } break;
+
+       case 32:
+               switch( ddsdSrc.ddpfPixelFormat.dwRGBBitCount )
+               {
+               case 16: BlendDraw16to32( &ddsdSrc, prcSrc, &ddsdDst, x, y ); break;
+               case 24: BlendDraw24to32( &ddsdSrc, prcSrc, &ddsdDst, x, y ); break;
+               case 32: BlendDraw32to32( &ddsdSrc, prcSrc, &ddsdDst, x, y ); break;
+               }
+               break;
+       }
+
+       this->pSurface->Unlock( NULL );
+       pDest->Unlock( NULL );
+       return S_OK;
+}
+
+void   CSurface::BlendDraw32to32( LPDDSURFACEDESC2 pddsdSrc, LPCRECT prcSrc, LPDDSURFACEDESC2 pddsdDst, int x, int y )
+{
+       int x2 = x + prcSrc->right  - prcSrc->left; /* x2 = x + Width  */
+       int y2 = y + prcSrc->bottom - prcSrc->top;  /* y2 = y + Height */
+
+       int a = this->nAlphaConst;
+       if( a == 255 ) a = 256;
+
+       LONG lPitchDst = pddsdDst->lPitch;
+       LONG lPitchSrc = pddsdSrc->lPitch;
+
+       // \88È\89º\81A\90F\8aÖ\8cW\82Ì\94z\97ñ\95Ï\90\94\82Ì\93Y\82¦\8e\9a\82Í [0]=R, [1]=G, [2]=B, [3]=A \82Æ\82·\82é\81B
+       DWORD MaskSrc[4], MaskSrcBit[4], MaskSrcShift[4];
+       DWORD MaskDst[4], MaskDstBit[4], MaskDstShift[4];
+
+       MaskSrc[0] = pddsdSrc->ddpfPixelFormat.dwRBitMask;
+       MaskSrc[1] = pddsdSrc->ddpfPixelFormat.dwGBitMask;
+       MaskSrc[2] = pddsdSrc->ddpfPixelFormat.dwBBitMask;
+       MaskSrc[3] = pddsdSrc->ddpfPixelFormat.dwRGBAlphaBitMask;
+       MaskDst[0] = pddsdDst->ddpfPixelFormat.dwRBitMask;
+       MaskDst[1] = pddsdDst->ddpfPixelFormat.dwGBitMask;
+       MaskDst[2] = pddsdDst->ddpfPixelFormat.dwBBitMask;
+       MaskDst[3] = pddsdDst->ddpfPixelFormat.dwRGBAlphaBitMask;
+       for( int i = 0; i < 4; i++ ) {
+        MaskSrcBit[i]   = BitCount( MaskSrc[i] );
+               MaskSrcShift[i] = ShiftCount( MaskSrc[i] );
+        MaskDstBit[i]   = BitCount( MaskDst[i] );
+               MaskDstShift[i] = ShiftCount( MaskDst[i] );
+       }
+
+       DWORD *ps = (DWORD*)pddsdSrc->lpSurface;
+       DWORD *pd = (DWORD*)pddsdDst->lpSurface;
+
+       ps = (DWORD*)((BYTE*)ps+(lPitchSrc *prcSrc->top)) + prcSrc->left - x;   // \93]\91\97\8c³\82Ì\8aJ\8en (x,y) \8dÀ\95W
+       pd = (DWORD*)((BYTE*)pd+(lPitchDst *y));                                                                // \93]\91\97\90æ\82Ì\8aJ\8en (0,y) \8dÀ\95W
+
+       for( int y3 = y; y3 < y2; y3++ )
+       {
+               for( int x3 = x; x3 < x2; x3++ )
+               {
+                       // srcpx[] \81¨ \93]\91\97\8c³\82Ì\90F\82ð\93]\91\97\90æ\82ÌRGBA\83t\83H\81[\83}\83b\83g\82É\91\9d\8c¸\90F
+                       // dstpx[] \81¨ \93]\91\97\90æ\82Ì\90F
+                       DWORD srcpx[3], dstpx[3], pixel=0;
+                       for( int i = 0; i < 3; i++ )
+                       {
+                               srcpx[i] = ( ps[x3] & MaskSrc[i] ) >> MaskSrcShift[i];
+
+                               if( MaskSrcBit[i] < MaskDstBit[i] )                                     // \97á: Bit\90\94 4 \81¨ 5 \82È\82ç
+                                       srcpx[i] <<= ( MaskDstBit[i] - MaskSrcBit[i] ); //     1 \82¾\82¯\8d\82É\83V\83t\83g\82·\82é\81B
+                               else if( MaskSrcBit[i] > MaskDstBit[i] )                        // \97á: BitCount 5 \81¨ 4 \82È\82ç
+                                       srcpx[i] >>= ( MaskSrcBit[i] - MaskDstBit[i] ); //     1 \82¾\82¯\89E\82É\83V\83t\83g\82·\82é\81B
+                               srcpx[i] <<= MaskDstShift[i];
+
+                               dstpx[i] = pd[x3] & MaskDst[i];
+
+                               // \90V\93]\91\97\90æ = \93]\91\97\8c³\81~\83¿ + \93]\91\97\90æ\81~(1-\83¿);
+                               //   \90æ\82É DWORD\81~a \82·\82é\82Ì\82Å\81A\8c\85\82 \82Ó\82ê\82µ\82È\82¢\82æ\82¤ DWORDLONG \82Å\83\89\83b\83s\83\93\83O\82·\82é\81B
+                               pixel |= ( ( (DWORDLONG)srcpx[i]*(a) + (DWORDLONG)dstpx[i]*(256-a) ) >> 8 ) & MaskDst[i];
+                       }
+
+                       if( MaskDst[3] != 0 ) pixel |= MaskDst[3];              // \93]\91\97\90æ\82É\83A\83\8b\83t\83@\83r\83b\83g\82ª\82 \82é\82È\82ç\8fí\82ÉMAX\82ð\90Ý\92è
+                       pd[x3] = pixel;
+               }
+               ps = (DWORD*)((BYTE*)ps+lPitchSrc );
+               pd = (DWORD*)((BYTE*)pd+lPitchDst ); // \82P\83\89\83X\83^\95ª\82Ì\91\9d\97Ê
+               // BYTE\82É\83L\83\83\83X\83g\82µ\82Ä\82¨\82©\82È\82¢\82Æ\8cv\8eZ\8aÔ\88á\82¤
+       }
+}
+
+void   CSurface::BlendDraw32to24( LPDDSURFACEDESC2 pddsdSrc, LPCRECT prcSrc, LPDDSURFACEDESC2 pddsdDst, int x, int y )
+{
+       int x2 = x + prcSrc->right  - prcSrc->left; /* x2 = x + Width  */
+       int y2 = y + prcSrc->bottom - prcSrc->top;  /* y2 = y + Height */
+
+       int a = this->nAlphaConst;
+       if( a == 255 ) a = 256;
+
+       LONG lPitchDst = pddsdDst->lPitch;
+       LONG lPitchSrc = pddsdSrc->lPitch;
+
+       // \88È\89º\81A\90F\8aÖ\8cW\82Ì\94z\97ñ\95Ï\90\94\82Ì\93Y\82¦\8e\9a\82Í [0]=R, [1]=G, [2]=B, [3]=A \82Æ\82·\82é\81B
+       DWORD MaskSrc[4], MaskSrcBit[4], MaskSrcShift[4];
+       DWORD MaskDst[4], MaskDstBit[4], MaskDstShift[4];
+
+       MaskSrc[0] = pddsdSrc->ddpfPixelFormat.dwRBitMask;
+       MaskSrc[1] = pddsdSrc->ddpfPixelFormat.dwGBitMask;
+       MaskSrc[2] = pddsdSrc->ddpfPixelFormat.dwBBitMask;
+       MaskSrc[3] = pddsdSrc->ddpfPixelFormat.dwRGBAlphaBitMask;
+       MaskDst[0] = pddsdDst->ddpfPixelFormat.dwRBitMask;
+       MaskDst[1] = pddsdDst->ddpfPixelFormat.dwGBitMask;
+       MaskDst[2] = pddsdDst->ddpfPixelFormat.dwBBitMask;
+       MaskDst[3] = pddsdDst->ddpfPixelFormat.dwRGBAlphaBitMask;
+       for( int i = 0; i < 4; i++ ) {
+        MaskSrcBit[i]   = BitCount( MaskSrc[i] );
+               MaskSrcShift[i] = ShiftCount( MaskSrc[i] );
+        MaskDstBit[i]   = BitCount( MaskDst[i] );
+               MaskDstShift[i] = ShiftCount( MaskDst[i] );
+       }
+
+       DWORD *ps = (DWORD*)pddsdSrc->lpSurface;
+        BYTE *pd = ( BYTE*)pddsdDst->lpSurface;
+
+       ps = (DWORD*)((BYTE*)ps+(lPitchSrc *prcSrc->top)) + prcSrc->left - x;   // \93]\91\97\8c³\82Ì\8aJ\8en (x,y) \8dÀ\95W
+       pd = ( BYTE*)((BYTE*)pd+(lPitchDst *y));                                                                // \93]\91\97\90æ\82Ì\8aJ\8en (0,y) \8dÀ\95W
+
+       for( int y3 = y; y3 < y2; y3++ )
+       {
+               for( int x3 = x; x3 < x2; x3++ )
+               {
+                       // srcpx[] \81¨ \93]\91\97\8c³\82Ì\90F\82ð\93]\91\97\90æ\82ÌRGBA\83t\83H\81[\83}\83b\83g\82É\91\9d\8c¸\90F
+                       // dstpx[] \81¨ \93]\91\97\90æ\82Ì\90F
+                       DWORD srcpx[3], dstpx[3], pixel;
+                       for( int i = 0; i < 3; i++ )
+                       {
+                               srcpx[i] = ( ps[x3] & MaskSrc[i] ) >> MaskSrcShift[i];
+
+                               if( MaskSrcBit[i] < MaskDstBit[i] )                                     // \97á: Bit\90\94 4 \81¨ 5 \82È\82ç
+                                       srcpx[i] <<= ( MaskDstBit[i] - MaskSrcBit[i] ); //     1 \82¾\82¯\8d\82É\83V\83t\83g\82·\82é\81B
+                               else if( MaskSrcBit[i] > MaskDstBit[i] )                        // \97á: BitCount 5 \81¨ 4 \82È\82ç
+                                       srcpx[i] >>= ( MaskSrcBit[i] - MaskDstBit[i] ); //     1 \82¾\82¯\89E\82É\83V\83t\83g\82·\82é\81B
+                               srcpx[i] <<= MaskDstShift[i];
+
+                               dstpx[i] = ( pd[x3*3] | (pd[x3*3+1]<<8) | (pd[x3*3+2]<<16) ) & MaskDst[i];
+
+                               // \90V\93]\91\97\90æ = \93]\91\97\8c³\81~\83¿ + \93]\91\97\90æ\81~(1-\83¿);
+                               //   \90æ\82É DWORD\81~a \82·\82é\82Ì\82Å\81A\8c\85\82 \82Ó\82ê\82µ\82È\82¢\82æ\82¤ DWORDLONG \82Å\83\89\83b\83s\83\93\83O\82·\82é\81B
+                               pixel |= ( ( (DWORDLONG)srcpx[i]*(a) + (DWORDLONG)dstpx[i]*(256-a) ) >> 8 ) & MaskDst[i];
+                       }
+
+                       if( MaskDst[3] != 0 ) pixel |= MaskDst[3];              // \93]\91\97\90æ\82É\83A\83\8b\83t\83@\83r\83b\83g\82ª\82 \82é\82È\82ç\8fí\82ÉMAX\82ð\90Ý\92è
+                       pd[x3*3+0] = (BYTE)((pixel >>  0) & 0xFF);
+                       pd[x3*3+1] = (BYTE)((pixel >>  8) & 0xFF);
+                       pd[x3*3+2] = (BYTE)((pixel >> 16) & 0xFF);
+               }
+               ps = (DWORD*)((BYTE*)ps+lPitchSrc );
+               pd = ( BYTE*)((BYTE*)pd+lPitchDst ); // \82P\83\89\83X\83^\95ª\82Ì\91\9d\97Ê
+               // BYTE\82É\83L\83\83\83X\83g\82µ\82Ä\82¨\82©\82È\82¢\82Æ\8cv\8eZ\8aÔ\88á\82¤
+       }
+}
+
+void   CSurface::BlendDraw32to16( LPDDSURFACEDESC2 pddsdSrc, LPCRECT prcSrc, LPDDSURFACEDESC2 pddsdDst, int x, int y )
+{
+       int x2 = x + prcSrc->right  - prcSrc->left; /* x2 = x + Width  */
+       int y2 = y + prcSrc->bottom - prcSrc->top;  /* y2 = y + Height */
+
+       int a = this->nAlphaConst;
+       if( a == 255 ) a = 256;
+
+       LONG lPitchDst = pddsdDst->lPitch;
+       LONG lPitchSrc = pddsdSrc->lPitch;
+
+       // \88È\89º\81A\90F\8aÖ\8cW\82Ì\94z\97ñ\95Ï\90\94\82Ì\93Y\82¦\8e\9a\82Í [0]=R, [1]=G, [2]=B, [3]=A \82Æ\82·\82é\81B
+       DWORD MaskSrc[4], MaskSrcBit[4], MaskSrcShift[4];
+       DWORD MaskDst[4], MaskDstBit[4], MaskDstShift[4];
+
+       MaskSrc[0] = pddsdSrc->ddpfPixelFormat.dwRBitMask;
+       MaskSrc[1] = pddsdSrc->ddpfPixelFormat.dwGBitMask;
+       MaskSrc[2] = pddsdSrc->ddpfPixelFormat.dwBBitMask;
+       MaskSrc[3] = pddsdSrc->ddpfPixelFormat.dwRGBAlphaBitMask;
+       MaskDst[0] = pddsdDst->ddpfPixelFormat.dwRBitMask;
+       MaskDst[1] = pddsdDst->ddpfPixelFormat.dwGBitMask;
+       MaskDst[2] = pddsdDst->ddpfPixelFormat.dwBBitMask;
+       MaskDst[3] = pddsdDst->ddpfPixelFormat.dwRGBAlphaBitMask;
+       for( int i = 0; i < 4; i++ ) {
+        MaskSrcBit[i]   = BitCount( MaskSrc[i] );
+               MaskSrcShift[i] = ShiftCount( MaskSrc[i] );
+        MaskDstBit[i]   = BitCount( MaskDst[i] );
+               MaskDstShift[i] = ShiftCount( MaskDst[i] );
+       }
+
+       DWORD *ps = (DWORD*)pddsdSrc->lpSurface;
+        WORD *pd = ( WORD*)pddsdDst->lpSurface;
+
+       ps = (DWORD*)((BYTE*)ps+(lPitchSrc *prcSrc->top)) + prcSrc->left - x;   // \93]\91\97\8c³\82Ì\8aJ\8en (x,y) \8dÀ\95W
+       pd = ( WORD*)((BYTE*)pd+(lPitchDst *y));                                                                // \93]\91\97\90æ\82Ì\8aJ\8en (0,y) \8dÀ\95W
+
+       for( int y3 = y; y3 < y2; y3++ )
+       {
+               for( int x3 = x; x3 < x2; x3++ )
+               {
+                       // srcpx[] \81¨ \93]\91\97\8c³\82Ì\90F\82ð\93]\91\97\90æ\82ÌRGBA\83t\83H\81[\83}\83b\83g\82É\91\9d\8c¸\90F
+                       // dstpx[] \81¨ \93]\91\97\90æ\82Ì\90F
+                       DWORD srcpx[3], dstpx[3], pixel=0;
+                       for( int i = 0; i < 3; i++ )
+                       {
+                               srcpx[i] = ( ps[x3] & MaskSrc[i] ) >> MaskSrcShift[i];
+
+                               if( MaskSrcBit[i] < MaskDstBit[i] )                                     // \97á: Bit\90\94 4 \81¨ 5 \82È\82ç
+                                       srcpx[i] <<= ( MaskDstBit[i] - MaskSrcBit[i] ); //     1 \82¾\82¯\8d\82É\83V\83t\83g\82·\82é\81B
+                               else if( MaskSrcBit[i] > MaskDstBit[i] )                        // \97á: BitCount 5 \81¨ 4 \82È\82ç
+                                       srcpx[i] >>= ( MaskSrcBit[i] - MaskDstBit[i] ); //     1 \82¾\82¯\89E\82É\83V\83t\83g\82·\82é\81B
+                               srcpx[i] <<= MaskDstShift[i];
+
+                               dstpx[i] = pd[x3] & MaskDst[i];
+
+                               // \90V\93]\91\97\90æ = \93]\91\97\8c³\81~\83¿ + \93]\91\97\90æ\81~(1-\83¿);
+                               pixel |= ( ( (DWORD)srcpx[i]*(a) + (DWORD)dstpx[i]*(256-a) ) >> 8 ) & MaskDst[i];
+                       }
+
+                       if( MaskDst[3] != 0 ) pixel |= MaskDst[3];              // \93]\91\97\90æ\82É\83A\83\8b\83t\83@\83r\83b\83g\82ª\82 \82é\82È\82ç\8fí\82ÉMAX\82ð\90Ý\92è
+                       pd[x3] = (WORD) pixel;
+               }
+               ps = (DWORD*)((BYTE*)ps+lPitchSrc );
+               pd = ( WORD*)((BYTE*)pd+lPitchDst ); // \82P\83\89\83X\83^\95ª\82Ì\91\9d\97Ê
+               // BYTE\82É\83L\83\83\83X\83g\82µ\82Ä\82¨\82©\82È\82¢\82Æ\8cv\8eZ\8aÔ\88á\82¤
+       }
+
+}
+
+void   CSurface::BlendDraw24to32( LPDDSURFACEDESC2 pddsdSrc, LPCRECT prcSrc, LPDDSURFACEDESC2 pddsdDst, int x, int y )
+{
+       int x2 = x + prcSrc->right  - prcSrc->left; /* x2 = x + Width  */
+       int y2 = y + prcSrc->bottom - prcSrc->top;  /* y2 = y + Height */
+
+       int a = this->nAlphaConst;
+       if( a == 255 ) a = 256;
+
+       LONG lPitchDst = pddsdDst->lPitch;
+       LONG lPitchSrc = pddsdSrc->lPitch;
+
+       // \88È\89º\81A\90F\8aÖ\8cW\82Ì\94z\97ñ\95Ï\90\94\82Ì\93Y\82¦\8e\9a\82Í [0]=R, [1]=G, [2]=B, [3]=A \82Æ\82·\82é\81B
+       DWORD MaskSrc[4], MaskSrcBit[4], MaskSrcShift[4];
+       DWORD MaskDst[4], MaskDstBit[4], MaskDstShift[4];
+
+       MaskSrc[0] = pddsdSrc->ddpfPixelFormat.dwRBitMask;
+       MaskSrc[1] = pddsdSrc->ddpfPixelFormat.dwGBitMask;
+       MaskSrc[2] = pddsdSrc->ddpfPixelFormat.dwBBitMask;
+       MaskSrc[3] = pddsdSrc->ddpfPixelFormat.dwRGBAlphaBitMask;
+       MaskDst[0] = pddsdDst->ddpfPixelFormat.dwRBitMask;
+       MaskDst[1] = pddsdDst->ddpfPixelFormat.dwGBitMask;
+       MaskDst[2] = pddsdDst->ddpfPixelFormat.dwBBitMask;
+       MaskDst[3] = pddsdDst->ddpfPixelFormat.dwRGBAlphaBitMask;
+       for( int i = 0; i < 4; i++ ) {
+        MaskSrcBit[i]   = BitCount( MaskSrc[i] );
+               MaskSrcShift[i] = ShiftCount( MaskSrc[i] );
+        MaskDstBit[i]   = BitCount( MaskDst[i] );
+               MaskDstShift[i] = ShiftCount( MaskDst[i] );
+       }
+
+        BYTE *ps = ( BYTE*)pddsdSrc->lpSurface;
+       DWORD *pd = (DWORD*)pddsdDst->lpSurface;
+
+       ps = ( BYTE*)((BYTE*)ps+(lPitchSrc *prcSrc->top)) + prcSrc->left - x;   // \93]\91\97\8c³\82Ì\8aJ\8en (x,y) \8dÀ\95W
+       pd = (DWORD*)((BYTE*)pd+(lPitchDst *y));                                                                // \93]\91\97\90æ\82Ì\8aJ\8en (0,y) \8dÀ\95W
+
+       for( int y3 = y; y3 < y2; y3++ )
+       {
+               for( int x3 = x; x3 < x2; x3++ )
+               {
+                       // srcpx[] \81¨ \93]\91\97\8c³\82Ì\90F\82ð\93]\91\97\90æ\82ÌRGBA\83t\83H\81[\83}\83b\83g\82É\91\9d\8c¸\90F
+                       // dstpx[] \81¨ \93]\91\97\90æ\82Ì\90F
+                       DWORD srcpx[3], dstpx[3], pixel=0;
+                       for( int i = 0; i < 3; i++ )
+                       {
+                               srcpx[i] = ( ( ps[x3*3] | (ps[x3*3+1]<<8) | (ps[x3*3+2]<<16) ) & MaskSrc[i] ) >> MaskSrcShift[i];
+
+                               if( MaskSrcBit[i] < MaskDstBit[i] )                                     // \97á: Bit\90\94 4 \81¨ 5 \82È\82ç
+                                       srcpx[i] <<= ( MaskDstBit[i] - MaskSrcBit[i] ); //     1 \82¾\82¯\8d\82É\83V\83t\83g\82·\82é\81B
+                               else if( MaskSrcBit[i] > MaskDstBit[i] )                        // \97á: BitCount 5 \81¨ 4 \82È\82ç
+                                       srcpx[i] >>= ( MaskSrcBit[i] - MaskDstBit[i] ); //     1 \82¾\82¯\89E\82É\83V\83t\83g\82·\82é\81B
+                               srcpx[i] <<= MaskDstShift[i];
+
+                               dstpx[i] = pd[x3] & MaskDst[i];
+
+                               // \90V\93]\91\97\90æ = \93]\91\97\8c³\81~\83¿ + \93]\91\97\90æ\81~(1-\83¿);
+                               //   \90æ\82É DWORD\81~a \82·\82é\82Ì\82Å\81A\8c\85\82 \82Ó\82ê\82µ\82È\82¢\82æ\82¤ DWORDLONG \82Å\83\89\83b\83s\83\93\83O\82·\82é\81B
+                               pixel |= ( ( (DWORDLONG)srcpx[i]*(a) + (DWORDLONG)dstpx[i]*(256-a) ) >> 8 ) & MaskDst[i];
+                       }
+
+                       if( MaskDst[3] != 0 ) pixel |= MaskDst[3];              // \93]\91\97\90æ\82É\83A\83\8b\83t\83@\83r\83b\83g\82ª\82 \82é\82È\82ç\8fí\82ÉMAX\82ð\90Ý\92è
+                       pd[x3] = pixel;
+               }
+               ps = ( BYTE*)((BYTE*)ps+lPitchSrc );
+               pd = (DWORD*)((BYTE*)pd+lPitchDst ); // \82P\83\89\83X\83^\95ª\82Ì\91\9d\97Ê
+               // BYTE\82É\83L\83\83\83X\83g\82µ\82Ä\82¨\82©\82È\82¢\82Æ\8cv\8eZ\8aÔ\88á\82¤
+       }
+}
+
+void   CSurface::BlendDraw24to24( LPDDSURFACEDESC2 pddsdSrc, LPCRECT prcSrc, LPDDSURFACEDESC2 pddsdDst, int x, int y )
+{
+       int x2 = x + prcSrc->right  - prcSrc->left; /* x2 = x + Width  */
+       int y2 = y + prcSrc->bottom - prcSrc->top;  /* y2 = y + Height */
+
+       int a = this->nAlphaConst;
+       if( a == 255 ) a = 256;
+
+       LONG lPitchDst = pddsdDst->lPitch;
+       LONG lPitchSrc = pddsdSrc->lPitch;
+
+       // \88È\89º\81A\90F\8aÖ\8cW\82Ì\94z\97ñ\95Ï\90\94\82Ì\93Y\82¦\8e\9a\82Í [0]=R, [1]=G, [2]=B, [3]=A \82Æ\82·\82é\81B
+       DWORD MaskSrc[4], MaskSrcBit[4], MaskSrcShift[4];
+       DWORD MaskDst[4], MaskDstBit[4], MaskDstShift[4];
+
+       MaskSrc[0] = pddsdSrc->ddpfPixelFormat.dwRBitMask;
+       MaskSrc[1] = pddsdSrc->ddpfPixelFormat.dwGBitMask;
+       MaskSrc[2] = pddsdSrc->ddpfPixelFormat.dwBBitMask;
+       MaskSrc[3] = pddsdSrc->ddpfPixelFormat.dwRGBAlphaBitMask;
+       MaskDst[0] = pddsdDst->ddpfPixelFormat.dwRBitMask;
+       MaskDst[1] = pddsdDst->ddpfPixelFormat.dwGBitMask;
+       MaskDst[2] = pddsdDst->ddpfPixelFormat.dwBBitMask;
+       MaskDst[3] = pddsdDst->ddpfPixelFormat.dwRGBAlphaBitMask;
+       for( int i = 0; i < 4; i++ ) {
+        MaskSrcBit[i]   = BitCount( MaskSrc[i] );
+               MaskSrcShift[i] = ShiftCount( MaskSrc[i] );
+        MaskDstBit[i]   = BitCount( MaskDst[i] );
+               MaskDstShift[i] = ShiftCount( MaskDst[i] );
+       }
+
+       BYTE *ps = (BYTE*)pddsdSrc->lpSurface;
+       BYTE *pd = (BYTE*)pddsdDst->lpSurface;
+
+       ps = (BYTE*)ps+(lPitchSrc*prcSrc->top) + (prcSrc->left - x)*3;          // \93]\91\97\8c³\82Ì\8aJ\8en (x,y) \8dÀ\95W
+       pd = (BYTE*)pd+(lPitchDst*y);                                                                           // \93]\91\97\90æ\82Ì\8aJ\8en (0,y) \8dÀ\95W
+
+       for( int y3 = y; y3 < y2; y3++ )
+       {
+               for( int x3 = x*3; x3 < x2*3 ; x3 += 3 )
+               {
+                       // srcpx[] \81¨ \93]\91\97\8c³\82Ì\90F\82ð\93]\91\97\90æ\82ÌRGBA\83t\83H\81[\83}\83b\83g\82É\91\9d\8c¸\90F
+                       // dstpx[] \81¨ \93]\91\97\90æ\82Ì\90F
+                       DWORD srcpx[3], dstpx[3], pixel=0;
+                       for( int i = 0; i < 3; i++ )
+                       {
+                               srcpx[i] = ( (ps[x3] | (ps[x3+1] << 8) | (ps[x3+2] << 16)) & MaskSrc[i] ) >> MaskSrcShift[i];
+
+                               if( MaskSrcBit[i] < MaskDstBit[i] )                                     // \97á: Bit\90\94 4 \81¨ 5 \82È\82ç
+                                       srcpx[i] <<= ( MaskDstBit[i] - MaskSrcBit[i] ); //     1 \82¾\82¯\8d\82É\83V\83t\83g\82·\82é\81B
+                               else if( MaskSrcBit[i] > MaskDstBit[i] )                        // \97á: BitCount 5 \81¨ 4 \82È\82ç
+                                       srcpx[i] >>= ( MaskSrcBit[i] - MaskDstBit[i] ); //     1 \82¾\82¯\89E\82É\83V\83t\83g\82·\82é\81B
+                               srcpx[i] <<= MaskDstShift[i];
+
+                               dstpx[i] = pd[x3] & MaskDst[i];
+
+                               // \90V\93]\91\97\90æ = \93]\91\97\8c³\81~\83¿ + \93]\91\97\90æ\81~(1-\83¿);
+                               //   \90æ\82É DWORD\81~a \82·\82é\82Ì\82Å\81A\8c\85\82 \82Ó\82ê\82µ\82È\82¢\82æ\82¤ DWORDLONG \82Å\83\89\83b\83s\83\93\83O\82·\82é\81B\81i\8eÀ\8dÛ\82Í24bit\82¾\82©\82ç\82 \82Ó\82ê\82È\82¢\82Æ\8ev\82¤\82ª\88ê\89\9e\81B\81j
+                               pixel |= ( ( (DWORDLONG)srcpx[i]*(a) + (DWORDLONG)dstpx[i]*(256-a) ) >> 8 ) & MaskDst[i];
+                       }
+
+                       if( MaskDst[3] != 0 ) pixel |= MaskDst[3];              // \93]\91\97\90æ\82É\83A\83\8b\83t\83@\83r\83b\83g\82ª\82 \82é\82È\82ç\8fí\82ÉMAX\82ð\90Ý\92è
+                       pd[x3+0] = (BYTE)((pixel >>  0) & 0xFF);
+                       pd[x3+1] = (BYTE)((pixel >>  8) & 0xFF);
+                       pd[x3+2] = (BYTE)((pixel >> 16) & 0xFF);
+               }
+               ps = (BYTE*)(ps+lPitchSrc );
+               pd = (BYTE*)(pd+lPitchDst ); // \82P\83\89\83X\83^\95ª\82Ì\91\9d\97Ê
+               // BYTE\82É\83L\83\83\83X\83g\82µ\82Ä\82¨\82©\82È\82¢\82Æ\8cv\8eZ\8aÔ\88á\82¤
+       }
+}
+
+void   CSurface::BlendDraw24to16( LPDDSURFACEDESC2 pddsdSrc, LPCRECT prcSrc, LPDDSURFACEDESC2 pddsdDst, int x, int y )
+{
+       int x2 = x + prcSrc->right  - prcSrc->left; /* x2 = x + Width  */
+       int y2 = y + prcSrc->bottom - prcSrc->top;  /* y2 = y + Height */
+
+       int a = this->nAlphaConst;
+       if( a == 255 ) a = 256;
+
+       LONG lPitchDst = pddsdDst->lPitch;
+       LONG lPitchSrc = pddsdSrc->lPitch;
+
+       // \88È\89º\81A\90F\8aÖ\8cW\82Ì\94z\97ñ\95Ï\90\94\82Ì\93Y\82¦\8e\9a\82Í [0]=R, [1]=G, [2]=B, [3]=A \82Æ\82·\82é\81B
+       WORD MaskSrc[4], MaskSrcBit[4], MaskSrcShift[4];
+       WORD MaskDst[4], MaskDstBit[4], MaskDstShift[4];
+
+       MaskSrc[0] = (WORD)pddsdSrc->ddpfPixelFormat.dwRBitMask;
+       MaskSrc[1] = (WORD)pddsdSrc->ddpfPixelFormat.dwGBitMask;
+       MaskSrc[2] = (WORD)pddsdSrc->ddpfPixelFormat.dwBBitMask;
+       MaskSrc[3] = (WORD)pddsdSrc->ddpfPixelFormat.dwRGBAlphaBitMask;
+       MaskDst[0] = (WORD)pddsdDst->ddpfPixelFormat.dwRBitMask;
+       MaskDst[1] = (WORD)pddsdDst->ddpfPixelFormat.dwGBitMask;
+       MaskDst[2] = (WORD)pddsdDst->ddpfPixelFormat.dwBBitMask;
+       MaskDst[3] = (WORD)pddsdDst->ddpfPixelFormat.dwRGBAlphaBitMask;
+       for( int i = 0; i < 4; i++ ) {
+        MaskSrcBit[i]   = (WORD)BitCount( MaskSrc[i] );
+               MaskSrcShift[i] = (WORD)ShiftCount( MaskSrc[i] );
+        MaskDstBit[i]   = (WORD)BitCount( MaskDst[i] );
+               MaskDstShift[i] = (WORD)ShiftCount( MaskDst[i] );
+       }
+
+       BYTE *ps = (BYTE*)pddsdSrc->lpSurface;
+       WORD *pd = (WORD*)pddsdDst->lpSurface;
+
+       ps = (BYTE*)((BYTE*)ps+(lPitchSrc*prcSrc->top)) + prcSrc->left - x;             // \93]\91\97\8c³\82Ì\8aJ\8en (x,y) \8dÀ\95W
+       pd = (WORD*)((BYTE*)pd+(lPitchDst*y));                                                                  // \93]\91\97\90æ\82Ì\8aJ\8en (0,y) \8dÀ\95W
+
+       for( int y3 = y; y3 < y2; y3++ )
+       {
+               for( int x3 = x; x3 < x2; x3++ )
+               {
+                       // srcpx[] \81¨ \93]\91\97\8c³\82Ì\90F\82ð\93]\91\97\90æ\82ÌRGBA\83t\83H\81[\83}\83b\83g\82É\91\9d\8c¸\90F
+                       // dstpx[] \81¨ \93]\91\97\90æ\82Ì\90F
+                       WORD srcpx[3], dstpx[3], pixel=0;
+                       for( int i = 0; i < 3; i++ )
+                       {
+                               srcpx[i] = ( ( ps[x3*3] | (ps[x3*3+1]<<8) | (ps[x3*3+2]<<16) ) & MaskSrc[i] ) >> MaskSrcShift[i];
+
+                               if( MaskSrcBit[i] < MaskDstBit[i] )                                     // \97á: Bit\90\94 4 \81¨ 5 \82È\82ç
+                                       srcpx[i] <<= ( MaskDstBit[i] - MaskSrcBit[i] ); //     1 \82¾\82¯\8d\82É\83V\83t\83g\82·\82é\81B
+                               else if( MaskSrcBit[i] > MaskDstBit[i] )                        // \97á: BitCount 5 \81¨ 4 \82È\82ç
+                                       srcpx[i] >>= ( MaskSrcBit[i] - MaskDstBit[i] ); //     1 \82¾\82¯\89E\82É\83V\83t\83g\82·\82é\81B
+                               srcpx[i] <<= MaskDstShift[i];
+
+                               dstpx[i] = pd[x3] & MaskDst[i];
+
+                               // \90V\93]\91\97\90æ = \93]\91\97\8c³\81~\83¿ + \93]\91\97\90æ\81~(1-\83¿);
+                               //   \90æ\82É WORD\81~a \82·\82é\82Ì\82Å\81A\8c\85\82 \82Ó\82ê\82µ\82È\82¢\82æ\82¤ DWORD \82Å\83\89\83b\83s\83\93\83O\82·\82é\81B
+                               pixel |= ( ( (DWORD)srcpx[i]*(a) + (DWORD)dstpx[i]*(256-a) ) >> 8 ) & MaskDst[i];
+                       }
+
+                       if( MaskDst[3] != 0 ) pixel |= MaskDst[3];              // \93]\91\97\90æ\82É\83A\83\8b\83t\83@\83r\83b\83g\82ª\82 \82é\82È\82ç\8fí\82ÉMAX\82ð\90Ý\92è
+                       pd[x3] = pixel;
+               }
+               ps = (BYTE*)((BYTE*)ps+lPitchSrc );
+               pd = (WORD*)((BYTE*)pd+lPitchDst ); // \82P\83\89\83X\83^\95ª\82Ì\91\9d\97Ê
+               // BYTE\82É\83L\83\83\83X\83g\82µ\82Ä\82¨\82©\82È\82¢\82Æ\8cv\8eZ\8aÔ\88á\82¤
+       }
+}
+
+void   CSurface::BlendDraw16to32( LPDDSURFACEDESC2 pddsdSrc, LPCRECT prcSrc, LPDDSURFACEDESC2 pddsdDst, int x, int y )
+{
+       int x2 = x + prcSrc->right  - prcSrc->left; /* x2 = x + Width  */
+       int y2 = y + prcSrc->bottom - prcSrc->top;  /* y2 = y + Height */
+
+       int a = this->nAlphaConst;
+       if( a == 255 ) a = 256;
+
+       LONG lPitchDst = pddsdDst->lPitch;
+       LONG lPitchSrc = pddsdSrc->lPitch;
+
+       // \88È\89º\81A\90F\8aÖ\8cW\82Ì\94z\97ñ\95Ï\90\94\82Ì\93Y\82¦\8e\9a\82Í [0]=R, [1]=G, [2]=B, [3]=A \82Æ\82·\82é\81B
+       DWORD MaskSrc[4], MaskSrcBit[4], MaskSrcShift[4];
+       DWORD MaskDst[4], MaskDstBit[4], MaskDstShift[4];
+
+       MaskSrc[0] = pddsdSrc->ddpfPixelFormat.dwRBitMask;
+       MaskSrc[1] = pddsdSrc->ddpfPixelFormat.dwGBitMask;
+       MaskSrc[2] = pddsdSrc->ddpfPixelFormat.dwBBitMask;
+       MaskSrc[3] = pddsdSrc->ddpfPixelFormat.dwRGBAlphaBitMask;
+       MaskDst[0] = pddsdDst->ddpfPixelFormat.dwRBitMask;
+       MaskDst[1] = pddsdDst->ddpfPixelFormat.dwGBitMask;
+       MaskDst[2] = pddsdDst->ddpfPixelFormat.dwBBitMask;
+       MaskDst[3] = pddsdDst->ddpfPixelFormat.dwRGBAlphaBitMask;
+       for( int i = 0; i < 4; i++ ) {
+        MaskSrcBit[i]   = BitCount( MaskSrc[i] );
+               MaskSrcShift[i] = ShiftCount( MaskSrc[i] );
+        MaskDstBit[i]   = BitCount( MaskDst[i] );
+               MaskDstShift[i] = ShiftCount( MaskDst[i] );
+       }
+
+        WORD *ps = ( WORD*)pddsdSrc->lpSurface;
+       DWORD *pd = (DWORD*)pddsdDst->lpSurface;
+
+       ps = ( WORD*)((BYTE*)ps+(lPitchSrc *prcSrc->top)) + prcSrc->left - x;   // \93]\91\97\8c³\82Ì\8aJ\8en (x,y) \8dÀ\95W
+       pd = (DWORD*)((BYTE*)pd+(lPitchDst *y));                                                                // \93]\91\97\90æ\82Ì\8aJ\8en (0,y) \8dÀ\95W
+
+       for( int y3 = y; y3 < y2; y3++ )
+       {
+               for( int x3 = x; x3 < x2; x3++ )
+               {
+                       // srcpx[] \81¨ \93]\91\97\8c³\82Ì\90F\82ð\93]\91\97\90æ\82ÌRGBA\83t\83H\81[\83}\83b\83g\82É\91\9d\8c¸\90F
+                       // dstpx[] \81¨ \93]\91\97\90æ\82Ì\90F
+                       DWORD srcpx[3], dstpx[3], pixel = 0;
+                       for( int i = 0; i < 3; i++ )
+                       {
+                               srcpx[i] = ( ps[x3] & MaskSrc[i] ) >> MaskSrcShift[i];
+
+                               if( MaskSrcBit[i] < MaskDstBit[i] )                                     // \97á: Bit\90\94 4 \81¨ 5 \82È\82ç
+                                       srcpx[i] <<= ( MaskDstBit[i] - MaskSrcBit[i] ); //     1 \82¾\82¯\8d\82É\83V\83t\83g\82·\82é\81B
+                               else if( MaskSrcBit[i] > MaskDstBit[i] )                        // \97á: BitCount 5 \81¨ 4 \82È\82ç
+                                       srcpx[i] >>= ( MaskSrcBit[i] - MaskDstBit[i] ); //     1 \82¾\82¯\89E\82É\83V\83t\83g\82·\82é\81B
+                               srcpx[i] <<= MaskDstShift[i];
+
+                               dstpx[i] = pd[x3] & MaskDst[i];
+
+                               // \90V\93]\91\97\90æ = \93]\91\97\8c³\81~\83¿ + \93]\91\97\90æ\81~(1-\83¿);
+                               //   \90æ\82É DWORD\81~a \82·\82é\82Ì\82Å\81A\8c\85\82 \82Ó\82ê\82µ\82È\82¢\82æ\82¤ DWORDLONG \82Å\83\89\83b\83s\83\93\83O\82·\82é\81B
+                               pixel |= ( ( (DWORDLONG)srcpx[i]*(a) + (DWORDLONG)dstpx[i]*(256-a) ) >> 8 ) & MaskDst[i];
+                       }
+
+                       if( MaskDst[3] != 0 ) pixel |= MaskDst[3];              // \93]\91\97\90æ\82É\83A\83\8b\83t\83@\83r\83b\83g\82ª\82 \82é\82È\82ç\8fí\82ÉMAX\82ð\90Ý\92è
+                       pd[x3] = pixel;
+               }
+               ps = ( WORD*)((BYTE*)ps+lPitchSrc );
+               pd = (DWORD*)((BYTE*)pd+lPitchDst ); // \82P\83\89\83X\83^\95ª\82Ì\91\9d\97Ê
+               // BYTE\82É\83L\83\83\83X\83g\82µ\82Ä\82¨\82©\82È\82¢\82Æ\8cv\8eZ\8aÔ\88á\82¤
+       }
+}
+
+void   CSurface::BlendDraw16to24( LPDDSURFACEDESC2 pddsdSrc, LPCRECT prcSrc, LPDDSURFACEDESC2 pddsdDst, int x, int y )
+{
+       int x2 = x + prcSrc->right  - prcSrc->left; /* x2 = x + Width  */
+       int y2 = y + prcSrc->bottom - prcSrc->top;  /* y2 = y + Height */
+
+       int a = this->nAlphaConst;
+       if( a == 255 ) a = 256;
+
+       LONG lPitchDst = pddsdDst->lPitch;
+       LONG lPitchSrc = pddsdSrc->lPitch;
+
+       // \88È\89º\81A\90F\8aÖ\8cW\82Ì\94z\97ñ\95Ï\90\94\82Ì\93Y\82¦\8e\9a\82Í [0]=R, [1]=G, [2]=B, [3]=A \82Æ\82·\82é\81B
+       DWORD MaskSrc[4], MaskSrcBit[4], MaskSrcShift[4];
+       DWORD MaskDst[4], MaskDstBit[4], MaskDstShift[4];
+
+       MaskSrc[0] = pddsdSrc->ddpfPixelFormat.dwRBitMask;
+       MaskSrc[1] = pddsdSrc->ddpfPixelFormat.dwGBitMask;
+       MaskSrc[2] = pddsdSrc->ddpfPixelFormat.dwBBitMask;
+       MaskSrc[3] = pddsdSrc->ddpfPixelFormat.dwRGBAlphaBitMask;
+       MaskDst[0] = pddsdDst->ddpfPixelFormat.dwRBitMask;
+       MaskDst[1] = pddsdDst->ddpfPixelFormat.dwGBitMask;
+       MaskDst[2] = pddsdDst->ddpfPixelFormat.dwBBitMask;
+       MaskDst[3] = pddsdDst->ddpfPixelFormat.dwRGBAlphaBitMask;
+       for( int i = 0; i < 4; i++ ) {
+        MaskSrcBit[i]   = BitCount( MaskSrc[i] );
+               MaskSrcShift[i] = ShiftCount( MaskSrc[i] );
+        MaskDstBit[i]   = BitCount( MaskDst[i] );
+               MaskDstShift[i] = ShiftCount( MaskDst[i] );
+       }
+
+       WORD *ps = (WORD*)pddsdSrc->lpSurface;
+       BYTE *pd = (BYTE*)pddsdDst->lpSurface;
+
+       ps = (WORD*)((BYTE*)ps+(lPitchSrc *prcSrc->top)) + prcSrc->left - x;    // \93]\91\97\8c³\82Ì\8aJ\8en (x,y) \8dÀ\95W
+       pd = (BYTE*)((BYTE*)pd+(lPitchDst *y));                                                                 // \93]\91\97\90æ\82Ì\8aJ\8en (0,y) \8dÀ\95W
+
+       for( int y3 = y; y3 < y2; y3++ )
+       {
+               for( int x3 = x; x3 < x2; x3++ )
+               {
+                       // srcpx[] \81¨ \93]\91\97\8c³\82Ì\90F\82ð\93]\91\97\90æ\82ÌRGBA\83t\83H\81[\83}\83b\83g\82É\91\9d\8c¸\90F
+                       // dstpx[] \81¨ \93]\91\97\90æ\82Ì\90F
+                       DWORD srcpx[3], dstpx[3], pixel=0;
+                       for( int i = 0; i < 3; i++ )
+                       {
+                               srcpx[i] = ( ps[x3] & MaskSrc[i] ) >> MaskSrcShift[i];
+
+                               if( MaskSrcBit[i] < MaskDstBit[i] )                                     // \97á: Bit\90\94 4 \81¨ 5 \82È\82ç
+                                       srcpx[i] <<= ( MaskDstBit[i] - MaskSrcBit[i] ); //     1 \82¾\82¯\8d\82É\83V\83t\83g\82·\82é\81B
+                               else if( MaskSrcBit[i] > MaskDstBit[i] )                        // \97á: BitCount 5 \81¨ 4 \82È\82ç
+                                       srcpx[i] >>= ( MaskSrcBit[i] - MaskDstBit[i] ); //     1 \82¾\82¯\89E\82É\83V\83t\83g\82·\82é\81B
+                               srcpx[i] <<= MaskDstShift[i];
+
+                               dstpx[i] = ( pd[x3*3] | (pd[x3*3+1]<<8) | (pd[x3*3+2]<<16) ) & MaskDst[i];
+
+                               // \90V\93]\91\97\90æ = \93]\91\97\8c³\81~\83¿ + \93]\91\97\90æ\81~(1-\83¿);
+                               //   \90æ\82É DWORD\81~a \82·\82é\82Ì\82Å\81A\8c\85\82 \82Ó\82ê\82µ\82È\82¢\82æ\82¤ DWORDLONG \82Å\83\89\83b\83s\83\93\83O\82·\82é\81B
+                               pixel |= ( ( (DWORDLONG)srcpx[i]*(a) + (DWORDLONG)dstpx[i]*(256-a) ) >> 8 ) & MaskDst[i];
+                       }
+
+                       if( MaskDst[3] != 0 ) pixel |= MaskDst[3];              // \93]\91\97\90æ\82É\83A\83\8b\83t\83@\83r\83b\83g\82ª\82 \82é\82È\82ç\8fí\82ÉMAX\82ð\90Ý\92è
+                       pd[x3*3+0] = (BYTE)((pixel >>  0) & 0xFF);
+                       pd[x3*3+1] = (BYTE)((pixel >>  8) & 0xFF);
+                       pd[x3*3+2] = (BYTE)((pixel >> 16) & 0xFF);
+               }
+               ps = (WORD*)((BYTE*)ps+lPitchSrc );
+               pd = (BYTE*)((BYTE*)pd+lPitchDst ); // \82P\83\89\83X\83^\95ª\82Ì\91\9d\97Ê
+               // BYTE\82É\83L\83\83\83X\83g\82µ\82Ä\82¨\82©\82È\82¢\82Æ\8cv\8eZ\8aÔ\88á\82¤
+       }
+}
+
+void   CSurface::BlendDraw16to16( LPDDSURFACEDESC2 pddsdSrc, LPCRECT prcSrc, LPDDSURFACEDESC2 pddsdDst, int x, int y )
+{
+       int x2 = x + prcSrc->right  - prcSrc->left; /* x2 = x + Width  */
+       int y2 = y + prcSrc->bottom - prcSrc->top;  /* y2 = y + Height */
+
+       int a = this->nAlphaConst;
+       if( a == 255 ) a = 256;
+
+       LONG lPitchDst = pddsdDst->lPitch;
+       LONG lPitchSrc = pddsdSrc->lPitch;
+
+       // \88È\89º\81A\90F\8aÖ\8cW\82Ì\94z\97ñ\95Ï\90\94\82Ì\93Y\82¦\8e\9a\82Í [0]=R, [1]=G, [2]=B, [3]=A \82Æ\82·\82é\81B
+       WORD MaskSrc[4], MaskSrcBit[4], MaskSrcShift[4];
+       WORD MaskDst[4], MaskDstBit[4], MaskDstShift[4];
+
+       MaskSrc[0] = (WORD)pddsdSrc->ddpfPixelFormat.dwRBitMask;
+       MaskSrc[1] = (WORD)pddsdSrc->ddpfPixelFormat.dwGBitMask;
+       MaskSrc[2] = (WORD)pddsdSrc->ddpfPixelFormat.dwBBitMask;
+       MaskSrc[3] = (WORD)pddsdSrc->ddpfPixelFormat.dwRGBAlphaBitMask;
+       MaskDst[0] = (WORD)pddsdDst->ddpfPixelFormat.dwRBitMask;
+       MaskDst[1] = (WORD)pddsdDst->ddpfPixelFormat.dwGBitMask;
+       MaskDst[2] = (WORD)pddsdDst->ddpfPixelFormat.dwBBitMask;
+       MaskDst[3] = (WORD)pddsdDst->ddpfPixelFormat.dwRGBAlphaBitMask;
+       for( int i = 0; i < 4; i++ ) {
+        MaskSrcBit[i]   = (WORD)BitCount( MaskSrc[i] );
+               MaskSrcShift[i] = (WORD)ShiftCount( MaskSrc[i] );
+        MaskDstBit[i]   = (WORD)BitCount( MaskDst[i] );
+               MaskDstShift[i] = (WORD)ShiftCount( MaskDst[i] );
+       }
+
+       WORD *ps = (WORD*)pddsdSrc->lpSurface;
+       WORD *pd = (WORD*)pddsdDst->lpSurface;
+
+       ps = (WORD*)((BYTE*)ps+(lPitchSrc*prcSrc->top)) + prcSrc->left - x;             // \93]\91\97\8c³\82Ì\8aJ\8en (x,y) \8dÀ\95W
+       pd = (WORD*)((BYTE*)pd+(lPitchDst*y));                                                                  // \93]\91\97\90æ\82Ì\8aJ\8en (0,y) \8dÀ\95W
+
+       for( int y3 = y; y3 < y2; y3++ )
+       {
+               for( int x3 = x; x3 < x2; x3++ )
+               {
+                       // srcpx[] \81¨ \93]\91\97\8c³\82Ì\90F\82ð\93]\91\97\90æ\82ÌRGBA\83t\83H\81[\83}\83b\83g\82É\91\9d\8c¸\90F
+                       // dstpx[] \81¨ \93]\91\97\90æ\82Ì\90F
+                       WORD srcpx, dstpx, pixel = 0;
+                       for( int i = 0; i < 3; i++ )
+                       {
+                               srcpx = ( ps[x3] & MaskSrc[i] ) >> MaskSrcShift[i];
+
+                               if( MaskSrcBit[i] < MaskDstBit[i] )                                     // \97á: Bit\90\94 4 \81¨ 5 \82È\82ç
+                                       srcpx <<= ( MaskDstBit[i] - MaskSrcBit[i] );    //     1 \82¾\82¯\8d\82É\83V\83t\83g\82·\82é\81B
+                               else if( MaskSrcBit[i] > MaskDstBit[i] )                        // \97á: BitCount 5 \81¨ 4 \82È\82ç
+                                       srcpx >>= ( MaskSrcBit[i] - MaskDstBit[i] );    //     1 \82¾\82¯\89E\82É\83V\83t\83g\82·\82é\81B
+                               srcpx <<= MaskDstShift[i];
+
+                               dstpx = pd[x3] & MaskDst[i];
+
+                               // \90V\93]\91\97\90æ = \93]\91\97\8c³\81~\83¿ + \93]\91\97\90æ\81~(1-\83¿);
+                               //   \90æ\82É WORD\81~a \82·\82é\82Ì\82Å\81A\8c\85\82 \82Ó\82ê\82µ\82È\82¢\82æ\82¤ DWORD \82Å\83\89\83b\83s\83\93\83O\82·\82é\81B
+                               pixel |= ( ( (DWORD)srcpx*(a) + (DWORD)dstpx*(256-a) ) >> 8 ) & MaskDst[i];
+                       }
+                       if( MaskDst[3] != 0 ) pixel |= MaskDst[3];              // \93]\91\97\90æ\82É\83A\83\8b\83t\83@\83r\83b\83g\82ª\82 \82é\82È\82ç\8fí\82ÉMAX\82ð\90Ý\92è
+                       pd[x3] = pixel;
+               }
+               ps = (WORD*)((BYTE*)ps+lPitchSrc );
+               pd = (WORD*)((BYTE*)pd+lPitchDst ); // \82P\83\89\83X\83^\95ª\82Ì\91\9d\97Ê
+               // BYTE\82É\83L\83\83\83X\83g\82µ\82Ä\82¨\82©\82È\82¢\82Æ\8cv\8eZ\8aÔ\88á\82¤
+       }
+}
+
+DWORD  CSurface::BitCount( DWORD dwNum )
+{
+       DWORD dwCount;
+       for( dwCount = 0; dwNum != 0; dwNum >>= 1 )
+               dwCount += ( dwNum & 0x1 );
+       return dwCount;
+}
+
+DWORD  CSurface::ShiftCount( DWORD dwNum )
+{
+       if( dwNum == 0 ) return 0;              // \83[\83\8d\82Ì\82Æ\82«\82Í\83[\83\8d\82ð\95Ô\82·\81B
+
+       DWORD dwCount;
+       for( dwCount = 0; (dwNum & 0x1) == 0; dwNum >>= 1 )
+               dwCount ++;
+
+       return dwCount;
+}
+
+HRESULT        CSurface::Text( int x, int y, HFONT hFont, LPCTSTR str, COLORREF color )
+{
+       if( ! this->pSurface )
+               return FDKERR_\83T\81[\83t\83F\83C\83X\82ªNULL;
+               
+       if( !str || *str == _T('\0') )
+               return S_OK;
+
+       this->LostCheck();              // \83\8d\83X\83g\82µ\82Ä\82¢\82ê\82Î\95\9c\8b\8c\82·\82é
+
+       HRESULT hr;
+
+       HDC hDC;
+       if( FAILED( hr = this->pSurface->GetDC( &hDC ) ) )
+               return FDKERR_DC\82Ì\8eæ\93¾\82É\8e¸\94s;
+
+       HFONT hOldFont = (HFONT) ::SelectObject( hDC, hFont );
+
+       ::SetBkMode( hDC, TRANSPARENT );
+       ::SetTextColor( hDC, color );
+       ::TextOut( hDC, x, y, str, lstrlen( str ) );
+
+       ::SelectObject( hDC, hOldFont );
+       this->pSurface->ReleaseDC( hDC );
+
+       return S_OK;
+}
+
+HRESULT        CSurface::TextSharp( int x, int y, HFONT hFont, LPCTSTR str, COLORREF color )
+{
+       if( ! this->pSurface )
+               return FDKERR_\83T\81[\83t\83F\83C\83X\82ªNULL;
+               
+       if( !str || *str == _T('\0') )
+               return S_OK;
+
+       this->LostCheck();              // \83\8d\83X\83g\82µ\82Ä\82¢\82ê\82Î\95\9c\8b\8c\82·\82é
+
+       // \96Ê\90Ï\82S\94{\82Ì BITMAP \82ð\8dì\90¬
+       BITMAPINFOHEADER bmi;
+       ZeroMemory( &bmi, sizeof( BITMAPINFOHEADER ) );
+       bmi.biSize              = sizeof( BITMAPINFOHEADER );
+       bmi.biWidth             = (    (LONG)(this->dwWidth  - x) ) * 2;
+       bmi.biHeight    = ( - ((LONG)(this->dwHeight - y)) ) * 2;
+       bmi.biPlanes    = 1;
+       bmi.biBitCount  = 32;
+       HDC hDC = CreateCompatibleDC( 0 );
+       HBITMAP hBmp = CreateDIBSection( hDC, (BITMAPINFO *)&bmi, DIB_RGB_COLORS, NULL, NULL, 0 );
+
+       // \83\81\83\82\83\8aDC \82ð\8eg\82Á\82Ä BITMAP \82Ö\83e\83L\83X\83g\95`\89æ
+       HBITMAP hOldBmp = (HBITMAP) SelectObject( hDC, hBmp  );
+       HFONT hOldFont  = (HFONT) SelectObject( hDC, hFont );
+       SetTextColor( hDC, color );
+       SetBkColor( hDC, RGB(0,0,0) );
+       RECT rc = { 0, 0, (this->dwWidth-x)*2, (this->dwHeight-y)*2 };
+       DrawText( hDC, str, lstrlen(str), &rc, DT_LEFT|DT_NOPREFIX );
+       SelectObject( hDC, hOldFont );
+       SelectObject( hDC, hOldBmp );
+       DeleteDC( hDC );
+
+       // \83r\83b\83g\83}\83b\83v\82©\82ç\83T\81[\83t\83F\83C\83X\82Ö\93]\91\97
+       BITMAP bmp;
+       GetObject( hBmp, sizeof(BITMAP), &bmp );
+       CopyFromBMP32x4( x, y, &bmp, true );
+       DeleteObject( hBmp );
+
+       return S_OK;
+}
+int            CSurface::GetTextWidthDot( HFONT hFont, LPCTSTR str\95\8e\9a\97ñ )
+{
+       HDC hdc = ::CreateCompatibleDC( 0 );
+       HFONT hOldFont = (HFONT) ::SelectObject( hdc, hFont );
+       SIZE size;
+       ::GetTextExtentPoint32( hdc, str\95\8e\9a\97ñ, lstrlen(str\95\8e\9a\97ñ), &size );
+       ::SelectObject( hdc, hOldFont );
+       ::DeleteDC( hdc );
+       return (int) size.cx;
+}
+void CSurface::CopyFromBMP32x4( int x, int y, BITMAP* bmp, bool bSkipBlack )
+{
+       DDSURFACEDESC2 ddsd;
+       ZeroMemory( &ddsd, sizeof( DDSURFACEDESC2 ) );
+       ddsd.dwSize = sizeof( DDSURFACEDESC2 );
+
+       if( SUCCEEDED( this->pSurface->Lock( NULL, &ddsd, DDLOCK_WAIT|DDLOCK_WRITEONLY, NULL ) ) )
+       {
+               BYTE* src_line = (BYTE*) bmp->bmBits;
+               BYTE* dst_line = (BYTE*) ddsd.lpSurface;
+
+               // A. \93]\91\97\90æ\83T\81[\83t\83F\83C\83X\82ª 32bpp \82Ì\8fê\8d\87
+               if( ddsd.ddpfPixelFormat.dwRGBBitCount == 32 )
+               {
+                       for( int ly = 0; ly < (LONG)this->dwHeight; ly++ )
+                       {
+                               if( ly >= y )
+                               {
+                                       DWORD* src = (DWORD*) src_line;
+                                       DWORD* dst = (DWORD*) dst_line;
+                                       for( int lx = 0; lx < (LONG)this->dwWidth; lx++ )
+                                       {
+                                               if( lx >= x ) 
+                                               {
+                                                       DWORD s, s1[4], s2[4], s3[4];
+                                                       s = *src;
+                                                       s1[0] = s & 0x00FF0000;
+                                                       s2[0] = s & 0x0000FF00;
+                                                       s3[0] = s & 0x000000FF;
+                                                       s = *(src + 1);
+                                                       s1[1] = s & 0x00FF0000;
+                                                       s2[1] = s & 0x0000FF00;
+                                                       s3[1] = s & 0x000000FF;
+                                                       s = *((DWORD*)(((BYTE*)src) + bmp->bmWidthBytes));
+                                                       s1[2] = s & 0x00FF0000;
+                                                       s2[2] = s & 0x0000FF00;
+                                                       s3[2] = s & 0x000000FF;
+                                                       s = *((DWORD*)(((BYTE*)src) + bmp->bmWidthBytes) + 1);
+                                                       s1[3] = s & 0x00FF0000;
+                                                       s2[3] = s & 0x0000FF00;
+                                                       s3[3] = s & 0x000000FF;
+
+                                                       DWORD A = 255;  // \83A\83\8b\83t\83@\82Í\8fí\82É255
+
+                                                       bool bAllBlack = false;         // bSkipBlack \8e\9e\82É\83X\83L\83b\83v\82·\82é\82©\94Û\82©\82Í\81A\82S\82Â\82Ì\90F\82ª\81u\82·\82×\82Ä\8d\95\81v\82©\81u\82Ð\82Æ\82Â\82Å\82à\8d\95\82Å\82È\82¢\81v\82©\82¾\82¯\82Å\8c\88\82ß\82é\81B
+                                                       for( int i = 0; i < 4; i++ ) {
+                                                               if( ! ( s1[i] == 0 && s2[i] == 0 && s3[i] == 0 ) ) {
+                                                                       bAllBlack = true;
+                                                                       break;
+                                                               }
+                                                       }
+                                               
+                                                       if( ! ( bSkipBlack && bAllBlack == 0 ) )        // \82S\82Â\82Ì\90F\82ª\82·\82×\82Ä\8d\95 \82©\82 bSkipBlack=true \82È\82ç\93]\91\97\82µ\82È\82¢\81B
+                                                       {
+                                                               DWORD c1 = ((( s1[0] + s1[1] + s1[2] + s1[3] ) >> 2) & ddsd.ddpfPixelFormat.dwRBitMask );
+                                                               DWORD c2 = ((( s2[0] + s2[1] + s2[2] + s2[3] ) >> 2) & ddsd.ddpfPixelFormat.dwGBitMask );
+                                                               DWORD c3 = ((( s3[0] + s3[1] + s3[2] + s3[3] ) >> 2) & ddsd.ddpfPixelFormat.dwBBitMask );
+                                                               DWORD c4 = (A << 24);
+                                                               *dst = c1 | c2 | c3 | c4;
+                                                       }
+                                                       src += 2;
+                                               }
+                                               dst ++;
+                                       }
+                                       src_line += bmp->bmWidthBytes * 2;
+                               }
+                               dst_line += ddsd.lPitch;
+                       }
+               }
+               // B. \93]\91\97\90æ\83T\81[\83t\83F\83C\83X\82ª 16/24bpp \82Ì\8fê\8d\87
+               else if ( ddsd.ddpfPixelFormat.dwRGBBitCount == 16 || ddsd.ddpfPixelFormat.dwRGBBitCount == 24 )
+               {
+                       // \93]\91\97\90æ\83}\83X\83N\82Ì\82»\82ê\82¼\82ê\82Ì\83r\83b\83g\90\94\82Æ\83V\83t\83g\90\94\82ð\8b\81\82ß\82é
+                       int nBit\90\94R = this->BitCount( ddsd.ddpfPixelFormat.dwRBitMask );
+                       int nBit\90\94G = this->BitCount( ddsd.ddpfPixelFormat.dwGBitMask );
+                       int nBit\90\94B = this->BitCount( ddsd.ddpfPixelFormat.dwBBitMask );
+                       int nBit\90\94A = this->BitCount( ddsd.ddpfPixelFormat.dwRGBAlphaBitMask );
+                       int nShift\90\94R = this->ShiftCount( ddsd.ddpfPixelFormat.dwRBitMask );
+                       int nShift\90\94G = this->ShiftCount( ddsd.ddpfPixelFormat.dwGBitMask );
+                       int nShift\90\94B = this->ShiftCount( ddsd.ddpfPixelFormat.dwBBitMask );
+                       int nShift\90\94A = this->ShiftCount( ddsd.ddpfPixelFormat.dwRGBAlphaBitMask );
+
+                       for( int ly = 0; ly < (LONG)this->dwHeight; ly++ )
+                       {
+                               if( ly >= y )
+                               {
+                                       DWORD* src = (DWORD*) src_line;
+                                       WORD*  dst = (WORD*)  dst_line;
+                                       for( int lx = 0; lx < (LONG)this->dwWidth; lx++ )
+                                       {
+                                               if( lx >= x ) 
+                                               {
+                                                       DWORD s;
+                                                       DWORD s1[4], s2[4], s3[4];
+                                                       s = *src;
+                                                       s1[0] = (s & 0x00FF0000) >> (16 + (8 - nBit\90\94R));
+                                                       s2[0] = (s & 0x0000FF00) >> ( 8 + (8 - nBit\90\94G));
+                                                       s3[0] = (s & 0x000000FF) >> ( 0 + (8 - nBit\90\94B));
+                                                       s = *(src + 1);
+                                                       s1[1] = (s & 0x00FF0000) >> (16 + (8 - nBit\90\94R));
+                                                       s2[1] = (s & 0x0000FF00) >> ( 8 + (8 - nBit\90\94G));
+                                                       s3[1] = (s & 0x000000FF) >> ( 0 + (8 - nBit\90\94B));
+                                                       s = *((DWORD*)(((BYTE*)src) + bmp->bmWidthBytes));
+                                                       s1[2] = (s & 0x00FF0000) >> (16 + (8 - nBit\90\94R));
+                                                       s2[2] = (s & 0x0000FF00) >> ( 8 + (8 - nBit\90\94G));
+                                                       s3[2] = (s & 0x000000FF) >> ( 0 + (8 - nBit\90\94B));
+                                                       s = *((DWORD*)(((BYTE*)src) + bmp->bmWidthBytes) + 1);
+                                                       s1[3] = (s & 0x00FF0000) >> (16 + (8 - nBit\90\94R));
+                                                       s2[3] = (s & 0x0000FF00) >> ( 8 + (8 - nBit\90\94G));
+                                                       s3[3] = (s & 0x000000FF) >> ( 0 + (8 - nBit\90\94B));
+
+                                                       WORD A = (WORD) ddsd.ddpfPixelFormat.dwRGBAlphaBitMask;         // \83A\83\8b\83t\83@\82Í\8fí\82É\8dÅ\91å
+
+                                                       bool bAllBlack = false;         // bSkipBlack \8e\9e\82É\83X\83L\83b\83v\82·\82é\82©\94Û\82©\82Í\81A\82S\82Â\82Ì\90F\82ª\81u\82·\82×\82Ä\8d\95\81v\82©\81u\82Ð\82Æ\82Â\82Å\82à\8d\95\82Å\82È\82¢\81v\82©\82¾\82¯\82Å\8c\88\82ß\82é\81B
+                                                       for( int i = 0; i < 4; i++ ) {
+                                                               if( ! ( s1[i] == 0 && s2[i] == 0 && s3[i] == 0 ) ) {
+                                                                       bAllBlack = true;
+                                                                       break;
+                                                               }
+                                                       }
+                                               
+                                                       if( ! ( bSkipBlack && bAllBlack == 0 ) )        // \82S\82Â\82Ì\90F\82ª\82·\82×\82Ä\8d\95 \82©\82 bSkipBlack=true \82È\82ç\93]\91\97\82µ\82È\82¢\81B
+                                                       {
+                                                               WORD c1 = (WORD)(((( s1[0] + s1[1] + s1[2] + s1[3] ) >> 2) << nShift\90\94R ) & ddsd.ddpfPixelFormat.dwRBitMask );
+                                                               WORD c2 = (WORD)(((( s2[0] + s2[1] + s2[2] + s2[3] ) >> 2) << nShift\90\94G ) & ddsd.ddpfPixelFormat.dwGBitMask );
+                                                               WORD c3 = (WORD)(((( s3[0] + s3[1] + s3[2] + s3[3] ) >> 2) << nShift\90\94B ) & ddsd.ddpfPixelFormat.dwBBitMask );
+                                                               *dst = c1 | c2 | c3 | A;
+                                                       }
+                                                       src += 2;
+                                               }
+                                               dst ++;
+                                       }
+                                       src_line += bmp->bmWidthBytes * 2;
+                               }
+                               dst_line += ddsd.lPitch;
+                       }
+               }
+
+               this->pSurface->Unlock( NULL );
+       }
+}
+void CSurface::LostCheck()
+{
+       if( this->pSurface != NULL 
+                       && this->pSurface->IsLost() == DDERR_SURFACELOST
+                       && ( this->place == LOADTO_VIDEO || this->place == LOADTO_VIDEO_OR_SYSTEM ) )
+               this->RestoreDeviceObjects();
+}
+       }//Graphics
+}//FDK
\ No newline at end of file