void Asteroids::CreateGUIResources() { auto font = mGUI->Font(); D3D11_TEXTURE2D_DESC textureDesc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_A8_UNORM, font->BitmapWidth(), font->BitmapHeight(), 1, 1); D3D11_SUBRESOURCE_DATA initialData = {}; initialData.pSysMem = font->Pixels(); initialData.SysMemPitch = font->BitmapWidth(); ID3D11Texture2D* texture = nullptr; ThrowIfFailed(mDevice->CreateTexture2D(&textureDesc, &initialData, &texture)); ThrowIfFailed(mDevice->CreateShaderResourceView(texture, nullptr, &mFontTextureSRV)); SafeRelease(&texture); // Load any GUI sprite textures for (size_t i = 0; i < mGUI->size(); ++i) { auto control = (*mGUI)[i]; if (control->TextureFile().length() > 0 && mSpriteTextures.find(control->TextureFile()) == mSpriteTextures.end()) { std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; ID3D11ShaderResourceView* textureSRV = nullptr; ThrowIfFailed(CreateDDSTextureFromFile(mDevice, converter.from_bytes(control->TextureFile()).c_str(), &textureSRV, true)); mSpriteTextures[control->TextureFile()] = textureSRV; } } }
BOOL ScaleDIB( LPBITMAPINFOHEADER lpbiSrc, LPVOID lpSrc, LPBITMAPINFOHEADER lpbiDst, LPVOID lpDst) { LPBYTE pbSrc; LPBYTE pbDst; LPDWORD pal; int dxSrc; int dySrc; int dxDst; int dyDst; int iSrc; int iDst; int x0; int y0; int sdx; int sdy; LONG WidthBytesSrc; LONG WidthBytesDst; if ((lpbiSrc->biCompression != BI_RGB) || (lpbiDst->biCompression != BI_RGB)) { return FALSE; } iSrc = BPPTOINDEX(lpbiSrc->biBitCount); iDst = BPPTOINDEX(lpbiDst->biBitCount); if (ScaleProc[iSrc][iDst] == NULL) return FALSE; dxSrc = (int)lpbiSrc->biWidth; dySrc = (int)lpbiSrc->biHeight; dxDst = (int)lpbiDst->biWidth; dyDst = (int)lpbiDst->biHeight; WidthBytesDst = BitmapWidth(lpbiDst->biWidth, lpbiDst->biBitCount); WidthBytesSrc = BitmapWidth(lpbiSrc->biWidth, lpbiSrc->biBitCount); lpbiDst->biSizeImage = (WidthBytesDst * dyDst); pbSrc = (LPBYTE)lpSrc; pbDst = (LPBYTE)lpDst; pal = (LPDWORD)(lpbiSrc + 1); if (InitDst[iDst]) InitDst[iDst](lpbiDst); if ((dxSrc == (dxDst * 2)) && (dySrc == (dyDst * 2))) { sdx = FX1 * 2; sdy = FX1 * 2; y0 = FX1 / 2; x0 = FX1 / 2; } else { sdx = (dxSrc - 1) * FX1 / (dxDst - 1); sdy = (dySrc - 1) * FX1 / (dyDst - 1); y0 = 0; x0 = 0; } ScaleProc[iSrc][iDst](pal, pbSrc, WidthBytesSrc, x0, y0, sdx, sdy, pbDst, WidthBytesDst, dxDst, dyDst); return TRUE; }