Jacek Caban : gdi32: Use NtGdiSetPixel for SetPixel implementation.

Alexandre Julliard julliard at winehq.org
Fri Jul 23 18:08:01 CDT 2021


Module: wine
Branch: master
Commit: 5a71d8415e82f62661006431d92139bbc5349093
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5a71d8415e82f62661006431d92139bbc5349093

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Jul 23 10:51:16 2021 +0200

gdi32: Use NtGdiSetPixel for SetPixel implementation.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi32/enhmfdrv/graphics.c | 24 ++++++++------
 dlls/gdi32/gdi_private.h       |  2 ++
 dlls/gdi32/gdidc.c             | 13 ++++++++
 dlls/gdi32/mfdrv/graphics.c    |  7 ++--
 dlls/gdi32/mfdrv/init.c        |  2 +-
 dlls/gdi32/mfdrv/metafiledrv.h |  1 -
 dlls/gdi32/painting.c          |  6 ++--
 dlls/gdi32/tests/metafile.c    | 72 ++++++++++++++++++++++++++++++++++++++++++
 8 files changed, 108 insertions(+), 19 deletions(-)

diff --git a/dlls/gdi32/enhmfdrv/graphics.c b/dlls/gdi32/enhmfdrv/graphics.c
index d4fd2b482ef..fcaf432b57e 100644
--- a/dlls/gdi32/enhmfdrv/graphics.c
+++ b/dlls/gdi32/enhmfdrv/graphics.c
@@ -524,9 +524,9 @@ BOOL CDECL EMFDRV_RoundRect( PHYSDEV dev, INT left, INT top, INT right,
 }
 
 /***********************************************************************
- *           EMFDRV_SetPixel
+ *           EMFDC_SetPixel
  */
-COLORREF CDECL EMFDRV_SetPixel( PHYSDEV dev, INT x, INT y, COLORREF color )
+BOOL EMFDC_SetPixel( DC_ATTR *dc_attr, INT x, INT y, COLORREF color )
 {
     EMRSETPIXELV emr;
 
@@ -535,15 +535,19 @@ COLORREF CDECL EMFDRV_SetPixel( PHYSDEV dev, INT x, INT y, COLORREF color )
     emr.ptlPixel.x = x;
     emr.ptlPixel.y = y;
     emr.crColor = color;
+    return EMFDRV_WriteRecord( dc_attr->emf, &emr.emr );
+}
 
-    if (EMFDRV_WriteRecord( dev, &emr.emr )) {
-        RECTL bounds;
-        bounds.left = bounds.right = x;
-        bounds.top = bounds.bottom = y;
-        EMFDRV_UpdateBBox( dev, &bounds );
-        return color;
-    }
-    return -1;
+/***********************************************************************
+ *           EMFDRV_SetPixel
+ */
+COLORREF CDECL EMFDRV_SetPixel( PHYSDEV dev, INT x, INT y, COLORREF color )
+{
+    RECTL bounds;
+    bounds.left = bounds.right = x;
+    bounds.top = bounds.bottom = y;
+    EMFDRV_UpdateBBox( dev, &bounds );
+    return CLR_INVALID;
 }
 
 /**********************************************************************
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index a95053ea44c..481bc14d7f3 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -60,6 +60,7 @@ extern BOOL METADC_Polyline( HDC hdc, const POINT *points,INT count) DECLSPEC_HI
 extern BOOL METADC_Rectangle( HDC hdc, INT left, INT top, INT right, INT bottom) DECLSPEC_HIDDEN;
 extern BOOL METADC_RoundRect( HDC hdc, INT left, INT top, INT right, INT bottom,
                               INT ell_width, INT ell_height ) DECLSPEC_HIDDEN;
+extern BOOL METADC_SetPixel( HDC hdc, INT x, INT y, COLORREF color ) DECLSPEC_HIDDEN;
 
 /* enhanced metafiles */
 extern BOOL EMFDC_AbortPath( DC_ATTR *dc_attr ) DECLSPEC_HIDDEN;
@@ -92,5 +93,6 @@ extern BOOL EMFDC_Rectangle( DC_ATTR *dc_attr, INT left, INT top, INT right,
                              INT bottom) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_RoundRect( DC_ATTR *dc_attr, INT left, INT top, INT right, INT bottom,
                              INT ell_width, INT ell_height ) DECLSPEC_HIDDEN;
+extern BOOL EMFDC_SetPixel( DC_ATTR *dc_attr, INT x, INT y, COLORREF color ) DECLSPEC_HIDDEN;
 
 #endif /* __WINE_GDI_PRIVATE_H */
diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c
index 04d90a5e0ba..0bfc48f3fcc 100644
--- a/dlls/gdi32/gdidc.c
+++ b/dlls/gdi32/gdidc.c
@@ -57,6 +57,19 @@ BOOL WINAPI GetCurrentPositionEx( HDC hdc, POINT *point )
     return TRUE;
 }
 
+/***********************************************************************
+ *           SetPixel    (GDI32.@)
+ */
+COLORREF WINAPI SetPixel( HDC hdc, INT x, INT y, COLORREF color )
+{
+    DC_ATTR *dc_attr;
+
+    if (is_meta_dc( hdc )) return METADC_SetPixel( hdc, x, y, color );
+    if (!(dc_attr = get_dc_attr( hdc ))) return CLR_INVALID;
+    if (dc_attr->emf && !EMFDC_SetPixel( dc_attr, x, y, color )) return CLR_INVALID;
+    return NtGdiSetPixel( hdc, x, y, color );
+}
+
 /***********************************************************************
  *           LineTo    (GDI32.@)
  */
diff --git a/dlls/gdi32/mfdrv/graphics.c b/dlls/gdi32/mfdrv/graphics.c
index d5f256346f9..8b74c1a3696 100644
--- a/dlls/gdi32/mfdrv/graphics.c
+++ b/dlls/gdi32/mfdrv/graphics.c
@@ -116,12 +116,11 @@ BOOL METADC_RoundRect( HDC hdc, INT left, INT top, INT right,
 }
 
 /***********************************************************************
- *           MFDRV_SetPixel
+ *           METADC_SetPixel
  */
-COLORREF CDECL MFDRV_SetPixel( PHYSDEV dev, INT x, INT y, COLORREF color )
+BOOL METADC_SetPixel( HDC hdc, INT x, INT y, COLORREF color )
 {
-    return MFDRV_MetaParam4(dev, META_SETPIXEL, x, y,HIWORD(color),
-			    LOWORD(color));
+    return metadc_param4( hdc, META_SETPIXEL, x, y, HIWORD(color), LOWORD(color) );
 }
 
 
diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c
index b37dc5c6d92..f53f8304a8e 100644
--- a/dlls/gdi32/mfdrv/init.c
+++ b/dlls/gdi32/mfdrv/init.c
@@ -202,7 +202,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs =
     MFDRV_SetLayout,                 /* pSetLayout */
     MFDRV_SetMapMode,                /* pSetMapMode */
     MFDRV_SetMapperFlags,            /* pSetMapperFlags */
-    MFDRV_SetPixel,                  /* pSetPixel */
+    NULL,                            /* pSetPixel */
     MFDRV_SetPolyFillMode,           /* pSetPolyFillMode */
     MFDRV_SetROP2,                   /* pSetROP2 */
     MFDRV_SetRelAbs,                 /* pSetRelAbs */
diff --git a/dlls/gdi32/mfdrv/metafiledrv.h b/dlls/gdi32/mfdrv/metafiledrv.h
index 3fad2970e64..6b4984854ed 100644
--- a/dlls/gdi32/mfdrv/metafiledrv.h
+++ b/dlls/gdi32/mfdrv/metafiledrv.h
@@ -112,7 +112,6 @@ extern COLORREF CDECL MFDRV_SetDCPenColor( PHYSDEV dev, COLORREF color ) DECLSPE
 extern DWORD    CDECL MFDRV_SetLayout( PHYSDEV dev, DWORD layout ) DECLSPEC_HIDDEN;
 extern INT  CDECL MFDRV_SetMapMode( PHYSDEV dev, INT mode ) DECLSPEC_HIDDEN;
 extern DWORD CDECL MFDRV_SetMapperFlags( PHYSDEV dev, DWORD flags ) DECLSPEC_HIDDEN;
