Exemple #1
0
void Surface::Set(u32 sw, u32 sh, const SurfaceFormat & fm)
{
    FreeSurface(*this);

#if SDL_VERSION_ATLEAST(2, 0, 0)
    surface = SDL_CreateRGBSurface(0, sw, sh, fm.depth, fm.rmask, fm.gmask, fm.bmask, fm.amask);
#else
    surface = SDL_CreateRGBSurface(SDL_SWSURFACE, sw, sh, fm.depth, fm.rmask, fm.gmask, fm.bmask, fm.amask);
#endif

    if(!surface)
	Error::Except(__FUNCTION__, SDL_GetError());

    if(8 == depth())
    {
	SetPalette();
	Fill(fm.ckey);
	SetColorKey(fm.ckey);
    }
    else
    if(amask())
    {
#if SDL_VERSION_ATLEAST(2, 0, 0)
	Fill(RGBA(0, 0, 0, 0)); // no color key only amask
#else
	Fill(RGBA(fm.ckey.r(), fm.ckey.g(), fm.ckey.b(), 0));
	SetColorKey(fm.ckey);
#endif
    }
    else
    if(fm.ckey.pack())
    {
	Fill(fm.ckey);
	SetColorKey(fm.ckey);
    }

    if(amask())
    {
#if SDL_VERSION_ATLEAST(2, 0, 0)
	SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND);
#else
	SDL_SetAlpha(surface, SDL_SRCALPHA, 255);
#endif
    }
    else
    {
#if SDL_VERSION_ATLEAST(2, 0, 0)
	SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE);
#else
	SDL_SetAlpha(surface, 0, 0);
