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 } }
// // 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 ; }
/////////////////// // 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; }
/*----------------------------------------------------------------------------- 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; }
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; }
/* 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); } }
/*----------------------------------------------------------------------------- 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; }
/* -- 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; }
// // 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 ; }
// // 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 ; }
// // 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 ; }
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; }
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); }