Also adds support for escapes writing to EMF spool file.
From: Piotr Caban piotr@codeweavers.com
--- dlls/gdi32/dc.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index b1ca342f8e3..531fbb1fe85 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -637,6 +637,12 @@ INT WINAPI Escape( HDC hdc, INT escape, INT in_count, const char *in_data, void } break; } + + case PASSTHROUGH: + case POSTSCRIPT_PASSTHROUGH: + in_count = *(const WORD *)in_data + sizeof(WORD); + out_data = NULL; + break; }
/* if not handled internally, pass it to the driver */
From: Piotr Caban piotr@codeweavers.com
--- dlls/gdi32/dc.c | 9 +++++++++ dlls/gdi32/emfdc.c | 32 ++++++++++++++++++++++++++++++++ dlls/gdi32/gdi_private.h | 2 ++ 3 files changed, 43 insertions(+)
diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index 531fbb1fe85..66832f9012e 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -655,8 +655,17 @@ INT WINAPI Escape( HDC hdc, INT escape, INT in_count, const char *in_data, void INT WINAPI ExtEscape( HDC hdc, INT escape, INT input_size, const char *input, INT output_size, char *output ) { + struct print *print; + DC_ATTR *dc_attr; + if (is_meta_dc( hdc )) return METADC_ExtEscape( hdc, escape, input_size, input, output_size, output ); + if (!(dc_attr = get_dc_attr( hdc ))) return 0; + if ((print = get_dc_print( dc_attr )) && dc_attr->emf) + { + int ret = EMFDC_ExtEscape( dc_attr, escape, input_size, input, output_size, output ); + if (ret) return ret; + } return NtGdiExtEscape( hdc, NULL, 0, escape, input_size, input, output_size, output ); }
diff --git a/dlls/gdi32/emfdc.c b/dlls/gdi32/emfdc.c index ef316fe42a1..5c3d01e43b1 100644 --- a/dlls/gdi32/emfdc.c +++ b/dlls/gdi32/emfdc.c @@ -1167,6 +1167,38 @@ BOOL EMFDC_PolyDraw( DC_ATTR *dc_attr, const POINT *pts, const BYTE *types, DWOR return ret; }
+INT EMFDC_ExtEscape( DC_ATTR *dc_attr, INT escape, INT input_size, const char *input, + INT output_size, char *output) +{ + struct EMREXTESCAPE + { + EMR emr; + DWORD escape; + DWORD size; + BYTE data[1]; + } *emr; + size_t size; + + if (escape == QUERYESCSUPPORT) return 0; + + size = FIELD_OFFSET( struct EMREXTESCAPE, data[input_size] ); + size = (size + 3) & ~3; + if (!(emr = HeapAlloc( GetProcessHeap(), 0, size ))) return 0; + + emr->emr.iType = EMR_EXTESCAPE; + emr->emr.nSize = size; + emr->escape = escape; + emr->size = input_size; + memcpy(emr->data, input, input_size); + emfdc_record( get_dc_emf( dc_attr ), &emr->emr ); + HeapFree( GetProcessHeap(), 0, emr ); + if (output_size && output) return 0; + + if (escape == PASSTHROUGH || escape == POSTSCRIPT_PASSTHROUGH) + input_size -= sizeof(WORD); + return input_size ? input_size : 1; +} + BOOL EMFDC_ExtFloodFill( DC_ATTR *dc_attr, INT x, INT y, COLORREF color, UINT fill_type ) { EMREXTFLOODFILL emr; diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index b8f914fe1f4..b78733103f8 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -187,6 +187,8 @@ extern BOOL EMFDC_Ellipse( DC_ATTR *dc_attr, INT left, INT top, INT right, extern BOOL EMFDC_EndPath( DC_ATTR *dc_attr ) DECLSPEC_HIDDEN; extern BOOL EMFDC_ExcludeClipRect( DC_ATTR *dc_attr, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN; +extern INT EMFDC_ExtEscape( DC_ATTR *dc_attr, INT escape, INT input_size, const char *input, + INT output_size, char *output) DECLSPEC_HIDDEN; extern BOOL EMFDC_ExtFloodFill( DC_ATTR *dc_attr, INT x, INT y, COLORREF color, UINT fill_type ) DECLSPEC_HIDDEN; extern BOOL EMFDC_ExtSelectClipRgn( DC_ATTR *dc_attr, HRGN hrgn, INT mode ) DECLSPEC_HIDDEN;
From: Piotr Caban piotr@codeweavers.com
--- dlls/gdi32/dc.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index 66832f9012e..0b5e0824d00 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -2458,6 +2458,7 @@ INT WINAPI EndPage( HDC hdc ) { BOOL write = print->flags & WRITE_DEVMODE;
+ if (!(print->flags & CALL_END_PAGE)) return SP_ERROR; print->flags = (print->flags & ~(CALL_END_PAGE | WRITE_DEVMODE)) | CALL_START_PAGE; if (dc_attr->emf) return spool_end_page( dc_attr, print->printer, print->devmode, write );
From: Piotr Caban piotr@codeweavers.com
--- dlls/win32u/font.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/dlls/win32u/font.c b/dlls/win32u/font.c index 1590ab00483..cdac88836b9 100644 --- a/dlls/win32u/font.c +++ b/dlls/win32u/font.c @@ -4622,6 +4622,9 @@ static HFONT CDECL font_SelectFont( PHYSDEV dev, HFONT hfont, UINT *aa_flags ) break; }
+ if (lf.lfOutPrecision == OUT_TT_ONLY_PRECIS) + can_use_bitmap = FALSE; + lf.lfWidth = abs(lf.lfWidth);
TRACE( "%s, h=%d, it=%d, weight=%d, PandF=%02x, charset=%d orient %d escapement %d\n",
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/printproc.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index 9786f5f83df..39a46f8d6c3 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -185,8 +185,21 @@ static BOOL CDECL font_GetTextMetrics(PHYSDEV dev, TEXTMETRICW *metrics)
static HFONT CDECL font_SelectFont(PHYSDEV dev, HFONT hfont, UINT *aa_flags) { + HFONT tt_font, old_font; + LOGFONTW lf; + *aa_flags = GGO_BITMAP; - return SelectObject(dev->hdc, hfont) ? hfont : 0; + if (!GetObjectW(hfont, sizeof(lf), &lf)) + return 0; + + lf.lfOutPrecision = OUT_TT_ONLY_PRECIS; + tt_font = CreateFontIndirectW(&lf); + if (!tt_font) + return 0; + + old_font = SelectObject(dev->hdc, tt_font); + DeleteObject(tt_font); + return old_font ? hfont : 0; }
static const struct gdi_dc_funcs font_funcs =
From: Piotr Caban piotr@codeweavers.com
This reverts commit 4216179eaa75a12a48d96567b599be0af79e75d2. --- dlls/wineps.drv/init.c | 2 +- dlls/wineps.drv/printproc.c | 2 -- dlls/wineps.drv/psdrv.h | 1 - 3 files changed, 1 insertion(+), 4 deletions(-)
diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index 39c7e2a4a7f..ded8224e1d7 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -92,7 +92,7 @@ static const PSDRV_DEVMODE DefaultDevmode = HINSTANCE PSDRV_hInstance = 0; HANDLE PSDRV_Heap = 0;
-HFONT PSDRV_DefaultFont = 0; +static HFONT PSDRV_DefaultFont = 0; static const LOGFONTA DefaultLogFont = { 100, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, "" diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index 39a46f8d6c3..e5376b43a4e 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -1147,8 +1147,6 @@ static HGDIOBJ get_object_handle(struct pp_data *data, HANDLETABLE *handletable, if (i & 0x80000000) { *pattern = NULL; - if ((i & 0x7fffffff) == DEVICE_DEFAULT_FONT) - return PSDRV_DefaultFont; return GetStockObject(i & 0x7fffffff); } *pattern = data->patterns + i; diff --git a/dlls/wineps.drv/psdrv.h b/dlls/wineps.drv/psdrv.h index bfa2807ce6f..07a625d43d2 100644 --- a/dlls/wineps.drv/psdrv.h +++ b/dlls/wineps.drv/psdrv.h @@ -417,7 +417,6 @@ extern const UNICODEGLYPH PSDRV_AGLbyUV[] DECLSPEC_HIDDEN; /* duplicates inc extern HINSTANCE PSDRV_hInstance DECLSPEC_HIDDEN; extern HANDLE PSDRV_Heap DECLSPEC_HIDDEN; extern char *PSDRV_ANSIVector[256] DECLSPEC_HIDDEN; -extern HFONT PSDRV_DefaultFont DECLSPEC_HIDDEN;
extern INPUTSLOT *find_slot( PPD *ppd, const PSDRV_DEVMODE *dm ) DECLSPEC_HIDDEN; extern PAGESIZE *find_pagesize( PPD *ppd, const PSDRV_DEVMODE *dm ) DECLSPEC_HIDDEN;
From: Piotr Caban piotr@codeweavers.com
--- dlls/winspool.drv/info.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c index 7e1e6138ff2..2f2529ea01b 100644 --- a/dlls/winspool.drv/info.c +++ b/dlls/winspool.drv/info.c @@ -720,7 +720,7 @@ static BOOL init_unix_printers( void ) HANDLE added_printer; PRINTER_INFO_2W pi2; NTSTATUS status; - WCHAR raw[] = L"RAW", winprint[] = L"WinPrint", empty[] = L""; + WCHAR raw[] = L"RAW", wineps[] = L"wineps", empty[] = L""; int i;
if (create_printers_reg_key( system_printers_key, &printers_key )) @@ -753,6 +753,8 @@ static BOOL init_unix_printers( void ) RegDeleteValueW( printer_key, May_Delete_Value ); /* flag that the PPD file should be checked for an update */ set_reg_DWORD( printer_key, L"Status", status | PRINTER_STATUS_DRIVER_UPDATE_NEEDED ); + RegSetValueExW( printer_key, L"Print Processor", 0, REG_SZ, (const BYTE*)wineps, + (wcslen( wineps ) + 1) * sizeof(WCHAR)); RegCloseKey( printer_key ); } else @@ -767,7 +769,7 @@ static BOOL init_unix_printers( void ) memset( &pi2, 0, sizeof(PRINTER_INFO_2W) ); pi2.pPrinterName = printer->name; pi2.pDatatype = raw; - pi2.pPrintProcessor = winprint; + pi2.pPrintProcessor = wineps; pi2.pDriverName = printer->name; pi2.pComment = printer->comment; pi2.pLocation = printer->location;
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/init.c | 58 +++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 29 deletions(-)
diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index ded8224e1d7..80b6a8e8036 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -765,25 +765,25 @@ static const struct gdi_dc_funcs psdrv_funcs = NULL, /* pAbortPath */ NULL, /* pAlphaBlend */ NULL, /* pAngleArc */ - PSDRV_Arc, /* pArc */ + NULL, /* pArc */ NULL, /* pArcTo */ NULL, /* pBeginPath */ NULL, /* pBlendImage */ - PSDRV_Chord, /* pChord */ + NULL, /* pChord */ NULL, /* pCloseFigure */ PSDRV_CreateCompatibleDC, /* pCreateCompatibleDC */ PSDRV_CreateDC, /* pCreateDC */ PSDRV_DeleteDC, /* pDeleteDC */ NULL, /* pDeleteObject */ - PSDRV_Ellipse, /* pEllipse */ - PSDRV_EndDoc, /* pEndDoc */ - PSDRV_EndPage, /* pEndPage */ + NULL, /* pEllipse */ + NULL, /* pEndDoc */ + NULL, /* pEndPage */ NULL, /* pEndPath */ PSDRV_EnumFonts, /* pEnumFonts */ PSDRV_ExtEscape, /* pExtEscape */ NULL, /* pExtFloodFill */ - PSDRV_ExtTextOut, /* pExtTextOut */ - PSDRV_FillPath, /* pFillPath */ + NULL, /* pExtTextOut */ + NULL, /* pFillPath */ NULL, /* pFillRgn */ NULL, /* pFontIsLinked */ NULL, /* pFrameRgn */ @@ -813,42 +813,42 @@ static const struct gdi_dc_funcs psdrv_funcs = PSDRV_GetTextMetrics, /* pGetTextMetrics */ NULL, /* pGradientFill */ NULL, /* pInvertRgn */ - PSDRV_LineTo, /* pLineTo */ + NULL, /* pLineTo */ NULL, /* pMoveTo */ - PSDRV_PaintRgn, /* pPaintRgn */ - PSDRV_PatBlt, /* pPatBlt */ - PSDRV_Pie, /* pPie */ - PSDRV_PolyBezier, /* pPolyBezier */ - PSDRV_PolyBezierTo, /* pPolyBezierTo */ + NULL, /* pPaintRgn */ + NULL, /* pPatBlt */ + NULL, /* pPie */ + NULL, /* pPolyBezier */ + NULL, /* pPolyBezierTo */ NULL, /* pPolyDraw */ - PSDRV_PolyPolygon, /* pPolyPolygon */ - PSDRV_PolyPolyline, /* pPolyPolyline */ + NULL, /* pPolyPolygon */ + NULL, /* pPolyPolyline */ NULL, /* pPolylineTo */ - PSDRV_PutImage, /* pPutImage */ + NULL, /* pPutImage */ NULL, /* pRealizeDefaultPalette */ NULL, /* pRealizePalette */ - PSDRV_Rectangle, /* pRectangle */ + NULL, /* pRectangle */ PSDRV_ResetDC, /* pResetDC */ - PSDRV_RoundRect, /* pRoundRect */ + NULL, /* pRoundRect */ NULL, /* pSelectBitmap */ - PSDRV_SelectBrush, /* pSelectBrush */ + NULL, /* pSelectBrush */ PSDRV_SelectFont, /* pSelectFont */ - PSDRV_SelectPen, /* pSelectPen */ - PSDRV_SetBkColor, /* pSetBkColor */ + NULL, /* pSelectPen */ + NULL, /* pSetBkColor */ NULL, /* pSetBoundsRect */ - PSDRV_SetDCBrushColor, /* pSetDCBrushColor */ - PSDRV_SetDCPenColor, /* pSetDCPenColor */ + NULL, /* pSetDCBrushColor */ + NULL, /* pSetDCPenColor */ NULL, /* pSetDIBitsToDevice */ NULL, /* pSetDeviceClipping */ NULL, /* pSetDeviceGammaRamp */ - PSDRV_SetPixel, /* pSetPixel */ - PSDRV_SetTextColor, /* pSetTextColor */ - PSDRV_StartDoc, /* pStartDoc */ - PSDRV_StartPage, /* pStartPage */ + NULL, /* pSetPixel */ + NULL, /* pSetTextColor */ + NULL, /* pStartDoc */ + NULL, /* pStartPage */ NULL, /* pStretchBlt */ NULL, /* pStretchDIBits */ - PSDRV_StrokeAndFillPath, /* pStrokeAndFillPath */ - PSDRV_StrokePath, /* pStrokePath */ + NULL, /* pStrokeAndFillPath */ + NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTCloseAdapter */
This merge request was approved by Huw Davies.