From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/printproc.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index b40f7a7962c..0a1f36c82d8 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -378,6 +378,10 @@ static void get_vis_rectangles(HDC hdc, struct bitblt_coords *dst, src->width = rect.right - rect.left; src->height = rect.bottom - rect.top; get_bounding_rect(&rect, src->x, src->y, src->width, src->height); + if (rect.left < 0) rect.left = 0; + if (rect.top < 0) rect.top = 0; + if (rect.right > width) rect.right = width; + if (rect.bottom > height) rect.bottom = height; src->visrect = rect;
intersect_vis_rectangles(dst, src); @@ -413,7 +417,7 @@ static int stretch_blt(PHYSDEV dev, const EMRSTRETCHBLT *blt, src.layout = 0;
get_vis_rectangles(dev->hdc, &dst, &blt->xformSrc, - bi->bmiHeader.biWidth, bi->bmiHeader.biHeight, &src); + bi->bmiHeader.biWidth, abs(bi->bmiHeader.biHeight), &src);
memcpy(dst_info, bi, blt->cbBmiSrc); memset(&bits, 0, sizeof(bits));
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/printproc.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index 0a1f36c82d8..1b5095bd109 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -2839,6 +2839,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_MODIFYWORLDTRANSFORM: case EMR_CREATEPEN: case EMR_CREATEBRUSHINDIRECT: + case EMR_CREATEPALETTE: case EMR_SETARCDIRECTION: case EMR_CLOSEFIGURE: case EMR_FLATTENPATH:
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/printproc.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index 1b5095bd109..3c54cfd7036 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -2839,6 +2839,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_MODIFYWORLDTRANSFORM: case EMR_CREATEPEN: case EMR_CREATEBRUSHINDIRECT: + case EMR_SELECTPALETTE: case EMR_CREATEPALETTE: case EMR_SETARCDIRECTION: case EMR_CLOSEFIGURE:
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/printproc.c | 88 +++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+)
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index 3c54cfd7036..2715cb952fc 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -802,6 +802,92 @@ static int plg_blt(PHYSDEV dev, const EMRPLGBLT *p) return TRUE; }
+static inline int get_dib_stride( int width, int bpp ) +{ + return ((width * bpp + 31) >> 3) & ~3; +} + +static inline int get_dib_image_size( const BITMAPINFO *info ) +{ + return get_dib_stride( info->bmiHeader.biWidth, info->bmiHeader.biBitCount ) + * abs( info->bmiHeader.biHeight ); +} + +static int set_di_bits_to_device(PHYSDEV dev, const EMRSETDIBITSTODEVICE *p) +{ + const BITMAPINFO *info = (const BITMAPINFO *)((BYTE *)p + p->offBmiSrc); + char bi_buffer[FIELD_OFFSET(BITMAPINFO, bmiColors[256])]; + BITMAPINFO *bi = (BITMAPINFO *)bi_buffer; + HBITMAP bitmap, old_bitmap; + int width, height, ret; + BYTE *bits; + + width = min(p->cxSrc, info->bmiHeader.biWidth); + height = min(p->cySrc, abs(info->bmiHeader.biHeight)); + + memset(bi_buffer, 0, sizeof(bi_buffer)); + bi->bmiHeader.biSize = sizeof(bi->bmiHeader); + bi->bmiHeader.biWidth = width; + bi->bmiHeader.biHeight = height; + bi->bmiHeader.biPlanes = 1; + if (p->iUsageSrc == DIB_PAL_COLORS && (info->bmiHeader.biBitCount == 1 || + info->bmiHeader.biBitCount == 4 || info->bmiHeader.biBitCount == 8)) + { + PALETTEENTRY pal[256]; + HPALETTE hpal; + UINT i, size; + + bi->bmiHeader.biBitCount = info->bmiHeader.biBitCount; + bi->bmiHeader.biClrUsed = 1 << info->bmiHeader.biBitCount; + bi->bmiHeader.biClrImportant = bi->bmiHeader.biClrUsed; + + hpal = GetCurrentObject(dev->hdc, OBJ_PAL); + size = GetPaletteEntries(hpal, 0, bi->bmiHeader.biClrUsed, pal); + for (i = 0; i < size; i++) + { + bi->bmiColors[i].rgbBlue = pal[i].peBlue; + bi->bmiColors[i].rgbGreen = pal[i].peGreen; + bi->bmiColors[i].rgbRed = pal[i].peRed; + } + } + else + { + bi->bmiHeader.biBitCount = 24; + } + bi->bmiHeader.biCompression = BI_RGB; + bitmap = CreateDIBSection(dev->hdc, bi, DIB_RGB_COLORS, (void **)&bits, NULL, 0); + if (!bitmap) + return 1; + old_bitmap = SelectObject(dev->hdc, bitmap); + + ret = SetDIBitsToDevice(dev->hdc, 0, 0, width, height, p->xSrc, p->ySrc, + p->iStartScan, p->cScans, (const BYTE*)p + p->offBitsSrc, info, p->iUsageSrc); + SelectObject(dev->hdc, old_bitmap); + if (ret) + { + EMRSTRETCHBLT blt; + + memset(&blt, 0, sizeof(blt)); + blt.rclBounds = p->rclBounds; + blt.xDest = p->xDest; + blt.yDest = p->yDest + p->cySrc - height; + blt.cxDest = width; + blt.cyDest = ret; + blt.dwRop = SRCCOPY; + blt.xformSrc.eM11 = 1; + blt.xformSrc.eM22 = 1; + blt.iUsageSrc = DIB_RGB_COLORS; + blt.cbBmiSrc = sizeof(bi_buffer); + blt.cbBitsSrc = get_dib_image_size(bi); + blt.cxSrc = blt.cxDest; + blt.cySrc = blt.cyDest; + stretch_blt(dev, &blt, bi, bits); + } + + DeleteObject(bitmap); + return 1; +} + static int poly_draw(PHYSDEV dev, const POINT *points, const BYTE *types, DWORD count) { POINT first, cur, pts[4]; @@ -2592,6 +2678,8 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable,
return plg_blt(&data->pdev->dev, p); } + case EMR_SETDIBITSTODEVICE: + return set_di_bits_to_device(&data->pdev->dev, (const EMRSETDIBITSTODEVICE *)rec); case EMR_EXTTEXTOUTW: { const EMREXTTEXTOUTW *p = (const EMREXTTEXTOUTW *)rec;
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/printproc.c | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+)
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index 2715cb952fc..48f584e1a7e 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -888,6 +888,52 @@ static int set_di_bits_to_device(PHYSDEV dev, const EMRSETDIBITSTODEVICE *p) return 1; }
+static int stretch_di_bits(PHYSDEV dev, const EMRSTRETCHDIBITS *p) +{ + char bi_buffer[FIELD_OFFSET(BITMAPINFO, bmiColors[256])]; + const BYTE *bits = (BYTE *)p + p->offBitsSrc; + BITMAPINFO *bi = (BITMAPINFO *)bi_buffer; + EMRSTRETCHBLT blt; + + memcpy(bi, (BYTE *)p + p->offBmiSrc, p->cbBmiSrc); + memset(bi_buffer + p->cbBmiSrc, 0, sizeof(bi_buffer) - p->cbBmiSrc); + + if (p->iUsageSrc == DIB_PAL_COLORS && (bi->bmiHeader.biBitCount == 1 || + bi->bmiHeader.biBitCount == 4 || bi->bmiHeader.biBitCount == 8)) + { + PALETTEENTRY pal[256]; + HPALETTE hpal; + UINT i, size; + + hpal = GetCurrentObject(dev->hdc, OBJ_PAL); + size = GetPaletteEntries(hpal, 0, 1 << bi->bmiHeader.biBitCount, pal); + for (i = 0; i < size; i++) + { + bi->bmiColors[i].rgbBlue = pal[i].peBlue; + bi->bmiColors[i].rgbGreen = pal[i].peGreen; + bi->bmiColors[i].rgbRed = pal[i].peRed; + } + } + + memset(&blt, 0, sizeof(blt)); + blt.rclBounds = p->rclBounds; + blt.xDest = p->xDest; + blt.yDest = p->yDest; + blt.cxDest = p->cxDest; + blt.cyDest = p->cyDest; + blt.dwRop = p->dwRop; + blt.xSrc = p->xSrc; + blt.ySrc = abs(bi->bmiHeader.biHeight) - p->ySrc - p->cySrc; + blt.xformSrc.eM11 = 1; + blt.xformSrc.eM22 = 1; + blt.iUsageSrc = p->iUsageSrc; + blt.cbBmiSrc = sizeof(bi_buffer); + blt.cbBitsSrc = p->cbBitsSrc; + blt.cxSrc = p->cxSrc; + blt.cySrc = p->cySrc; + return stretch_blt(dev, &blt, bi, bits); +} + static int poly_draw(PHYSDEV dev, const POINT *points, const BYTE *types, DWORD count) { POINT first, cur, pts[4]; @@ -2680,6 +2726,8 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, } case EMR_SETDIBITSTODEVICE: return set_di_bits_to_device(&data->pdev->dev, (const EMRSETDIBITSTODEVICE *)rec); + case EMR_STRETCHDIBITS: + return stretch_di_bits(&data->pdev->dev, (const EMRSTRETCHDIBITS *)rec); case EMR_EXTTEXTOUTW: { const EMREXTTEXTOUTW *p = (const EMREXTTEXTOUTW *)rec;
This merge request was approved by Huw Davies.