Commit 8b6dafda authored by Vincent Povirk's avatar Vincent Povirk Committed by Alexandre Julliard

gdiplus: Implement bilinear interpolation.

parent 51cf90d8
...@@ -538,6 +538,40 @@ static ARGB resample_bitmap_pixel(GDIPCONST GpRect *src_rect, LPBYTE bits, UINT ...@@ -538,6 +538,40 @@ static ARGB resample_bitmap_pixel(GDIPCONST GpRect *src_rect, LPBYTE bits, UINT
if (!fixme++) if (!fixme++)
FIXME("Unimplemented interpolation %i\n", interpolation); FIXME("Unimplemented interpolation %i\n", interpolation);
/* fall-through */ /* 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: case InterpolationModeNearestNeighbor:
return sample_bitmap_pixel(src_rect, bits, width, height, return sample_bitmap_pixel(src_rect, bits, width, height,
roundr(point->X), roundr(point->Y), attributes); roundr(point->X), roundr(point->Y), attributes);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment