Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void FreeImageErrorHandler(FREE_IMAGE_FORMAT fif, const char *message)
- {
- std::cout<<"FreeImage error ("<<FreeImage_GetFormatFromFIF(fif)<<"): "<<message<<"\n";
- }
- //check std extension
- HRESULT CTexture::LoadTextureFromOtherFormat(e3d_str FileName)
- {
- // try
- {
- e3d_Std(ES"Trying to load image with FreeImage: "+ES FileName);
- FreeImage_Initialise(true);
- FreeImage_SetOutputMessage(&FreeImageErrorHandler);
- //FIMEMORY *mem = 0;
- FIBITMAP *img = 0;
- FREE_IMAGE_FORMAT fmt=FreeImage_GetFileTypeU(FileName.buf);
- img = FreeImage_LoadU(fmt,FileName.buf);
- if (img == 0)
- {
- e3d_Warn(ES"Unable to load image, FreeImage_LoadFromMemory failed");
- return E_FAIL;
- }
- FIBITMAP *newImg = FreeImage_ConvertTo32Bits(img);
- if (newImg == 0)
- {
- e3d_Warn(ES"Unable to convert image, FreeImage_ConvertTo32Bits failed");
- return E_FAIL;
- }
- FreeImage_Unload(img);
- img = newImg;
- newImg = 0;
- typedef UINT uint;
- typedef unsigned char uint8;
- uint pitch = FreeImage_GetPitch(img);
- uint height = FreeImage_GetHeight(img);
- uint width = FreeImage_GetWidth(img);
- uint8 *rawBuf = (uint8*)CoreAlloc(width * height << 2);
- FreeImage_ConvertToRawBits(rawBuf, img, pitch, 32,
- FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, true);
- // We need to convert pixel format a little
- // NB: little endian only - I think(!)
- #if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
- for (uint i = 0; i < height; ++i)
- {
- for (uint j = 0; j < width; ++j)
- {
- uint p = *(((uint*)(rawBuf + i * pitch)) + j);
- uint r = (p >> 16) & 0x000000FF;
- uint b = (p << 16) & 0x00FF0000;
- p &= 0xFF00FF00;
- p |= r | b;
- // write the adjusted pixel back
- *(((uint*)(rawBuf + i * pitch)) + j) = p;
- }
- }
- #endif
- FreeImage_Unload(img);
- img = 0;
- //create tex2D
- D3D11_TEXTURE2D_DESC tex_desc;
- //ZeroMemory(&tex_desc, sizeof(tex_desc));
- tex_desc.Width = width;
- tex_desc.Height = 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_RENDER_TARGET|D3D11_BIND_SHADER_RESOURCE;
- tex_desc.CPUAccessFlags = 0;
- tex_desc.MiscFlags = D3D11_RESOURCE_MISC_GENERATE_MIPS;
- tex_desc.MipLevels = 0;
- this->CreateFromDesc(&tex_desc,e3d_Tex2D,NULL,NULL);
- devc11->UpdateSubresource(TexRes,D3D11CalcSubresource(0,0,0),NULL,rawBuf,4 * tex_desc.Width,0);
- CoreFree(rawBuf);
- e3d_T2D ldesc;
- this->GetDesc(&ldesc,e3d_Tex2D);
- D3D11_SHADER_RESOURCE_VIEW_DESC srvd;
- srvd.Format = ldesc.Format;
- srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
- srvd.Texture2D.MostDetailedMip = 0;
- srvd.Texture2D.MipLevels = ldesc.MipLevels;
- this->CreateFromDesc(&srvd,e3d_TexSRV);
- devc11->GenerateMips(SRV);
- FreeImage_DeInitialise();
- }
- return S_OK;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement