gdiplus: Don't use gdi32 to scale or draw from outside bitmaps.

This commit is contained in:
Vincent Povirk 2011-03-10 11:37:14 -06:00 committed by Alexandre Julliard
parent 8b6dafda45
commit 2302e80cc9
1 changed files with 11 additions and 8 deletions

View File

@ -2465,10 +2465,18 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
else else
return NotImplemented; return NotImplemented;
srcx = srcx * dx;
srcy = srcy * dy;
srcwidth = srcwidth * dx;
srcheight = srcheight * dy;
if (imageAttributes || if (imageAttributes ||
(graphics->image && graphics->image->type == ImageTypeBitmap) || (graphics->image && graphics->image->type == ImageTypeBitmap) ||
!((GpBitmap*)image)->hbitmap || !((GpBitmap*)image)->hbitmap ||
ptf[1].Y != ptf[0].Y || ptf[2].X != ptf[0].X) ptf[1].Y != ptf[0].Y || ptf[2].X != ptf[0].X ||
ptf[1].X - ptf[0].X != srcwidth || ptf[2].Y - ptf[0].Y != srcheight ||
srcx < 0 || srcy < 0 ||
srcx + srcwidth > bitmap->width || srcy + srcheight > bitmap->height)
use_software = 1; use_software = 1;
if (use_software) if (use_software)
@ -2488,11 +2496,6 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
if (!imageAttributes) if (!imageAttributes)
imageAttributes = &defaultImageAttributes; imageAttributes = &defaultImageAttributes;
srcx = srcx * dx;
srcy = srcy * dy;
srcwidth = srcwidth * dx;
srcheight = srcheight * dy;
dst_area.left = dst_area.right = pti[0].x; dst_area.left = dst_area.right = pti[0].x;
dst_area.top = dst_area.bottom = pti[0].y; dst_area.top = dst_area.bottom = pti[0].y;
for (i=1; i<4; i++) for (i=1; i<4; i++)
@ -2672,12 +2675,12 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
bf.AlphaFormat = AC_SRC_ALPHA; bf.AlphaFormat = AC_SRC_ALPHA;
GdiAlphaBlend(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y, GdiAlphaBlend(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y,
hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, bf); hdc, srcx, srcy, srcwidth, srcheight, bf);
} }
else else
{ {
StretchBlt(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y, StretchBlt(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y,
hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, SRCCOPY); hdc, srcx, srcy, srcwidth, srcheight, SRCCOPY);
} }
if (temp_hdc) if (temp_hdc)