-- v2: wineps: Handle EMR_SETTEXTJUSTIFICATION record in spool files. wineps: Handle EMR_SETLAYOUT record in spool files. wineps: Handle EMR_SETPOLYFILLMODE record in spool files. wineps: Handle EMR_SETBKMODE record in spool files. wineps: Handle EMR_SETMAPMODE record in spool files. wineps: Handle EMR_SETMAPPERFLAGS record in spool files. wineps: Silence FIXME message on EMR_EXTFLOODFILL record. wineps: Silence FIXME message on EMR_ALPHABLEND record. wineps: Handle EMR_EXTESCAPE record in spool files. wineps: Handle EMR_RESTOREDC record in spool files. wineps: Handle EMR_SAVEDC in spool files. wineps: Handle EMR_SETBKCOLOR record in spool files. wineps: Handle EMR_SETTEXTCOLOR record in spool files. wineps: Don't store currently selected brush in print processor data.
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/printproc.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-)
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index f46f7752a3c..9993d5e236b 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -41,7 +41,6 @@ struct pp_data WCHAR *doc_name; WCHAR *out_file; PSDRV_PDEVICE *pdev; - DWORD brush; struct brush_pattern *patterns; BOOL path; }; @@ -939,7 +938,24 @@ static HGDIOBJ get_object_handle(struct pp_data *data, HANDLETABLE *handletable, return handletable->objectHandle[i]; }
-static BOOL fill_rgn(struct pp_data *data, HANDLETABLE *htable, DWORD brush, HRGN rgn) +static BOOL select_hbrush(struct pp_data *data, HANDLETABLE *htable, int handle_count, HBRUSH brush) +{ + struct brush_pattern *pattern = NULL; + int i; + + for (i = 0; i < handle_count; i++) + { + if (htable->objectHandle[i] == brush) + { + pattern = data->patterns + i; + break; + } + } + + return PSDRV_SelectBrush(&data->pdev->dev, brush, pattern) != NULL; +} + +static BOOL fill_rgn(struct pp_data *data, HANDLETABLE *htable, int handle_count, DWORD brush, HRGN rgn) { struct brush_pattern *pattern; HBRUSH hbrush; @@ -948,7 +964,7 @@ static BOOL fill_rgn(struct pp_data *data, HANDLETABLE *htable, DWORD brush, HRG 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); + select_hbrush(data, htable, handle_count, GetCurrentObject(data->pdev->dev.hdc, OBJ_BRUSH)); PSDRV_SelectBrush(&data->pdev->dev, hbrush, pattern); return ret; } @@ -1090,13 +1106,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, switch (GetObjectType(obj)) { case OBJ_PEN: return PSDRV_SelectPen(&data->pdev->dev, obj, NULL) != NULL; - case OBJ_BRUSH: - if (PSDRV_SelectBrush(&data->pdev->dev, obj, pattern)) - { - data->brush = so->ihObject; - return 1; - } - return 0; + case OBJ_BRUSH: return PSDRV_SelectBrush(&data->pdev->dev, obj, pattern) != NULL; default: FIXME("unhandled object type %ld\n", GetObjectType(obj)); return 1; @@ -1253,7 +1263,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, int ret;
rgn = ExtCreateRegion(NULL, p->cbRgnData, (const RGNDATA *)p->RgnData); - ret = fill_rgn(data, htable, p->ihBrush, rgn); + ret = fill_rgn(data, htable, n, p->ihBrush, rgn); DeleteObject(rgn); return ret; } @@ -1277,7 +1287,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, OffsetRgn(rgn, 0, -p->szlStroke.cy); CombineRgn(frame, rgn, frame, RGN_DIFF);
- ret = fill_rgn(data, htable, p->ihBrush, frame); + ret = fill_rgn(data, htable, n, p->ihBrush, frame); DeleteObject(rgn); DeleteObject(frame); return ret; @@ -1290,7 +1300,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable,
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); + ret = fill_rgn(data, htable, n, 0x80000000 | BLACK_BRUSH, rgn); SetROP2(data->pdev->dev.hdc, old_rop); DeleteObject(rgn); return ret;
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/printproc.c | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index 9993d5e236b..c6b2651ee0b 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1094,6 +1094,14 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, return PSDRV_SetPixel(&data->pdev->dev, p->ptlPixel.x, p->ptlPixel.y, p->crColor); } + case EMR_SETTEXTCOLOR: + { + const EMRSETTEXTCOLOR *p = (const EMRSETTEXTCOLOR *)rec; + + SetTextColor(data->pdev->dev.hdc, p->crColor); + PSDRV_SetTextColor(&data->pdev->dev, p->crColor); + return 1; + } case EMR_SELECTOBJECT: { const EMRSELECTOBJECT *so = (const EMRSELECTOBJECT *)rec;
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/printproc.c | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index c6b2651ee0b..5e6b5489b0d 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1102,6 +1102,14 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, PSDRV_SetTextColor(&data->pdev->dev, p->crColor); return 1; } + case EMR_SETBKCOLOR: + { + const EMRSETBKCOLOR *p = (const EMRSETBKCOLOR *)rec; + + SetBkColor(data->pdev->dev.hdc, p->crColor); + PSDRV_SetBkColor(&data->pdev->dev, p->crColor); + return 1; + } case EMR_SELECTOBJECT: { const EMRSELECTOBJECT *so = (const EMRSELECTOBJECT *)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 5e6b5489b0d..29cb718f199 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1569,6 +1569,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_INTERSECTCLIPRECT: case EMR_SCALEVIEWPORTEXTEX: case EMR_SCALEWINDOWEXTEX: + case EMR_SAVEDC: case EMR_SETWORLDTRANSFORM: case EMR_MODIFYWORLDTRANSFORM: case EMR_CREATEPEN:
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/printproc.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index 29cb718f199..849afc625b8 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1110,6 +1110,18 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, PSDRV_SetBkColor(&data->pdev->dev, p->crColor); return 1; } + case EMR_RESTOREDC: + { + HDC hdc = data->pdev->dev.hdc; + int ret = PlayEnhMetaFileRecord(hdc, htable, rec, n); + + select_hbrush(data, htable, n, GetCurrentObject(hdc, OBJ_BRUSH)); + /* TODO: reselect font */ + PSDRV_SelectPen(&data->pdev->dev, GetCurrentObject(hdc, OBJ_PEN), NULL); + PSDRV_SetBkColor(&data->pdev->dev, GetBkColor(hdc)); + PSDRV_SetTextColor(&data->pdev->dev, GetTextColor(hdc)); + return ret; + } case EMR_SELECTOBJECT: { const EMRSELECTOBJECT *so = (const EMRSELECTOBJECT *)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 849afc625b8..a9961b0a7b8 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1559,6 +1559,19 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, data->patterns[p->ihBrush].bits.ptr = (BYTE *)p + p->offBits; return 1; } + case EMR_EXTESCAPE: + { + const struct EMREXTESCAPE + { + EMR emr; + DWORD escape; + DWORD size; + BYTE data[1]; + } *p = (const struct EMREXTESCAPE *)rec; + + PSDRV_ExtEscape(&data->pdev->dev, p->escape, p->size, p->data, 0, NULL); + return 1; + } case EMR_GRADIENTFILL: { const EMRGRADIENTFILL *p = (const EMRGRADIENTFILL *)rec;
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/printproc.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index a9961b0a7b8..24f6157c835 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1580,6 +1580,9 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, p->Ver + p->nVer, p->nTri, p->ulMode); }
+ case EMR_ALPHABLEND: + break; + case EMR_SETWINDOWEXTEX: case EMR_SETWINDOWORGEX: case EMR_SETVIEWPORTEXTEX:
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 24f6157c835..94de63da075 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1580,6 +1580,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, p->Ver + p->nVer, p->nTri, p->ulMode); }
+ case EMR_EXTFLOODFILL: case EMR_ALPHABLEND: break;
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 94de63da075..97dbc933e6e 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1589,6 +1589,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_SETVIEWPORTEXTEX: case EMR_SETVIEWPORTORGEX: case EMR_SETBRUSHORGEX: + case EMR_SETMAPPERFLAGS: case EMR_SETROP2: case EMR_SETSTRETCHBLTMODE: case EMR_SETTEXTALIGN:
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 97dbc933e6e..d81fa9c9ee1 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1590,6 +1590,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_SETVIEWPORTORGEX: case EMR_SETBRUSHORGEX: case EMR_SETMAPPERFLAGS: + case EMR_SETMAPMODE: case EMR_SETROP2: case EMR_SETSTRETCHBLTMODE: case EMR_SETTEXTALIGN:
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 d81fa9c9ee1..94cb1e11ea2 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1591,6 +1591,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_SETBRUSHORGEX: case EMR_SETMAPPERFLAGS: case EMR_SETMAPMODE: + case EMR_SETBKMODE: case EMR_SETROP2: case EMR_SETSTRETCHBLTMODE: case EMR_SETTEXTALIGN:
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 94cb1e11ea2..fd0e5f21772 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1592,6 +1592,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_SETMAPPERFLAGS: case EMR_SETMAPMODE: case EMR_SETBKMODE: + case EMR_SETPOLYFILLMODE: case EMR_SETROP2: case EMR_SETSTRETCHBLTMODE: case EMR_SETTEXTALIGN:
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 fd0e5f21772..329d60f1a15 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1613,6 +1613,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_WIDENPATH: case EMR_SELECTCLIPPATH: case EMR_EXTSELECTCLIPRGN: + case EMR_SETLAYOUT: return PlayEnhMetaFileRecord(data->pdev->dev.hdc, htable, rec, n); default: FIXME("unsupported record: %ld\n", rec->iType);
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 329d60f1a15..84d7539b963 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1614,6 +1614,7 @@ static int WINAPI hmf_proc(HDC hdc, HANDLETABLE *htable, case EMR_SELECTCLIPPATH: case EMR_EXTSELECTCLIPRGN: case EMR_SETLAYOUT: + case EMR_SETTEXTJUSTIFICATION: return PlayEnhMetaFileRecord(data->pdev->dev.hdc, htable, rec, n); default: FIXME("unsupported record: %ld\n", rec->iType);
v2 with `n` -> `handle_count` (we should probably do the same in `hmf_proc()`, but I didn't want to cause conflicts with forthcoming commits).
This merge request was approved by Huw Davies.