gdiplus: Avoid more cases of allocating a transformation matrix on the heap.
This commit is contained in:
parent
8180b9000a
commit
b9ead1a7ea
|
@ -1439,7 +1439,7 @@ static void draw_cap(GpGraphics *graphics, COLORREF color, GpLineCap cap, REAL s
|
||||||
const GpCustomLineCap *custom, REAL x1, REAL y1, REAL x2, REAL y2)
|
const GpCustomLineCap *custom, REAL x1, REAL y1, REAL x2, REAL y2)
|
||||||
{
|
{
|
||||||
HGDIOBJ oldbrush = NULL, oldpen = NULL;
|
HGDIOBJ oldbrush = NULL, oldpen = NULL;
|
||||||
GpMatrix *matrix = NULL;
|
GpMatrix matrix;
|
||||||
HBRUSH brush = NULL;
|
HBRUSH brush = NULL;
|
||||||
HPEN pen = NULL;
|
HPEN pen = NULL;
|
||||||
PointF ptf[4], *custptf = NULL;
|
PointF ptf[4], *custptf = NULL;
|
||||||
|
@ -1584,16 +1584,17 @@ static void draw_cap(GpGraphics *graphics, COLORREF color, GpLineCap cap, REAL s
|
||||||
custpt = GdipAlloc(count * sizeof(POINT));
|
custpt = GdipAlloc(count * sizeof(POINT));
|
||||||
tp = GdipAlloc(count);
|
tp = GdipAlloc(count);
|
||||||
|
|
||||||
if(!custptf || !custpt || !tp || (GdipCreateMatrix(&matrix) != Ok))
|
if(!custptf || !custpt || !tp)
|
||||||
goto custend;
|
goto custend;
|
||||||
|
|
||||||
memcpy(custptf, custom->pathdata.Points, count * sizeof(PointF));
|
memcpy(custptf, custom->pathdata.Points, count * sizeof(PointF));
|
||||||
|
|
||||||
GdipScaleMatrix(matrix, size, size, MatrixOrderAppend);
|
GdipSetMatrixElements(&matrix, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
|
||||||
GdipRotateMatrix(matrix, (180.0 / M_PI) * (theta - M_PI_2),
|
GdipScaleMatrix(&matrix, size, size, MatrixOrderAppend);
|
||||||
|
GdipRotateMatrix(&matrix, (180.0 / M_PI) * (theta - M_PI_2),
|
||||||
MatrixOrderAppend);
|
MatrixOrderAppend);
|
||||||
GdipTranslateMatrix(matrix, x2, y2, MatrixOrderAppend);
|
GdipTranslateMatrix(&matrix, x2, y2, MatrixOrderAppend);
|
||||||
GdipTransformMatrixPoints(matrix, custptf, count);
|
GdipTransformMatrixPoints(&matrix, custptf, count);
|
||||||
|
|
||||||
transform_and_round_points(graphics, custpt, custptf, count);
|
transform_and_round_points(graphics, custpt, custptf, count);
|
||||||
|
|
||||||
|
@ -1613,7 +1614,6 @@ custend:
|
||||||
GdipFree(custptf);
|
GdipFree(custptf);
|
||||||
GdipFree(custpt);
|
GdipFree(custpt);
|
||||||
GdipFree(tp);
|
GdipFree(tp);
|
||||||
GdipDeleteMatrix(matrix);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -3127,7 +3127,7 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
|
||||||
RECT dst_area;
|
RECT dst_area;
|
||||||
GpRect src_area;
|
GpRect src_area;
|
||||||
int i, x, y, src_stride, dst_stride;
|
int i, x, y, src_stride, dst_stride;
|
||||||
GpMatrix *dst_to_src;
|
GpMatrix dst_to_src;
|
||||||
REAL m11, m12, m21, m22, mdx, mdy;
|
REAL m11, m12, m21, m22, mdx, mdy;
|
||||||
LPBYTE src_data, dst_data;
|
LPBYTE src_data, dst_data;
|
||||||
BitmapData lockeddata;
|
BitmapData lockeddata;
|
||||||
|
@ -3159,22 +3159,13 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
|
||||||
m22 = (ptf[2].Y - ptf[0].Y) / srcheight;
|
m22 = (ptf[2].Y - ptf[0].Y) / srcheight;
|
||||||
mdy = ptf[0].Y - m12 * srcx - m22 * srcy;
|
mdy = ptf[0].Y - m12 * srcx - m22 * srcy;
|
||||||
|
|
||||||
stat = GdipCreateMatrix2(m11, m12, m21, m22, mdx, mdy, &dst_to_src);
|
GdipSetMatrixElements(&dst_to_src, m11, m12, m21, m22, mdx, mdy);
|
||||||
|
|
||||||
|
stat = GdipInvertMatrix(&dst_to_src);
|
||||||
if (stat != Ok) return stat;
|
if (stat != Ok) return stat;
|
||||||
|
|
||||||
stat = GdipInvertMatrix(dst_to_src);
|
|
||||||
if (stat != Ok)
|
|
||||||
{
|
|
||||||
GdipDeleteMatrix(dst_to_src);
|
|
||||||
return stat;
|
|
||||||
}
|
|
||||||
|
|
||||||
dst_data = GdipAlloc(sizeof(ARGB) * (dst_area.right - dst_area.left) * (dst_area.bottom - dst_area.top));
|
dst_data = GdipAlloc(sizeof(ARGB) * (dst_area.right - dst_area.left) * (dst_area.bottom - dst_area.top));
|
||||||
if (!dst_data)
|
if (!dst_data) return OutOfMemory;
|
||||||
{
|
|
||||||
GdipDeleteMatrix(dst_to_src);
|
|
||||||
return OutOfMemory;
|
|
||||||
}
|
|
||||||
|
|
||||||
dst_stride = sizeof(ARGB) * (dst_area.right - dst_area.left);
|
dst_stride = sizeof(ARGB) * (dst_area.right - dst_area.left);
|
||||||
|
|
||||||
|
@ -3187,7 +3178,6 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
|
||||||
if (!src_data)
|
if (!src_data)
|
||||||
{
|
{
|
||||||
GdipFree(dst_data);
|
GdipFree(dst_data);
|
||||||
GdipDeleteMatrix(dst_to_src);
|
|
||||||
return OutOfMemory;
|
return OutOfMemory;
|
||||||
}
|
}
|
||||||
src_stride = sizeof(ARGB) * src_area.Width;
|
src_stride = sizeof(ARGB) * src_area.Width;
|
||||||
|
@ -3210,7 +3200,6 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
|
||||||
if (src_data != dst_data)
|
if (src_data != dst_data)
|
||||||
GdipFree(src_data);
|
GdipFree(src_data);
|
||||||
GdipFree(dst_data);
|
GdipFree(dst_data);
|
||||||
GdipDeleteMatrix(dst_to_src);
|
|
||||||
return stat;
|
return stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3219,7 +3208,7 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
|
||||||
src_stride, ColorAdjustTypeBitmap);
|
src_stride, ColorAdjustTypeBitmap);
|
||||||
|
|
||||||
/* Transform the bits as needed to the destination. */
|
/* Transform the bits as needed to the destination. */
|
||||||
GdipTransformMatrixPoints(dst_to_src, dst_to_src_points, 3);
|
GdipTransformMatrixPoints(&dst_to_src, dst_to_src_points, 3);
|
||||||
|
|
||||||
x_dx = dst_to_src_points[1].X - dst_to_src_points[0].X;
|
x_dx = dst_to_src_points[1].X - dst_to_src_points[0].X;
|
||||||
x_dy = dst_to_src_points[1].Y - dst_to_src_points[0].Y;
|
x_dy = dst_to_src_points[1].Y - dst_to_src_points[0].Y;
|
||||||
|
@ -3246,8 +3235,6 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GdipDeleteMatrix(dst_to_src);
|
|
||||||
|
|
||||||
GdipFree(src_data);
|
GdipFree(src_data);
|
||||||
|
|
||||||
stat = alpha_blend_pixels(graphics, dst_area.left, dst_area.top,
|
stat = alpha_blend_pixels(graphics, dst_area.left, dst_area.top,
|
||||||
|
|
Loading…
Reference in New Issue