Module: wine Branch: master Commit: 8b6dafda459d4a4a69123b9928c3c4fc4afa83a7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8b6dafda459d4a4a69123b9928...
Author: Vincent Povirk vincent@codeweavers.com Date: Thu Mar 10 11:03:39 2011 -0600
gdiplus: Implement bilinear interpolation.
---
dlls/gdiplus/graphics.c | 34 ++++++++++++++++++++++++++++++++++ 1 files changed, 34 insertions(+), 0 deletions(-)
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 3b7b7ba..07239e0 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);