Example #1
0
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;
}
Example #2
0
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;
}