bool CDX7SubPicAllocator::Alloc(bool fStatic, ISubPic** ppSubPic) { if (!ppSubPic) { return false; } if (m_maxsize.cx <= 0 || m_maxsize.cy <= 0) { return false; } CAutoLock cAutoLock(this); DDSURFACEDESC2 ddsd; INITDDSTRUCT(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT; ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | (fStatic ? DDSCAPS_SYSTEMMEMORY : 0); ddsd.ddsCaps.dwCaps2 = fStatic ? 0 : (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_HINTSTATIC); ddsd.dwWidth = m_maxsize.cx; ddsd.dwHeight = m_maxsize.cy; ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS; ddsd.ddpfPixelFormat.dwRGBBitCount = 32; ddsd.ddpfPixelFormat.dwRGBAlphaBitMask = 0xFF000000; ddsd.ddpfPixelFormat.dwRBitMask = 0x00FF0000; ddsd.ddpfPixelFormat.dwGBitMask = 0x0000FF00; ddsd.ddpfPixelFormat.dwBBitMask = 0x000000FF; if (m_fPow2Textures && ddsd.dwWidth < 1024 && ddsd.dwHeight < 1024) { ddsd.dwWidth = ddsd.dwHeight = 1; while (ddsd.dwWidth < (DWORD)m_maxsize.cx) { ddsd.dwWidth <<= 1; } while (ddsd.dwHeight < (DWORD)m_maxsize.cy) { ddsd.dwHeight <<= 1; } } CComPtr<IDirect3D7> pD3D; CComQIPtr<IDirectDraw7, &IID_IDirectDraw7> pDD; if (FAILED(m_pD3DDev->GetDirect3D(&pD3D)) || !pD3D || !(pDD = pD3D)) { return false; } CComPtr<IDirectDrawSurface7> pSurface; if (FAILED(pDD->CreateSurface(&ddsd, &pSurface, nullptr))) { return false; } try { *ppSubPic = DEBUG_NEW CDX7SubPic(m_pD3DDev, pSurface); } catch (std::bad_alloc) { return false; } (*ppSubPic)->AddRef(); return true; }
bool CDX7SubPicAllocator::Alloc(bool fStatic, ISubPic** ppSubPic) { if (!ppSubPic) { return false; } CAutoLock cAutoLock(this); DDSURFACEDESC2 ddsd; INITDDSTRUCT(ddsd); ddsd.dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT; ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | (fStatic ? DDSCAPS_SYSTEMMEMORY : 0); ddsd.ddsCaps.dwCaps2 = fStatic ? 0 : (DDSCAPS2_TEXTUREMANAGE|DDSCAPS2_HINTSTATIC); ddsd.dwWidth = m_maxsize.cx; ddsd.dwHeight = m_maxsize.cy; ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB|DDPF_ALPHAPIXELS; ddsd.ddpfPixelFormat.dwRGBBitCount = 32; ddsd.ddpfPixelFormat.dwRGBAlphaBitMask = 0xFF000000; ddsd.ddpfPixelFormat.dwRBitMask = 0x00FF0000; ddsd.ddpfPixelFormat.dwGBitMask = 0x0000FF00; ddsd.ddpfPixelFormat.dwBBitMask = 0x000000FF; CComPtr<IDirect3D7> pD3D; CComQIPtr<IDirectDraw7, &IID_IDirectDraw7> pDD; if (FAILED(m_pD3DDev->GetDirect3D(&pD3D)) || !pD3D || !(pDD = pD3D)) { return false; } CComPtr<IDirectDrawSurface7> pSurface; if (FAILED(pDD->CreateSurface(&ddsd, &pSurface, NULL))) { return false; } *ppSubPic = DNew CDX7SubPic(m_pD3DDev, pSurface); if (!(*ppSubPic)) { return false; } (*ppSubPic)->AddRef(); return true; }