From 8b6dafda459d4a4a69123b9928c3c4fc4afa83a7 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Thu, 10 Mar 2011 11:03:39 -0600 Subject: [PATCH] gdiplus: Implement bilinear interpolation. --- dlls/gdiplus/graphics.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 3b7b7ba8ab3..07239e08b75 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -538,6 +538,40 @@ static ARGB resample_bitmap_pixel(GDIPCONST GpRect *src_rect, LPBYTE bits, UINT if (!fixme++) FIXME("Unimplemented interpolation %i\n", interpolation); /* fall-through */ + case InterpolationModeBilinear: + { + REAL leftxf, topyf; + INT leftx, rightx, topy, bottomy; + ARGB topleft, topright, bottomleft, bottomright; + ARGB top, bottom; + float x_offset; + + leftxf = floorf(point->X); + leftx = (INT)leftxf; + rightx = (INT)ceilf(point->X); + topyf = floorf(point->Y); + topy = (INT)topyf; + bottomy = (INT)ceilf(point->Y); + + if (leftx == rightx && topy == bottomy) + return sample_bitmap_pixel(src_rect, bits, width, height, + leftx, topy, attributes); + + topleft = sample_bitmap_pixel(src_rect, bits, width, height, + leftx, topy, attributes); + topright = sample_bitmap_pixel(src_rect, bits, width, height, + rightx, topy, attributes); + bottomleft = sample_bitmap_pixel(src_rect, bits, width, height, + leftx, bottomy, attributes); + bottomright = sample_bitmap_pixel(src_rect, bits, width, height, + rightx, bottomy, attributes); + + x_offset = point->X - leftxf; + top = blend_colors(topleft, topright, x_offset); + bottom = blend_colors(bottomleft, bottomright, x_offset); + + return blend_colors(top, bottom, point->Y - topyf); + } case InterpolationModeNearestNeighbor: return sample_bitmap_pixel(src_rect, bits, width, height, roundr(point->X), roundr(point->Y), attributes);