Alexandre Julliard : gdi32: Add a null driver fallback for AlphaBlend, using a new BlendImage driver entry point.

Alexandre Julliard julliard at winehq.org
Wed Sep 14 12:25:39 CDT 2011


Module: wine
Branch: master
Commit: c819e4bdea373406521e7e8a5361a0f40efec173
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c819e4bdea373406521e7e8a5361a0f40efec173

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Sep 14 11:57:45 2011 +0200

gdi32: Add a null driver fallback for AlphaBlend, using a new BlendImage driver entry point.

---

 dlls/gdi32/bitblt.c        |   45 +++++++++++++++++++++++++++++++++++++++++++-
 dlls/gdi32/dibdrv/dc.c     |    1 +
 dlls/gdi32/driver.c        |    9 ++++---
 dlls/gdi32/enhmfdrv/init.c |    1 +
 dlls/gdi32/gdi_private.h   |    2 +
 dlls/gdi32/mfdrv/init.c    |    1 +
 dlls/wineps.drv/init.c     |    1 +
 dlls/winex11.drv/init.c    |    1 +
 dlls/winex11.drv/xrender.c |    1 +
 include/wine/gdi_driver.h  |    3 +-
 10 files changed, 59 insertions(+), 6 deletions(-)

diff --git a/dlls/gdi32/bitblt.c b/dlls/gdi32/bitblt.c
index 999f5ba..98ced52 100644
--- a/dlls/gdi32/bitblt.c
+++ b/dlls/gdi32/bitblt.c
@@ -196,7 +196,10 @@ static DWORD stretch_bits( const BITMAPINFO *src_info, struct bitblt_coords *src
     return err;
 }
 
-/* nulldrv fallback implementation using StretchDIBits */
+/***********************************************************************
+ *           null driver fallback implementations
+ */
+
 BOOL nulldrv_StretchBlt( PHYSDEV dst_dev, struct bitblt_coords *dst,
                          PHYSDEV src_dev, struct bitblt_coords *src, DWORD rop )
 {
@@ -267,6 +270,46 @@ BOOL nulldrv_StretchBlt( PHYSDEV dst_dev, struct bitblt_coords *dst,
     return !err;
 }
 
+
+BOOL nulldrv_AlphaBlend( PHYSDEV dst_dev, struct bitblt_coords *dst,
+                         PHYSDEV src_dev, struct bitblt_coords *src, BLENDFUNCTION func )
+{
+    DC *dc_src, *dc_dst = get_nulldrv_dc( dst_dev );
+    char src_buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )];
+    char dst_buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )];
+    BITMAPINFO *src_info = (BITMAPINFO *)src_buffer;
+    BITMAPINFO *dst_info = (BITMAPINFO *)dst_buffer;
+    DWORD err;
+    struct gdi_image_bits bits;
+
+    if (!(dc_src = get_dc_ptr( src_dev->hdc ))) return FALSE;
+    src_dev = GET_DC_PHYSDEV( dc_src, pGetImage );
+    err = src_dev->funcs->pGetImage( src_dev, 0, src_info, &bits, src );
+    release_dc_ptr( dc_src );
+    if (err) return FALSE;
+
+    dst_dev = GET_DC_PHYSDEV( dc_dst, pBlendImage );
+    memcpy( dst_info, src_info, FIELD_OFFSET( BITMAPINFO, bmiColors[256] ));
+    err = dst_dev->funcs->pBlendImage( dst_dev, dst_info, &bits, src, dst, func );
+    if (err == ERROR_BAD_FORMAT)
+    {
+        err = convert_bits( src_info, src, dst_info, &bits );
+        if (!err) err = dst_dev->funcs->pBlendImage( dst_dev, dst_info, &bits, src, dst, func );
+    }
+
+    if (err == ERROR_TRANSFORM_NOT_SUPPORTED &&
+        ((src->width != dst->width) || (src->height != dst->height)))
+    {
+        memcpy( src_info, dst_info, FIELD_OFFSET( BITMAPINFO, bmiColors[256] ));
+        err = stretch_bits( src_info, src, dst_info, dst, &bits, COLORONCOLOR );
+        if (!err) err = dst_dev->funcs->pBlendImage( dst_dev, dst_info, &bits, src, dst, func );
+    }
+
+    if (bits.free) bits.free( &bits );
+    return !err;
+}
+
+
 /***********************************************************************
  *           PatBlt    (GDI32.@)
  */
diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index 99b441c..b02ae8a 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -506,6 +506,7 @@ const DC_FUNCTIONS dib_driver =
     NULL,                               /* pArc */
     NULL,                               /* pArcTo */
     NULL,                               /* pBeginPath */
+    NULL,                               /* pBlendImage */
     NULL,                               /* pChoosePixelFormat */
     NULL,                               /* pChord */
     NULL,                               /* pCloseFigure */
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index 51e241f..4f111c3 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -190,14 +190,14 @@ static INT nulldrv_AbortDoc( PHYSDEV dev )
     return 0;
 }
 
-static BOOL nulldrv_AlphaBlend( PHYSDEV dst_dev, struct bitblt_coords *dst,
-                                PHYSDEV src_dev, struct bitblt_coords *src, BLENDFUNCTION func)
+static BOOL nulldrv_Arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
+                         INT xstart, INT ystart, INT xend, INT yend )
 {
     return TRUE;
 }
 
-static BOOL nulldrv_Arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
-                         INT xstart, INT ystart, INT xend, INT yend )
+static DWORD nulldrv_BlendImage( PHYSDEV dev, BITMAPINFO *info, const struct gdi_image_bits *bits,
+                                 struct bitblt_coords *src, struct bitblt_coords *dst, BLENDFUNCTION func )
 {
     return TRUE;
 }
