Zhiyi Zhang : gdi32: Use a common helper for emf StretchBlt and AlphaBlend.
Alexandre Julliard
julliard at winehq.org
Mon Jun 7 16:30:37 CDT 2021
Module: wine
Branch: master
Commit: dadc6fd29b8bfeb94e9f3954a6d65473ab1d2ba6
URL: https://source.winehq.org/git/wine.git/?a=commit;h=dadc6fd29b8bfeb94e9f3954a6d65473ab1d2ba6
Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date: Mon May 31 16:13:06 2021 +0800
gdi32: Use a common helper for emf StretchBlt and AlphaBlend.
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/gdi32/enhmfdrv/bitblt.c | 129 ++++++++-----------------------------------
1 file changed, 23 insertions(+), 106 deletions(-)
diff --git a/dlls/gdi32/enhmfdrv/bitblt.c b/dlls/gdi32/enhmfdrv/bitblt.c
index 597a6110abd..f15acaa1f14 100644
--- a/dlls/gdi32/enhmfdrv/bitblt.c
+++ b/dlls/gdi32/enhmfdrv/bitblt.c
@@ -27,15 +27,17 @@
#include "enhmetafiledrv.h"
#include "wine/debug.h"
-BOOL CDECL EMFDRV_AlphaBlend( PHYSDEV dev_dst, struct bitblt_coords *dst,
- PHYSDEV dev_src, struct bitblt_coords *src, BLENDFUNCTION func )
+/* Generate an EMRBITBLT, EMRSTRETCHBLT or EMRALPHABLEND record depending on the type parameter */
+static BOOL emfdrv_stretchblt( PHYSDEV dev_dst, struct bitblt_coords *dst, PHYSDEV dev_src,
+ struct bitblt_coords *src, DWORD rop, DWORD type )
{
unsigned char src_buffer[FIELD_OFFSET(BITMAPINFO, bmiColors[256])];
BITMAPINFO *src_info = (BITMAPINFO *)src_buffer;
UINT bits_size, bmi_size, emr_size, size, bpp;
+ EMRSTRETCHBLT *emr_stretchblt;
struct gdi_image_bits bits;
- EMRALPHABLEND *emr;
BITMAPINFO *bmi;
+ EMRBITBLT *emr;
DC *dc_src;
DWORD err;
BOOL ret = FALSE;
@@ -56,14 +58,15 @@ BOOL CDECL EMFDRV_AlphaBlend( PHYSDEV dev_dst, struct bitblt_coords *dst,
bmi_size = sizeof(BITMAPINFOHEADER) + 3 * sizeof(RGBQUAD);
else
bmi_size = sizeof(BITMAPINFOHEADER);
- emr_size = sizeof(EMRALPHABLEND);
+ /* EMRSTRETCHBLT and EMRALPHABLEND have the same structure */
+ emr_size = type == EMR_BITBLT ? sizeof(EMRBITBLT) : sizeof(EMRSTRETCHBLT);
bits_size = src_info->bmiHeader.biSizeImage;
size = emr_size + bmi_size + bits_size;
emr = HeapAlloc(GetProcessHeap(), 0, size);
if (!emr) goto err;
- emr->emr.iType = EMR_ALPHABLEND;
+ emr->emr.iType = type;
emr->emr.nSize = size;
emr->rclBounds.left = dst->log_x;
emr->rclBounds.top = dst->log_y;
@@ -75,9 +78,13 @@ BOOL CDECL EMFDRV_AlphaBlend( PHYSDEV dev_dst, struct bitblt_coords *dst,
emr->cyDest = dst->log_height;
emr->xSrc = src->log_x;
emr->ySrc = src->log_y;
- emr->cxSrc = src->log_width;
- emr->cySrc = src->log_height;
- emr->dwRop = *(DWORD *)&func;
+ if (type == EMR_STRETCHBLT || type == EMR_ALPHABLEND)
+ {
+ emr_stretchblt = (EMRSTRETCHBLT *)emr;
+ emr_stretchblt->cxSrc = src->log_width;
+ emr_stretchblt->cySrc = src->log_height;
+ }
+ emr->dwRop = rop;
GetTransform(dev_src->hdc, 0x204, &emr->xformSrc);
emr->crBkColorSrc = GetBkColor(dev_src->hdc);
emr->iUsageSrc = DIB_RGB_COLORS;
@@ -115,6 +122,12 @@ err:
return ret;
}
+BOOL CDECL EMFDRV_AlphaBlend( PHYSDEV dev_dst, struct bitblt_coords *dst,
+ PHYSDEV dev_src, struct bitblt_coords *src, BLENDFUNCTION func )
+{
+ return emfdrv_stretchblt(dev_dst, dst, dev_src, src, *(DWORD *)&func, EMR_ALPHABLEND);
+}
+
BOOL CDECL EMFDRV_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop )
{
EMRBITBLT emr;
@@ -155,106 +168,10 @@ BOOL CDECL EMFDRV_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop )
BOOL CDECL EMFDRV_StretchBlt( PHYSDEV devDst, struct bitblt_coords *dst,
PHYSDEV devSrc, struct bitblt_coords *src, DWORD rop )
{
- BOOL ret;
- PEMRBITBLT pEMR;
- UINT emrSize;
- UINT bmiSize;
- UINT bitsSize;
- UINT size;
- BITMAP BM;
- WORD nBPP = 0;
- LPBITMAPINFOHEADER lpBmiH;
- HBITMAP hBitmap = NULL;
- DWORD emrType;
-
- if (devSrc->funcs == devDst->funcs) return FALSE; /* can't use a metafile DC as source */
-
if (src->log_width == dst->log_width && src->log_height == dst->log_height)
- {
- emrType = EMR_BITBLT;
- emrSize = sizeof(EMRBITBLT);
- }
- else
- {
- emrType = EMR_STRETCHBLT;
- emrSize = sizeof(EMRSTRETCHBLT);
- }
-
- hBitmap = GetCurrentObject(devSrc->hdc, OBJ_BITMAP);
-
- if(sizeof(BITMAP) != GetObjectW(hBitmap, sizeof(BITMAP), &BM))
- return FALSE;
-
- nBPP = BM.bmPlanes * BM.bmBitsPixel;
- if(nBPP > 8) nBPP = 24; /* FIXME Can't get 16bpp to work for some reason */
- bitsSize = get_dib_stride( BM.bmWidth, nBPP ) * BM.bmHeight;
- bmiSize = sizeof(BITMAPINFOHEADER) +
- (nBPP <= 8 ? 1 << nBPP : 0) * sizeof(RGBQUAD);
-
- size = emrSize + bmiSize + bitsSize;
-
- pEMR = HeapAlloc(GetProcessHeap(), 0, size);
- if (!pEMR) return FALSE;
-
- /* Initialize EMR */
- pEMR->emr.iType = emrType;
- pEMR->emr.nSize = size;
- pEMR->rclBounds.left = dst->log_x;
- pEMR->rclBounds.top = dst->log_y;
- pEMR->rclBounds.right = dst->log_x + dst->log_width - 1;
- pEMR->rclBounds.bottom = dst->log_y + dst->log_height - 1;
- pEMR->xDest = dst->log_x;
- pEMR->yDest = dst->log_y;
- pEMR->cxDest = dst->log_width;
- pEMR->cyDest = dst->log_height;
- pEMR->dwRop = rop;
- pEMR->xSrc = src->log_x;
- pEMR->ySrc = src->log_y;
- GetTransform(devSrc->hdc, 0x204, &pEMR->xformSrc);
- pEMR->crBkColorSrc = GetBkColor(devSrc->hdc);
- pEMR->iUsageSrc = DIB_RGB_COLORS;
- pEMR->offBmiSrc = emrSize;
- pEMR->offBitsSrc = emrSize + bmiSize;
- pEMR->cbBmiSrc = bmiSize;
- pEMR->cbBitsSrc = bitsSize;
- if (emrType == EMR_STRETCHBLT)
- {
- PEMRSTRETCHBLT pEMRStretch = (PEMRSTRETCHBLT)pEMR;
- pEMRStretch->cxSrc = src->log_width;
- pEMRStretch->cySrc = src->log_height;
- }
-
- /* Initialize BITMAPINFO structure */
- lpBmiH = (LPBITMAPINFOHEADER)((BYTE*)pEMR + pEMR->offBmiSrc);
-
- lpBmiH->biSize = sizeof(BITMAPINFOHEADER);
- lpBmiH->biWidth = BM.bmWidth;
- lpBmiH->biHeight = BM.bmHeight;
- lpBmiH->biPlanes = BM.bmPlanes;
- lpBmiH->biBitCount = nBPP;
- /* Assume the bitmap isn't compressed and set the BI_RGB flag. */
- lpBmiH->biCompression = BI_RGB;
- lpBmiH->biSizeImage = bitsSize;
- lpBmiH->biYPelsPerMeter = 0;
- lpBmiH->biXPelsPerMeter = 0;
- lpBmiH->biClrUsed = nBPP <= 8 ? 1 << nBPP : 0;
- /* Set biClrImportant to 0, indicating that all of the
- device colors are important. */
- lpBmiH->biClrImportant = 0;
-
- /* Initialize bitmap bits */
- if (GetDIBits(devSrc->hdc, hBitmap, 0, (UINT)lpBmiH->biHeight,
- (BYTE*)pEMR + pEMR->offBitsSrc,
- (LPBITMAPINFO)lpBmiH, DIB_RGB_COLORS))
- {
- ret = EMFDRV_WriteRecord(devDst, (EMR*)pEMR);
- if (ret) EMFDRV_UpdateBBox(devDst, &(pEMR->rclBounds));
- }
+ return emfdrv_stretchblt(devDst, dst, devSrc, src, rop, EMR_BITBLT);
else
- ret = FALSE;
-
- HeapFree( GetProcessHeap(), 0, pEMR);
- return ret;
+ return emfdrv_stretchblt(devDst, dst, devSrc, src, rop, EMR_STRETCHBLT);
}
INT CDECL EMFDRV_StretchDIBits( PHYSDEV dev, INT xDst, INT yDst, INT widthDst, INT heightDst,
More information about the wine-cvs
mailing list