• Zhiyi Zhang's avatar
    gdi32: Partially implement HALFTONE stretch mode. · 04b4d0f3
    Zhiyi Zhang authored
    COLORONCOLOR(STRETCH_DELETESCANS) was used in place of HALFTONE. COLORONCOLOR mode may delete rows
    of pixels without trying to preserve information so it will cause Wine to render poorly when the
    destination rectangle is small.
    
    According to tests, HALFTONE mode uses box filter when doing integer downscaling and nearest
    neighbor interpolation when doing upscaling in both horizontally and vertically. In other cases,
    HALFTONE mode uses a lanczos3 like algorithm to interpolate pixels. There are also other heuristics
    involved. For example, shrinking a 2x2 image to 1x1 may not use box filter depending on image data.
    Since this algorithm is undocumented, it's difficult to reverse engineer the original algorithm and
    produce identical results. Instead, this patch uses a naive implementation of bilinear interpolation
    to implement HALFTONE mode and it produces good quality images.
    
    For 8-bit and lower color depth images, nulldrv_StretchBlt should resize the images first and then
    converts color depth.
    
    Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46375Signed-off-by: 's avatarZhiyi Zhang <zzhang@codeweavers.com>
    Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
    04b4d0f3
primitives.c 307 KB