@@ -666,6 +666,7 @@ const DC_FUNCTIONS null_driver =
     nulldrv_Arc,                        /* pArc */
     nulldrv_ArcTo,                      /* pArcTo */
     nulldrv_BeginPath,                  /* pBeginPath */
+    nulldrv_BlendImage,                 /* pBlendImage */
     nulldrv_ChoosePixelFormat,          /* pChoosePixelFormat */
     nulldrv_Chord,                      /* pChord */
     nulldrv_CloseFigure,                /* pCloseFigure */
diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c
index 8ccb050..292f505 100644
--- a/dlls/gdi32/enhmfdrv/init.c
+++ b/dlls/gdi32/enhmfdrv/init.c
@@ -43,6 +43,7 @@ static const DC_FUNCTIONS EMFDRV_Funcs =
     EMFDRV_Arc,                      /* pArc */
     NULL,                            /* pArcTo */
     EMFDRV_BeginPath,                /* pBeginPath */
+    NULL,                            /* pBlendImage */
     NULL,                            /* pChoosePixelFormat */
     EMFDRV_Chord,                    /* pChord */
     EMFDRV_CloseFigure,              /* pCloseFigure */
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 4fe2e59..6cb8693 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -383,6 +383,8 @@ static inline void release_wine_region(HRGN rgn)
 
 /* null driver entry points */
 extern BOOL nulldrv_AbortPath( PHYSDEV dev ) DECLSPEC_HIDDEN;
+extern BOOL nulldrv_AlphaBlend( PHYSDEV dst_dev, struct bitblt_coords *dst,
+                                PHYSDEV src_dev, struct bitblt_coords *src, BLENDFUNCTION func) DECLSPEC_HIDDEN;
 extern BOOL nulldrv_AngleArc( PHYSDEV dev, INT x, INT y, DWORD radius, FLOAT start, FLOAT sweep ) DECLSPEC_HIDDEN;
 extern BOOL nulldrv_ArcTo( PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN;
 extern BOOL nulldrv_BeginPath( PHYSDEV dev ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c
index 2139b98..0c93571 100644
--- a/dlls/gdi32/mfdrv/init.c
+++ b/dlls/gdi32/mfdrv/init.c
@@ -88,6 +88,7 @@ static const DC_FUNCTIONS MFDRV_Funcs =
     MFDRV_Arc,                       /* pArc */
     NULL,                            /* pArcTo */
     MFDRV_BeginPath,                 /* pBeginPath */
+    NULL,                            /* pBlendImage */
     NULL,                            /* pChoosePixelFormat */
     MFDRV_Chord,                     /* pChord */
     MFDRV_CloseFigure,               /* pCloseFigure */
diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c
index e7e545e..3a6f89f 100644
--- a/dlls/wineps.drv/init.c
+++ b/dlls/wineps.drv/init.c
@@ -825,6 +825,7 @@ static const struct gdi_dc_funcs psdrv_funcs =
     PSDRV_Arc,                          /* pArc */
     NULL,                               /* pArcTo */
     NULL,                               /* pBeginPath */
+    NULL,                               /* pBlendImage */
     NULL,                               /* pChoosePixelFormat */
     PSDRV_Chord,                        /* pChord */
     NULL,                               /* pCloseFigure */
diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c
index df6084a..96b6a7a 100644
--- a/dlls/winex11.drv/init.c
+++ b/dlls/winex11.drv/init.c
@@ -472,6 +472,7 @@ static const struct gdi_dc_funcs x11drv_funcs =
     X11DRV_Arc,                         /* pArc */
     NULL,                               /* pArcTo */
     NULL,                               /* pBeginPath */
+    NULL,                               /* pBlendImage */
     X11DRV_ChoosePixelFormat,           /* pChoosePixelFormat */
     X11DRV_Chord,                       /* pChord */
     NULL,                               /* pCloseFigure */
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index 2e7aca3..e525d5f 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -2598,6 +2598,7 @@ static const struct gdi_dc_funcs xrender_funcs =
     NULL,                               /* pArc */
     NULL,                               /* pArcTo */
     NULL,                               /* pBeginPath */
+    NULL,                               /* pBlendImage */
     NULL,                               /* pChoosePixelFormat */
     NULL,                               /* pChord */
     NULL,                               /* pCloseFigure */
diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h
index 1e7ebdb..b15dbd1 100644
--- a/include/wine/gdi_driver.h
+++ b/include/wine/gdi_driver.h
@@ -61,6 +61,7 @@ struct gdi_dc_funcs
     BOOL     (*pArc)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
     BOOL     (*pArcTo)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
     BOOL     (*pBeginPath)(PHYSDEV);
+    DWORD    (*pBlendImage)(PHYSDEV,BITMAPINFO*,const struct gdi_image_bits*,struct bitblt_coords*,struct bitblt_coords*,BLENDFUNCTION);
     INT      (*pChoosePixelFormat)(PHYSDEV,const PIXELFORMATDESCRIPTOR *);
     BOOL     (*pChord)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
     BOOL     (*pCloseFigure)(PHYSDEV);
@@ -189,7 +190,7 @@ struct gdi_dc_funcs
 };
 
 /* increment this when you change the DC function table */
-#define WINE_GDI_DRIVER_VERSION 13
+#define WINE_GDI_DRIVER_VERSION 14
 
 static inline PHYSDEV get_physdev_entry_point( PHYSDEV dev, size_t offset )
 {




More information about the wine-cvs mailing list