wined3d: Properly up-scale WINED3DFMT_R5G5_SNORM_L6_UNORM.
This commit is contained in:
parent
44ddcac6c3
commit
ce836bf651
|
@ -322,8 +322,8 @@ static void convert_r5g5_snorm_l6_unorm_nv(const BYTE *src, BYTE *dst, UINT src_
|
|||
UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth)
|
||||
{
|
||||
unsigned int x, y, z;
|
||||
const WORD *Source;
|
||||
unsigned char *Dest;
|
||||
unsigned char *texel_out, ds_out, dt_out, r_in, g_in, l_in;
|
||||
const unsigned short *texel_in;
|
||||
|
||||
/* This makes the gl surface bigger(24 bit instead of 16), but it works with
|
||||
* fixed function and shaders without further conversion once the surface is
|
||||
|
@ -333,27 +333,28 @@ static void convert_r5g5_snorm_l6_unorm_nv(const BYTE *src, BYTE *dst, UINT src_
|
|||
{
|
||||
for (y = 0; y < height; y++)
|
||||
{
|
||||
Source = (const WORD *)(src + z * src_slice_pitch + y * src_row_pitch);
|
||||
Dest = dst + z * dst_slice_pitch + y * dst_row_pitch;
|
||||
texel_in = (const unsigned short *)(src + z * src_slice_pitch + y * src_row_pitch);
|
||||
texel_out = dst + z * dst_slice_pitch + y * dst_row_pitch;
|
||||
for (x = 0; x < width; x++ )
|
||||
{
|
||||
short color = (*Source++);
|
||||
unsigned char l = ((color >> 10) & 0xfc);
|
||||
char v = ((color >> 5) & 0x3e);
|
||||
char u = ((color ) & 0x1f);
|
||||
l_in = (*texel_in & 0xfc00) >> 10;
|
||||
g_in = (*texel_in & 0x03e0) >> 5;
|
||||
r_in = *texel_in & 0x001f;
|
||||
|
||||
/* 8 bits destination, 6 bits source, 8th bit is the sign. gl ignores the sign
|
||||
* and doubles the positive range. Thus shift left only once, gl does the 2nd
|
||||
* shift. GL reads a signed value and converts it into an unsigned value.
|
||||
*/
|
||||
/* M */ Dest[2] = l << 1;
|
||||
ds_out = r_in << 3;
|
||||
if (!(r_in & 0x10)) /* r > 0 */
|
||||
ds_out |= r_in >> 1;
|
||||
|
||||
/* Those are read as signed, but kept signed. Just left-shift 3 times to scale
|
||||
* from 5 bit values to 8 bit values.
|
||||
*/
|
||||
/* V */ Dest[1] = v << 3;
|
||||
/* U */ Dest[0] = u << 3;
|
||||
Dest += 3;
|
||||
dt_out = g_in << 3;
|
||||
if (!(g_in & 0x10)) /* g > 0 */
|
||||
dt_out |= g_in >> 1;
|
||||
|
||||
texel_out[0] = ds_out;
|
||||
texel_out[1] = dt_out;
|
||||
texel_out[2] = l_in << 1 | l_in >> 5;
|
||||
|
||||
texel_out += 3;
|
||||
texel_in++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue