//----------------------------------------------------------------------------// void Direct3D11Texture::loadFromMemory(const void* buffer, const Size& buffer_size, PixelFormat pixel_format) { cleanupDirect3D11Texture(); const void* img_src = buffer; if (pixel_format == PF_RGB) { const char* src = static_cast<const char*>(buffer); char* dest = new char[buffer_size.d_width * buffer_size.d_height * 4]; for (int i = 0; i < buffer_size.d_width * buffer_size.d_height; ++i) { dest[i * 4 + 0] = src[i * 3 + 0]; dest[i * 4 + 1] = src[i * 3 + 1]; dest[i * 4 + 2] = src[i * 3 + 2]; dest[i * 4 + 3] = 0xFF; } img_src = dest; } D3D11_TEXTURE2D_DESC tex_desc; ZeroMemory(&tex_desc, sizeof(tex_desc)); tex_desc.Width = static_cast<UINT>(buffer_size.d_width); tex_desc.Height = static_cast<UINT>(buffer_size.d_height); tex_desc.ArraySize = 1; tex_desc.SampleDesc.Count = 1; tex_desc.SampleDesc.Quality = 0; tex_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; tex_desc.Usage = D3D11_USAGE_DEFAULT; tex_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; tex_desc.CPUAccessFlags = 0; tex_desc.MiscFlags = 0; tex_desc.MipLevels = 1; D3D11_SUBRESOURCE_DATA data; ZeroMemory(&data, sizeof(D3D11_SUBRESOURCE_DATA)); data.pSysMem = img_src; data.SysMemPitch = 4 * tex_desc.Width; HRESULT hr = d_device.d_device->CreateTexture2D(&tex_desc, &data, &d_texture); if (pixel_format == PF_RGB) delete[] img_src; if (FAILED(hr)) CEGUI_THROW(RendererException( "Direct3D11Texture::loadFromMemory: Failed to " "create texture from memory buffer.")); initialiseShaderResourceView(); d_dataSize = buffer_size; updateTextureSize(); updateCachedScaleValues(); }
//----------------------------------------------------------------------------// Direct3D11Texture::~Direct3D11Texture() { cleanupDirect3D11Texture(); }
//----------------------------------------------------------------------------// void Direct3D11Texture::loadFromMemory(const void* buffer, const Sizef& buffer_size, PixelFormat pixel_format) { if (!isPixelFormatSupported(pixel_format)) CEGUI_THROW(InvalidRequestException( "Data was supplied in an unsupported pixel format.")); cleanupDirect3D11Texture(); const void* img_src = buffer; if (pixel_format == PF_RGB) { const unsigned char* src = static_cast<const unsigned char*>(buffer); unsigned char* dest = new unsigned char[static_cast<unsigned int>( buffer_size.d_width * buffer_size.d_height * 4 )]; for (int i = 0; i < buffer_size.d_width * buffer_size.d_height; ++i) { dest[i * 4 + 0] = src[i * 3 + 0]; dest[i * 4 + 1] = src[i * 3 + 1]; dest[i * 4 + 2] = src[i * 3 + 2]; dest[i * 4 + 3] = 0xFF; } img_src = dest; } D3D11_TEXTURE2D_DESC tex_desc; ZeroMemory(&tex_desc, sizeof(tex_desc)); tex_desc.Width = static_cast<UINT>(buffer_size.d_width); tex_desc.Height = static_cast<UINT>(buffer_size.d_height); tex_desc.ArraySize = 1; tex_desc.SampleDesc.Count = 1; tex_desc.SampleDesc.Quality = 0; tex_desc.Format = toD3DPixelFormat(pixel_format); tex_desc.Usage = D3D11_USAGE_DEFAULT; tex_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; tex_desc.CPUAccessFlags = 0; tex_desc.MiscFlags = 0; tex_desc.MipLevels = 1; D3D11_SUBRESOURCE_DATA data; ZeroMemory(&data, sizeof(D3D11_SUBRESOURCE_DATA)); data.pSysMem = img_src; data.SysMemPitch = calculateDataWidth(tex_desc.Width, pixel_format); HRESULT hr = d_device.d_device->CreateTexture2D(&tex_desc, &data, &d_texture); if (pixel_format == PF_RGB) delete[] img_src; if (FAILED(hr)) CEGUI_THROW(RendererException( "Failed to create texture from memory buffer.")); initialiseShaderResourceView(); d_dataSize = buffer_size; updateTextureSize(); updateCachedScaleValues(); }