windows-nt/Source/XPSP1/NT/shell/osshell/control/scrnsave/dolphin/texture.cpp
2020-09-26 16:20:57 +08:00

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;
}