[PATCH 4/4] gdiplus/metafile: Implement DrawArc() recording.
Nikolay Sivov
nsivov at codeweavers.com
Tue Mar 23 11:08:15 CDT 2021
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/gdiplus/gdiplus_private.h | 2 ++
dlls/gdiplus/graphics.c | 7 ++++++
dlls/gdiplus/metafile.c | 46 ++++++++++++++++++++++++++++++++++
3 files changed, 55 insertions(+)
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index f777595e810..25672530313 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -115,6 +115,8 @@ extern GpStatus METAFILE_FillEllipse(GpMetafile *metafile, GpBrush *brush, GpRec
extern GpStatus METAFILE_DrawRectangles(GpMetafile *metafile, GpPen *pen, const GpRectF *rects, INT count) DECLSPEC_HIDDEN;
extern GpStatus METAFILE_FillPie(GpMetafile *metafile, GpBrush *brush, const GpRectF *rect,
REAL startAngle, REAL sweepAngle) DECLSPEC_HIDDEN;
+extern GpStatus METAFILE_DrawArc(GpMetafile *metafile, GpPen *pen, const GpRectF *rect,
+ REAL startAngle, REAL sweepAngle) DECLSPEC_HIDDEN;
extern void calc_curve_bezier(const GpPointF *pts, REAL tension, REAL *x1,
REAL *y1, REAL *x2, REAL *y2) DECLSPEC_HIDDEN;
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 9d16d7c3cdb..e292afdfb2c 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -2595,6 +2595,7 @@ GpStatus WINGDIPAPI GdipDrawArc(GpGraphics *graphics, GpPen *pen, REAL x,
{
GpStatus status;
GpPath *path;
+ GpRectF rect;
TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f)\n", graphics, pen, x, y,
width, height, startAngle, sweepAngle);
@@ -2605,6 +2606,12 @@ GpStatus WINGDIPAPI GdipDrawArc(GpGraphics *graphics, GpPen *pen, REAL x,
if(graphics->busy)
return ObjectBusy;
+ if (is_metafile_graphics(graphics))
+ {
+ set_rect(&rect, x, y, width, height);
+ return METAFILE_DrawArc((GpMetafile *)graphics->image, pen, &rect, startAngle, sweepAngle);
+ }
+
status = GdipCreatePath(FillModeAlternate, &path);
if (status != Ok) return status;
diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index 06d1a9ccbf4..41950eb31c7 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -5205,3 +5205,49 @@ GpStatus METAFILE_DrawRectangles(GpMetafile *metafile, GpPen *pen, const GpRectF
return Ok;
}
+
+GpStatus METAFILE_DrawArc(GpMetafile *metafile, GpPen *pen, const GpRectF *rect, REAL startAngle, REAL sweepAngle)
+{
+ EmfPlusDrawArc *record;
+ GpStatus stat;
+ BOOL integer_rect;
+ DWORD pen_id;
+
+ if (metafile->metafile_type == MetafileTypeEmf)
+ {
+ FIXME("stub!\n");
+ return NotImplemented;
+ }
+
+ stat = METAFILE_AddPenObject(metafile, pen, &pen_id);
+ if (stat != Ok) return stat;
+
+ integer_rect = is_integer_rect(rect);
+
+ stat = METAFILE_AllocateRecord(metafile, FIELD_OFFSET(EmfPlusDrawArc, RectData) +
+ integer_rect ? sizeof(record->RectData.rect) : sizeof(record->RectData.rectF),
+ (void **)&record);
+ if (stat != Ok)
+ return stat;
+
+ record->Header.Type = EmfPlusRecordTypeDrawArc;
+ record->Header.Flags = pen_id;
+ if (integer_rect)
+ record->Header.Flags |= 0x4000;
+ record->StartAngle = startAngle;
+ record->SweepAngle = sweepAngle;
+
+ if (integer_rect)
+ {
+ record->RectData.rect.X = (SHORT)rect->X;
+ record->RectData.rect.Y = (SHORT)rect->Y;
+ record->RectData.rect.Width = (SHORT)rect->Width;
+ record->RectData.rect.Height = (SHORT)rect->Height;
+ }
+ else
+ memcpy(&record->RectData.rectF, rect, sizeof(*rect));
+
+ METAFILE_WriteRecords(metafile);
+
+ return Ok;
+}
--
2.30.2
More information about the wine-devel
mailing list