/*==LICENSE==* CyanWorlds.com Engine - MMOG client, server and tools Copyright (C) 2011 Cyan Worlds, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . You can contact Cyan Worlds, Inc. by email legal@cyan.com or by snail mail at: Cyan Worlds, Inc. 14617 N Newport Hwy Mead, WA 99021 *==LICENSE==*/ /////////////////////////////////////////////////////////////////////////////// // // // hsDXTDirectXCodec Class Functions // // DirectX-based codec functions // // Cyan, Inc. // // // //// Version History ////////////////////////////////////////////////////////// // // // 6.8.2001 mcn - Got a much-needed Plasma 2.0/DX8 update. // // // /////////////////////////////////////////////////////////////////////////////// #include "hsConfig.h" #include "hsWindows.h" #include #include #include "hsTypes.h" #include "hsDXTDirectXCodec.h" #include "plMipmap.h" #include "hsCodecManager.h" #include "../plPipeline/hsGDDrawDllLoad.h" namespace { typedef HRESULT(WINAPI * DIRECTDRAWCREATEEX)( GUID*, VOID**, REFIID, IUnknown* ); } enum { D3DTEXTURE_FMT_ARGB32_8888 = 0x00000002, // No. 2: 8888 ARGB (32-bit) format. D3DTEXTURE_FMT_FOURCC_DXT1 = 0x00002000, // No.14: DXTn FourCC (DXT1), format. D3DTEXTURE_FMT_FOURCC_DXT5 = 0x00020000, // No.18: DXTn FourCC (DXT5), format. }; hsBool hsDXTDirectXCodec::fRegistered = false; //// Small Init Functions ///////////////////////////////////////////////////// hsDXTDirectXCodec& hsDXTDirectXCodec::Instance() { static hsDXTDirectXCodec the_instance; return the_instance; } hsDXTDirectXCodec::hsDXTDirectXCodec() : fDirectDraw( nil ), fDDLibraryInstance( nil ), fFlags( 0 ) { } hsDXTDirectXCodec::~hsDXTDirectXCodec() { if ((fFlags & kExternalInit) == 0) { if (fDirectDraw) { fDirectDraw->Release(); } if (fDDLibraryInstance) { FreeLibrary(fDDLibraryInstance); } } fDirectDraw = nil; fDDLibraryInstance = nil; } hsBool hsDXTDirectXCodec::Register() { return hsCodecManager::Instance().Register( &(Instance()), plMipmap::kDirectXCompression, 500 ); } //// Initialize /////////////////////////////////////////////////////////////// void hsDXTDirectXCodec::Initialize( IDirect3DDevice8 *directDraw ) { /* if (directDraw) { fFlags |= (kInitialized | kExternalInit); } else { fFlags &= ~(kInitialized | kExternalInit); } fDirectDraw = directDraw; */ // Don't do anything--force IInitialize to run } //// IInitialize ////////////////////////////////////////////////////////////// // Gotta initialize D3D ourself and create a device and everything. This is // a LOT messier than it was in DX7, since this time we got D3D to deal with hsBool hsDXTDirectXCodec::IInitialize() { fFlags |= kInitialized; // if( hsGDDrawDllLoad::GetDDrawDll() == nil ) // return false; DIRECTDRAWCREATEEX DirectDrawCreateEx = 0; // Initialize DirectDraw HRESULT hr; DirectDrawCreateEx = (DIRECTDRAWCREATEEX)GetProcAddress( hsGDDrawDllLoad::GetD3DDll(), "DirectDrawCreateEx" ); if( DirectDrawCreateEx == nil ) return false; /// Using EMULATIONONLY here usually fails--using NULL forces the /// use of the standard display driver, which DOES work. if (FAILED(hr = DirectDrawCreateEx((GUID FAR *)NULL/*DDCREATE_EMULATIONONLY*/, (VOID**)&fDirectDraw, IID_IDirectDraw7, NULL))) return false; if (FAILED(hr = fDirectDraw->SetCooperativeLevel(NULL, DDSCL_NORMAL))) return false; return true; } //// CreateCompressedMipmap /////////////////////////////////////////////////// // Updated 8.15.2000 mcn to generate uncompressed mipmaps down to 1x1 (the // decompressor better know how to deal with this!) Also cleaned up so I can // read it :) plMipmap *hsDXTDirectXCodec::CreateCompressedMipmap( plMipmap *uncompressed ) { const plMipmap *b = uncompressed; plMipmap *compressed = nil; UInt32 numLevels = 1, numCompLevels; UInt32 compFormat, totalSize, compSize; Int32 width, height, blockSize, i; /// Sanity checks, initialization, etc. if( !Initialized() ) { if( !IInitialize() ) return nil; } hsAssert( fRegistered, "Calling member of unregistered codec." ); hsAssert( !uncompressed->IsCompressed(), "Trying to re-compress compressed bitmap." ); if( !fDirectDraw ) return nil; /// Check width and height if( ( uncompressed->GetWidth() | uncompressed->GetHeight() ) & 0x03 ) return nil; /// Width and height must be multiple of 4 /// This used to be checked later--but WHY? We can check it now and /// potentially avoid a lot of headache compFormat = ICompressedFormat( b ); if( !compFormat ) return nil; /// Precalc this blockSize = ( compFormat == D3DTEXTURE_FMT_FOURCC_DXT1 ) ? 8 : 16; { compSize = 0; numCompLevels = 0; width = uncompressed->GetWidth(); height = uncompressed->GetHeight(); /// Count the levels we're going to compress for( i = 0; i < uncompressed->GetNumLevels(); i++ ) { if( ( width | height ) & 0x03 ) break; numCompLevels++; compSize += blockSize * width * height >> 4; width >>= 1; height >>= 1; } /// NEW 8.15.2000 mcn - Now count up remaining levels down to 1x1 totalSize = compSize; numLevels = numCompLevels; for( ; i < uncompressed->GetNumLevels(); i++ ) { totalSize += uncompressed->GetLevelSize( (UInt8)i ); width >>= 1; height >>= 1; numLevels++; } } /// Create source DirectDraw surface IDirectDrawSurface7 *srcSurface = IMakeDirect3DSurface( D3DTEXTURE_FMT_ARGB32_8888, numCompLevels, uncompressed->GetWidth(), uncompressed->GetHeight() ); IFillSurface( (hsRGBAColor32 *)uncompressed->GetImage(), numCompLevels, srcSurface ); /// Create destination DirectDraw surface IDirectDrawSurface7 *destSurface = IMakeDirect3DSurface( compFormat, numCompLevels, uncompressed->GetWidth(), uncompressed->GetHeight() ); ICopySurface( destSurface, srcSurface, numCompLevels ); /// Now set up the data structures compressed = TRACKED_NEW plMipmap( uncompressed->GetWidth(), uncompressed->GetHeight(), plMipmap::kARGB32Config, uncompressed->GetNumLevels(), plMipmap::kDirectXCompression, ( compFormat == D3DTEXTURE_FMT_FOURCC_DXT1 ) ? plMipmap::DirectXInfo::kDXT1 : plMipmap::DirectXInfo::kDXT5 ); /// Copy compressed data back from the surface IFillFromSurface( (hsRGBAColor32 *)compressed->GetImage(), numCompLevels, destSurface ); /// Finally, copy back any remaining data if( numCompLevels < numLevels ) { /// Now copy the rest straight over for( i = numCompLevels; i < numLevels; i++ ) { memcpy( compressed->GetLevelPtr( (UInt8)i ), uncompressed->GetLevelPtr( (UInt8)i ), uncompressed->GetLevelSize( (UInt8)i ) ); } } /// All done! return compressed; } //// CreateUncompressedMipmap ///////////////////////////////////////////////// // Updated 8.15.2000 mcn to support mipmaps down to 1x1. See // CreateCompressedMipmap(). Also cleaned up the code a bit (too tired to // clean it ALL up) plMipmap *hsDXTDirectXCodec::CreateUncompressedMipmap( plMipmap *compressed, UInt8 bitDepth ) { /// Use software decompression ALWAYS return nil; /* plMipmap *uncompressed = nil; UInt32 mmlvs, formatType, numCompLevels; Int32 totalSize, width, height, i; /// Check bit depth--if it's 16 bit, we don't support it (for now) if( ( bitDepth & hsCodecManager::kBitDepthMask ) != hsCodecManager::k16BitDepth ) return nil; if( !Initialized() ) { if( !IInitialize() ) return nil; } /// Sanity checks hsAssert( fRegistered, "Calling member of unregistered codec." ); hsAssert( compressed->fFlags & hsGMipmap::kCompressed, "Trying to uncompress already uncompressed bitmap." ); hsAssert( compressed->fCompressionFormat == hsGMipmap::kDirectXCompression, "Uncompressing wrong format." ); hsAssert( ( compressed->fDirectXInfo.fCompressionType == hsGMipmap::DirectXInfo::kDXT1 ) || ( compressed->fDirectXInfo.fCompressionType == hsGMipmap::DirectXInfo::kDXT5 ), "Unsupported directX compression format." ); if( !fDirectDraw ) return nil; if( compressed->fDirectXInfo.fCompressionType == hsGMipmap::DirectXInfo::kDXT5 ) { // Fall out since directX software decompressor doesn't work... return nil; } if( compressed->fFlags & hsGMipmap::kMipMap ) { mmCompressed->SetLevel( 0 ); mmlvs = mmCompressed->GetNumLevels(); for( i = 0, numCompLevels = 0; i < mmlvs; i++ ) { mmCompressed->SetLevel( i ); if( ( mmCompressed->fWidth | mmCompressed->fHeight ) & 0x03 ) break; numCompLevels++; } mmCompressed->SetLevel( 0 ); } else { mmlvs = numCompLevels = 1; } /// Get format type formatType = ( compressed->fDirectXInfo.fCompressionType == hsGMipmap::DirectXInfo::kDXT1 ) ? D3DTEXTURE_FMT_FOURCC_DXT1 : D3DTEXTURE_FMT_FOURCC_DXT5; /// Make the surfaces (decompress in the process) IDirectDrawSurface7 *srcSurface = IMakeDirect3DSurface( formatType, numCompLevels, compressed->fWidth, compressed->fHeight ); IFillSurface( (hsRGBAColor32 *)compressed->fImage, numCompLevels, srcSurface ); IDirectDrawSurface7 *destSurface = IMakeDirect3DSurface( D3DTEXTURE_FMT_ARGB32_8888, numCompLevels, compressed->fWidth, compressed->fHeight ); ICopySurface( destSurface, srcSurface, numCompLevels ); /// Set up the uncompressed data structure if( compressed->fFlags & hsGMipmap::kMipMap ) { mmUncompressed = TRACKED_NEW hsGMipmapClass; uncompressed = mmUncompressed; } else { uncompressed = TRACKED_NEW plMipmap; mmUncompressed = nil; } uncompressed->fWidth = compressed->fWidth; uncompressed->fHeight = compressed->fHeight; uncompressed->fPixelSize = 32; uncompressed->fRowBytes = uncompressed->fWidth * uncompressed->fPixelSize >> 3; uncompressed->fFlags = compressed->fFlags & ~hsGMipmap::kCompressed; uncompressed->fCompressionFormat = 0; uncompressed->fDirectXInfo.fBlockSize = 0; uncompressed->fDirectXInfo.fCompressionType = hsGMipmap::DirectXInfo::kError; /// Handle mipmaps or single image? if( mmUncompressed ) { totalSize = 0; width = compressed->fWidth; height = compressed->fHeight; for( i = 0; i < mmlvs; i++ ) { totalSize += width * height * uncompressed->fPixelSize >> 3; width >>= 1; height >>= 1; } mmUncompressed->fImage = HSMemory::New( totalSize ); mmUncompressed->SetData( mmUncompressed->fImage ); mmUncompressed->SetNumLevels( mmlvs ); } else { uncompressed->fImage = HSMemory::New( uncompressed->fWidth * uncompressed->fHeight * uncompressed->fPixelSize >> 3 ); } /// Copy over compressed levels IFillFromSurface( (hsRGBAColor32 *)uncompressed->fImage, numCompLevels, destSurface ); /// Now take care of the remainder levels if( mmUncompressed ) { for( i = numCompLevels; i < mmlvs; i++ ) { mmUncompressed->SetLevel( i ); mmCompressed->SetLevel( i ); memcpy( mmUncompressed->fImage, mmCompressed->fImage, mmCompressed->ImageSize() ); } mmUncompressed->SetLevel( 0 ); mmCompressed->SetLevel( 0 ); } /// All done! return uncompressed; */ } UInt32 hsDXTDirectXCodec::ICompressedFormat(const plMipmap *uncompressed) { if( uncompressed->GetFlags() & plMipmap::kAlphaChannelFlag ) return D3DTEXTURE_FMT_FOURCC_DXT5; return D3DTEXTURE_FMT_FOURCC_DXT1; } //// IFindTextureFormat /////////////////////////////////////////////////////// // Changed to a local function 6.8.2001 to avoid certain annoying problems // with headers and the compiler. DDPIXELFORMAT IFindTextureFormat(UInt32 formatType) { DDPIXELFORMAT ddPixelFormat; memset( &ddPixelFormat, 0x00, sizeof(DDPIXELFORMAT) ); ddPixelFormat.dwSize = sizeof(DDPIXELFORMAT); switch (formatType) { case D3DTEXTURE_FMT_ARGB32_8888: ddPixelFormat.dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS; ddPixelFormat.dwFourCC = 0; ddPixelFormat.dwRGBBitCount = 32; ddPixelFormat.dwRBitMask = 0x00ff0000; ddPixelFormat.dwGBitMask = 0x0000ff00; ddPixelFormat.dwBBitMask = 0x000000ff; ddPixelFormat.dwRGBAlphaBitMask = 0xff000000; return ddPixelFormat; case D3DTEXTURE_FMT_FOURCC_DXT1: ddPixelFormat.dwFlags = DDPF_FOURCC; ddPixelFormat.dwFourCC = FOURCC_DXT1; return ddPixelFormat; case D3DTEXTURE_FMT_FOURCC_DXT5: ddPixelFormat.dwFlags = DDPF_FOURCC; ddPixelFormat.dwFourCC = FOURCC_DXT5; return ddPixelFormat; default: hsAssert(false, "Unknown texture format selected"); return ddPixelFormat; } } IDirectDrawSurface7 *hsDXTDirectXCodec::IMakeDirect3DSurface(UInt32 formatType, UInt32 mipMapLevels, UInt32 width, UInt32 height) { DDSURFACEDESC2 ddsd2; memset( &ddsd2, 0x00, sizeof(DDSURFACEDESC2) ); ddsd2.dwSize = sizeof(DDSURFACEDESC2); ddsd2.dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT; ddsd2.ddsCaps.dwCaps = DDSCAPS_TEXTURE; if(mipMapLevels > 1 ) { ddsd2.dwFlags |= DDSD_MIPMAPCOUNT; ddsd2.ddsCaps.dwCaps |= DDSCAPS_MIPMAP|DDSCAPS_COMPLEX; } ddsd2.dwMipMapCount = mipMapLevels; ddsd2.dwWidth = width; ddsd2.dwHeight = height; ddsd2.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; ddsd2.ddpfPixelFormat = IFindTextureFormat(formatType); IDirectDrawSurface7 *lpDDsTex; HRESULT res = fDirectDraw->CreateSurface( &ddsd2, &lpDDsTex, NULL ); if( S_OK != res ) CheckErrorCode(res); return lpDDsTex; } void hsDXTDirectXCodec::IFillSurface(hsRGBAColor32* src, UInt32 mmlvs, IDirectDrawSurface7 *pddsDest) { UInt8 *pTexDat = (UInt8*)src; UInt32 cap = 0; HRESULT hr; DDSCAPS2 ddsCaps2; for( WORD wNum=0; wNum < mmlvs; wNum++ ) { DDSURFACEDESC2 ddsd2; memset( &ddsd2, 0x00, sizeof(DDSURFACEDESC2) ); ddsd2.dwSize = sizeof( DDSURFACEDESC2 ); hr = pddsDest->Lock( NULL, &ddsd2, DDLOCK_WAIT | DDLOCK_WRITEONLY | DDLOCK_DISCARDCONTENTS, NULL ); if (ddsd2.ddpfPixelFormat.dwFlags == DDPF_FOURCC) { Int32 blockSize = (ddsd2.ddpfPixelFormat.dwFourCC == FOURCC_DXT1) ? 8 : 16; cap = ddsd2.dwHeight * ddsd2.dwWidth * blockSize >> 4; memcpy( (char*)ddsd2.lpSurface, pTexDat, cap ); pTexDat += cap; } else { hsAssert(ddsd2.ddpfPixelFormat.dwRGBBitCount == 32, "Format not supported."); Int32* dest = (Int32*)ddsd2.lpSurface; Int32 pixelCount = ddsd2.dwHeight * ddsd2.dwWidth; Int32 j; for (j = 0; j < pixelCount; ++j) { dest[j] = ( ( src->a << 24 ) | ( src->r << 16 ) | ( src->g << 8 ) | src->b ); src++; } } hr = pddsDest->Unlock( NULL ); memset( &ddsCaps2, 0x00, sizeof(DDSCAPS2) ); ddsCaps2.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_MIPMAP; if( SUCCEEDED( pddsDest->GetAttachedSurface( &ddsCaps2, &pddsDest ) ) ) pddsDest->Release(); } } void hsDXTDirectXCodec::IFillFromSurface(hsRGBAColor32* dest, UInt32 mmlvs, IDirectDrawSurface7 *pddsSrc) { UInt8 *pTexDat = (UInt8 *)dest; UInt32 cap = 0; HRESULT hr; DDSCAPS2 ddsCaps2; DDSURFACEDESC2 ddsd2; for( WORD wNum = 0; wNum < mmlvs; wNum++ ) { memset( &ddsd2, 0, sizeof( DDSURFACEDESC2 ) ); ddsd2.dwSize = sizeof( DDSURFACEDESC2 ); hr = pddsSrc->Lock( NULL, &ddsd2, DDLOCK_WAIT | DDLOCK_READONLY | DDLOCK_DISCARDCONTENTS, NULL ); if( ddsd2.ddpfPixelFormat.dwFlags == DDPF_FOURCC ) { Int32 blockSize = ( ddsd2.ddpfPixelFormat.dwFourCC == FOURCC_DXT1 ) ? 8 : 16; cap = ddsd2.dwHeight * ddsd2.dwWidth * blockSize >> 4; memcpy( pTexDat, (char*)ddsd2.lpSurface, cap ); pTexDat += cap; } else { hsAssert( ddsd2.ddpfPixelFormat.dwRGBBitCount == 32, "Format not supported." ); Int32* src = (Int32*)ddsd2.lpSurface; Int32 pixelCount = ddsd2.dwHeight * ddsd2.dwWidth; Int32 j; for (j = 0; j < pixelCount; ++j) { dest->a = (UInt8)((src[j] >> 24) & 0xff); dest->r = (UInt8)((src[j] >> 16) & 0xff); dest->g = (UInt8)((src[j] >> 8) & 0xff); dest->b = (UInt8)((src[j]) & 0xff); dest++; } } hr = pddsSrc->Unlock( NULL ); memset( &ddsCaps2, 0, sizeof( DDSCAPS2 ) ); ddsCaps2.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_MIPMAP; if( SUCCEEDED( pddsSrc->GetAttachedSurface( &ddsCaps2, &pddsSrc ) ) ) pddsSrc->Release(); } } void hsDXTDirectXCodec::ICopySurface(IDirectDrawSurface7 *dest, IDirectDrawSurface7 *src, Int32 mipMapLevels) { DDSURFACEDESC2 ddsd2; memset( &ddsd2, 0x00, sizeof(DDSURFACEDESC2) ); ddsd2.dwSize = sizeof( DDSURFACEDESC2 ); DDSCAPS2 ddsCaps; ZeroMemory(&ddsCaps, sizeof(ddsCaps)); ddsCaps.dwCaps = DDSCAPS_TEXTURE; if (mipMapLevels > 1) ddsCaps.dwCaps2 = DDSCAPS2_MIPMAPSUBLEVEL; IDirectDrawSurface7 *lpSrc = src; IDirectDrawSurface7 *lpDst = dest; int mmlvs = mipMapLevels; HRESULT hr; int i; for( i = 0; i < mmlvs; i++ ) { if( FAILED(hr = lpDst->Blt(NULL, lpSrc, NULL, DDBLT_WAIT, NULL)) ) { hsAssert(false, "Uh oh!"); } if (FAILED(hr = lpSrc->GetAttachedSurface(&ddsCaps, &lpSrc)) ||FAILED(hr = lpDst->GetAttachedSurface(&ddsCaps, &lpDst))) { break; } lpSrc->Release(); lpDst->Release(); } } void hsDXTDirectXCodec::CheckErrorCode(HRESULT res) { switch( res ) { // This object is already initialized case DDERR_ALREADYINITIALIZED: hsAssert(false, "DDERR_ALREADYINITIALIZED."); break; // This surface can not be attached to the requested surface. case DDERR_CANNOTATTACHSURFACE: hsAssert(false, "DDERR_CANNOTATTACHSURFACE."); break; // This surface can not be detached from the requested surface. case DDERR_CANNOTDETACHSURFACE: hsAssert(false, "DDERR_CANNOTDETACHSURFACE."); break; // Support is currently not available. case DDERR_CURRENTLYNOTAVAIL: hsAssert(false, "DDERR_CURRENTLYNOTAVAIL."); break; // An exception was encountered while performing the requested operation case DDERR_EXCEPTION: hsAssert(false, "DDERR_EXCEPTION."); break; // Generic failure. case DDERR_GENERIC: hsAssert(false, "DDERR_GENERIC."); break; // Height of rectangle provided is not a multiple of reqd alignment case DDERR_HEIGHTALIGN: hsAssert(false, "DDERR_HEIGHTALIGN."); break; // Unable to match primary surface creation request with existing // primary surface. case DDERR_INCOMPATIBLEPRIMARY: hsAssert(false, "DDERR_INCOMPATIBLEPRIMARY."); break; // One or more of the caps bits passed to the callback are incorrect. case DDERR_INVALIDCAPS: hsAssert(false, "DDERR_INVALIDCAPS."); break; // DirectDraw does not support provided Cliplist. case DDERR_INVALIDCLIPLIST: hsAssert(false, "DDERR_INVALIDCLIPLIST."); break; // DirectDraw does not support the requested mode case DDERR_INVALIDMODE: hsAssert(false, "DDERR_INVALIDMODE."); break; // DirectDraw received a pointer that was an invalid DIRECTDRAW object. case DDERR_INVALIDOBJECT: hsAssert(false, "DDERR_INVALIDOBJECT."); break; // One or more of the parameters passed to the callback function are // incorrect. case DDERR_INVALIDPARAMS: hsAssert(false, "DDERR_INVALIDPARAMS."); break; // pixel format was invalid as specified case DDERR_INVALIDPIXELFORMAT: hsAssert(false, "DDERR_INVALIDPIXELFORMAT."); break; // Rectangle provided was invalid. case DDERR_INVALIDRECT: hsAssert(false, "DDERR_INVALIDRECT."); break; // Operation could not be carried out because one or more surfaces are locked case DDERR_LOCKEDSURFACES: hsAssert(false, "DDERR_LOCKEDSURFACES."); break; // There is no 3D present. case DDERR_NO3D: hsAssert(false, "DDERR_NO3D."); break; // Operation could not be carried out because there is no alpha accleration // hardware present or available. case DDERR_NOALPHAHW: hsAssert(false, "DDERR_NOALPHAHW."); break; // no clip list available case DDERR_NOCLIPLIST: hsAssert(false, "DDERR_NOCLIPLIST."); break; // Operation could not be carried out because there is no color conversion // hardware present or available. case DDERR_NOCOLORCONVHW: hsAssert(false, "DDERR_NOCOLORCONVHW."); break; // Create function called without DirectDraw object method SetCooperativeLevel // being called. case DDERR_NOCOOPERATIVELEVELSET: hsAssert(false, "DDERR_NOCOOPERATIVELEVELSET."); break; // Surface doesn't currently have a color key case DDERR_NOCOLORKEY: hsAssert(false, "DDERR_NOCOLORKEY."); break; // Operation could not be carried out because there is no hardware support // of the dest color key. case DDERR_NOCOLORKEYHW: hsAssert(false, "DDERR_NOCOLORKEYHW."); break; // No DirectDraw support possible with current display driver case DDERR_NODIRECTDRAWSUPPORT: hsAssert(false, "DDERR_NODIRECTDRAWSUPPORT."); break; // Operation requires the application to have exclusive mode but the // application does not have exclusive mode. case DDERR_NOEXCLUSIVEMODE: hsAssert(false, "DDERR_NOEXCLUSIVEMODE."); break; // Flipping visible surfaces is not supported. case DDERR_NOFLIPHW: hsAssert(false, "DDERR_NOFLIPHW."); break; // There is no GDI present. case DDERR_NOGDI: hsAssert(false, "DDERR_NOGDI."); break; // Operation could not be carried out because there is no hardware present // or available. case DDERR_NOMIRRORHW: hsAssert(false, "DDERR_NOMIRRORHW."); break; // Requested item was not found case DDERR_NOTFOUND: hsAssert(false, "DDERR_NOTFOUND."); break; // Operation could not be carried out because there is no overlay hardware // present or available. case DDERR_NOOVERLAYHW: hsAssert(false, "DDERR_NOOVERLAYHW."); break; // Operation could not be carried out because the source and destination // rectangles are on the same surface and overlap each other. case DDERR_OVERLAPPINGRECTS: hsAssert(false, "DDERR_OVERLAPPINGRECTS."); break; // Operation could not be carried out because there is no appropriate raster // op hardware present or available. case DDERR_NORASTEROPHW: hsAssert(false, "DDERR_NORASTEROPHW."); break; // Operation could not be carried out because there is no rotation hardware // present or available. case DDERR_NOROTATIONHW: hsAssert(false, "DDERR_NOROTATIONHW."); break; // Operation could not be carried out because there is no hardware support // for stretching case DDERR_NOSTRETCHHW: hsAssert(false, "DDERR_NOSTRETCHHW."); break; // DirectDrawSurface is not in 4 bit color palette and the requested operation // requires 4 bit color palette. case DDERR_NOT4BITCOLOR: hsAssert(false, "DDERR_NOT4BITCOLOR."); break; // DirectDrawSurface is not in 4 bit color index palette and the requested // operation requires 4 bit color index palette. case DDERR_NOT4BITCOLORINDEX: hsAssert(false, "DDERR_NOT4BITCOLORINDEX."); break; // DirectDraw Surface is not in 8 bit color mode and the requested operation // requires 8 bit color. case DDERR_NOT8BITCOLOR: hsAssert(false, "DDERR_NOT8BITCOLOR."); break; // Operation could not be carried out because there is no texture mapping // hardware present or available. case DDERR_NOTEXTUREHW: hsAssert(false, "DDERR_NOTEXTUREHW."); break; // Operation could not be carried out because there is no hardware support // for vertical blank synchronized operations. case DDERR_NOVSYNCHW: hsAssert(false, "DDERR_NOVSYNCHW."); break; // Operation could not be carried out because there is no hardware support // for zbuffer blting. case DDERR_NOZBUFFERHW: hsAssert(false, "DDERR_NOZBUFFERHW."); break; // Overlay surfaces could not be z layered based on their BltOrder because // the hardware does not support z layering of overlays. case DDERR_NOZOVERLAYHW: hsAssert(false, "DDERR_NOZOVERLAYHW."); break; // The hardware needed for the requested operation has already been // allocated. case DDERR_OUTOFCAPS: hsAssert(false, "DDERR_OUTOFCAPS."); break; // DirectDraw does not have enough memory to perform the operation. case DDERR_OUTOFMEMORY: hsAssert(false, "DDERR_OUTOFMEMORY."); break; // DirectDraw does not have enough memory to perform the operation. case DDERR_OUTOFVIDEOMEMORY: hsAssert(false, "DDERR_OUTOFVIDEOMEMORY."); break; // hardware does not support clipped overlays case DDERR_OVERLAYCANTCLIP: hsAssert(false, "DDERR_OVERLAYCANTCLIP."); break; // Can only have ony color key active at one time for overlays case DDERR_OVERLAYCOLORKEYONLYONEACTIVE: hsAssert(false, "DDERR_OVERLAYCOLORKEYONLYONEACTIVE."); break; // Access to this palette is being refused because the palette is already // locked by another thread. case DDERR_PALETTEBUSY: hsAssert(false, "DDERR_PALETTEBUSY."); break; // No src color key specified for this operation. case DDERR_COLORKEYNOTSET: hsAssert(false, "DDERR_COLORKEYNOTSET."); break; // This surface is already attached to the surface it is being attached to. case DDERR_SURFACEALREADYATTACHED: hsAssert(false, "DDERR_SURFACEALREADYATTACHED."); break; // This surface is already a dependency of the surface it is being made a // dependency of. case DDERR_SURFACEALREADYDEPENDENT: hsAssert(false, "DDERR_SURFACEALREADYDEPENDENT."); break; // Access to this surface is being refused because the surface is already // locked by another thread. case DDERR_SURFACEBUSY: hsAssert(false, "DDERR_SURFACEBUSY."); break; // Access to this surface is being refused because no driver exists // which can supply a pointer to the surface. // This is most likely to happen when attempting to lock the primary // surface when no DCI provider is present. // Will also happen on attempts to lock an optimized surface. case DDERR_CANTLOCKSURFACE: hsAssert(false, "DDERR_CANTLOCKSURFACE."); break; // Access to Surface refused because Surface is obscured. case DDERR_SURFACEISOBSCURED: hsAssert(false, "DDERR_SURFACEISOBSCURED."); break; // Access to this surface is being refused because the surface is gone. // The DIRECTDRAWSURFACE object representing this surface should // have Restore called on it. case DDERR_SURFACELOST: hsAssert(false, "DDERR_SURFACELOST."); break; // The requested surface is not attached. case DDERR_SURFACENOTATTACHED: hsAssert(false, "DDERR_SURFACENOTATTACHED."); break; // Height requested by DirectDraw is too large. case DDERR_TOOBIGHEIGHT: hsAssert(false, "DDERR_TOOBIGHEIGHT."); break; // Size requested by DirectDraw is too large -- The individual height and // width are OK. case DDERR_TOOBIGSIZE: hsAssert(false, "DDERR_TOOBIGSIZE."); break; // Width requested by DirectDraw is too large. case DDERR_TOOBIGWIDTH: hsAssert(false, "DDERR_TOOBIGWIDTH."); break; // Action not supported. case DDERR_UNSUPPORTED: hsAssert(false, "DDERR_UNSUPPORTED."); break; // FOURCC format requested is unsupported by DirectDraw case DDERR_UNSUPPORTEDFORMAT: hsAssert(false, "DDERR_UNSUPPORTEDFORMAT."); break; // Bitmask in the pixel format requested is unsupported by DirectDraw case DDERR_UNSUPPORTEDMASK: hsAssert(false, "DDERR_UNSUPPORTEDMASK."); break; // The specified stream contains invalid data case DDERR_INVALIDSTREAM: hsAssert(false, "DDERR_INVALIDSTREAM."); break; // vertical blank is in progress case DDERR_VERTICALBLANKINPROGRESS: hsAssert(false, "DDERR_VERTICALBLANKINPROGRESS."); break; // Informs DirectDraw that the previous Blt which is transfering information // to or from this Surface is incomplete. case DDERR_WASSTILLDRAWING: hsAssert(false, "DDERR_WASSTILLDRAWING."); break; // Rectangle provided was not horizontally aligned on reqd. boundary case DDERR_XALIGN: hsAssert(false, "DDERR_XALIGN."); break; // The GUID passed to DirectDrawCreate is not a valid DirectDraw driver // identifier. case DDERR_INVALIDDIRECTDRAWGUID: hsAssert(false, "DDERR_INVALIDDIRECTDRAWGUID."); break; // A DirectDraw object representing this driver has already been created // for this process. case DDERR_DIRECTDRAWALREADYCREATED: hsAssert(false, "DDERR_DIRECTDRAWALREADYCREATED."); break; // A hardware only DirectDraw object creation was attempted but the driver // did not support any hardware. case DDERR_NODIRECTDRAWHW: hsAssert(false, "DDERR_NODIRECTDRAWHW."); break; // this process already has created a primary surface case DDERR_PRIMARYSURFACEALREADYEXISTS: hsAssert(false, "DDERR_PRIMARYSURFACEALREADYEXISTS."); break; // software emulation not available. case DDERR_NOEMULATION: hsAssert(false, "DDERR_NOEMULATION."); break; // region passed to Clipper::GetClipList is too small. case DDERR_REGIONTOOSMALL: hsAssert(false, "DDERR_REGIONTOOSMALL."); break; // an attempt was made to set a clip list for a clipper objec that // is already monitoring an hwnd. case DDERR_CLIPPERISUSINGHWND: hsAssert(false, "DDERR_CLIPPERISUSINGHWND."); break; // No clipper object attached to surface object case DDERR_NOCLIPPERATTACHED: hsAssert(false, "DDERR_NOCLIPPERATTACHED."); break; // Clipper notification requires an HWND or // no HWND has previously been set as the CooperativeLevel HWND. case DDERR_NOHWND: hsAssert(false, "DDERR_NOHWND."); break; // HWND used by DirectDraw CooperativeLevel has been subclassed, // this prevents DirectDraw from restoring state. case DDERR_HWNDSUBCLASSED: hsAssert(false, "DDERR_HWNDSUBCLASSED."); break; // The CooperativeLevel HWND has already been set. // It can not be reset while the process has surfaces or palettes created. case DDERR_HWNDALREADYSET: hsAssert(false, "DDERR_HWNDALREADYSET."); break; // No palette object attached to this surface. case DDERR_NOPALETTEATTACHED: hsAssert(false, "DDERR_NOPALETTEATTACHED."); break; // No hardware support for 16 or 256 color palettes. case DDERR_NOPALETTEHW: hsAssert(false, "DDERR_NOPALETTEHW."); break; // If a clipper object is attached to the source surface passed into a // BltFast call. case DDERR_BLTFASTCANTCLIP: hsAssert(false, "DDERR_BLTFASTCANTCLIP."); break; // No blter. case DDERR_NOBLTHW: hsAssert(false, "DDERR_NOBLTHW."); break; // No DirectDraw ROP hardware. case DDERR_NODDROPSHW: hsAssert(false, "DDERR_NODDROPSHW."); break; // returned when GetOverlayPosition is called on a hidden overlay case DDERR_OVERLAYNOTVISIBLE: hsAssert(false, "DDERR_OVERLAYNOTVISIBLE."); break; // returned when GetOverlayPosition is called on a overlay that UpdateOverlay // has never been called on to establish a destionation. case DDERR_NOOVERLAYDEST: hsAssert(false, "DDERR_NOOVERLAYDEST."); break; // returned when the position of the overlay on the destionation is no longer // legal for that destionation. case DDERR_INVALIDPOSITION: hsAssert(false, "DDERR_INVALIDPOSITION."); break; // returned when an overlay member is called for a non-overlay surface case DDERR_NOTAOVERLAYSURFACE: hsAssert(false, "DDERR_NOTAOVERLAYSURFACE."); break; // An attempt was made to set the cooperative level when it was already // set to exclusive. case DDERR_EXCLUSIVEMODEALREADYSET: hsAssert(false, "DDERR_EXCLUSIVEMODEALREADYSET."); break; // An attempt has been made to flip a surface that is not flippable. case DDERR_NOTFLIPPABLE: hsAssert(false, "DDERR_NOTFLIPPABLE."); break; // Can't duplicate primary & 3D surfaces, or surfaces that are implicitly // created. case DDERR_CANTDUPLICATE: hsAssert(false, "DDERR_CANTDUPLICATE."); break; // Surface was not locked. An attempt to unlock a surface that was not // locked at all, or by this process, has been attempted. case DDERR_NOTLOCKED: hsAssert(false, "DDERR_NOTLOCKED."); break; // Windows can not create any more DCs, or a DC was requested for a paltte-indexed // surface when the surface had no palette AND the display mode was not palette-indexed // (in this case DirectDraw cannot select a proper palette into the DC) case DDERR_CANTCREATEDC: hsAssert(false, "DDERR_CANTCREATEDC."); break; // No DC was ever created for this surface. case DDERR_NODC: hsAssert(false, "DDERR_NODC."); break; // This surface can not be restored because it was created in a different // mode. case DDERR_WRONGMODE: hsAssert(false, "DDERR_WRONGMODE."); break; // This surface can not be restored because it is an implicitly created // surface. case DDERR_IMPLICITLYCREATED: hsAssert(false, "DDERR_IMPLICITLYCREATED."); break; // The surface being used is not a palette-based surface case DDERR_NOTPALETTIZED: hsAssert(false, "DDERR_NOTPALETTIZED."); break; // The display is currently in an unsupported mode case DDERR_UNSUPPORTEDMODE: hsAssert(false, "DDERR_UNSUPPORTEDMODE."); break; // Operation could not be carried out because there is no mip-map // texture mapping hardware present or available. case DDERR_NOMIPMAPHW: hsAssert(false, "DDERR_NOMIPMAPHW."); break; // The requested action could not be performed because the surface was of // the wrong type. case DDERR_INVALIDSURFACETYPE: hsAssert(false, "DDERR_INVALIDSURFACETYPE."); break; // Device does not support optimized surfaces, therefore no video memory optimized surfaces case DDERR_NOOPTIMIZEHW: hsAssert(false, "DDERR_NOOPTIMIZEHW."); break; // Surface is an optimized surface, but has not yet been allocated any memory case DDERR_NOTLOADED: hsAssert(false, "DDERR_NOTLOADED."); break; // Attempt was made to create or set a device window without first setting // the focus window case DDERR_NOFOCUSWINDOW: hsAssert(false, "DDERR_NOFOCUSWINDOW."); break; // A DC has already been returned for this surface. Only one DC can be // retrieved per surface. case DDERR_DCALREADYCREATED: hsAssert(false, "DDERR_DCALREADYCREATED."); break; // An attempt was made to allocate non-local video memory from a device // that does not support non-local video memory. case DDERR_NONONLOCALVIDMEM: hsAssert(false, "DDERR_NONONLOCALVIDMEM."); break; // The attempt to page lock a surface failed. case DDERR_CANTPAGELOCK: hsAssert(false, "DDERR_CANTPAGELOCK."); break; // The attempt to page unlock a surface failed. case DDERR_CANTPAGEUNLOCK: hsAssert(false, "DDERR_CANTPAGEUNLOCK."); break; // An attempt was made to page unlock a surface with no outstanding page locks. case DDERR_NOTPAGELOCKED: hsAssert(false, "DDERR_NOTPAGELOCKED."); break; // There is more data available than the specified buffer size could hold case DDERR_MOREDATA: hsAssert(false, "DDERR_MOREDATA."); break; // The data has expired and is therefore no longer valid. case DDERR_EXPIRED: hsAssert(false, "DDERR_EXPIRED."); break; // The video port is not active case DDERR_VIDEONOTACTIVE: hsAssert(false, "DDERR_VIDEONOTACTIVE."); break; // Surfaces created by one direct draw device cannot be used directly by // another direct draw device. case DDERR_DEVICEDOESNTOWNSURFACE: hsAssert(false, "DDERR_DEVICEDOESNTOWNSURFACE."); break; // An attempt was made to invoke an interface member of a DirectDraw object // created by CoCreateInstance() before it was initialized. case DDERR_NOTINITIALIZED: hsAssert(false, "DDERR_NOTINITIALIZED."); break; default: hsAssert(false, "Unknown error."); break; } } hsBool hsDXTDirectXCodec::ColorizeCompMipmap( plMipmap *bMap, const UInt8 *colorMask ) { return false; }