- for (unsigned x = 0; x < Desc.Width; ++x) {
- dst[3*x + 0] = src[4*x + 2];
- dst[3*x + 1] = src[4*x + 1];
- dst[3*x + 2] = src[4*x + 0];
+ switch (Desc.Format) {
+ case D3DFMT_R5G6B5:
+ for (unsigned x = 0; x < Desc.Width; ++x) {
+ uint32_t pixel = ((const uint16_t *)src)[x];
+ dst[3*x + 0] = (( pixel & 0x1f) * (2*0xff) + 0x1f) / (2*0x1f);
+ dst[3*x + 1] = (((pixel >> 5) & 0x3f) * (2*0xff) + 0x3f) / (2*0x3f);
+ dst[3*x + 2] = (( pixel >> 11 ) * (2*0xff) + 0x1f) / (2*0x1f);
+ }
+ break;
+ case D3DFMT_X8R8G8B8:
+ case D3DFMT_A8R8G8B8:
+ for (unsigned x = 0; x < Desc.Width; ++x) {
+ dst[3*x + 0] = src[4*x + 2];
+ dst[3*x + 1] = src[4*x + 1];
+ dst[3*x + 2] = src[4*x + 0];
+ }
+ break;
+ case D3DFMT_D16:
+ case D3DFMT_D16_LOCKABLE:
+ for (unsigned x = 0; x < Desc.Width; ++x) {
+ ((float *)dst)[x] = ((const uint16_t *)src)[x] * (1.0f / 0xffff);
+ }
+ break;
+ case D3DFMT_D32F_LOCKABLE:
+ memcpy(dst, src, Desc.Width * sizeof(float));
+ break;
+ default:
+ assert(0);
+ break;