[PATCH 3/4] gdiplus: Add a helper to check for metafile graphics context.

Nikolay Sivov nsivov at codeweavers.com
Thu Mar 18 07:18:02 CDT 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/gdiplus/graphics.c | 78 +++++++++++++++++++++++------------------
 dlls/gdiplus/image.c    |  1 +
 2 files changed, 44 insertions(+), 35 deletions(-)

diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 97dfc4a75f2..c2c116acf94 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -114,6 +114,11 @@ static COLORREF get_gdi_brush_color(const GpBrush *brush)
     return ARGB2COLORREF(argb);
 }
 
+static BOOL is_metafile_graphics(const GpGraphics *graphics)
+{
+    return graphics->image && graphics->image_type == ImageTypeMetafile;
+}
+
 static ARGB blend_colors(ARGB start, ARGB end, REAL position);
 
 static void init_hatch_palette(ARGB *hatch_palette, ARGB fore_color, ARGB back_color)
@@ -556,7 +561,7 @@ static GpStatus alpha_blend_pixels_hrgn(GpGraphics *graphics, INT dst_x, INT dst
 
         return stat;
     }
-    else if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    else if (is_metafile_graphics(graphics))
     {
         ERR("This should not be used for metafiles; fix caller\n");
         return NotImplemented;
@@ -2241,7 +2246,7 @@ static GpStatus get_visible_clip_region(GpGraphics *graphics, GpRegion *rgn)
     GpRegion* tmp;
 
     /* Ignore graphics image bounds for metafiles */
-    if (graphics->image && graphics->image_type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
         return GdipCombineRegionRegion(rgn, graphics->clip, CombineModeReplace);
 
     if((stat = get_graphics_bounds(graphics, &rectf)) != Ok)
@@ -2550,7 +2555,7 @@ GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics)
     if(!graphics) return InvalidParameter;
     if(graphics->busy) return ObjectBusy;
 
-    if (graphics->image && graphics->image_type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
     {
         stat = METAFILE_GraphicsDeleted((GpMetafile*)graphics->image);
         if (stat != Ok)
@@ -2916,7 +2921,7 @@ GpStatus WINGDIPAPI GdipDrawEllipse(GpGraphics *graphics, GpPen *pen, REAL x,
     if(graphics->busy)
         return ObjectBusy;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
     {
         rect.X = x;
         rect.Y = y;
@@ -3069,7 +3074,7 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
     TRACE("%s %s %s\n", debugstr_pointf(&points[0]), debugstr_pointf(&points[1]),
         debugstr_pointf(&points[2]));
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
     {
         return METAFILE_DrawImagePointsRect((GpMetafile*)graphics->image,
                 image, points, count, srcx, srcy, srcwidth, srcheight,
@@ -4035,7 +4040,7 @@ GpStatus WINGDIPAPI GdipDrawPath(GpGraphics *graphics, GpPen *pen, GpPath *path)
     if (path->pathdata.Count == 0)
         return Ok;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
         retval = METAFILE_DrawPath((GpMetafile*)graphics->image, pen, path);
     else if (!graphics->hdc || graphics->alpha_hdc || !brush_can_fill_path(pen->brush, FALSE))
         retval = SOFTWARE_GdipDrawPath(graphics, pen, path);
@@ -4258,7 +4263,7 @@ GpStatus WINGDIPAPI GdipFillEllipse(GpGraphics *graphics, GpBrush *brush, REAL x
     if(graphics->busy)
         return ObjectBusy;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
     {
         GpRectF rect;
 
@@ -4371,7 +4376,7 @@ GpStatus WINGDIPAPI GdipFillPath(GpGraphics *graphics, GpBrush *brush, GpPath *p
     if (!path->pathdata.Count)
         return Ok;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
         return METAFILE_FillPath((GpMetafile*)graphics->image, brush, path);
 
     if (!graphics->image && !graphics->alpha_hdc)
@@ -4543,7 +4548,7 @@ GpStatus WINGDIPAPI GdipFillRectangles(GpGraphics *graphics, GpBrush *brush, GDI
     if(!graphics || !brush || !rects || count <= 0)
         return InvalidParameter;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
     {
         status = METAFILE_FillRectangles((GpMetafile*)graphics->image, brush, rects, count);
         /* FIXME: Add gdi32 drawing. */
@@ -4736,7 +4741,7 @@ GpStatus WINGDIPAPI GdipFillRegion(GpGraphics* graphics, GpBrush* brush,
     if(graphics->busy)
         return ObjectBusy;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
         stat = METAFILE_FillRegion((GpMetafile*)graphics->image, brush, region);
     else
     {
@@ -5076,7 +5081,7 @@ GpStatus WINGDIPAPI GdipGraphicsClear(GpGraphics *graphics, ARGB color)
     if(graphics->busy)
         return ObjectBusy;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
         return METAFILE_GraphicsClear((GpMetafile*)graphics->image, color);
 
     if((stat = GdipCreateSolidFill(color, &brush)) != Ok)
@@ -5854,7 +5859,8 @@ GpStatus WINGDIPAPI GdipResetWorldTransform(GpGraphics *graphics)
     if(graphics->busy)
         return ObjectBusy;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile) {
+    if (is_metafile_graphics(graphics))
+    {
         stat = METAFILE_ResetWorldTransform((GpMetafile*)graphics->image);
 
         if (stat != Ok)
@@ -5877,7 +5883,8 @@ GpStatus WINGDIPAPI GdipRotateWorldTransform(GpGraphics *graphics, REAL angle,
     if(graphics->busy)
         return ObjectBusy;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile) {
+    if (is_metafile_graphics(graphics))
+    {
         stat = METAFILE_RotateWorldTransform((GpMetafile*)graphics->image, angle, order);
 
         if (stat != Ok)
@@ -5903,7 +5910,7 @@ static GpStatus begin_container(GpGraphics *graphics,
     list_add_head(&graphics->containers, &container->entry);
     *state = graphics->contid = container->contid;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile) {
+    if (is_metafile_graphics(graphics)) {
         if (type == BEGIN_CONTAINER)
             METAFILE_BeginContainerNoParams((GpMetafile*)graphics->image, container->contid);
         else
@@ -5963,9 +5970,8 @@ GpStatus WINGDIPAPI GdipBeginContainer(GpGraphics *graphics, GDIPCONST GpRectF *
 
     GdipMultiplyMatrix(&graphics->worldtrans, &transform, MatrixOrderPrepend);
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile) {
+    if (is_metafile_graphics(graphics))
         METAFILE_BeginContainer((GpMetafile*)graphics->image, dstrect, srcrect, unit, container->contid);
-    }
 
     return Ok;
 }
@@ -6031,7 +6037,7 @@ static GpStatus end_container(GpGraphics *graphics, GraphicsContainerType type,
     list_remove(&container->entry);
     delete_container(container);
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile) {
+    if (is_metafile_graphics(graphics)) {
         if (type == BEGIN_CONTAINER)
             METAFILE_EndContainer((GpMetafile*)graphics->image, state);
         else
@@ -6066,7 +6072,7 @@ GpStatus WINGDIPAPI GdipScaleWorldTransform(GpGraphics *graphics, REAL sx,
     if(graphics->busy)
         return ObjectBusy;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile) {
+    if (is_metafile_graphics(graphics)) {
         stat = METAFILE_ScaleWorldTransform((GpMetafile*)graphics->image, sx, sy, order);
 
         if (stat != Ok)
@@ -6101,7 +6107,7 @@ GpStatus WINGDIPAPI GdipSetCompositingMode(GpGraphics *graphics,
     if(graphics->compmode == mode)
         return Ok;
 
-    if(graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
     {
         GpStatus stat;
 
@@ -6130,7 +6136,7 @@ GpStatus WINGDIPAPI GdipSetCompositingQuality(GpGraphics *graphics,
     if(graphics->compqual == quality)
         return Ok;
 
-    if(graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
     {
         GpStatus stat;
 
@@ -6165,7 +6171,7 @@ GpStatus WINGDIPAPI GdipSetInterpolationMode(GpGraphics *graphics,
     if (mode == graphics->interpolation)
         return Ok;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
     {
         GpStatus stat;
 
@@ -6192,7 +6198,7 @@ GpStatus WINGDIPAPI GdipSetPageScale(GpGraphics *graphics, REAL scale)
     if(graphics->busy)
         return ObjectBusy;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
     {
         stat = METAFILE_SetPageTransform((GpMetafile*)graphics->image, graphics->unit, scale);
         if (stat != Ok)
@@ -6219,7 +6225,7 @@ GpStatus WINGDIPAPI GdipSetPageUnit(GpGraphics *graphics, GpUnit unit)
     if(unit == UnitWorld)
         return InvalidParameter;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
     {
         stat = METAFILE_SetPageTransform((GpMetafile*)graphics->image, unit, graphics->scale);
         if (stat != Ok)
@@ -6245,7 +6251,7 @@ GpStatus WINGDIPAPI GdipSetPixelOffsetMode(GpGraphics *graphics, PixelOffsetMode
     if(graphics->pixeloffset == mode)
         return Ok;
 
-    if(graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
     {
         GpStatus stat;
 
@@ -6299,7 +6305,8 @@ GpStatus WINGDIPAPI GdipSetSmoothingMode(GpGraphics *graphics, SmoothingMode mod
     if(graphics->smoothing == mode)
         return Ok;
 
-    if(graphics->image && graphics->image->type == ImageTypeMetafile) {
+    if (is_metafile_graphics(graphics))
+    {
          GpStatus stat;
          BOOL antialias = (mode != SmoothingModeDefault &&
                  mode != SmoothingModeNone && mode != SmoothingModeHighSpeed);
@@ -6308,7 +6315,7 @@ GpStatus WINGDIPAPI GdipSetSmoothingMode(GpGraphics *graphics, SmoothingMode mod
                  EmfPlusRecordTypeSetAntiAliasMode, (mode << 1) + antialias);
          if(stat != Ok)
              return stat;
-     }
+    }
 
     graphics->smoothing = mode;
 
@@ -6341,7 +6348,7 @@ GpStatus WINGDIPAPI GdipSetTextRenderingHint(GpGraphics *graphics,
     if(graphics->texthint == hint)
         return Ok;
 
-    if(graphics->image && graphics->image->type == ImageTypeMetafile) {
+    if (is_metafile_graphics(graphics)) {
         GpStatus stat;
 
         stat = METAFILE_AddSimpleProperty((GpMetafile*)graphics->image,
@@ -6371,7 +6378,7 @@ GpStatus WINGDIPAPI GdipSetWorldTransform(GpGraphics *graphics, GpMatrix *matrix
           matrix->matrix[0], matrix->matrix[1], matrix->matrix[2],
           matrix->matrix[3], matrix->matrix[4], matrix->matrix[5]);
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile) {
+    if (is_metafile_graphics(graphics)) {
         stat = METAFILE_SetWorldTransform((GpMetafile*)graphics->image, matrix);
 
         if (stat != Ok)
@@ -6396,7 +6403,7 @@ GpStatus WINGDIPAPI GdipTranslateWorldTransform(GpGraphics *graphics, REAL dx,
     if(graphics->busy)
         return ObjectBusy;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile) {
+    if (is_metafile_graphics(graphics)) {
         stat = METAFILE_TranslateWorldTransform((GpMetafile*)graphics->image, dx, dy, order);
 
         if (stat != Ok)
@@ -6486,7 +6493,7 @@ GpStatus WINGDIPAPI GdipSetClipRect(GpGraphics *graphics, REAL x, REAL y,
     if(graphics->busy)
         return ObjectBusy;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
     {
         status = METAFILE_SetClipRect((GpMetafile*)graphics->image, x, y, width, height, mode);
         if (status != Ok)
@@ -6544,7 +6551,7 @@ GpStatus WINGDIPAPI GdipSetClipRegion(GpGraphics *graphics, GpRegion *region,
     if(graphics->busy)
         return ObjectBusy;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
     {
         status = METAFILE_SetClipRegion((GpMetafile*)graphics->image, region, mode);
         if (status != Ok)
@@ -6661,7 +6668,8 @@ GpStatus WINGDIPAPI GdipMultiplyWorldTransform(GpGraphics *graphics, GDIPCONST G
     if(graphics->busy)
         return ObjectBusy;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile) {
+    if (is_metafile_graphics(graphics))
+    {
         ret = METAFILE_MultiplyWorldTransform((GpMetafile*)graphics->image, matrix, order);
 
         if (ret != Ok)
@@ -6692,7 +6700,7 @@ GpStatus WINGDIPAPI GdipGetDC(GpGraphics *graphics, HDC *hdc)
     if(graphics->busy)
         return ObjectBusy;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
     {
         stat = METAFILE_GetDC((GpMetafile*)graphics->image, hdc);
     }
@@ -6773,7 +6781,7 @@ GpStatus WINGDIPAPI GdipReleaseDC(GpGraphics *graphics, HDC hdc)
     if(!graphics || !hdc || !graphics->busy)
         return InvalidParameter;
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
     {
         stat = METAFILE_ReleaseDC((GpMetafile*)graphics->image, hdc);
     }
@@ -7489,7 +7497,7 @@ static GpStatus draw_driver_string(GpGraphics *graphics, GDIPCONST UINT16 *text,
     if (length == -1)
         length = lstrlenW(text);
 
-    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+    if (is_metafile_graphics(graphics))
         return METAFILE_DrawDriverString((GpMetafile*)graphics->image, text, length, font,
             format, brush, positions, flags, matrix);
 
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 3d527801da9..552dcf83e9a 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -2239,6 +2239,7 @@ GpStatus WINGDIPAPI GdipGetImageGraphicsContext(GpImage *image,
         if (stat == Ok)
         {
             (*graphics)->image = image;
+            (*graphics)->image_type = image->type;
             (*graphics)->xres = image->xres;
             (*graphics)->yres = image->yres;
         }
-- 
2.30.2




More information about the wine-devel mailing list