void ESSUB_LoadPNG (const std::string& aPath, Texture** aTexture) { assert(aTexture); wchar_t buffer[1024]; MultiByteToWideChar(CP_UTF8, 0, aPath.c_str(), -1, buffer, 512); Texture* output = 0; Bitmap img(buffer, false); if(img.GetWidth()) { output = ESVideo::CreateTexture(img.GetWidth(), img.GetHeight(), true); output->Clear(0); BitmapData BMData; BMData.Width = std::min(output->GetWidth(), img.GetWidth()); BMData.Height = std::min(output->GetHeight(), img.GetHeight()); BMData.Stride = output->GetWidth() * 4; BMData.PixelFormat = PixelFormat32bppARGB; BMData.Scan0 = output->Map(); BMData.Reserved = 0; Rect area(0, 0, img.GetWidth(), img.GetHeight()); img.LockBits(&area, ImageLockModeRead | ImageLockModeUserInputBuf, PixelFormat32bppARGB, &BMData); img.UnlockBits(&BMData); output->Unmap(); } *aTexture = output; }
Texture* GetTexture () { Texture* output = 0; if(Valid) { output = ESVideo::CreateTexture(Width, Height, true); output->Clear(0); uint32_t copyWidth = std::min(Width, output->GetWidth()); uint32_t copyHeight = std::min(Height, output->GetHeight()); uint32_t* texPixels = output->Map(); for(int i = 0; i != copyHeight; i ++) { uint32_t* dest = texPixels + (output->GetPitch() * i); uint8_t* source = RowPointers[i]; for(int j = 0; j != copyWidth; j ++) { uint32_t a = (InfoPtr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) ? *source++ : 0xFF; uint32_t r = *source ++; uint32_t g = *source ++; uint32_t b = *source ++; *dest++ = output->ConvertPixel(r, g, b, a); } } output->Unmap(); } return output; }