-extern COLORREF CDECL MFDRV_SetPixel( PHYSDEV dev, INT x, INT y, COLORREF color ) DECLSPEC_HIDDEN;
 extern INT  CDECL MFDRV_SetPolyFillMode( PHYSDEV dev, INT mode ) DECLSPEC_HIDDEN;
 extern INT  CDECL MFDRV_SetROP2( PHYSDEV dev, INT rop ) DECLSPEC_HIDDEN;
 extern INT  CDECL MFDRV_SetRelAbs( PHYSDEV dev, INT mode ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/painting.c b/dlls/gdi32/painting.c
index 803b9797736..1e03a2046d9 100644
--- a/dlls/gdi32/painting.c
+++ b/dlls/gdi32/painting.c
@@ -399,15 +399,15 @@ BOOL WINAPI NtGdiRoundRect( HDC hdc, INT left, INT top, INT right,
 }
 
 /***********************************************************************
- *           SetPixel    (GDI32.@)
+ *           NtGdiSetPixel    (win32u.@)
  */
-COLORREF WINAPI SetPixel( HDC hdc, INT x, INT y, COLORREF color )
+COLORREF WINAPI NtGdiSetPixel( HDC hdc, INT x, INT y, COLORREF color )
 {
     PHYSDEV physdev;
     COLORREF ret;
     DC * dc = get_dc_ptr( hdc );
 
-    if (!dc) return ~0;
+    if (!dc) return CLR_INVALID;
     update_dc( dc );
     physdev = GET_DC_PHYSDEV( dc, pSetPixel );
     ret = physdev->funcs->pSetPixel( physdev, x, y, color );
diff --git a/dlls/gdi32/tests/metafile.c b/dlls/gdi32/tests/metafile.c
index 34de9518f2a..d310eb47fa2 100644
--- a/dlls/gdi32/tests/metafile.c
+++ b/dlls/gdi32/tests/metafile.c
@@ -3077,6 +3077,42 @@ static void test_metafile_file(void)
     ok(GetLastError() == ERROR_INVALID_HANDLE, "GetLastError() = %u\n", GetLastError());
 }
 
+static void test_mf_SetPixel(void)
+{
+    HMETAFILE mf;
+    COLORREF c;
+    BOOL ret;
+    HDC hdc;
+
+    hdc = CreateMetaFileW(NULL);
+    ok(hdc != 0, "CreateEnhMetaFile failed\n");
+
+    c = GetPixel(hdc, 5, 5);
+    ok(c == CLR_INVALID, "c = %x\n", c);
+
+    c = SetPixel(hdc, 5, 5, RGB(1,2,3));
+    ok(c == 1, "c = %x\n", c);
+
+    c = SetPixel(hdc, 5, 5, RGB(1,2,3));
+    ok(c == 1, "c = %x\n", c);
+
+    ret = SetPixelV(hdc, 5, 5, RGB(1,2,3));
+    ok(ret, "ret = %x\n", ret);
+
+    c = GetPixel(hdc, 5, 5);
+    ok(c == CLR_INVALID, "c = %x\n", c);
+
+    ret = Rectangle(hdc, 1, 1, 10, 10);
+    ok(ret, "Rectangle failed\n");
+
+    c = GetPixel(hdc, 5, 5);
+    ok(c == CLR_INVALID, "c = %x\n", c);
+
+    mf = CloseMetaFile(hdc);
+    ok(mf != 0, "CloseEnhMetaFile failed\n");
+    DeleteMetaFile(mf);
+}
+
 static void test_enhmetafile_file(void)
 {
     char temp_path[MAX_PATH];
@@ -3178,6 +3214,40 @@ static void test_enhmetafile_file(void)
     ok(GetLastError() == ERROR_INVALID_HANDLE, "GetLastError() = %u\n", GetLastError());
 }
 
+static void test_emf_SetPixel(void)
+{
+    HENHMETAFILE emf;
+    COLORREF c;
+    BOOL ret;
+    HDC hdc;
+
+    hdc = CreateEnhMetaFileW(NULL, L"test.emf", NULL, NULL);
+    ok(hdc != 0, "CreateEnhMetaFile failed\n");
+
+    c = GetPixel(hdc, 5, 5);
+    ok(c == CLR_INVALID, "c = %x\n", c);
+
+    c = SetPixel(hdc, 5, 5, RGB(1,2,3));
+    ok(c == CLR_INVALID, "c = %x\n", c);
+
+    ret = SetPixelV(hdc, 5, 5, RGB(1,2,3));
+    todo_wine
+    ok(!ret, "ret = %x\n", ret);
+
+    c = GetPixel(hdc, 5, 5);
+    ok(c == CLR_INVALID, "c = %x\n", c);
+
+    ret = Rectangle(hdc, 1, 1, 10, 10);
+    ok(ret, "Rectangle failed\n");
+
+    c = GetPixel(hdc, 5, 5);
+    ok(c == CLR_INVALID, "c = %x\n", c);
+
+    emf = CloseEnhMetaFile(hdc);
+    ok(emf != 0, "CloseEnhMetaFile failed\n");
+    DeleteEnhMetaFile(emf);
+}
+
 static void test_CopyMetaFile(void)
 {
     HDC hdcMetafile;
@@ -6272,6 +6342,7 @@ START_TEST(metafile)
     test_emf_WorldTransform();
     test_emf_text_extents();
     test_enhmetafile_file();
+    test_emf_SetPixel();
 
     /* For win-format metafiles (mfdrv) */
     test_mf_SaveDC();
@@ -6286,6 +6357,7 @@ START_TEST(metafile)
     test_mf_GetPath();
     test_mf_SetLayout();
     test_metafile_file();
+    test_mf_SetPixel();
 
     /* For metafile conversions */
     test_mf_conversions();




More information about the wine-cvs mailing list