On 12 May 2014 15:12, Stefan Dösinger stefan@codeweavers.com wrote:
@@ -1458,8 +1457,7 @@ static void surface_download_data(struct wined3d_surface *surface, const struct int src_pitch = 0; int dst_pitch = 0;
/* In case of P8 the index is stored in the alpha component if the primary render target uses P8. */
if (format->id == WINED3DFMT_P8_UINT && swapchain_is_p8(surface->resource.device->swapchains[0]))
if (format->id == WINED3DFMT_P8_UINT) { gl_format = GL_ALPHA; gl_type = GL_UNSIGNED_BYTE;
This branch is pretty pointless, the format / type for WINED3DFMT_P8_UINT is always GL_ALPHA / GL_UNSIGNED_BYTE. (If ARB_fragment_program is supported, and the format is supported at all anyway.)
@@ -3256,53 +3252,19 @@ static void read_from_framebuffer(struct wined3d_surface *surface, DWORD dst_loc switch (surface->resource.format->id) { case WINED3DFMT_P8_UINT:
{
if (swapchain_is_p8(context->swapchain))
{
/* In case of P8 render targets the index is stored in the alpha component */
fmt = GL_ALPHA;
type = GL_UNSIGNED_BYTE;
mem = data.addr;
bpp = surface->resource.format->byte_count;
}
else
{
/* GL can't return palettized data, so read ARGB pixels into a
* separate block of memory and convert them into palettized format
* in software. Slow, but if the app means to use palettized render
* targets and locks it...
*
* Use GL_RGB, GL_UNSIGNED_BYTE to read the surface for performance reasons
* Don't use GL_BGR as in the WINED3DFMT_R8G8B8 case, instead watch out
* for the color channels when palettizing the colors.
*/
fmt = GL_RGB;
type = GL_UNSIGNED_BYTE;
pitch *= 3;
mem = HeapAlloc(GetProcessHeap(), 0, surface->resource.size * 3);
if (!mem)
{
ERR("Out of memory\n");
return;
}
bpp = surface->resource.format->byte_count * 3;
}
}
break;
fmt = GL_ALPHA;
type = GL_UNSIGNED_BYTE;
break; default:
mem = data.addr; fmt = surface->resource.format->glFormat; type = surface->resource.format->glType;
}bpp = surface->resource.format->byte_count;
Like above.
if (!srcIsUpsideDown) {
UINT len; /* glReadPixels returns the image upside down, and there is no way to prevent this.
Flip the lines in software */
len = surface->resource.width * bpp;
* Flip the lines in software.
* TODO: Consider flipping the image in an FBO. */
Possibly, but that would be a decision for surface_load_sysmem(), not read_from_framebuffer(). Note that reading the front buffer isn't particularly fast on Windows either though.
row = HeapAlloc(GetProcessHeap(), 0, pitch);
goto error;
This looks unintentional.
@@ -3088,38 +3088,7 @@ DWORD wined3d_format_convert_from_float(const struct wined3d_surface *surface, c }
if (format->id == WINED3DFMT_P8_UINT)
- {
const RGBQUAD *e;
BYTE r, g, b, a;
if (!surface->palette)
{
WARN("Surface doesn't have a palette, returning 0.\n");
return 0;
}
r = (BYTE)((color->r * 255.0f) + 0.5f);
g = (BYTE)((color->g * 255.0f) + 0.5f);
b = (BYTE)((color->b * 255.0f) + 0.5f);
a = (BYTE)((color->a * 255.0f) + 0.5f);
e = &surface->palette->colors[a];
if (e->rgbRed == r && e->rgbGreen == g && e->rgbBlue == b)
return a;
WARN("Alpha didn't match index, searching full palette.\n");
for (i = 0; i < 256; ++i)
{
e = &surface->palette->colors[i];
if (e->rgbRed == r && e->rgbGreen == g && e->rgbBlue == b)
return i;
}
FIXME("Unable to convert color to palette index.\n");
return 0;
- }
return (BYTE)((color->a * 255.0f) + 0.5f);
So this could just use the table now, right?