200 lines
6.3 KiB
C++
200 lines
6.3 KiB
C++
#include "stdafx.h"
|
|
#include "DXSvr.h"
|
|
|
|
extern IDirectDraw7 * g_pDD;
|
|
|
|
|
|
//***************************************************************************************
|
|
HRESULT LoadBMPFile(TCHAR* strFilename, HBITMAP* phbm)
|
|
{
|
|
// Check params
|
|
if (NULL==strFilename || NULL==phbm)
|
|
return DDERR_INVALIDPARAMS;
|
|
|
|
// Try to load the bitmap as a resource.
|
|
(*phbm) = (HBITMAP)LoadImage(g_hMainInstance, strFilename, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
|
|
|
|
// If the bitmap wasn't a resource, try it as a file.
|
|
if (NULL == (*phbm))
|
|
(*phbm) = (HBITMAP)LoadImage(NULL, strFilename, IMAGE_BITMAP, 0, 0,
|
|
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
|
|
|
|
return (*phbm) ? DD_OK : DDERR_NOTFOUND;
|
|
}
|
|
|
|
//***************************************************************************************
|
|
HRESULT LoadBMPFileChain(TCHAR** strFilenames , HBITMAP* phbm , int num_files)
|
|
{
|
|
for (int i = 0 ; i < num_files ; i++)
|
|
{
|
|
if (FAILED(LoadBMPFile(strFilenames[i] , phbm+i)))
|
|
{
|
|
for (int j = 0 ; j < i ; j++)
|
|
DeleteObject(phbm[j]);
|
|
return E_FAIL;
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//***************************************************************************************
|
|
IDirectDrawSurface7* CreateTextureFromBitmap(HBITMAP hBmp , DDPIXELFORMAT& ddpfFormat)
|
|
{
|
|
IDirectDrawSurface7* pTexture;
|
|
IDirectDrawSurface7* pSurface;
|
|
DDSURFACEDESC2 desc;
|
|
|
|
// Figure out the size of the bitmap
|
|
BITMAP bm;
|
|
GetObject(hBmp, sizeof(BITMAP), &bm);
|
|
|
|
// Create texture surface. Flag as a managed texture
|
|
memset(&desc , 0 , sizeof(desc));
|
|
desc.dwSize = sizeof(desc);
|
|
desc.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT;
|
|
desc.dwHeight = bm.bmHeight;
|
|
desc.dwWidth = bm.bmWidth;
|
|
desc.ddpfPixelFormat = ddpfFormat;
|
|
desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE;
|
|
desc.ddsCaps.dwCaps2 = DDSCAPS2_TEXTUREMANAGE;
|
|
if (FAILED(g_pDD->CreateSurface(&desc , &pTexture , NULL))) // g_pDDraw
|
|
return NULL;
|
|
|
|
// Now create system surface which we'll put the bitmap data into.
|
|
desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE|DDSCAPS_SYSTEMMEMORY;
|
|
desc.ddsCaps.dwCaps2 = 0;
|
|
if (FAILED(g_pDD->CreateSurface(&desc , &pSurface , NULL)))
|
|
{
|
|
pTexture->Release();
|
|
return NULL;
|
|
}
|
|
|
|
// Copy the bitmap into the system surface
|
|
HDC image = CreateCompatibleDC(NULL);
|
|
if (image != NULL)
|
|
{
|
|
SelectObject(image , hBmp);
|
|
HDC dc;
|
|
if (SUCCEEDED(pSurface->GetDC(&dc)))
|
|
{
|
|
BitBlt(dc , 0 , 0 , bm.bmWidth , bm.bmHeight , image , 0 , 0 , SRCCOPY);
|
|
pSurface->ReleaseDC(dc);
|
|
}
|
|
DeleteDC(image);
|
|
}
|
|
|
|
// Load the texture
|
|
pTexture->Blt(NULL , pSurface , NULL , DDBLT_WAIT , NULL);
|
|
|
|
// Lose the system copy of the texture
|
|
pSurface->Release();
|
|
|
|
// Done
|
|
return pTexture;
|
|
}
|
|
|
|
//***************************************************************************************
|
|
IDirectDrawSurface7* CreateMipTextureFromBitmapChain(HBITMAP* hBmp , DDPIXELFORMAT& ddpfFormat , int num_mips)
|
|
{
|
|
IDirectDrawSurface7* pSurface;
|
|
IDirectDrawSurface7* pTexture;
|
|
DDSURFACEDESC2 desc;
|
|
|
|
// Figure out the size of the first bitmap
|
|
BITMAP bm;
|
|
GetObject(*hBmp, sizeof(BITMAP), &bm);
|
|
|
|
// Create texture surface. Flag as a managed texture
|
|
memset(&desc , 0 , sizeof(desc));
|
|
desc.dwSize = sizeof(desc);
|
|
desc.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_MIPMAPCOUNT;
|
|
desc.dwHeight = bm.bmHeight;
|
|
desc.dwWidth = bm.bmWidth;
|
|
desc.dwMipMapCount = num_mips;
|
|
desc.ddpfPixelFormat = ddpfFormat;
|
|
desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE|DDSCAPS_MIPMAP|DDSCAPS_COMPLEX;
|
|
desc.ddsCaps.dwCaps2 = DDSCAPS2_TEXTUREMANAGE;
|
|
if (FAILED(g_pDD->CreateSurface(&desc , &pTexture , NULL)))
|
|
return NULL;
|
|
|
|
// Now create system surface which we'll put the bitmap data into.
|
|
desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE|DDSCAPS_SYSTEMMEMORY|DDSCAPS_MIPMAP|DDSCAPS_COMPLEX;
|
|
desc.ddsCaps.dwCaps2 = 0;
|
|
if (FAILED(g_pDD->CreateSurface(&desc , &pSurface , NULL)))
|
|
{
|
|
pTexture->Release();
|
|
return NULL;
|
|
}
|
|
|
|
// Copy the bitmaps into the system surfaces
|
|
IDirectDrawSurface7* pMipLevel = pSurface;
|
|
HDC image = CreateCompatibleDC(NULL);
|
|
if (image != NULL)
|
|
{
|
|
for (int i = 0 ; i < num_mips ; i++)
|
|
{
|
|
GetObject(hBmp[i] , sizeof(BITMAP) , &bm);
|
|
SelectObject(image , hBmp[i]);
|
|
HDC dc;
|
|
if (SUCCEEDED(pMipLevel->GetDC(&dc)))
|
|
{
|
|
BitBlt(dc , 0 , 0 , bm.bmWidth , bm.bmHeight , image , 0 , 0 , SRCCOPY);
|
|
pMipLevel->ReleaseDC(dc);
|
|
}
|
|
|
|
DDSCAPS2 ddsCaps;
|
|
ddsCaps.dwCaps = DDSCAPS_TEXTURE|DDSCAPS_MIPMAP;
|
|
ddsCaps.dwCaps2 = ddsCaps.dwCaps3 = ddsCaps.dwCaps4 = 0;
|
|
if (FAILED(pMipLevel->GetAttachedSurface(&ddsCaps , &pMipLevel)))
|
|
break;
|
|
}
|
|
DeleteDC(image);
|
|
}
|
|
|
|
// Load the texture
|
|
pTexture->Blt(NULL , pSurface , NULL , DDBLT_WAIT , NULL);
|
|
|
|
// Lose the system copy of the texture
|
|
pSurface->Release();
|
|
|
|
// Done
|
|
return pTexture;
|
|
}
|
|
|
|
//***************************************************************************************
|
|
IDirectDrawSurface7* LoadAndCreateTexture(TCHAR* strFilename , DDPIXELFORMAT& ddpfFormat)
|
|
{
|
|
HBITMAP hBmp;
|
|
if (FAILED(LoadBMPFile(strFilename , &hBmp)))
|
|
return NULL;
|
|
|
|
IDirectDrawSurface7* texture = CreateTextureFromBitmap(hBmp , ddpfFormat);
|
|
|
|
DeleteObject(hBmp);
|
|
|
|
return texture;
|
|
}
|
|
|
|
//***************************************************************************************
|
|
IDirectDrawSurface7* LoadAndCreateMipTexture(TCHAR** strFilenames , DDPIXELFORMAT& ddpfFormat , int num_mips)
|
|
{
|
|
if (num_mips > 16 || num_mips < 1)
|
|
return NULL;
|
|
|
|
HBITMAP hBmp[16];
|
|
|
|
if (FAILED(LoadBMPFileChain(strFilenames , hBmp , num_mips)))
|
|
return NULL;
|
|
|
|
IDirectDrawSurface7* texture = CreateMipTextureFromBitmapChain(hBmp , ddpfFormat , num_mips);
|
|
|
|
for (int i = 0 ; i < num_mips ; i++)
|
|
DeleteObject(hBmp[i]);
|
|
|
|
return texture;
|
|
}
|
|
|
|
|
|
|