From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/printproc.c | 57 ++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 11 deletions(-)
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index 4e90347a4eb..da6ecf62a60 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -41,6 +41,7 @@ struct pp_data WCHAR *doc_name; WCHAR *out_file; PSDRV_PDEVICE *pdev; + DWORD brush; struct brush_pattern *patterns; };
@@ -692,6 +693,32 @@ static int poly_draw(PHYSDEV dev, const POINT *points, const BYTE *types, DWORD return TRUE; }
+static HGDIOBJ get_object_handle(struct pp_data *data, HANDLETABLE *handletable, + DWORD i, struct brush_pattern **pattern) +{ + if (i & 0x80000000) + { + *pattern = NULL; + return GetStockObject(i & 0x7fffffff); + } + *pattern = data->patterns + i; + return handletable->objectHandle[i]; +} + +static BOOL fill_rgn(struct pp_data *data, HANDLETABLE *htable, DWORD brush, HRGN rgn) +{ + struct brush_pattern *pattern; + HBRUSH hbrush; + int ret; + + hbrush = get_object_handle(data, htable, brush, &pattern); + PSDRV_SelectBrush(&data->pdev->dev, hbrush, pattern); + ret = PSDRV_PaintRgn(&data->pdev->dev, rgn); + hbrush = get_object_handle(data, htable, data->brush, &pattern); + PSDRV_SelectBrush(&data->pdev->dev, hbrush, pattern); + return ret; +} + static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, const ENHMETARECORD *rec, int n, LPARAM arg) { @@ -782,22 +809,19 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, struct brush_pattern *pattern; HGDIOBJ obj;
- if (so->ihObject & 0x80000000) - { - obj = GetStockObject(so->ihObject & 0x7fffffff); - pattern = NULL; - } - else - { - obj = (htable->objectHandle)[so->ihObject]; - pattern = data->patterns + so->ihObject; - } + obj = get_object_handle(data, htable, so->ihObject, &pattern); SelectObject(data->pdev->dev.hdc, obj);
switch (GetObjectType(obj)) { case OBJ_PEN: return PSDRV_SelectPen(&data->pdev->dev, obj, NULL) != NULL; - case OBJ_BRUSH: return PSDRV_SelectBrush(&data->pdev->dev, obj, pattern) != NULL; + case OBJ_BRUSH: + if (PSDRV_SelectBrush(&data->pdev->dev, obj, pattern)) + { + data->brush = so->ihObject; + return 1; + } + return 0; default: FIXME("unhandled object type %ld\n", GetObjectType(obj)); return 1; @@ -926,6 +950,17 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, return poly_draw(&data->pdev->dev, pts, (BYTE *)(p->aptl + p->cptl), p->cptl) && MoveToEx(data->pdev->dev.hdc, pts[p->cptl - 1].x, pts[p->cptl - 1].y, NULL); } + case EMR_FILLRGN: + { + const EMRFILLRGN *p = (const EMRFILLRGN *)rec; + HRGN rgn; + int ret; + + rgn = ExtCreateRegion(NULL, p->cbRgnData, (const RGNDATA *)p->RgnData); + ret = fill_rgn(data, htable, p->ihBrush, rgn); + DeleteObject(rgn); + return ret; + } case EMR_PAINTRGN: { const EMRPAINTRGN *p = (const EMRPAINTRGN *)rec;
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/printproc.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index da6ecf62a60..a5922c848e0 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -961,6 +961,31 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, DeleteObject(rgn); return ret; } + case EMR_FRAMERGN: + { + const EMRFRAMERGN *p = (const EMRFRAMERGN *)rec; + HRGN rgn, frame; + int ret; + + rgn = ExtCreateRegion(NULL, p->cbRgnData, (const RGNDATA *)p->RgnData); + frame = CreateRectRgn(0, 0, 0, 0); + + CombineRgn(frame, rgn, 0, RGN_COPY); + OffsetRgn(frame, -p->szlStroke.cx, 0); + OffsetRgn(rgn, p->szlStroke.cx, 0); + CombineRgn(frame, frame, rgn, RGN_AND); + OffsetRgn(rgn, -p->szlStroke.cx, -p->szlStroke.cy); + CombineRgn(frame, frame, rgn, RGN_AND); + OffsetRgn(rgn, 0, 2*p->szlStroke.cy); + CombineRgn(frame, frame, rgn, RGN_AND); + OffsetRgn(rgn, 0, -p->szlStroke.cy); + CombineRgn(frame, rgn, frame, RGN_DIFF); + + ret = fill_rgn(data, htable, p->ihBrush, frame); + DeleteObject(rgn); + DeleteObject(frame); + return ret; + } case EMR_PAINTRGN: { const EMRPAINTRGN *p = (const EMRPAINTRGN *)rec;
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/printproc.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index a5922c848e0..0fb35b2b8c0 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -986,6 +986,19 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, DeleteObject(frame); return ret; } + case EMR_INVERTRGN: + { + const EMRINVERTRGN *p = (const EMRINVERTRGN *)rec; + int old_rop, ret; + HRGN rgn; + + rgn = ExtCreateRegion(NULL, p->cbRgnData, (const RGNDATA *)p->RgnData); + old_rop = SetROP2(data->pdev->dev.hdc, R2_NOT); + ret = fill_rgn(data, htable, 0x80000000 | BLACK_BRUSH, rgn); + SetROP2(data->pdev->dev.hdc, old_rop); + DeleteObject(rgn); + return ret; + } case EMR_PAINTRGN: { const EMRPAINTRGN *p = (const EMRPAINTRGN *)rec;
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 0fb35b2b8c0..56e5273e3e4 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1231,6 +1231,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_SETVIEWPORTEXTEX: case EMR_SETVIEWPORTORGEX: case EMR_SETBRUSHORGEX: + case EMR_SETROP2: case EMR_MOVETOEX: case EMR_SETWORLDTRANSFORM: case EMR_MODIFYWORLDTRANSFORM:
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 56e5273e3e4..6aa573c18fa 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1232,6 +1232,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_SETVIEWPORTORGEX: case EMR_SETBRUSHORGEX: case EMR_SETROP2: + case EMR_SETSTRETCHBLTMODE: case EMR_MOVETOEX: case EMR_SETWORLDTRANSFORM: case EMR_MODIFYWORLDTRANSFORM:
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 6aa573c18fa..60d07f2668a 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1233,6 +1233,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_SETBRUSHORGEX: case EMR_SETROP2: case EMR_SETSTRETCHBLTMODE: + case EMR_SETTEXTALIGN: case EMR_MOVETOEX: case EMR_SETWORLDTRANSFORM: case EMR_MODIFYWORLDTRANSFORM:
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 60d07f2668a..6aef1dd1dd4 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1234,6 +1234,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_SETROP2: case EMR_SETSTRETCHBLTMODE: case EMR_SETTEXTALIGN: + case EMR_OFFSETCLIPRGN: case EMR_MOVETOEX: case EMR_SETWORLDTRANSFORM: case EMR_MODIFYWORLDTRANSFORM:
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 6aef1dd1dd4..de5f3cfce40 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1236,6 +1236,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_SETTEXTALIGN: case EMR_OFFSETCLIPRGN: case EMR_MOVETOEX: + case EMR_EXCLUDECLIPRECT: case EMR_SETWORLDTRANSFORM: case EMR_MODIFYWORLDTRANSFORM: case EMR_CREATEPEN:
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 de5f3cfce40..bfc25cb00b3 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1237,6 +1237,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_OFFSETCLIPRGN: case EMR_MOVETOEX: case EMR_EXCLUDECLIPRECT: + case EMR_INTERSECTCLIPRECT: case EMR_SETWORLDTRANSFORM: case EMR_MODIFYWORLDTRANSFORM: case EMR_CREATEPEN:
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 bfc25cb00b3..be9c7f6027a 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1238,6 +1238,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_MOVETOEX: case EMR_EXCLUDECLIPRECT: case EMR_INTERSECTCLIPRECT: + case EMR_SCALEVIEWPORTEXTEX: case EMR_SETWORLDTRANSFORM: case EMR_MODIFYWORLDTRANSFORM: case EMR_CREATEPEN:
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 be9c7f6027a..f4eb2fd9eb0 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1239,6 +1239,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_EXCLUDECLIPRECT: case EMR_INTERSECTCLIPRECT: case EMR_SCALEVIEWPORTEXTEX: + case EMR_SCALEWINDOWEXTEX: case EMR_SETWORLDTRANSFORM: case EMR_MODIFYWORLDTRANSFORM: case EMR_CREATEPEN:
This merge request was approved by Huw Davies.