On 12 May 2014 15:12, Stefan Dösinger <stefan(a)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?