#endif
    }
}
Exemple #2
0
//
// CDVDPlayer::GetColorKeyInternal(): Retrieves color key and stores it for later
// queries from the app.
//
HRESULT CDVDPlayer::GetColorKeyInternal(IBaseFilter *pOvM /* = NULL */)
{
    ASSERT(NULL == pOvM) ; // we don't need pOvM passed in

    // Get color key from MixerPinConfig interface via IDvdGraphBuilder
    IMixerPinConfig2  *pMPC ;
    DWORD              dwColorKey ;
    HRESULT  hr = m_pDvdGB->GetDvdInterface(IID_IMixerPinConfig2, (LPVOID *) &pMPC) ;
    if (SUCCEEDED(hr))
    {
        hr = pMPC->GetColorKey(NULL, &dwColorKey) ;
        ASSERT(SUCCEEDED(hr)) ;
        SetColorKey(dwColorKey) ;

        //  Set mode to stretch - that way we don't fight the overlay
        //  mixer about the exact way to fix the aspect ratio
        pMPC->SetAspectRatioMode(AM_ARMODE_STRETCHED);
        pMPC->Release() ;
    }
    else
    {
        DbgLog((LOG_ERROR, 0,
            TEXT("WARNING: IDvdGraphBuilder::GetDvdInterface(IID_IMixerPinConfig2) failed (Error 0x%lx)"), hr)) ;
        return hr ;
    }
    return S_OK ;
}
Exemple #3
0
///////////////////
// Load a font
int CFont::Load(const std::string& fontname, bool _colour) {

	// Load the font
	LOAD_IMAGE_WITHALPHA(bmpFont, fontname);

	// Set the color key for this alpha surface
	SetColorKey(bmpFont.get(), 255, 0, 255);

	Colorize = _colour;

	bmpWhite = gfxCreateSurfaceAlpha(bmpFont.get()->w, bmpFont.get()->h);
	bmpGreen = gfxCreateSurfaceAlpha(bmpFont.get()->w, bmpFont.get()->h);

	// Calculate the width of each character and number of characters
	Parse();

	// Pre-calculate some colours
	f_white = tLX->clNormalLabel;
	f_green = tLX->clChatText;

	// Precache some common font colors (but only if this font should be colorized)
	if (Colorize) {
		PreCalculate(bmpWhite, f_white);
		PreCalculate(bmpGreen, f_green);
	}

	return true;
}
Exemple #4
0
/*-----------------------------------------------------------------------------
	PNGのロード
-----------------------------------------------------------------------------*/
int CNkImage::LoadPNG(char* lpszFileName)
{
	HBITMAP 	   hBMP = NULL;
	BITMAP		   bmp;
	DDSURFACEDESC2 ddsd;
	//ビットマップハンドルへPNGをロード
	hBMP = LoadPng( (string)lpszFileName);
	if( hBMP == NULL )
	{
		MB(lpszFileName);
		return 0;
	}
	//BMP情報を所得
	GetObject( hBMP, sizeof(bmp), &bmp );
	//サーフェイスに設定する構造体
	ZeroMemory( &ddsd, sizeof(ddsd) );
	ddsd.dwSize 		= sizeof(ddsd);
	ddsd.dwFlags		= DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;//システムメモリに作る
	
	ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat);
	ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB;
	ddsd.ddpfPixelFormat.dwRGBBitCount = 16;
	//RGB565カラー
	ddsd.ddpfPixelFormat.dwRBitMask = 0x0000F800 ;
	ddsd.ddpfPixelFormat.dwGBitMask = 0x000007E0 ;
	ddsd.ddpfPixelFormat.dwBBitMask = 0x0000001F ;
	ddsd.ddpfPixelFormat.dwRGBAlphaBitMask = 0x00000000 ;

	if(g_pNkLib->GetDouble())
	{
		ddsd.dwWidth		= bmp.bmWidth * 2;
		ddsd.dwHeight		= bmp.bmHeight * 2;
	}
	else
	{
		ddsd.dwWidth		= bmp.bmWidth;
		ddsd.dwHeight		= bmp.bmHeight;
	}
	//メンバにBMP情報を代入
	m_bmpWidth = (int)bmp.bmWidth;
	m_bmpHeight = (int)bmp.bmHeight;
	//サーフェイスを作成
	if(!g_pNkLib->CreateSurface(&ddsd, &m_pdds))
	{
		SAFE_RELEASE(m_pdds);
		return 0;
	}
	//BMPをサーフェイスに描画
	if(!DrawBitmap(hBMP))
	{
		DeleteObject( hBMP );
		return 0;
	}
	DeleteObject( hBMP );
	//カラーキー設定
	SetColorKey(RGB(255,0,255));
	return 1;
}
Exemple #5
0
void ResourceManager::AddSurfaceWithTransparency(std::string key,
                                                 std::string file_path,
                                                 SDL_Color alpha) {
  auto surface = std::make_shared<SDL2pp::Surface>(SDL2pp::Surface(file_path));
  surface->SetBlendMode(SDL_BLENDMODE_NONE);
  surface->SetColorKey(true, SDL_MapRGB(&surface->Lock().GetFormat(), alpha.r,
                                        alpha.g, alpha.b));
  surfaces_[key] = surface;
}
Exemple #6
0
/* set color key */
void Surface::SetDefaultColorKey(void)
{
    if(isValid())
    {
	const u32 clkey = amask() ? SDL_MapRGBA(surface->format, 0xFF, 0, 0xFF, 0) : 
				    SDL_MapRGB(surface->format, 0xFF, 0, 0xFF);
	Fill(clkey);
	SetColorKey(clkey);
    }
}
Exemple #7
0
/*-----------------------------------------------------------------------------
	BMPのロード
-----------------------------------------------------------------------------*/
int CNkImage::LoadBMP(char* lpszFileName)
{
	HBITMAP 	   hBMP = NULL;
	BITMAP		   bmp;
	DDSURFACEDESC2 ddsd;
	//ビットマップハンドルへBMPロード
	hBMP = (HBITMAP) LoadImage( GetModuleHandle(NULL), lpszFileName,
								IMAGE_BITMAP, 0, 0,
								LR_CREATEDIBSECTION );//リソースからロード
	if( hBMP == NULL )
	{
		hBMP = (HBITMAP) LoadImage( NULL, lpszFileName, 
									IMAGE_BITMAP, 0, 0,
									LR_LOADFROMFILE | LR_CREATEDIBSECTION );
									//ファイルからロード
		if( hBMP == NULL )
			return 0;
	}
	//BMP情報を所得
	GetObject( hBMP, sizeof(bmp), &bmp );
	//サーフェイスに設定する構造体
	ZeroMemory( &ddsd, sizeof(ddsd) );
	ddsd.dwSize 		= sizeof(ddsd);
	ddsd.dwFlags		= DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;//システムメモリに作る
	if(g_pNkLib->GetDouble())
	{
		ddsd.dwWidth		= bmp.bmWidth * 2;
		ddsd.dwHeight		= bmp.bmHeight * 2;
	}
	else
	{
		ddsd.dwWidth		= bmp.bmWidth;
		ddsd.dwHeight		= bmp.bmHeight;
	}
	//メンバにBMP情報を代入
	m_bmpWidth = (int)bmp.bmWidth;
	m_bmpHeight = (int)bmp.bmHeight;
	//サーフェイスを作成
	if(!g_pNkLib->CreateSurface(&ddsd, &m_pdds))
	{
		SAFE_RELEASE(m_pdds);
		return 0;
	}
	//BMPをサーフェイスに描画
	if(!DrawBitmap(hBMP))
	{
		DeleteObject( hBMP );
		return 0;
	}
	DeleteObject( hBMP );
	//カラーキー設定
	SetColorKey(RGB(255,0,255));
	return 1;
}
Exemple #8
0
/* -- GDIのコンパチブルDCからDirectDrawサーフェスを作成する -- */
BOOL SPRITE::GDISurfToDDSurf( ){
	if ( IsEmpty( WINGDI ) ) return FALSE;
	
	// 復元の必要がある
	Make( Size.cx , Size.cy  , DDRAW );

	// そっくりそのままコピーする
	HDC hDC;
	DDrawSurf->GetDC( &hDC );
	BitBlt( hDC , 0 , 0 , Size.cx , Size.cy  , CompatibleDC , 0 , 0 ,SRCCOPY );
	DDrawSurf->ReleaseDC( hDC );

	// WINGDIを開放
	Clear( WINGDI );
	// カラーキー適応
	SetColorKey( CLRKey );
	
	return TRUE;
}
Exemple #9
0
//
// CFilePlayer::GetColorKeyInternal(): Private method to query the color key
// value from teh first input pin of the OverlayMixer.
//
HRESULT CFilePlayer::GetColorKeyInternal(IBaseFilter *pOvM)
{
    DbgLog((LOG_TRACE, 5, TEXT("CFilePlayer::GetColorKeyInternal() entered"))) ;

    if (NULL == pOvM)
        return E_INVALIDARG ;

    IEnumPins  *pEnumPins ;
    IPin       *pPin ;
    ULONG       ul ;
    PIN_DIRECTION  pd ;
    DWORD       dwColorKey ;
    IMixerPinConfig  *pMPC ;
    HRESULT  hr = pOvM->EnumPins(&pEnumPins) ;
    ASSERT(pEnumPins) ;
    while (S_OK == pEnumPins->Next(1, &pPin, &ul)  &&  1 == ul)  // try all pins
    {
        pPin->QueryDirection(&pd) ;
        if (PINDIR_INPUT == pd)  // only the 1st in pin
        {
            hr = pPin->QueryInterface(IID_IMixerPinConfig, (LPVOID *) &pMPC) ;
            ASSERT(SUCCEEDED(hr) && pMPC) ;
            hr = pMPC->GetColorKey(NULL, &dwColorKey) ;  // just get the physical color
            SetColorKey(dwColorKey) ;

            //  Set mode to stretch - that way we don't fight the overlay
            //  mixer about the exact way to fix the aspect ratio
            pMPC->SetAspectRatioMode(AM_ARMODE_STRETCHED);
            ASSERT(SUCCEEDED(hr)) ;
            pMPC->Release() ;
            pPin->Release() ; // exiting early; release pin
            break ;   // we are done
        }
        pPin->Release() ;
    }
    pEnumPins->Release() ;  // done with pin enum

    return S_OK ;
}
Exemple #10
0
//
// CFilePlayer::BuildGraph(): Builds a AVI/MPEG/.. playback graph rendering via
// OverlayMixer which uses app's given DDraw params.
//
HRESULT CFilePlayer::BuildGraph(HWND hWndApp, LPDIRECTDRAW pDDObj, LPDIRECTDRAWSURFACE pDDPrimary)
{
    DbgLog((LOG_TRACE, 5, TEXT("CFilePlayer::BuildGraph() entered"))) ;

    HRESULT       hr ;
    IBaseFilter  *pOvM ;
    WCHAR         achwFileName[MAX_PATH] ;
    LPWSTR        lpszwFileName = NULL ;
    IBaseFilter  *pVR ;

    // First release any existing interface pointer(s)
    ReleaseInterfaces() ;
    SetColorKey(253) ;  // default magenta for 8bpp

    // Check if a file name has been specified; if so, use that
    if (lstrlen(GetFileName()) > 0)  // if something was specified before
    {
#ifdef UNICODE
        lstrcpy(achwFileName, GetFileName()) ;
#else
        MultiByteToWideChar(CP_ACP, 0, GetFileName(), -1, achwFileName, MAX_PATH) ;
#endif

        lpszwFileName = achwFileName ;
    }
    else  // no file specified, but we should have detected it before!!!
        return E_FAIL ;

    //
    // Instantiate Overlay Mixer, add it to the graph and set DDraw params
    //
    hr = AddOvMToGraph(&pOvM, pDDObj, pDDPrimary) ;
    if (FAILED(hr))
    {
        return E_FAIL ;
    }

    //
    // First render the graph for the selected file
    //
    hr = m_pGraph->RenderFile(lpszwFileName, NULL) ;
    if (S_OK != hr)
    {
        DbgLog((LOG_ERROR, 0,
            TEXT("Rendering the given file didn't succeed completely (Error 0x%lx)"), hr)) ;
        m_pGraph->RemoveFilter(pOvM) ;  // remove from graph
        pOvM->Release() ;               // release filter
        return E_FAIL ;
    }

    //
    // Because there are some AVI files which on some machines decide to rather go
    // through the Color Space Converter filter, just making sure that the OverlayMixer
    // is actually being used.  Otherwise we have to do some more (bull)work.
    //
    if (! IsOvMConnected(pOvM) )
    {
        DbgLog((LOG_TRACE, 1, TEXT("OverlayMixer is not used in the graph. Try again..."))) ;

        //
        // Check that the  specified file has a video stream. Otherwise OverlayMixer
        // will never be used and DDraw exclusive mode playback doesn't make any sense.
        //
        if (FAILED(GetVideoRendererInterface(&pVR)))
        {
            DbgLog((LOG_TRACE, 1, TEXT("Specified file doesn't have any video stream. Aborting graph building."))) ;
            m_pGraph->RemoveFilter(pOvM) ;  // remove from graph
            pOvM->Release() ;               // release filter
            return E_FAIL ;
        }

        //
        // Put the video stream to go through the OverlayMixer.
        //
        hr = PutVideoThroughOvM(pOvM, pVR) ;
        if (FAILED(hr))
        {
            DbgLog((LOG_TRACE, 1, TEXT("Couldn't put video through the OverlayMixer."))) ;
            m_pGraph->RemoveFilter(pOvM) ;  // remove OvMixer from graph
            pOvM->Release() ;               // release OvMixer filter
            pVR->Release() ;                // release VR interface (before giving up)
            return E_FAIL ;
        }
        pVR->Release() ;    // done with VR interface
    }

    //
    // We are successful in building the graph. Now the rest...
    //
    GetInterfaces(hWndApp) ;

    // Get IDDrawExclModeVideo interface of the OvMixer and store it
    hr = pOvM->QueryInterface(IID_IDDrawExclModeVideo, (LPVOID *)&m_pDDXM) ;
    ASSERT(SUCCEEDED(hr)) ;

    // Get the color key to be used and store it
    hr = GetColorKeyInternal(pOvM) ;
    ASSERT(SUCCEEDED(hr)) ;

    pOvM->Release() ;  // done with it

    return S_OK ;
}
Exemple #11
0
//
// CDVDPlayer::BuildGraph(): Builds a filter graph for playing back the specified
// DVD title/file.  Also gets some interfaces that are required for controlling
// playback.
//
HRESULT CDVDPlayer::BuildGraph(HWND hWndApp, LPDIRECTDRAW pDDObj, LPDIRECTDRAWSURFACE pDDPrimary)
{
    DbgLog((LOG_TRACE, 5, TEXT("CDVDPlayer::BuildGraph() entered"))) ;

    HRESULT     hr ;

    // First release any existing interface pointer(s)
    ReleaseInterfaces() ;
    SetColorKey(253) ;  // default magenta for 8bpp

    // Check if a DVD-Video volume name has been specified; if so, use that
    WCHAR    achwFileName[MAX_PATH] ;
    LPCWSTR  lpszwFileName = NULL ;  // by default
    if (lstrlen(GetFileName()) > 0)  // if something was specified before
    {
#ifdef UNICODE
        lstrcpy(achwFileName, GetFileName()) ;
#else
        MultiByteToWideChar(CP_ACP, 0, GetFileName(), -1, achwFileName, MAX_PATH) ;
#endif // UNICODE

        lpszwFileName = achwFileName ;
    }
    DbgLog((LOG_TRACE, 5, TEXT("DVD file <%s> will be played"), GetFileName())) ;

    // Set DDraw object and surface on DVD graph builder before starting to build graph
    IDDrawExclModeVideo  *pDDXMV ;
    hr = m_pDvdGB->GetDvdInterface(IID_IDDrawExclModeVideo, (LPVOID *)&pDDXMV) ;
    if (FAILED(hr) || NULL == pDDXMV)
    {
        DbgLog((LOG_ERROR, 0,
            TEXT("ERROR: IDvdGB::GetDvdInterface(IDDrawExclModeVideo) failed (Error 0x%lx)"), hr)) ;
        return hr ;
    }
    hr = pDDXMV->SetDDrawObject(pDDObj) ;
    if (FAILED(hr))
    {
        DbgLog((LOG_ERROR, 0, TEXT("ERROR: IDDrawExclModeVideo::SetDDrawObject() failed (Error 0x%lx)"), hr)) ;
        pDDXMV->Release() ;  // release before returning
        return hr ;
    }
    hr = pDDXMV->SetDDrawSurface(pDDPrimary) ;
    if (FAILED(hr))
    {
        DbgLog((LOG_ERROR, 0, TEXT("ERROR: IDDrawExclModeVideo::SetDDrawSurface() failed (Error 0x%lx)"), hr)) ;
        pDDXMV->SetDDrawObject(NULL) ;  // to reset
        pDDXMV->Release() ;  // release before returning
        return hr ;
    }
    pDDXMV->Release() ;  // done with the interface

    // Build the graph
    AM_DVD_RENDERSTATUS   Status ;
    TCHAR                 achBuffer[1000] ;
    hr = m_pDvdGB->RenderDvdVideoVolume(lpszwFileName,
        AM_DVD_HWDEC_PREFER, &Status) ;
    if (FAILED(hr))
    {
        AMGetErrorText(hr, achBuffer, sizeof(achBuffer)) ;
        MessageBox(hWndApp, achBuffer, "Error", MB_OK) ;
        return hr ;
    }
    if (S_FALSE == hr)  // if partial success
    {
        std::basic_string<TCHAR>   l_Text;
        if (GetStatusText(&Status, achBuffer, sizeof(achBuffer)))
	    {
            l_Text.assign(achBuffer);
        }
        else
        {
            l_Text.assign(TEXT("An unknown error has occurred"));
        }
        l_Text.append(TEXT("\n\nDo you still want to continue?"));
        if (IDNO == MessageBox(hWndApp, l_Text.c_str(), TEXT("Warning"), MB_YESNO))
        {
            return E_FAIL;
        }
    }

    GetInterfaces(hWndApp) ;

    hr = GetColorKeyInternal() ;
    ASSERT(SUCCEEDED(hr)) ;

    return S_OK ;
}
Exemple #12
0
bool CAnimationSpooler::PrepareJob_Flat(CAnimJobUI* pJob)
{
   // Determine actual colorkey
   pJob->data.plot.clrKey = TranslateColor(m_p3DBackSurface, pJob->data.plot.clrKey);
   // Prepare surfaces
   HRESULT Hr;
   RECT rc = pJob->data.plot.rcFrom;
   int cx = rc.right - rc.left;
   int cy = rc.bottom - rc.left;
   FLOAT z = 0.1f;
   FLOAT rhw = 1.0f / (z * 990.0f + 10.0f);
   D3DCOLOR col = 0xffffffff;
   // Determine texture size
   int iTexSize = 128;
   if( cx < 64 ) iTexSize = 64;
   if( cx < 32 ) iTexSize = 32;
   FLOAT fTexSize = (FLOAT) iTexSize;
   // Start building tiles
   pJob->iBufferStart = m_nBuffers;
   for( int x = rc.left; x < rc.right; x += iTexSize ) {
      for( int y = rc.top; y < rc.bottom; y += iTexSize ) {
         RECT rcTile = { x, y, MIN(rc.right, x + iTexSize), MIN(rc.bottom, y + iTexSize) };
         // Adjust texture coordinates, because last tile may only use parts
         // of the texture...
         FLOAT tcoordx = (iTexSize - (x + fTexSize - rc.right)) / fTexSize;
         FLOAT tcoordy = (iTexSize - (y + fTexSize - rc.bottom)) / fTexSize;
         if( tcoordx > 1.0f ) tcoordx = 1.0f;
         if( tcoordy > 1.0f ) tcoordy = 1.0f;
         // Create the vertex buffer
         CUSTOMFAN verts = 
         {
            { rcTile.left - 0.5f,  rcTile.top - 0.5f,    z, rhw, col, 0.0f, 0.0f },
            { rcTile.right - 0.5f, rcTile.top - 0.5f,    z, rhw, col, tcoordx, 0.0f },
            { rcTile.right - 0.5f, rcTile.bottom - 0.5f, z, rhw, col, tcoordx, tcoordy },
            { rcTile.left - 0.5f,  rcTile.bottom - 0.5f, z, rhw, col, 0.0f, tcoordy }
         };
         LPDIRECT3DVERTEXBUFFER9 pVertex = NULL;
         Hr = m_p3DDevice->CreateVertexBuffer(4 * sizeof(CUSTOMVERTEX), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &pVertex, NULL);
         if( FAILED(Hr) ) return false;
         CSafeRelease<IDirect3DVertexBuffer9> RefVertex = pVertex;
         memcpy(m_fans[m_nBuffers], verts, sizeof(verts));

         LPDIRECT3DTEXTURE9 pTex1 = NULL;
         Hr = m_p3DDevice->CreateTexture(iTexSize, iTexSize, 1, 0, m_ColorFormat, D3DPOOL_DEFAULT, &pTex1, NULL);
         if( FAILED(Hr) ) return false;
         CSafeRelease<IDirect3DTexture9> RefTex1 = pTex1;
         LPDIRECT3DSURFACE9 pTexSurf1 = NULL;
         Hr = pTex1->GetSurfaceLevel(0, &pTexSurf1);
         if( FAILED(Hr) ) return false;
         CSafeRelease<IDirect3DSurface9> RefTexSurf1 = pTexSurf1;
         POINT pt = { 0, 0 };         
         Hr = m_p3DDevice->UpdateSurface(m_p3DBackSurface, &rcTile, pTexSurf1, &pt);
         if( FAILED(Hr) ) return false;
         LPDIRECT3DTEXTURE9 pTex2 = NULL;
         RECT rcDest = { 0, 0, rcTile.right - rcTile.left, rcTile.bottom - rcTile.top };
         Hr = m_p3DDevice->CreateTexture(iTexSize, iTexSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pTex2, NULL);
         if( FAILED(Hr) ) return false;
         CSafeRelease<IDirect3DTexture9> RefTex2 = pTex2;
         LPDIRECT3DSURFACE9 pTexSurf2 = NULL;
         Hr = pTex2->GetSurfaceLevel(0, &pTexSurf2);
         if( FAILED(Hr) ) return false;
         CSafeRelease<IDirect3DSurface9> RefTexSurf2 = pTexSurf2;
         Hr = m_p3DDevice->StretchRect(pTexSurf1, &rcDest, pTexSurf2, &rcDest, D3DTEXF_NONE);
         if( FAILED(Hr) ) return false;
         // Replace colorkey pixels with alpha
         SetColorKey(pTex2, pTexSurf2, iTexSize, pJob->data.plot.clrKey);
         // Finally, assign the texture
         m_p3DTextures[m_nBuffers] = RefTex2.Detach();
         m_p3DVertices[m_nBuffers] = RefVertex.Detach();
         m_nBuffers++;
      }
   }
   pJob->iBufferEnd = m_nBuffers;
   ASSERT(m_nBuffers<MAX_BUFFERS);
   // Clear the background so the sprite can take its place
   COLORREF clrBack = pJob->data.plot.clrBack;
   if( clrBack != CLR_INVALID) {
      HDC hDC = NULL;
      Hr = m_p3DBackSurface->GetDC(&hDC);
      if( FAILED(Hr) ) return false;
      HBRUSH hBrush = ::CreateSolidBrush(clrBack);
      ::FillRect(hDC, &rc, hBrush);
      ::DeleteObject(hBrush);
      m_p3DBackSurface->ReleaseDC(hDC);
   }
   return true;
}
Exemple #13
0
void masked_blit(ALLEGRO_BITMAP *source, ALLEGRO_BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height) {
	SetColorKey(source->surf.get());
	blit(source, dest, source_x, source_y, dest_x, dest_y, width, height);
}