From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/Makefile.in | 2 + dlls/wineps.drv/init.c | 98 +++------------------- dlls/wineps.drv/psdrv.h | 2 + dlls/wineps.drv/unixlib.c | 157 ++++++++++++++++++++++++++++++++++++ dlls/wineps.drv/unixlib.h | 31 +++++++ 5 files changed, 205 insertions(+), 85 deletions(-) create mode 100644 dlls/wineps.drv/unixlib.c create mode 100644 dlls/wineps.drv/unixlib.h
diff --git a/dlls/wineps.drv/Makefile.in b/dlls/wineps.drv/Makefile.in index 9fe0497c2b2..4dd315757da 100644 --- a/dlls/wineps.drv/Makefile.in +++ b/dlls/wineps.drv/Makefile.in @@ -1,4 +1,5 @@ MODULE = wineps.drv +UNIXLIB = wineps.so IMPORTS = user32 gdi32 winspool advapi32 win32u
C_SRCS = \ @@ -62,6 +63,7 @@ C_SRCS = \ type1.c \ type1afm.c \ type42.c \ + unixlib.c \ vertical.c
RC_SRCS = wineps.rc diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index afcf4321b11..a1cd09b5ba2 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -28,6 +28,7 @@ #include "winreg.h" #include "winnls.h" #include "winuser.h" +#include "unixlib.h" #include "psdrv.h" #include "winspool.h" #include "wine/debug.h" @@ -98,7 +99,7 @@ static const LOGFONTA DefaultLogFont = { DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, "" };
-static const struct gdi_dc_funcs psdrv_funcs; +static struct gdi_dc_funcs psdrv_funcs;
/********************************************************************* * DllMain @@ -113,9 +114,18 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) switch(reason) {
case DLL_PROCESS_ATTACH: + { + struct init_dc_params params = { &psdrv_funcs }; + PSDRV_hInstance = hinst; DisableThreadLibraryCalls(hinst);
+ if (__wine_init_unix_call()) + return FALSE; + if (!WINE_UNIX_CALL( unix_init_dc, ¶ms )) + return FALSE; + + PSDRV_Heap = HeapCreate(0, 0x10000, 0); if (PSDRV_Heap == NULL) return FALSE; @@ -131,6 +141,7 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) return FALSE; } break; + }
case DLL_PROCESS_DETACH: if (reserved) break; @@ -448,88 +459,6 @@ BOOL CDECL PSDRV_ResetDC( PHYSDEV dev, const DEVMODEW *lpInitData ) return TRUE; }
-/*********************************************************************** - * GetDeviceCaps (WINEPS.@) - */ -static INT CDECL PSDRV_GetDeviceCaps( PHYSDEV dev, INT cap ) -{ - PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); - - TRACE("%p,%d\n", dev->hdc, cap); - - switch(cap) - { - case DRIVERVERSION: - return 0; - case TECHNOLOGY: - return DT_RASPRINTER; - case HORZSIZE: - return MulDiv(physDev->horzSize, 100, physDev->Devmode->dmPublic.dmScale); - case VERTSIZE: - return MulDiv(physDev->vertSize, 100, physDev->Devmode->dmPublic.dmScale); - case HORZRES: - return physDev->horzRes; - case VERTRES: - return physDev->vertRes; - case BITSPIXEL: - /* Although Windows returns 1 for monochrome printers, we want - CreateCompatibleBitmap to provide something other than 1 bpp */ - return 32; - case NUMPENS: - return 10; - case NUMFONTS: - return 39; - case NUMCOLORS: - return -1; - case PDEVICESIZE: - return sizeof(PSDRV_PDEVICE); - case TEXTCAPS: - return TC_CR_ANY | TC_VA_ABLE; /* psdrv 0x59f7 */ - case RASTERCAPS: - return (RC_BITBLT | RC_BITMAP64 | RC_GDI20_OUTPUT | RC_DIBTODEV | - RC_STRETCHBLT | RC_STRETCHDIB); /* psdrv 0x6e99 */ - case ASPECTX: - return physDev->logPixelsX; - case ASPECTY: - return physDev->logPixelsY; - case LOGPIXELSX: - return MulDiv(physDev->logPixelsX, physDev->Devmode->dmPublic.dmScale, 100); - case LOGPIXELSY: - return MulDiv(physDev->logPixelsY, physDev->Devmode->dmPublic.dmScale, 100); - case NUMRESERVED: - return 0; - case COLORRES: - return 0; - case PHYSICALWIDTH: - return (physDev->Devmode->dmPublic.dmOrientation == DMORIENT_LANDSCAPE) ? - physDev->PageSize.cy : physDev->PageSize.cx; - case PHYSICALHEIGHT: - return (physDev->Devmode->dmPublic.dmOrientation == DMORIENT_LANDSCAPE) ? - physDev->PageSize.cx : physDev->PageSize.cy; - case PHYSICALOFFSETX: - if(physDev->Devmode->dmPublic.dmOrientation == DMORIENT_LANDSCAPE) { - if(physDev->pi->ppd->LandscapeOrientation == -90) - return physDev->PageSize.cy - physDev->ImageableArea.top; - else - return physDev->ImageableArea.bottom; - } - return physDev->ImageableArea.left; - - case PHYSICALOFFSETY: - if(physDev->Devmode->dmPublic.dmOrientation == DMORIENT_LANDSCAPE) { - if(physDev->pi->ppd->LandscapeOrientation == -90) - return physDev->PageSize.cx - physDev->ImageableArea.right; - else - return physDev->ImageableArea.left; - } - return physDev->PageSize.cy - physDev->ImageableArea.top; - - default: - dev = GET_NEXT_PHYSDEV( dev, pGetDeviceCaps ); - return dev->funcs->pGetDeviceCaps( dev, cap ); - } -} - static PRINTER_ENUM_VALUESA *load_font_sub_table( HANDLE printer, DWORD *num_entries ) { DWORD res, needed, num; @@ -759,7 +688,7 @@ fail: }
-static const struct gdi_dc_funcs psdrv_funcs = +static struct gdi_dc_funcs psdrv_funcs = { .pCreateCompatibleDC = PSDRV_CreateCompatibleDC, .pCreateDC = PSDRV_CreateDC, @@ -767,7 +696,6 @@ static const struct gdi_dc_funcs psdrv_funcs = .pEnumFonts = PSDRV_EnumFonts, .pExtEscape = PSDRV_ExtEscape, .pGetCharWidth = PSDRV_GetCharWidth, - .pGetDeviceCaps = PSDRV_GetDeviceCaps, .pGetTextExtentExPoint = PSDRV_GetTextExtentExPoint, .pGetTextMetrics = PSDRV_GetTextMetrics, .pResetDC = PSDRV_ResetDC, diff --git a/dlls/wineps.drv/psdrv.h b/dlls/wineps.drv/psdrv.h index 9a82576ba0e..63bd04d8cf1 100644 --- a/dlls/wineps.drv/psdrv.h +++ b/dlls/wineps.drv/psdrv.h @@ -585,6 +585,7 @@ extern void passthrough_leave(PHYSDEV dev) DECLSPEC_HIDDEN; setlocale(LC_NUMERIC,tmplocale); \ } while (0)
+#ifndef WINE_UNIX_LIB static inline WCHAR *strdupW( const WCHAR *str ) { int size; @@ -596,5 +597,6 @@ static inline WCHAR *strdupW( const WCHAR *str ) if (ret) memcpy( ret, str, size ); return ret; } +#endif
#endif diff --git a/dlls/wineps.drv/unixlib.c b/dlls/wineps.drv/unixlib.c new file mode 100644 index 00000000000..2b85ec5d558 --- /dev/null +++ b/dlls/wineps.drv/unixlib.c @@ -0,0 +1,157 @@ +/* + * Unix interface for wineps.drv + * + * Copyright 1998 Huw D M Davies + * Copyright 2001 Marcus Meissner + * Copyright 2023 Piotr Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#if 0 +#pragma makedep unix +#endif + +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" + +#include "psdrv.h" +#include "unixlib.h" +#include "wine/gdi_driver.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(psdrv); + +/* copied from kernelbase */ +static int muldiv(int a, int b, int c) +{ + LONGLONG ret; + + if (!c) return -1; + + /* We want to deal with a positive divisor to simplify the logic. */ + if (c < 0) + { + a = -a; + c = -c; + } + + /* If the result is positive, we "add" to round. else, we subtract to round. */ + if ((a < 0 && b < 0) || (a >= 0 && b >= 0)) + ret = (((LONGLONG)a * b) + (c / 2)) / c; + else + ret = (((LONGLONG)a * b) - (c / 2)) / c; + + if (ret > 2147483647 || ret < -2147483647) return -1; + return ret; +} + +static INT CDECL get_device_caps(PHYSDEV dev, INT cap) +{ + PSDRV_PDEVICE *pdev = get_psdrv_dev(dev); + + TRACE("%p,%d\n", dev->hdc, cap); + + switch(cap) + { + case DRIVERVERSION: + return 0; + case TECHNOLOGY: + return DT_RASPRINTER; + case HORZSIZE: + return muldiv(pdev->horzSize, 100, pdev->Devmode->dmPublic.dmScale); + case VERTSIZE: + return muldiv(pdev->vertSize, 100, pdev->Devmode->dmPublic.dmScale); + case HORZRES: + return pdev->horzRes; + case VERTRES: + return pdev->vertRes; + case BITSPIXEL: + /* Although Windows returns 1 for monochrome printers, we want + CreateCompatibleBitmap to provide something other than 1 bpp */ + return 32; + case NUMPENS: + return 10; + case NUMFONTS: + return 39; + case NUMCOLORS: + return -1; + case PDEVICESIZE: + return sizeof(PSDRV_PDEVICE); + case TEXTCAPS: + return TC_CR_ANY | TC_VA_ABLE; /* psdrv 0x59f7 */ + case RASTERCAPS: + return (RC_BITBLT | RC_BITMAP64 | RC_GDI20_OUTPUT | RC_DIBTODEV | + RC_STRETCHBLT | RC_STRETCHDIB); /* psdrv 0x6e99 */ + case ASPECTX: + return pdev->logPixelsX; + case ASPECTY: + return pdev->logPixelsY; + case LOGPIXELSX: + return muldiv(pdev->logPixelsX, pdev->Devmode->dmPublic.dmScale, 100); + case LOGPIXELSY: + return muldiv(pdev->logPixelsY, pdev->Devmode->dmPublic.dmScale, 100); + case NUMRESERVED: + return 0; + case COLORRES: + return 0; + case PHYSICALWIDTH: + return (pdev->Devmode->dmPublic.dmOrientation == DMORIENT_LANDSCAPE) ? + pdev->PageSize.cy : pdev->PageSize.cx; + case PHYSICALHEIGHT: + return (pdev->Devmode->dmPublic.dmOrientation == DMORIENT_LANDSCAPE) ? + pdev->PageSize.cx : pdev->PageSize.cy; + case PHYSICALOFFSETX: + if (pdev->Devmode->dmPublic.dmOrientation == DMORIENT_LANDSCAPE) + { + if (pdev->pi->ppd->LandscapeOrientation == -90) + return pdev->PageSize.cy - pdev->ImageableArea.top; + else + return pdev->ImageableArea.bottom; + } + return pdev->ImageableArea.left; + + case PHYSICALOFFSETY: + if (pdev->Devmode->dmPublic.dmOrientation == DMORIENT_LANDSCAPE) + { + if (pdev->pi->ppd->LandscapeOrientation == -90) + return pdev->PageSize.cx - pdev->ImageableArea.right; + else + return pdev->ImageableArea.left; + } + return pdev->PageSize.cy - pdev->ImageableArea.top; + + default: + dev = GET_NEXT_PHYSDEV(dev, pGetDeviceCaps); + return dev->funcs->pGetDeviceCaps(dev, cap); + } +} + +static NTSTATUS init_dc(void *arg) +{ + struct init_dc_params *params = arg; + + params->funcs->pGetDeviceCaps = get_device_caps; + return TRUE; +} + +const unixlib_entry_t __wine_unix_call_funcs[] = +{ + init_dc, +}; + +C_ASSERT(ARRAYSIZE(__wine_unix_call_funcs) == unix_funcs_count); diff --git a/dlls/wineps.drv/unixlib.h b/dlls/wineps.drv/unixlib.h new file mode 100644 index 00000000000..95efdd4c310 --- /dev/null +++ b/dlls/wineps.drv/unixlib.h @@ -0,0 +1,31 @@ +/* + * Copyright 2022 Piotr Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "ntuser.h" +#include "wine/unixlib.h" + +enum wineps_funcs +{ + unix_init_dc, + unix_funcs_count, +}; + +struct init_dc_params +{ + struct gdi_dc_funcs *funcs; +};
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/init.c | 1 - dlls/wineps.drv/unixlib.c | 364 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 364 insertions(+), 1 deletion(-)
diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index a1cd09b5ba2..1ccb5e3644b 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -698,7 +698,6 @@ static struct gdi_dc_funcs psdrv_funcs = .pGetCharWidth = PSDRV_GetCharWidth, .pGetTextExtentExPoint = PSDRV_GetTextExtentExPoint, .pGetTextMetrics = PSDRV_GetTextMetrics, - .pResetDC = PSDRV_ResetDC, .pSelectFont = PSDRV_SelectFont, .priority = GDI_PRIORITY_GRAPHICS_DRV }; diff --git a/dlls/wineps.drv/unixlib.c b/dlls/wineps.drv/unixlib.c index 2b85ec5d558..0261158ce44 100644 --- a/dlls/wineps.drv/unixlib.c +++ b/dlls/wineps.drv/unixlib.c @@ -60,6 +60,87 @@ static int muldiv(int a, int b, int c) return ret; }
+static void dump_fields(int fields) +{ + int add_space = 0; + +#define CHECK_FIELD(flag) \ +do \ +{ \ + if (fields & flag) \ + { \ + if (add_space++) TRACE(" "); \ + TRACE(#flag); \ + fields &= ~flag; \ + } \ +} \ +while (0) + + CHECK_FIELD(DM_ORIENTATION); + CHECK_FIELD(DM_PAPERSIZE); + CHECK_FIELD(DM_PAPERLENGTH); + CHECK_FIELD(DM_PAPERWIDTH); + CHECK_FIELD(DM_SCALE); + CHECK_FIELD(DM_POSITION); + CHECK_FIELD(DM_NUP); + CHECK_FIELD(DM_DISPLAYORIENTATION); + CHECK_FIELD(DM_COPIES); + CHECK_FIELD(DM_DEFAULTSOURCE); + CHECK_FIELD(DM_PRINTQUALITY); + CHECK_FIELD(DM_COLOR); + CHECK_FIELD(DM_DUPLEX); + CHECK_FIELD(DM_YRESOLUTION); + CHECK_FIELD(DM_TTOPTION); + CHECK_FIELD(DM_COLLATE); + CHECK_FIELD(DM_FORMNAME); + CHECK_FIELD(DM_LOGPIXELS); + CHECK_FIELD(DM_BITSPERPEL); + CHECK_FIELD(DM_PELSWIDTH); + CHECK_FIELD(DM_PELSHEIGHT); + CHECK_FIELD(DM_DISPLAYFLAGS); + CHECK_FIELD(DM_DISPLAYFREQUENCY); + CHECK_FIELD(DM_ICMMETHOD); + CHECK_FIELD(DM_ICMINTENT); + CHECK_FIELD(DM_MEDIATYPE); + CHECK_FIELD(DM_DITHERTYPE); + CHECK_FIELD(DM_PANNINGWIDTH); + CHECK_FIELD(DM_PANNINGHEIGHT); + if (fields) TRACE(" %#x", fields); + TRACE("\n"); +#undef CHECK_FIELD +} + +static void dump_devmode(const DEVMODEW *dm) +{ + if (!TRACE_ON(psdrv)) return; + + TRACE("dmDeviceName: %s\n", debugstr_w(dm->dmDeviceName)); + TRACE("dmSpecVersion: 0x%04x\n", dm->dmSpecVersion); + TRACE("dmDriverVersion: 0x%04x\n", dm->dmDriverVersion); + TRACE("dmSize: 0x%04x\n", dm->dmSize); + TRACE("dmDriverExtra: 0x%04x\n", dm->dmDriverExtra); + TRACE("dmFields: 0x%04x\n", (int)dm->dmFields); + dump_fields(dm->dmFields); + TRACE("dmOrientation: %d\n", dm->dmOrientation); + TRACE("dmPaperSize: %d\n", dm->dmPaperSize); + TRACE("dmPaperLength: %d\n", dm->dmPaperLength); + TRACE("dmPaperWidth: %d\n", dm->dmPaperWidth); + TRACE("dmScale: %d\n", dm->dmScale); + TRACE("dmCopies: %d\n", dm->dmCopies); + TRACE("dmDefaultSource: %d\n", dm->dmDefaultSource); + TRACE("dmPrintQuality: %d\n", dm->dmPrintQuality); + TRACE("dmColor: %d\n", dm->dmColor); + TRACE("dmDuplex: %d\n", dm->dmDuplex); + TRACE("dmYResolution: %d\n", dm->dmYResolution); + TRACE("dmTTOption: %d\n", dm->dmTTOption); + TRACE("dmCollate: %d\n", dm->dmCollate); + TRACE("dmFormName: %s\n", debugstr_w(dm->dmFormName)); + TRACE("dmLogPixels %u\n", dm->dmLogPixels); + TRACE("dmBitsPerPel %u\n", (unsigned int)dm->dmBitsPerPel); + TRACE("dmPelsWidth %u\n", (unsigned int)dm->dmPelsWidth); + TRACE("dmPelsHeight %u\n", (unsigned int)dm->dmPelsHeight); +} + static INT CDECL get_device_caps(PHYSDEV dev, INT cap) { PSDRV_PDEVICE *pdev = get_psdrv_dev(dev); @@ -141,11 +222,294 @@ static INT CDECL get_device_caps(PHYSDEV dev, INT cap) } }
+static inline int paper_size_from_points(float size) +{ + return size * 254 / 72; +} + +static INPUTSLOT *unix_find_slot(PPD *ppd, const PSDRV_DEVMODE *dm) +{ + INPUTSLOT *slot; + + LIST_FOR_EACH_ENTRY(slot, &ppd->InputSlots, INPUTSLOT, entry) + if (slot->WinBin == dm->dmPublic.dmDefaultSource) + return slot; + + return NULL; +} + +static PAGESIZE *unix_find_pagesize(PPD *ppd, const PSDRV_DEVMODE *dm) +{ + PAGESIZE *page; + + LIST_FOR_EACH_ENTRY(page, &ppd->PageSizes, PAGESIZE, entry) + if (page->WinPage == dm->dmPublic.dmPaperSize) + return page; + + return NULL; +} + +static void merge_devmodes(PSDRV_DEVMODE *dm1, const PSDRV_DEVMODE *dm2, PRINTERINFO *pi) +{ + /* some sanity checks here on dm2 */ + + if (dm2->dmPublic.dmFields & DM_ORIENTATION) + { + dm1->dmPublic.dmOrientation = dm2->dmPublic.dmOrientation; + TRACE("Changing orientation to %d (%s)\n", + dm1->dmPublic.dmOrientation, + dm1->dmPublic.dmOrientation == DMORIENT_PORTRAIT ? + "Portrait" : + (dm1->dmPublic.dmOrientation == DMORIENT_LANDSCAPE ? + "Landscape" : "unknown")); + } + + /* NB PaperWidth is always < PaperLength */ + if (dm2->dmPublic.dmFields & DM_PAPERSIZE) + { + PAGESIZE *page = unix_find_pagesize(pi->ppd, dm2); + + if (page) + { + dm1->dmPublic.dmPaperSize = dm2->dmPublic.dmPaperSize; + dm1->dmPublic.dmPaperWidth = paper_size_from_points(page->PaperDimension->x); + dm1->dmPublic.dmPaperLength = paper_size_from_points(page->PaperDimension->y); + dm1->dmPublic.dmFields |= DM_PAPERSIZE | DM_PAPERWIDTH | DM_PAPERLENGTH; + TRACE("Changing page to %s %d x %d\n", debugstr_w(page->FullName), + dm1->dmPublic.dmPaperWidth, + dm1->dmPublic.dmPaperLength); + + if (dm1->dmPublic.dmSize >= FIELD_OFFSET(DEVMODEW, dmFormName) + CCHFORMNAME * sizeof(WCHAR)) + { + lstrcpynW(dm1->dmPublic.dmFormName, page->FullName, CCHFORMNAME); + dm1->dmPublic.dmFields |= DM_FORMNAME; + } + } + else + TRACE("Trying to change to unsupported pagesize %d\n", dm2->dmPublic.dmPaperSize); + } + + else if ((dm2->dmPublic.dmFields & DM_PAPERLENGTH) && + (dm2->dmPublic.dmFields & DM_PAPERWIDTH)) + { + dm1->dmPublic.dmPaperLength = dm2->dmPublic.dmPaperLength; + dm1->dmPublic.dmPaperWidth = dm2->dmPublic.dmPaperWidth; + TRACE("Changing PaperLength|Width to %dx%d\n", + dm2->dmPublic.dmPaperLength, + dm2->dmPublic.dmPaperWidth); + dm1->dmPublic.dmFields &= ~DM_PAPERSIZE; + dm1->dmPublic.dmFields |= (DM_PAPERLENGTH | DM_PAPERWIDTH); + } + else if (dm2->dmPublic.dmFields & (DM_PAPERLENGTH | DM_PAPERWIDTH)) + { + /* You might think that this would be allowed if dm1 is in custom size + mode, but apparently Windows reverts to standard paper mode even in + this case */ + FIXME("Trying to change only paperlength or paperwidth\n"); + dm1->dmPublic.dmFields &= ~(DM_PAPERLENGTH | DM_PAPERWIDTH); + dm1->dmPublic.dmFields |= DM_PAPERSIZE; + } + + if (dm2->dmPublic.dmFields & DM_SCALE) + { + dm1->dmPublic.dmScale = dm2->dmPublic.dmScale; + TRACE("Changing Scale to %d\n", dm2->dmPublic.dmScale); + } + + if (dm2->dmPublic.dmFields & DM_COPIES) + { + dm1->dmPublic.dmCopies = dm2->dmPublic.dmCopies; + TRACE("Changing Copies to %d\n", dm2->dmPublic.dmCopies); + } + + if (dm2->dmPublic.dmFields & DM_DEFAULTSOURCE) + { + INPUTSLOT *slot = unix_find_slot(pi->ppd, dm2); + + if (slot) + { + dm1->dmPublic.dmDefaultSource = dm2->dmPublic.dmDefaultSource; + TRACE("Changing bin to '%s'\n", slot->FullName); + } + else + { + TRACE("Trying to change to unsupported bin %d\n", dm2->dmPublic.dmDefaultSource); + } + } + + if (dm2->dmPublic.dmFields & DM_DEFAULTSOURCE) + dm1->dmPublic.dmDefaultSource = dm2->dmPublic.dmDefaultSource; + if (dm2->dmPublic.dmFields & DM_PRINTQUALITY) + dm1->dmPublic.dmPrintQuality = dm2->dmPublic.dmPrintQuality; + if (dm2->dmPublic.dmFields & DM_COLOR) + dm1->dmPublic.dmColor = dm2->dmPublic.dmColor; + if (dm2->dmPublic.dmFields & DM_DUPLEX && pi->ppd->DefaultDuplex && pi->ppd->DefaultDuplex->WinDuplex != 0) + dm1->dmPublic.dmDuplex = dm2->dmPublic.dmDuplex; + if (dm2->dmPublic.dmFields & DM_YRESOLUTION) + dm1->dmPublic.dmYResolution = dm2->dmPublic.dmYResolution; + if (dm2->dmPublic.dmFields & DM_TTOPTION) + dm1->dmPublic.dmTTOption = dm2->dmPublic.dmTTOption; + if (dm2->dmPublic.dmFields & DM_COLLATE) + dm1->dmPublic.dmCollate = dm2->dmPublic.dmCollate; + if (dm2->dmPublic.dmFields & DM_FORMNAME) + lstrcpynW(dm1->dmPublic.dmFormName, dm2->dmPublic.dmFormName, CCHFORMNAME); + if (dm2->dmPublic.dmFields & DM_BITSPERPEL) + dm1->dmPublic.dmBitsPerPel = dm2->dmPublic.dmBitsPerPel; + if (dm2->dmPublic.dmFields & DM_PELSWIDTH) + dm1->dmPublic.dmPelsWidth = dm2->dmPublic.dmPelsWidth; + if (dm2->dmPublic.dmFields & DM_PELSHEIGHT) + dm1->dmPublic.dmPelsHeight = dm2->dmPublic.dmPelsHeight; + if (dm2->dmPublic.dmFields & DM_DISPLAYFLAGS) + dm1->dmPublic.dmDisplayFlags = dm2->dmPublic.dmDisplayFlags; + if (dm2->dmPublic.dmFields & DM_DISPLAYFREQUENCY) + dm1->dmPublic.dmDisplayFrequency = dm2->dmPublic.dmDisplayFrequency; + if (dm2->dmPublic.dmFields & DM_POSITION) + dm1->dmPublic.dmPosition = dm2->dmPublic.dmPosition; + if (dm2->dmPublic.dmFields & DM_LOGPIXELS) + dm1->dmPublic.dmLogPixels = dm2->dmPublic.dmLogPixels; + if (dm2->dmPublic.dmFields & DM_ICMMETHOD) + dm1->dmPublic.dmICMMethod = dm2->dmPublic.dmICMMethod; + if (dm2->dmPublic.dmFields & DM_ICMINTENT) + dm1->dmPublic.dmICMIntent = dm2->dmPublic.dmICMIntent; + if (dm2->dmPublic.dmFields & DM_MEDIATYPE) + dm1->dmPublic.dmMediaType = dm2->dmPublic.dmMediaType; + if (dm2->dmPublic.dmFields & DM_DITHERTYPE) + dm1->dmPublic.dmDitherType = dm2->dmPublic.dmDitherType; + if (dm2->dmPublic.dmFields & DM_PANNINGWIDTH) + dm1->dmPublic.dmPanningWidth = dm2->dmPublic.dmPanningWidth; + if (dm2->dmPublic.dmFields & DM_PANNINGHEIGHT) + dm1->dmPublic.dmPanningHeight = dm2->dmPublic.dmPanningHeight; +} + +static void update_dev_caps(PSDRV_PDEVICE *pdev) +{ + INT width = 0, height = 0, resx = 0, resy = 0; + RESOLUTION *res; + PAGESIZE *page; + + dump_devmode(&pdev->Devmode->dmPublic); + + if (pdev->Devmode->dmPublic.dmFields & (DM_PRINTQUALITY | DM_YRESOLUTION | DM_LOGPIXELS)) + { + if (pdev->Devmode->dmPublic.dmFields & DM_PRINTQUALITY) + resx = resy = pdev->Devmode->dmPublic.dmPrintQuality; + + if (pdev->Devmode->dmPublic.dmFields & DM_YRESOLUTION) + resy = pdev->Devmode->dmPublic.dmYResolution; + + if (pdev->Devmode->dmPublic.dmFields & DM_LOGPIXELS) + resx = resy = pdev->Devmode->dmPublic.dmLogPixels; + + LIST_FOR_EACH_ENTRY(res, &pdev->pi->ppd->Resolutions, RESOLUTION, entry) + { + if (res->resx == resx && res->resy == resy) + { + pdev->logPixelsX = resx; + pdev->logPixelsY = resy; + break; + } + } + + if (&res->entry == &pdev->pi->ppd->Resolutions) + { + WARN("Requested resolution %dx%d is not supported by device\n", resx, resy); + pdev->logPixelsX = pdev->pi->ppd->DefaultResolution; + pdev->logPixelsY = pdev->logPixelsX; + } + } + else + { + WARN("Using default device resolution %d\n", pdev->pi->ppd->DefaultResolution); + pdev->logPixelsX = pdev->pi->ppd->DefaultResolution; + pdev->logPixelsY = pdev->logPixelsX; + } + + if (pdev->Devmode->dmPublic.dmFields & DM_PAPERSIZE) { + LIST_FOR_EACH_ENTRY(page, &pdev->pi->ppd->PageSizes, PAGESIZE, entry) { + if (page->WinPage == pdev->Devmode->dmPublic.dmPaperSize) + break; + } + + if (&page->entry == &pdev->pi->ppd->PageSizes) { + FIXME("Can't find page\n"); + SetRectEmpty(&pdev->ImageableArea); + pdev->PageSize.cx = 0; + pdev->PageSize.cy = 0; + } else if (page->ImageableArea) { + /* pdev sizes in device units; ppd sizes in 1/72" */ + SetRect(&pdev->ImageableArea, page->ImageableArea->llx * pdev->logPixelsX / 72, + page->ImageableArea->ury * pdev->logPixelsY / 72, + page->ImageableArea->urx * pdev->logPixelsX / 72, + page->ImageableArea->lly * pdev->logPixelsY / 72); + pdev->PageSize.cx = page->PaperDimension->x * + pdev->logPixelsX / 72; + pdev->PageSize.cy = page->PaperDimension->y * + pdev->logPixelsY / 72; + } else { + pdev->ImageableArea.left = pdev->ImageableArea.bottom = 0; + pdev->ImageableArea.right = pdev->PageSize.cx = + page->PaperDimension->x * pdev->logPixelsX / 72; + pdev->ImageableArea.top = pdev->PageSize.cy = + page->PaperDimension->y * pdev->logPixelsY / 72; + } + } else if ((pdev->Devmode->dmPublic.dmFields & DM_PAPERLENGTH) && + (pdev->Devmode->dmPublic.dmFields & DM_PAPERWIDTH)) { + /* pdev sizes in device units; Devmode sizes in 1/10 mm */ + pdev->ImageableArea.left = pdev->ImageableArea.bottom = 0; + pdev->ImageableArea.right = pdev->PageSize.cx = + pdev->Devmode->dmPublic.dmPaperWidth * pdev->logPixelsX / 254; + pdev->ImageableArea.top = pdev->PageSize.cy = + pdev->Devmode->dmPublic.dmPaperLength * pdev->logPixelsY / 254; + } else { + FIXME("Odd dmFields %x\n", (int)pdev->Devmode->dmPublic.dmFields); + SetRectEmpty(&pdev->ImageableArea); + pdev->PageSize.cx = 0; + pdev->PageSize.cy = 0; + } + + TRACE("ImageableArea = %s: PageSize = %dx%d\n", wine_dbgstr_rect(&pdev->ImageableArea), + (int)pdev->PageSize.cx, (int)pdev->PageSize.cy); + + /* these are in device units */ + width = pdev->ImageableArea.right - pdev->ImageableArea.left; + height = pdev->ImageableArea.top - pdev->ImageableArea.bottom; + + if (pdev->Devmode->dmPublic.dmOrientation == DMORIENT_PORTRAIT) { + pdev->horzRes = width; + pdev->vertRes = height; + } else { + pdev->horzRes = height; + pdev->vertRes = width; + } + + /* these are in mm */ + pdev->horzSize = (pdev->horzRes * 25.4) / pdev->logPixelsX; + pdev->vertSize = (pdev->vertRes * 25.4) / pdev->logPixelsY; + + TRACE("devcaps: horzSize = %dmm, vertSize = %dmm, " + "horzRes = %d, vertRes = %d\n", + pdev->horzSize, pdev->vertSize, + pdev->horzRes, pdev->vertRes); +} + +static BOOL CDECL reset_dc(PHYSDEV dev, const DEVMODEW *devmode) +{ + PSDRV_PDEVICE *pdev = get_psdrv_dev(dev); + + if (devmode) + { + merge_devmodes(pdev->Devmode, (const PSDRV_DEVMODE *)devmode, pdev->pi); + update_dev_caps(pdev); + } + return TRUE; +} + static NTSTATUS init_dc(void *arg) { struct init_dc_params *params = arg;
params->funcs->pGetDeviceCaps = get_device_caps; + params->funcs->pResetDC = reset_dc; return TRUE; }
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/escape.c | 358 ++++++++------------------------------ dlls/wineps.drv/init.c | 1 - dlls/wineps.drv/unixlib.c | 260 +++++++++++++++++++++++++++ 3 files changed, 329 insertions(+), 290 deletions(-)
diff --git a/dlls/wineps.drv/escape.c b/dlls/wineps.drv/escape.c index 1d11854fd03..e85ccb0f9e5 100644 --- a/dlls/wineps.drv/escape.c +++ b/dlls/wineps.drv/escape.c @@ -62,311 +62,91 @@ INT CDECL PSDRV_ExtEscape( PHYSDEV dev, INT nEscape, INT cbInput, LPCVOID in_dat
switch(nEscape) { - case QUERYESCSUPPORT: - if(cbInput < sizeof(SHORT)) - { - WARN("cbInput < sizeof(SHORT) (=%d) for QUERYESCSUPPORT\n", cbInput); - return 0; - } else { - DWORD num = (cbInput < sizeof(DWORD)) ? *(const USHORT *)in_data : *(const DWORD *)in_data; - TRACE("QUERYESCSUPPORT for %ld\n", num); - - switch(num) { - case NEXTBAND: - /*case BANDINFO:*/ - case SETCOPYCOUNT: - case GETTECHNOLOGY: - case SETLINECAP: - case SETLINEJOIN: - case SETMITERLIMIT: - case SETCHARSET: - case EXT_DEVICE_CAPS: - case SET_BOUNDS: - case EPSPRINTING: - case POSTSCRIPT_DATA: - case PASSTHROUGH: - case POSTSCRIPT_PASSTHROUGH: - case POSTSCRIPT_IGNORE: - case BEGIN_PATH: - case CLIP_TO_PATH: - case END_PATH: - /*case DRAWPATTERNRECT:*/ - - /* PageMaker checks for it */ - case DOWNLOADHEADER: - - /* PageMaker doesn't check for DOWNLOADFACE and GETFACENAME but - * uses them, they are supposed to be supported by any PS printer. - */ - case DOWNLOADFACE: - - /* PageMaker checks for these as a part of process of detecting - * a "fully compatible" PS printer, but doesn't actually use them. - */ - case OPENCHANNEL: - case CLOSECHANNEL: - return TRUE; - - /* Windows PS driver reports 0, but still supports this escape */ - case GETFACENAME: - return FALSE; /* suppress the FIXME below */ - - default: - FIXME("QUERYESCSUPPORT(%ld) - not supported.\n", num); - return FALSE; - } - } - - case OPENCHANNEL: - FIXME("OPENCHANNEL: stub\n"); - return 1; - - case CLOSECHANNEL: - FIXME("CLOSECHANNEL: stub\n"); - return 1; - - case DOWNLOADHEADER: - FIXME("DOWNLOADHEADER: stub\n"); - /* should return name of the downloaded procset */ - *(char *)out_data = 0; - return 1; - - case GETFACENAME: - FIXME("GETFACENAME: stub\n"); - lstrcpynA(out_data, "Courier", cbOutput); - return 1; - - case DOWNLOADFACE: - FIXME("DOWNLOADFACE: stub\n"); - return 1; - - case MFCOMMENT: - { - FIXME("MFCOMMENT(%p, %d)\n", in_data, cbInput); - return 1; - } - case DRAWPATTERNRECT: - { - DRAWPATRECT *dpr = (DRAWPATRECT*)in_data; - - FIXME("DRAWPATTERNRECT(pos (%ld,%ld), size %ldx%ld, style %d, pattern %x), stub!\n", - dpr->ptPosition.x, dpr->ptPosition.y, - dpr->ptSize.x, dpr->ptSize.y, - dpr->wStyle, dpr->wPattern - ); - return 1; - } - case BANDINFO: - { - BANDINFOSTRUCT *ibi = (BANDINFOSTRUCT*)in_data; - BANDINFOSTRUCT *obi = (BANDINFOSTRUCT*)out_data; - - FIXME("BANDINFO(graphics %d, text %d, rect %s), stub!\n", ibi->GraphicsFlag, - ibi->TextFlag, wine_dbgstr_rect(&ibi->GraphicsRect)); - *obi = *ibi; - return 1; - } - - case SETCOPYCOUNT: - { - const INT *NumCopies = in_data; - INT *ActualCopies = out_data; - if(cbInput != sizeof(INT)) { - WARN("cbInput != sizeof(INT) (=%d) for SETCOPYCOUNT\n", cbInput); - return 0; - } - TRACE("SETCOPYCOUNT %d\n", *NumCopies); - *ActualCopies = 1; - return 1; - } - - case GETTECHNOLOGY: - { - LPSTR p = out_data; - strcpy(p, "PostScript"); - *(p + strlen(p) + 1) = '\0'; /* 2 '\0's at end of string */ - return 1; - } - - case SETLINECAP: - { - INT newCap = *(const INT *)in_data; - if(cbInput != sizeof(INT)) { - WARN("cbInput != sizeof(INT) (=%d) for SETLINECAP\n", cbInput); - return 0; - } - TRACE("SETLINECAP %d\n", newCap); - return 0; - } - - case SETLINEJOIN: - { - INT newJoin = *(const INT *)in_data; - if(cbInput != sizeof(INT)) { - WARN("cbInput != sizeof(INT) (=%d) for SETLINEJOIN\n", cbInput); - return 0; - } - TRACE("SETLINEJOIN %d\n", newJoin); - return 0; - } - - case SETMITERLIMIT: - { - INT newLimit = *(const INT *)in_data; - if(cbInput != sizeof(INT)) { - WARN("cbInput != sizeof(INT) (=%d) for SETMITERLIMIT\n", cbInput); - return 0; - } - TRACE("SETMITERLIMIT %d\n", newLimit); - return 0; - } - - case SETCHARSET: - /* Undocumented escape used by winword6. - Switches between ANSI and a special charset. - If *lpInData == 1 we require that - 0x91 is quoteleft - 0x92 is quoteright - 0x93 is quotedblleft - 0x94 is quotedblright - 0x95 is bullet - 0x96 is endash - 0x97 is emdash - 0xa0 is non break space - yeah right. - - If *lpInData == 0 we get ANSI. - Since there's nothing else there, let's just make these the default - anyway and see what happens... - */ - return 1; - - case EXT_DEVICE_CAPS: - { - UINT cap = *(const UINT *)in_data; - if(cbInput != sizeof(UINT)) { - WARN("cbInput != sizeof(UINT) (=%d) for EXT_DEVICE_CAPS\n", cbInput); - return 0; - } - TRACE("EXT_DEVICE_CAPS %d\n", cap); - return 0; - } - - case SET_BOUNDS: - { - const RECT *r = in_data; - if(cbInput != sizeof(RECT)) { - WARN("cbInput != sizeof(RECT) (=%d) for SET_BOUNDS\n", cbInput); - return 0; - } - TRACE("SET_BOUNDS %s\n", wine_dbgstr_rect(r)); - return 0; - } - - case EPSPRINTING: - { - UINT epsprint = *(const UINT*)in_data; - /* FIXME: In this mode we do not need to send page intros and page - * ends according to the doc. But I just ignore that detail - * for now. - */ - TRACE("EPS Printing support %sable.\n",epsprint?"en":"dis"); - return 1; - } - case POSTSCRIPT_DATA: case PASSTHROUGH: case POSTSCRIPT_PASSTHROUGH: - { - /* Write directly to spool file, bypassing normal PS driver - * processing that is done along with writing PostScript code - * to the spool. - * We have a WORD before the data counting the size, but - * cbInput is just this +2. - * However Photoshop 7 has a bug that sets cbInput to 2 less than the - * length of the string, rather than 2 more. So we'll use the WORD at - * in_data[0] instead. - */ - passthrough_enter(dev); - return write_spool(dev, ((char*)in_data) + 2, *(const WORD*)in_data); - } + { + /* Write directly to spool file, bypassing normal PS driver + * processing that is done along with writing PostScript code + * to the spool. + * We have a WORD before the data counting the size, but + * cbInput is just this +2. + * However Photoshop 7 has a bug that sets cbInput to 2 less than the + * length of the string, rather than 2 more. So we'll use the WORD at + * in_data[0] instead. + */ + passthrough_enter(dev); + return write_spool(dev, ((char*)in_data) + 2, *(const WORD*)in_data); + }
case POSTSCRIPT_IGNORE: - { - BOOL ret = physDev->job.quiet; + { + BOOL ret = physDev->job.quiet; TRACE("POSTSCRIPT_IGNORE %d\n", *(const short*)in_data); - physDev->job.quiet = *(const short*)in_data; - return ret; - } - - case GETSETPRINTORIENT: - { - /* If lpInData is present, it is a 20 byte structure, first 32 - * bit LONG value is the orientation. if lpInData is NULL, it - * returns the current orientation. - */ - FIXME("GETSETPRINTORIENT not implemented (data %p)!\n",in_data); - return 1; - } + physDev->job.quiet = *(const short*)in_data; + return ret; + } + case BEGIN_PATH: TRACE("BEGIN_PATH\n"); - if(physDev->pathdepth) - FIXME("Nested paths not yet handled\n"); - return ++physDev->pathdepth; + if(physDev->pathdepth) + FIXME("Nested paths not yet handled\n"); + return ++physDev->pathdepth;
case END_PATH: - { - const struct PATH_INFO *info = (const struct PATH_INFO*)in_data; + { + const struct PATH_INFO *info = (const struct PATH_INFO*)in_data;
- TRACE("END_PATH\n"); + TRACE("END_PATH\n"); if(!physDev->pathdepth) { - ERR("END_PATH called without a BEGIN_PATH\n"); - return -1; - } - TRACE("RenderMode = %d, FillMode = %d, BkMode = %d\n", - info->RenderMode, info->FillMode, info->BkMode); - switch(info->RenderMode) { - case RENDERMODE_NO_DISPLAY: - PSDRV_WriteClosePath(dev); /* not sure if this is necessary, but it can't hurt */ - break; - case RENDERMODE_OPEN: - case RENDERMODE_CLOSED: - default: - FIXME("END_PATH: RenderMode %d, not yet supported\n", info->RenderMode); - break; - } - return --physDev->pathdepth; - } + ERR("END_PATH called without a BEGIN_PATH\n"); + return -1; + } + TRACE("RenderMode = %d, FillMode = %d, BkMode = %d\n", + info->RenderMode, info->FillMode, info->BkMode); + switch(info->RenderMode) { + case RENDERMODE_NO_DISPLAY: + PSDRV_WriteClosePath(dev); /* not sure if this is necessary, but it can't hurt */ + break; + case RENDERMODE_OPEN: + case RENDERMODE_CLOSED: + default: + FIXME("END_PATH: RenderMode %d, not yet supported\n", info->RenderMode); + break; + } + return --physDev->pathdepth; + }
case CLIP_TO_PATH: - { - WORD mode = *(const WORD*)in_data; - - switch(mode) { - case CLIP_SAVE: - TRACE("CLIP_TO_PATH: CLIP_SAVE\n"); - PSDRV_WriteGSave(dev); - return 1; - case CLIP_RESTORE: - TRACE("CLIP_TO_PATH: CLIP_RESTORE\n"); - PSDRV_WriteGRestore(dev); - return 1; - case CLIP_INCLUSIVE: - TRACE("CLIP_TO_PATH: CLIP_INCLUSIVE\n"); - /* FIXME to clip or eoclip ? (see PATH_INFO.FillMode) */ - PSDRV_WriteClip(dev); + { + WORD mode = *(const WORD*)in_data; + + switch(mode) { + case CLIP_SAVE: + TRACE("CLIP_TO_PATH: CLIP_SAVE\n"); + PSDRV_WriteGSave(dev); + return 1; + case CLIP_RESTORE: + TRACE("CLIP_TO_PATH: CLIP_RESTORE\n"); + PSDRV_WriteGRestore(dev); + return 1; + case CLIP_INCLUSIVE: + TRACE("CLIP_TO_PATH: CLIP_INCLUSIVE\n"); + /* FIXME to clip or eoclip ? (see PATH_INFO.FillMode) */ + PSDRV_WriteClip(dev); PSDRV_WriteNewPath(dev); - return 1; - case CLIP_EXCLUSIVE: - FIXME("CLIP_EXCLUSIVE: not implemented\n"); - return 0; - default: - FIXME("Unknown CLIP_TO_PATH mode %d\n", mode); - return 0; - } - } + return 1; + case CLIP_EXCLUSIVE: + FIXME("CLIP_EXCLUSIVE: not implemented\n"); + return 0; + default: + FIXME("Unknown CLIP_TO_PATH mode %d\n", mode); + return 0; + } + } + default: - FIXME("Unimplemented code %d\n", nEscape); - return 0; + return 0; } }
diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index 1ccb5e3644b..3385bfe90cf 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -694,7 +694,6 @@ static struct gdi_dc_funcs psdrv_funcs = .pCreateDC = PSDRV_CreateDC, .pDeleteDC = PSDRV_DeleteDC, .pEnumFonts = PSDRV_EnumFonts, - .pExtEscape = PSDRV_ExtEscape, .pGetCharWidth = PSDRV_GetCharWidth, .pGetTextExtentExPoint = PSDRV_GetTextExtentExPoint, .pGetTextMetrics = PSDRV_GetTextMetrics, diff --git a/dlls/wineps.drv/unixlib.c b/dlls/wineps.drv/unixlib.c index 0261158ce44..2c80e2f75e2 100644 --- a/dlls/wineps.drv/unixlib.c +++ b/dlls/wineps.drv/unixlib.c @@ -33,6 +33,7 @@ #include "unixlib.h" #include "wine/gdi_driver.h" #include "wine/debug.h" +#include "wine/wingdi16.h"
WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
@@ -504,12 +505,271 @@ static BOOL CDECL reset_dc(PHYSDEV dev, const DEVMODEW *devmode) return TRUE; }
+static int CDECL ext_escape(PHYSDEV dev, int escape, int input_size, const void *input, + int output_size, void *output) +{ + TRACE("%p,%d,%d,%p,%d,%p\n", + dev->hdc, escape, input_size, input, output_size, output); + + switch (escape) + { + case QUERYESCSUPPORT: + if (input_size < sizeof(SHORT)) + { + WARN("input_size < sizeof(SHORT) (=%d) for QUERYESCSUPPORT\n", input_size); + return 0; + } + else + { + DWORD num = (input_size < sizeof(DWORD)) ? *(const USHORT *)input : *(const DWORD *)input; + TRACE("QUERYESCSUPPORT for %d\n", (int)num); + + switch (num) + { + case NEXTBAND: + /*case BANDINFO:*/ + case SETCOPYCOUNT: + case GETTECHNOLOGY: + case SETLINECAP: + case SETLINEJOIN: + case SETMITERLIMIT: + case SETCHARSET: + case EXT_DEVICE_CAPS: + case SET_BOUNDS: + case EPSPRINTING: + case POSTSCRIPT_DATA: + case PASSTHROUGH: + case POSTSCRIPT_PASSTHROUGH: + case POSTSCRIPT_IGNORE: + case BEGIN_PATH: + case CLIP_TO_PATH: + case END_PATH: + /*case DRAWPATTERNRECT:*/ + + /* PageMaker checks for it */ + case DOWNLOADHEADER: + + /* PageMaker doesn't check for DOWNLOADFACE and GETFACENAME but + * uses them, they are supposed to be supported by any PS printer. + */ + case DOWNLOADFACE: + + /* PageMaker checks for these as a part of process of detecting + * a "fully compatible" PS printer, but doesn't actually use them. + */ + case OPENCHANNEL: + case CLOSECHANNEL: + return TRUE; + + /* Windows PS driver reports 0, but still supports this escape */ + case GETFACENAME: + return FALSE; /* suppress the FIXME below */ + + default: + FIXME("QUERYESCSUPPORT(%d) - not supported.\n", (int)num); + return FALSE; + } + } + + case OPENCHANNEL: + FIXME("OPENCHANNEL: stub\n"); + return 1; + + case CLOSECHANNEL: + FIXME("CLOSECHANNEL: stub\n"); + return 1; + + case DOWNLOADHEADER: + FIXME("DOWNLOADHEADER: stub\n"); + /* should return name of the downloaded procset */ + *(char *)output = 0; + return 1; + + case GETFACENAME: + FIXME("GETFACENAME: stub\n"); + lstrcpynA(output, "Courier", output_size); + return 1; + + case DOWNLOADFACE: + FIXME("DOWNLOADFACE: stub\n"); + return 1; + + case MFCOMMENT: + { + FIXME("MFCOMMENT(%p, %d)\n", input, input_size); + return 1; + } + case DRAWPATTERNRECT: + { + DRAWPATRECT *dpr = (DRAWPATRECT*)input; + + FIXME("DRAWPATTERNRECT(pos (%d,%d), size %dx%d, style %d, pattern %x), stub!\n", + (int)dpr->ptPosition.x, (int)dpr->ptPosition.y, + (int)dpr->ptSize.x, (int)dpr->ptSize.y, + dpr->wStyle, dpr->wPattern); + return 1; + } + case BANDINFO: + { + BANDINFOSTRUCT *ibi = (BANDINFOSTRUCT*)input; + BANDINFOSTRUCT *obi = (BANDINFOSTRUCT*)output; + + FIXME("BANDINFO(graphics %d, text %d, rect %s), stub!\n", ibi->GraphicsFlag, + ibi->TextFlag, wine_dbgstr_rect(&ibi->GraphicsRect)); + *obi = *ibi; + return 1; + } + + case SETCOPYCOUNT: + { + const INT *NumCopies = input; + INT *ActualCopies = output; + if (input_size != sizeof(INT)) + { + WARN("input_size != sizeof(INT) (=%d) for SETCOPYCOUNT\n", input_size); + return 0; + } + TRACE("SETCOPYCOUNT %d\n", *NumCopies); + *ActualCopies = 1; + return 1; + } + + case GETTECHNOLOGY: + { + LPSTR p = output; + strcpy(p, "PostScript"); + *(p + strlen(p) + 1) = '\0'; /* 2 '\0's at end of string */ + return 1; + } + + case SETLINECAP: + { + INT newCap = *(const INT *)input; + if (input_size != sizeof(INT)) + { + WARN("input_size != sizeof(INT) (=%d) for SETLINECAP\n", input_size); + return 0; + } + TRACE("SETLINECAP %d\n", newCap); + return 0; + } + + case SETLINEJOIN: + { + INT newJoin = *(const INT *)input; + if (input_size != sizeof(INT)) + { + WARN("input_size != sizeof(INT) (=%d) for SETLINEJOIN\n", input_size); + return 0; + } + TRACE("SETLINEJOIN %d\n", newJoin); + return 0; + } + + case SETMITERLIMIT: + { + INT newLimit = *(const INT *)input; + if (input_size != sizeof(INT)) + { + WARN("input_size != sizeof(INT) (=%d) for SETMITERLIMIT\n", input_size); + return 0; + } + TRACE("SETMITERLIMIT %d\n", newLimit); + return 0; + } + + case SETCHARSET: + /* Undocumented escape used by winword6. + Switches between ANSI and a special charset. + If *lpInData == 1 we require that + 0x91 is quoteleft + 0x92 is quoteright + 0x93 is quotedblleft + 0x94 is quotedblright + 0x95 is bullet + 0x96 is endash + 0x97 is emdash + 0xa0 is non break space - yeah right. + + If *lpInData == 0 we get ANSI. + Since there's nothing else there, let's just make these the default + anyway and see what happens... + */ + return 1; + + case EXT_DEVICE_CAPS: + { + UINT cap = *(const UINT *)input; + if (input_size != sizeof(UINT)) + { + WARN("input_size != sizeof(UINT) (=%d) for EXT_DEVICE_CAPS\n", input_size); + return 0; + } + TRACE("EXT_DEVICE_CAPS %d\n", cap); + return 0; + } + + case SET_BOUNDS: + { + const RECT *r = input; + if (input_size != sizeof(RECT)) + { + WARN("input_size != sizeof(RECT) (=%d) for SET_BOUNDS\n", input_size); + return 0; + } + TRACE("SET_BOUNDS %s\n", wine_dbgstr_rect(r)); + return 0; + } + + case EPSPRINTING: + { + UINT epsprint = *(const UINT*)input; + /* FIXME: In this mode we do not need to send page intros and page + * ends according to the doc. But I just ignore that detail + * for now. + */ + TRACE("EPS Printing support %sable.\n",epsprint?"en":"dis"); + return 1; + } + + case POSTSCRIPT_DATA: + case PASSTHROUGH: + case POSTSCRIPT_PASSTHROUGH: + return 1; + + case POSTSCRIPT_IGNORE: + return 1; + + case GETSETPRINTORIENT: + { + /* If lpInData is present, it is a 20 byte structure, first 32 + * bit LONG value is the orientation. if lpInData is NULL, it + * returns the current orientation. + */ + FIXME("GETSETPRINTORIENT not implemented (data %p)!\n",input); + return 1; + } + case BEGIN_PATH: + return 1; + + case END_PATH: + return 1; + + case CLIP_TO_PATH: + return 1; + default: + FIXME("Unimplemented code %d\n", escape); + return 0; + } +} + static NTSTATUS init_dc(void *arg) { struct init_dc_params *params = arg;
params->funcs->pGetDeviceCaps = get_device_caps; params->funcs->pResetDC = reset_dc; + params->funcs->pExtEscape = ext_escape; return TRUE; }
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/afm.c | 14 +++---- dlls/wineps.drv/afm2c.c | 8 ++-- dlls/wineps.drv/builtin.c | 38 ++++++++---------- dlls/wineps.drv/data/AvantGarde_Book.c | 6 +-- dlls/wineps.drv/data/AvantGarde_BookOblique.c | 6 +-- dlls/wineps.drv/data/AvantGarde_Demi.c | 6 +-- dlls/wineps.drv/data/AvantGarde_DemiOblique.c | 6 +-- dlls/wineps.drv/data/Bookman_Demi.c | 6 +-- dlls/wineps.drv/data/Bookman_DemiItalic.c | 6 +-- dlls/wineps.drv/data/Bookman_Light.c | 6 +-- dlls/wineps.drv/data/Bookman_LightItalic.c | 6 +-- dlls/wineps.drv/data/Courier.c | 6 +-- dlls/wineps.drv/data/Courier_Bold.c | 6 +-- dlls/wineps.drv/data/Courier_BoldOblique.c | 6 +-- dlls/wineps.drv/data/Courier_Oblique.c | 6 +-- dlls/wineps.drv/data/Helvetica.c | 6 +-- dlls/wineps.drv/data/Helvetica_Bold.c | 6 +-- dlls/wineps.drv/data/Helvetica_BoldOblique.c | 6 +-- dlls/wineps.drv/data/Helvetica_Narrow.c | 6 +-- dlls/wineps.drv/data/Helvetica_Narrow_Bold.c | 6 +-- .../data/Helvetica_Narrow_BoldOblique.c | 6 +-- .../data/Helvetica_Narrow_Oblique.c | 6 +-- dlls/wineps.drv/data/Helvetica_Oblique.c | 6 +-- dlls/wineps.drv/data/NewCenturySchlbk_Bold.c | 6 +-- .../data/NewCenturySchlbk_BoldItalic.c | 6 +-- .../wineps.drv/data/NewCenturySchlbk_Italic.c | 6 +-- dlls/wineps.drv/data/NewCenturySchlbk_Roman.c | 6 +-- dlls/wineps.drv/data/Palatino_Bold.c | 6 +-- dlls/wineps.drv/data/Palatino_BoldItalic.c | 6 +-- dlls/wineps.drv/data/Palatino_Italic.c | 6 +-- dlls/wineps.drv/data/Palatino_Roman.c | 6 +-- dlls/wineps.drv/data/Symbol.c | 6 +-- dlls/wineps.drv/data/Times_Bold.c | 6 +-- dlls/wineps.drv/data/Times_BoldItalic.c | 6 +-- dlls/wineps.drv/data/Times_Italic.c | 6 +-- dlls/wineps.drv/data/Times_Roman.c | 6 +-- .../data/ZapfChancery_MediumItalic.c | 6 +-- dlls/wineps.drv/data/ZapfDingbats.c | 6 +-- dlls/wineps.drv/font.c | 38 ++++++++---------- dlls/wineps.drv/init.c | 14 +++---- dlls/wineps.drv/ppd.c | 2 +- dlls/wineps.drv/psdrv.h | 14 +++---- dlls/wineps.drv/type1afm.c | 39 ++++++++++++++++--- 43 files changed, 197 insertions(+), 180 deletions(-)
diff --git a/dlls/wineps.drv/afm.c b/dlls/wineps.drv/afm.c index c5e0cd3f36d..cd08cee55f8 100644 --- a/dlls/wineps.drv/afm.c +++ b/dlls/wineps.drv/afm.c @@ -99,7 +99,7 @@ BOOL PSDRV_AddAFMtoList(FONTFAMILY **head, const AFM *afm, BOOL *p_added) newafmle->afm = afm;
while(family) { - if(!strcmp(family->FamilyName, afm->FamilyName)) + if(!wcscmp(family->FamilyName, afm->FamilyName)) break; insert = &(family->next); family = family->next; @@ -113,12 +113,12 @@ BOOL PSDRV_AddAFMtoList(FONTFAMILY **head, const AFM *afm, BOOL *p_added) return FALSE; } *insert = family; - if (!(family->FamilyName = HeapAlloc(PSDRV_Heap, 0, strlen(afm->FamilyName)+1 ))) { + if (!(family->FamilyName = HeapAlloc(PSDRV_Heap, 0, (wcslen(afm->FamilyName)+1)*sizeof(WCHAR) ))) { HeapFree(PSDRV_Heap, 0, family); HeapFree(PSDRV_Heap, 0, newafmle); return FALSE; } - strcpy( family->FamilyName, afm->FamilyName ); + wcscpy( family->FamilyName, afm->FamilyName ); family->afmlist = newafmle; *p_added = TRUE; return TRUE; @@ -158,16 +158,16 @@ static void PSDRV_DumpFontList(void) AFMLISTENTRY *afmle;
for(family = PSDRV_AFMFontList; family; family = family->next) { - TRACE("Family '%s'\n", family->FamilyName); + TRACE("Family %s\n", debugstr_w(family->FamilyName)); for(afmle = family->afmlist; afmle; afmle = afmle->next) { #if 0 INT i; #endif
- TRACE("\tFontName '%s' (%i glyphs) - '%s' encoding:\n", - afmle->afm->FontName, afmle->afm->NumofMetrics, - afmle->afm->EncodingScheme); + TRACE("\tFontName '%s' (%i glyphs) - %s encoding:\n", + afmle->afm->FontName, afmle->afm->NumofMetrics, + debugstr_w(afmle->afm->EncodingScheme));
/* Uncomment to regenerate font data; see afm2c.c */
diff --git a/dlls/wineps.drv/afm2c.c b/dlls/wineps.drv/afm2c.c index a0427e5128d..104cad4bace 100644 --- a/dlls/wineps.drv/afm2c.c +++ b/dlls/wineps.drv/afm2c.c @@ -81,7 +81,7 @@ static void writeHeader(FILE *of, const AFM *afm, const char *buffer) fputc('*', of); fprintf(of, "\n" " *\n" - " *\tFont metric data for %s\n" + " *\tFont metric data for %S\n" " *\n" " *\tCopyright 2001 Ian Pilcher\n" " *\n" @@ -121,11 +121,11 @@ static void writeAFM(FILE *of, const AFM *afm, const char *buffer) fprintf(of, "const AFM PSDRV_%s =\n{\n", buffer); cursorto(of, 44, fprintf(of, " "%s",", afm->FontName)); fputs("/* FontName */\n", of); - cursorto(of, 44, fprintf(of, " "%s",", afm->FullName)); + cursorto(of, 44, fprintf(of, " L"%S",", afm->FullName)); fputs("/* FullName */\n", of); - cursorto(of, 44, fprintf(of, " "%s",", afm->FamilyName)); + cursorto(of, 44, fprintf(of, " L"%S",", afm->FamilyName)); fputs("/* FamilyName */\n", of); - cursorto(of, 44, fprintf(of, " "%s",", afm->EncodingScheme)); + cursorto(of, 44, fprintf(of, " L"%S",", afm->EncodingScheme)); fputs("/* EncodingScheme */\n", of); cursorto(of, 44, fprintf(of, " %s,", (afm->Weight > 550) ? "FW_BOLD" : "FW_NORMAL")); diff --git a/dlls/wineps.drv/builtin.c b/dlls/wineps.drv/builtin.c index 88096665812..5100539764d 100644 --- a/dlls/wineps.drv/builtin.c +++ b/dlls/wineps.drv/builtin.c @@ -157,7 +157,7 @@ static VOID ScaleFont(const AFM *afm, LONG lfHeight, PSFONT *font, * */ BOOL PSDRV_SelectBuiltinFont(PHYSDEV dev, HFONT hfont, - LOGFONTW *plf, LPSTR FaceName) + LOGFONTW *plf, WCHAR *face_name) { PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); AFMLISTENTRY *afmle; @@ -165,27 +165,27 @@ BOOL PSDRV_SelectBuiltinFont(PHYSDEV dev, HFONT hfont, BOOL bd = FALSE, it = FALSE; LONG height;
- TRACE("Trying to find facename '%s'\n", FaceName); + TRACE("Trying to find facename %s\n", debugstr_w(face_name));
/* Look for a matching font family */ for(family = physDev->pi->Fonts; family; family = family->next) { - if(!stricmp(FaceName, family->FamilyName)) + if(!wcsicmp(face_name, family->FamilyName)) break; }
if(!family) { /* Fallback for Window's font families to common PostScript families */ - if(!strcmp(FaceName, "Arial")) - strcpy(FaceName, "Helvetica"); - else if(!strcmp(FaceName, "System")) - strcpy(FaceName, "Helvetica"); - else if(!strcmp(FaceName, "Times New Roman")) - strcpy(FaceName, "Times"); - else if(!strcmp(FaceName, "Courier New")) - strcpy(FaceName, "Courier"); + if(!wcscmp(face_name, L"Arial")) + wcscpy(face_name, L"Helvetica"); + else if(!wcscmp(face_name, L"System")) + wcscpy(face_name, L"Helvetica"); + else if(!wcscmp(face_name, L"Times New Roman")) + wcscpy(face_name, L"Times"); + else if(!wcscmp(face_name, L"Courier New")) + wcscpy(face_name, L"Courier");
for(family = physDev->pi->Fonts; family; family = family->next) { - if(!strcmp(FaceName, family->FamilyName)) + if(!wcscmp(face_name, family->FamilyName)) break; } } @@ -193,7 +193,7 @@ BOOL PSDRV_SelectBuiltinFont(PHYSDEV dev, HFONT hfont, if(!family) family = physDev->pi->Fonts;
- TRACE("Got family '%s'\n", family->FamilyName); + TRACE("Got family %s\n", debugstr_w(family->FamilyName));
if(plf->lfItalic) it = TRUE; @@ -401,8 +401,7 @@ static UINT PSDRV_GetFontMetric(HDC hdc, const AFM *afm,
lf->lfPitchAndFamily = (afm->IsFixedPitch) ? FIXED_PITCH : VARIABLE_PITCH;
- MultiByteToWideChar(CP_ACP, 0, afm->FamilyName, -1, lf->lfFaceName, - LF_FACESIZE); + lstrcpynW(lf->lfFaceName, afm->FamilyName, LF_FACESIZE);
return DEVICE_FONTTYPE; } @@ -419,18 +418,15 @@ BOOL CDECL PSDRV_EnumFonts( PHYSDEV dev, LPLOGFONTW plf, FONTENUMPROCW proc, LPA BOOL ret; AFMLISTENTRY *afmle; FONTFAMILY *family; - char FaceName[LF_FACESIZE];
ret = next->funcs->pEnumFonts( next, plf, proc, lp ); if (!ret) return FALSE;
if( plf && plf->lfFaceName[0] ) { - WideCharToMultiByte(CP_ACP, 0, plf->lfFaceName, -1, - FaceName, sizeof(FaceName), NULL, NULL); - TRACE("lfFaceName = '%s'\n", FaceName); + TRACE("lfFaceName = %s\n", debugstr_w(plf->lfFaceName)); for(family = physDev->pi->Fonts; family; family = family->next) { - if(!strncmp(FaceName, family->FamilyName, - strlen(family->FamilyName))) + if(!wcsncmp(plf->lfFaceName, family->FamilyName, + wcslen(family->FamilyName))) break; } if(family) { diff --git a/dlls/wineps.drv/data/AvantGarde_Book.c b/dlls/wineps.drv/data/AvantGarde_Book.c index 803f496367d..c1da48c752f 100644 --- a/dlls/wineps.drv/data/AvantGarde_Book.c +++ b/dlls/wineps.drv/data/AvantGarde_Book.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_AvantGarde_Book = { "AvantGarde-Book", /* FontName */ - "ITC Avant Garde Gothic Book", /* FullName */ - "ITC Avant Garde Gothic", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"ITC Avant Garde Gothic Book", /* FullName */ + L"ITC Avant Garde Gothic", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/AvantGarde_BookOblique.c b/dlls/wineps.drv/data/AvantGarde_BookOblique.c index 805163d330d..07a05f81e0e 100644 --- a/dlls/wineps.drv/data/AvantGarde_BookOblique.c +++ b/dlls/wineps.drv/data/AvantGarde_BookOblique.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_AvantGarde_BookOblique = { "AvantGarde-BookOblique", /* FontName */ - "ITC Avant Garde Gothic Book Oblique", /* FullName */ - "ITC Avant Garde Gothic", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"ITC Avant Garde Gothic Book Oblique", /* FullName */ + L"ITC Avant Garde Gothic", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ -10.5, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/AvantGarde_Demi.c b/dlls/wineps.drv/data/AvantGarde_Demi.c index 9580f92efd7..0951e4acc28 100644 --- a/dlls/wineps.drv/data/AvantGarde_Demi.c +++ b/dlls/wineps.drv/data/AvantGarde_Demi.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_AvantGarde_Demi = { "AvantGarde-Demi", /* FontName */ - "ITC Avant Garde Gothic Demi", /* FullName */ - "ITC Avant Garde Gothic", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"ITC Avant Garde Gothic Demi", /* FullName */ + L"ITC Avant Garde Gothic", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/AvantGarde_DemiOblique.c b/dlls/wineps.drv/data/AvantGarde_DemiOblique.c index 085e6df2ef1..34caec240ad 100644 --- a/dlls/wineps.drv/data/AvantGarde_DemiOblique.c +++ b/dlls/wineps.drv/data/AvantGarde_DemiOblique.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_AvantGarde_DemiOblique = { "AvantGarde-DemiOblique", /* FontName */ - "ITC Avant Garde Gothic Demi Oblique", /* FullName */ - "ITC Avant Garde Gothic", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"ITC Avant Garde Gothic Demi Oblique", /* FullName */ + L"ITC Avant Garde Gothic", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ -10.5, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Bookman_Demi.c b/dlls/wineps.drv/data/Bookman_Demi.c index 0859e48811f..dd80c3fdd1d 100644 --- a/dlls/wineps.drv/data/Bookman_Demi.c +++ b/dlls/wineps.drv/data/Bookman_Demi.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Bookman_Demi = { "Bookman-Demi", /* FontName */ - "ITC Bookman Demi", /* FullName */ - "ITC Bookman", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"ITC Bookman Demi", /* FullName */ + L"ITC Bookman", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Bookman_DemiItalic.c b/dlls/wineps.drv/data/Bookman_DemiItalic.c index ffa8bb7bef0..7888a3ce79c 100644 --- a/dlls/wineps.drv/data/Bookman_DemiItalic.c +++ b/dlls/wineps.drv/data/Bookman_DemiItalic.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Bookman_DemiItalic = { "Bookman-DemiItalic", /* FontName */ - "ITC Bookman Demi Italic", /* FullName */ - "ITC Bookman", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"ITC Bookman Demi Italic", /* FullName */ + L"ITC Bookman", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ -10, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Bookman_Light.c b/dlls/wineps.drv/data/Bookman_Light.c index 36a73c434a1..eef56681b54 100644 --- a/dlls/wineps.drv/data/Bookman_Light.c +++ b/dlls/wineps.drv/data/Bookman_Light.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Bookman_Light = { "Bookman-Light", /* FontName */ - "ITC Bookman Light", /* FullName */ - "ITC Bookman", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"ITC Bookman Light", /* FullName */ + L"ITC Bookman", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Bookman_LightItalic.c b/dlls/wineps.drv/data/Bookman_LightItalic.c index e315b0a5896..1e6009d3093 100644 --- a/dlls/wineps.drv/data/Bookman_LightItalic.c +++ b/dlls/wineps.drv/data/Bookman_LightItalic.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Bookman_LightItalic = { "Bookman-LightItalic", /* FontName */ - "ITC Bookman Light Italic", /* FullName */ - "ITC Bookman", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"ITC Bookman Light Italic", /* FullName */ + L"ITC Bookman", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ -10, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Courier.c b/dlls/wineps.drv/data/Courier.c index 4c898766fa7..b5a7cc11c9c 100644 --- a/dlls/wineps.drv/data/Courier.c +++ b/dlls/wineps.drv/data/Courier.c @@ -272,9 +272,9 @@ static const AFMMETRICS metrics[243] = const AFM PSDRV_Courier = { "Courier", /* FontName */ - "Courier", /* FullName */ - "Courier", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Courier", /* FullName */ + L"Courier", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ 0, /* ItalicAngle */ TRUE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Courier_Bold.c b/dlls/wineps.drv/data/Courier_Bold.c index 4bb6543d547..78ba00727b3 100644 --- a/dlls/wineps.drv/data/Courier_Bold.c +++ b/dlls/wineps.drv/data/Courier_Bold.c @@ -272,9 +272,9 @@ static const AFMMETRICS metrics[243] = const AFM PSDRV_Courier_Bold = { "Courier-Bold", /* FontName */ - "Courier Bold", /* FullName */ - "Courier", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Courier Bold", /* FullName */ + L"Courier", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ 0, /* ItalicAngle */ TRUE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Courier_BoldOblique.c b/dlls/wineps.drv/data/Courier_BoldOblique.c index 8657a2b9d53..e9daa65fb59 100644 --- a/dlls/wineps.drv/data/Courier_BoldOblique.c +++ b/dlls/wineps.drv/data/Courier_BoldOblique.c @@ -272,9 +272,9 @@ static const AFMMETRICS metrics[243] = const AFM PSDRV_Courier_BoldOblique = { "Courier-BoldOblique", /* FontName */ - "Courier Bold Oblique", /* FullName */ - "Courier", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Courier Bold Oblique", /* FullName */ + L"Courier", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ -12, /* ItalicAngle */ TRUE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Courier_Oblique.c b/dlls/wineps.drv/data/Courier_Oblique.c index cd4324d763d..a03b875c253 100644 --- a/dlls/wineps.drv/data/Courier_Oblique.c +++ b/dlls/wineps.drv/data/Courier_Oblique.c @@ -272,9 +272,9 @@ static const AFMMETRICS metrics[243] = const AFM PSDRV_Courier_Oblique = { "Courier-Oblique", /* FontName */ - "Courier Oblique", /* FullName */ - "Courier", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Courier Oblique", /* FullName */ + L"Courier", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ -12, /* ItalicAngle */ TRUE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Helvetica.c b/dlls/wineps.drv/data/Helvetica.c index 0ead75b5e8c..45aa0a5e23a 100644 --- a/dlls/wineps.drv/data/Helvetica.c +++ b/dlls/wineps.drv/data/Helvetica.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Helvetica = { "Helvetica", /* FontName */ - "Helvetica", /* FullName */ - "Helvetica", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Helvetica", /* FullName */ + L"Helvetica", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Helvetica_Bold.c b/dlls/wineps.drv/data/Helvetica_Bold.c index e9cf1a37554..6a3ae6ac9b0 100644 --- a/dlls/wineps.drv/data/Helvetica_Bold.c +++ b/dlls/wineps.drv/data/Helvetica_Bold.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Helvetica_Bold = { "Helvetica-Bold", /* FontName */ - "Helvetica Bold", /* FullName */ - "Helvetica", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Helvetica Bold", /* FullName */ + L"Helvetica", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Helvetica_BoldOblique.c b/dlls/wineps.drv/data/Helvetica_BoldOblique.c index e807a9a2b42..e286110ffd5 100644 --- a/dlls/wineps.drv/data/Helvetica_BoldOblique.c +++ b/dlls/wineps.drv/data/Helvetica_BoldOblique.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Helvetica_BoldOblique = { "Helvetica-BoldOblique", /* FontName */ - "Helvetica Bold Oblique", /* FullName */ - "Helvetica", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Helvetica Bold Oblique", /* FullName */ + L"Helvetica", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ -12, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Helvetica_Narrow.c b/dlls/wineps.drv/data/Helvetica_Narrow.c index 64f2e88effc..1e8758f74f2 100644 --- a/dlls/wineps.drv/data/Helvetica_Narrow.c +++ b/dlls/wineps.drv/data/Helvetica_Narrow.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Helvetica_Narrow = { "Helvetica-Narrow", /* FontName */ - "Helvetica Narrow", /* FullName */ - "Helvetica Narrow", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Helvetica Narrow", /* FullName */ + L"Helvetica Narrow", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Helvetica_Narrow_Bold.c b/dlls/wineps.drv/data/Helvetica_Narrow_Bold.c index 8f6a6e3b38c..b8fe194165f 100644 --- a/dlls/wineps.drv/data/Helvetica_Narrow_Bold.c +++ b/dlls/wineps.drv/data/Helvetica_Narrow_Bold.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Helvetica_Narrow_Bold = { "Helvetica-Narrow-Bold", /* FontName */ - "Helvetica Narrow Bold", /* FullName */ - "Helvetica Narrow", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Helvetica Narrow Bold", /* FullName */ + L"Helvetica Narrow", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Helvetica_Narrow_BoldOblique.c b/dlls/wineps.drv/data/Helvetica_Narrow_BoldOblique.c index 0ad9edc2cb7..5ea6169bac2 100644 --- a/dlls/wineps.drv/data/Helvetica_Narrow_BoldOblique.c +++ b/dlls/wineps.drv/data/Helvetica_Narrow_BoldOblique.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Helvetica_Narrow_BoldOblique = { "Helvetica-Narrow-BoldOblique", /* FontName */ - "Helvetica Narrow Bold Oblique", /* FullName */ - "Helvetica Narrow", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Helvetica Narrow Bold Oblique", /* FullName */ + L"Helvetica Narrow", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ -12, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Helvetica_Narrow_Oblique.c b/dlls/wineps.drv/data/Helvetica_Narrow_Oblique.c index b12768781ea..f5cf448205e 100644 --- a/dlls/wineps.drv/data/Helvetica_Narrow_Oblique.c +++ b/dlls/wineps.drv/data/Helvetica_Narrow_Oblique.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Helvetica_Narrow_Oblique = { "Helvetica-Narrow-Oblique", /* FontName */ - "Helvetica Narrow Oblique", /* FullName */ - "Helvetica Narrow", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Helvetica Narrow Oblique", /* FullName */ + L"Helvetica Narrow", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ -12, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Helvetica_Oblique.c b/dlls/wineps.drv/data/Helvetica_Oblique.c index b6eba3a2f75..7508b292dc4 100644 --- a/dlls/wineps.drv/data/Helvetica_Oblique.c +++ b/dlls/wineps.drv/data/Helvetica_Oblique.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Helvetica_Oblique = { "Helvetica-Oblique", /* FontName */ - "Helvetica Oblique", /* FullName */ - "Helvetica", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Helvetica Oblique", /* FullName */ + L"Helvetica", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ -12, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/NewCenturySchlbk_Bold.c b/dlls/wineps.drv/data/NewCenturySchlbk_Bold.c index b88fc289eba..63de72bb9d5 100644 --- a/dlls/wineps.drv/data/NewCenturySchlbk_Bold.c +++ b/dlls/wineps.drv/data/NewCenturySchlbk_Bold.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_NewCenturySchlbk_Bold = { "NewCenturySchlbk-Bold", /* FontName */ - "New Century Schoolbook Bold", /* FullName */ - "New Century Schoolbook", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"New Century Schoolbook Bold", /* FullName */ + L"New Century Schoolbook", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/NewCenturySchlbk_BoldItalic.c b/dlls/wineps.drv/data/NewCenturySchlbk_BoldItalic.c index f0c6967f64b..d8082565697 100644 --- a/dlls/wineps.drv/data/NewCenturySchlbk_BoldItalic.c +++ b/dlls/wineps.drv/data/NewCenturySchlbk_BoldItalic.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_NewCenturySchlbk_BoldItalic = { "NewCenturySchlbk-BoldItalic", /* FontName */ - "New Century Schoolbook Bold Italic", /* FullName */ - "New Century Schoolbook", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"New Century Schoolbook Bold Italic", /* FullName */ + L"New Century Schoolbook", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ -16, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/NewCenturySchlbk_Italic.c b/dlls/wineps.drv/data/NewCenturySchlbk_Italic.c index 776af09488b..3d4efa883f2 100644 --- a/dlls/wineps.drv/data/NewCenturySchlbk_Italic.c +++ b/dlls/wineps.drv/data/NewCenturySchlbk_Italic.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_NewCenturySchlbk_Italic = { "NewCenturySchlbk-Italic", /* FontName */ - "New Century Schoolbook Italic", /* FullName */ - "New Century Schoolbook", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"New Century Schoolbook Italic", /* FullName */ + L"New Century Schoolbook", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ -16, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/NewCenturySchlbk_Roman.c b/dlls/wineps.drv/data/NewCenturySchlbk_Roman.c index 30e6268b86a..4e89086e564 100644 --- a/dlls/wineps.drv/data/NewCenturySchlbk_Roman.c +++ b/dlls/wineps.drv/data/NewCenturySchlbk_Roman.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_NewCenturySchlbk_Roman = { "NewCenturySchlbk-Roman", /* FontName */ - "New Century Schoolbook Roman", /* FullName */ - "New Century Schoolbook", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"New Century Schoolbook Roman", /* FullName */ + L"New Century Schoolbook", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Palatino_Bold.c b/dlls/wineps.drv/data/Palatino_Bold.c index 8a973eee115..0f9dfcc5890 100644 --- a/dlls/wineps.drv/data/Palatino_Bold.c +++ b/dlls/wineps.drv/data/Palatino_Bold.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Palatino_Bold = { "Palatino-Bold", /* FontName */ - "Palatino Bold", /* FullName */ - "Palatino", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Palatino Bold", /* FullName */ + L"Palatino", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Palatino_BoldItalic.c b/dlls/wineps.drv/data/Palatino_BoldItalic.c index e5f3fdb5287..afe63c2e1ec 100644 --- a/dlls/wineps.drv/data/Palatino_BoldItalic.c +++ b/dlls/wineps.drv/data/Palatino_BoldItalic.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Palatino_BoldItalic = { "Palatino-BoldItalic", /* FontName */ - "Palatino Bold Italic", /* FullName */ - "Palatino", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Palatino Bold Italic", /* FullName */ + L"Palatino", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ -10, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Palatino_Italic.c b/dlls/wineps.drv/data/Palatino_Italic.c index 762cc550283..6c3b605b2ca 100644 --- a/dlls/wineps.drv/data/Palatino_Italic.c +++ b/dlls/wineps.drv/data/Palatino_Italic.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Palatino_Italic = { "Palatino-Italic", /* FontName */ - "Palatino Italic", /* FullName */ - "Palatino", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Palatino Italic", /* FullName */ + L"Palatino", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ -10, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Palatino_Roman.c b/dlls/wineps.drv/data/Palatino_Roman.c index 598f5e22bc1..d3cd8f89f79 100644 --- a/dlls/wineps.drv/data/Palatino_Roman.c +++ b/dlls/wineps.drv/data/Palatino_Roman.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Palatino_Roman = { "Palatino-Roman", /* FontName */ - "Palatino Roman", /* FullName */ - "Palatino", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Palatino Roman", /* FullName */ + L"Palatino", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Symbol.c b/dlls/wineps.drv/data/Symbol.c index 9458a62bf0f..b6bfd37361d 100644 --- a/dlls/wineps.drv/data/Symbol.c +++ b/dlls/wineps.drv/data/Symbol.c @@ -217,9 +217,9 @@ static const AFMMETRICS metrics[188] = const AFM PSDRV_Symbol = { "Symbol", /* FontName */ - "Symbol", /* FullName */ - "Symbol", /* FamilyName */ - "FontSpecific", /* EncodingScheme */ + L"Symbol", /* FullName */ + L"Symbol", /* FamilyName */ + L"FontSpecific", /* EncodingScheme */ FW_NORMAL, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Times_Bold.c b/dlls/wineps.drv/data/Times_Bold.c index 56036fdc163..6136fd3bdad 100644 --- a/dlls/wineps.drv/data/Times_Bold.c +++ b/dlls/wineps.drv/data/Times_Bold.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Times_Bold = { "Times-Bold", /* FontName */ - "Times Bold", /* FullName */ - "Times", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Times Bold", /* FullName */ + L"Times", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Times_BoldItalic.c b/dlls/wineps.drv/data/Times_BoldItalic.c index a127b4331ea..3d3c5f8559f 100644 --- a/dlls/wineps.drv/data/Times_BoldItalic.c +++ b/dlls/wineps.drv/data/Times_BoldItalic.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Times_BoldItalic = { "Times-BoldItalic", /* FontName */ - "Times Bold Italic", /* FullName */ - "Times", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Times Bold Italic", /* FullName */ + L"Times", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_BOLD, /* Weight */ -15, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Times_Italic.c b/dlls/wineps.drv/data/Times_Italic.c index 5e192846585..afc6c0ffc59 100644 --- a/dlls/wineps.drv/data/Times_Italic.c +++ b/dlls/wineps.drv/data/Times_Italic.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Times_Italic = { "Times-Italic", /* FontName */ - "Times Italic", /* FullName */ - "Times", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Times Italic", /* FullName */ + L"Times", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ -15.5, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/Times_Roman.c b/dlls/wineps.drv/data/Times_Roman.c index 6f8eb4a2651..fc40e438ba8 100644 --- a/dlls/wineps.drv/data/Times_Roman.c +++ b/dlls/wineps.drv/data/Times_Roman.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_Times_Roman = { "Times-Roman", /* FontName */ - "Times Roman", /* FullName */ - "Times", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"Times Roman", /* FullName */ + L"Times", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/ZapfChancery_MediumItalic.c b/dlls/wineps.drv/data/ZapfChancery_MediumItalic.c index 1353cf7ce91..b05a195b592 100644 --- a/dlls/wineps.drv/data/ZapfChancery_MediumItalic.c +++ b/dlls/wineps.drv/data/ZapfChancery_MediumItalic.c @@ -257,9 +257,9 @@ static const AFMMETRICS metrics[228] = const AFM PSDRV_ZapfChancery_MediumItalic = { "ZapfChancery-MediumItalic", /* FontName */ - "ITC Zapf Chancery Medium Italic", /* FullName */ - "ITC Zapf Chancery", /* FamilyName */ - "AdobeStandardEncoding", /* EncodingScheme */ + L"ITC Zapf Chancery Medium Italic", /* FullName */ + L"ITC Zapf Chancery", /* FamilyName */ + L"AdobeStandardEncoding", /* EncodingScheme */ FW_NORMAL, /* Weight */ -14, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/data/ZapfDingbats.c b/dlls/wineps.drv/data/ZapfDingbats.c index 2c7ce49cfdf..8b47eec6ff2 100644 --- a/dlls/wineps.drv/data/ZapfDingbats.c +++ b/dlls/wineps.drv/data/ZapfDingbats.c @@ -217,9 +217,9 @@ static const AFMMETRICS metrics[188] = const AFM PSDRV_ZapfDingbats = { "ZapfDingbats", /* FontName */ - "ITC Zapf Dingbats", /* FullName */ - "ITC Zapf Dingbats", /* FamilyName */ - "FontSpecific", /* EncodingScheme */ + L"ITC Zapf Dingbats", /* FullName */ + L"ITC Zapf Dingbats", /* FamilyName */ + L"FontSpecific", /* EncodingScheme */ FW_NORMAL, /* Weight */ 0, /* ItalicAngle */ FALSE, /* IsFixedPitch */ diff --git a/dlls/wineps.drv/font.c b/dlls/wineps.drv/font.c index ebe6fb6b07a..cc219724aee 100644 --- a/dlls/wineps.drv/font.c +++ b/dlls/wineps.drv/font.c @@ -44,7 +44,6 @@ HFONT CDECL PSDRV_SelectFont( PHYSDEV dev, HFONT hfont, UINT *aa_flags ) HFONT ret; LOGFONTW lf; BOOL subst = FALSE; - char FaceName[LF_FACESIZE];
if (!GetObjectW( hfont, sizeof(lf), &lf )) return 0;
@@ -54,36 +53,33 @@ HFONT CDECL PSDRV_SelectFont( PHYSDEV dev, HFONT hfont, UINT *aa_flags ) debugstr_w(lf.lfFaceName), lf.lfHeight, lf.lfItalic, lf.lfWeight);
- WideCharToMultiByte(CP_ACP, 0, lf.lfFaceName, -1, - FaceName, sizeof(FaceName), NULL, NULL); - - if(FaceName[0] == '\0') { + if(lf.lfFaceName[0] == '\0') { switch(lf.lfPitchAndFamily & 0xf0) { case FF_DONTCARE: break; case FF_ROMAN: case FF_SCRIPT: - strcpy(FaceName, "Times"); + wcscpy(lf.lfFaceName, L"Times"); break; case FF_SWISS: - strcpy(FaceName, "Helvetica"); + wcscpy(lf.lfFaceName, L"Helvetica"); break; case FF_MODERN: - strcpy(FaceName, "Courier"); + wcscpy(lf.lfFaceName, L"Courier"); break; case FF_DECORATIVE: - strcpy(FaceName, "Symbol"); + wcscpy(lf.lfFaceName, L"Symbol"); break; } }
- if(FaceName[0] == '\0') { + if(lf.lfFaceName[0] == '\0') { switch(lf.lfPitchAndFamily & 0x0f) { case VARIABLE_PITCH: - strcpy(FaceName, "Times"); + wcscpy(lf.lfFaceName, L"Times"); break; default: - strcpy(FaceName, "Courier"); + wcscpy(lf.lfFaceName, L"Courier"); break; } } @@ -94,21 +90,19 @@ HFONT CDECL PSDRV_SelectFont( PHYSDEV dev, HFONT hfont, UINT *aa_flags )
for (i = 0; i < physDev->pi->FontSubTableSize; ++i) { - if (!stricmp (FaceName, + if (!wcsicmp (lf.lfFaceName, physDev->pi->FontSubTable[i].pValueName)) { - TRACE ("substituting facename '%s' for '%s'\n", - (LPSTR) physDev->pi->FontSubTable[i].pData, FaceName); - if (strlen ((LPSTR) physDev->pi->FontSubTable[i].pData) < - LF_FACESIZE) + TRACE("substituting facename %s for %s\n", + debugstr_w((WCHAR *)physDev->pi->FontSubTable[i].pData), debugstr_w(lf.lfFaceName)); + if (wcslen((WCHAR *)physDev->pi->FontSubTable[i].pData) < LF_FACESIZE) { - strcpy (FaceName, - (LPSTR) physDev->pi->FontSubTable[i].pData); + wcscpy(lf.lfFaceName, (WCHAR *)physDev->pi->FontSubTable[i].pData); subst = TRUE; } else - WARN ("Facename '%s' is too long; ignoring substitution\n", - (LPSTR) physDev->pi->FontSubTable[i].pData); + WARN("Facename %s is too long; ignoring substitution\n", + debugstr_w((WCHAR *)physDev->pi->FontSubTable[i].pData)); break; } } @@ -123,7 +117,7 @@ HFONT CDECL PSDRV_SelectFont( PHYSDEV dev, HFONT hfont, UINT *aa_flags ) return ret; }
- PSDRV_SelectBuiltinFont(dev, hfont, &lf, FaceName); + PSDRV_SelectBuiltinFont(dev, hfont, &lf, lf.lfFaceName); next->funcs->pSelectFont( next, 0, aa_flags ); /* tell next driver that we selected a device font */ return hfont; } diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index 3385bfe90cf..6d1de9132c3 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -459,21 +459,21 @@ BOOL CDECL PSDRV_ResetDC( PHYSDEV dev, const DEVMODEW *lpInitData ) return TRUE; }
-static PRINTER_ENUM_VALUESA *load_font_sub_table( HANDLE printer, DWORD *num_entries ) +static PRINTER_ENUM_VALUESW *load_font_sub_table( HANDLE printer, DWORD *num_entries ) { DWORD res, needed, num; - PRINTER_ENUM_VALUESA *table = NULL; - static const char fontsubkey[] = "PrinterDriverData\FontSubTable"; + PRINTER_ENUM_VALUESW *table = NULL; + static const WCHAR fontsubkey[] = L"PrinterDriverData\FontSubTable";
*num_entries = 0;
- res = EnumPrinterDataExA( printer, fontsubkey, NULL, 0, &needed, &num ); + res = EnumPrinterDataExW( printer, fontsubkey, NULL, 0, &needed, &num ); if (res != ERROR_MORE_DATA) return NULL;
table = HeapAlloc( PSDRV_Heap, 0, needed ); if (!table) return NULL;
- res = EnumPrinterDataExA( printer, fontsubkey, (LPBYTE)table, needed, &needed, &num ); + res = EnumPrinterDataExW( printer, fontsubkey, (LPBYTE)table, needed, &needed, &num ); if (res != ERROR_SUCCESS) { HeapFree( PSDRV_Heap, 0, table ); @@ -579,7 +579,7 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCWSTR name) BOOL using_default_devmode = FALSE; int len;
- TRACE("'%s'\n", debugstr_w(name)); + TRACE("%s\n", debugstr_w(name));
LIST_FOR_EACH_ENTRY( pi, &printer_list, PRINTERINFO, entry ) { @@ -659,7 +659,7 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCWSTR name) afm = PSDRV_FindAFMinList(PSDRV_AFMFontList, font->Name); if(!afm) { TRACE( "Couldn't find AFM file for installed printer font '%s' - " - "ignoring\n", font->Name); + "ignoring\n", font->Name); } else { BOOL added; diff --git a/dlls/wineps.drv/ppd.c b/dlls/wineps.drv/ppd.c index 8b2249a7fe4..d116f8ebbc0 100644 --- a/dlls/wineps.drv/ppd.c +++ b/dlls/wineps.drv/ppd.c @@ -1091,7 +1091,7 @@ PPD *PSDRV_ParsePPD( const WCHAR *fname, HANDLE printer ) TRACE("'%s'\n", fn->Name);
LIST_FOR_EACH_ENTRY(page, &ppd->PageSizes, PAGESIZE, entry) { - TRACE("'%s' aka '%s' (%d) invoked by '%s'\n", page->Name, + TRACE("'%s' aka %s (%d) invoked by '%s'\n", page->Name, debugstr_w(page->FullName), page->WinPage, page->InvocationString); if(page->ImageableArea) TRACE("Area = %.2f,%.2f - %.2f, %.2f\n", diff --git a/dlls/wineps.drv/psdrv.h b/dlls/wineps.drv/psdrv.h index 63bd04d8cf1..038798df9eb 100644 --- a/dlls/wineps.drv/psdrv.h +++ b/dlls/wineps.drv/psdrv.h @@ -81,10 +81,10 @@ typedef struct { } WINMETRICS;
typedef struct _tagAFM { - LPCSTR FontName; - LPCSTR FullName; - LPCSTR FamilyName; - LPCSTR EncodingScheme; + const char *FontName; + const WCHAR *FullName; + const WCHAR *FamilyName; + const WCHAR *EncodingScheme; LONG Weight; /* FW_NORMAL etc. */ float ItalicAngle; BOOL IsFixedPitch; @@ -109,7 +109,7 @@ typedef struct _tagAFMLISTENTRY { } AFMLISTENTRY;
typedef struct _tagFONTFAMILY { - char *FamilyName; /* family name */ + WCHAR *FamilyName; /* family name */ AFMLISTENTRY *afmlist; /* list of afms for this family */ struct _tagFONTFAMILY *next; /* next family */ } FONTFAMILY; @@ -243,7 +243,7 @@ typedef struct PPD *ppd; PSDRV_DEVMODE *Devmode; FONTFAMILY *Fonts; - PPRINTER_ENUM_VALUESA FontSubTable; + PPRINTER_ENUM_VALUESW FontSubTable; DWORD FontSubTableSize; } PRINTERINFO;
@@ -545,7 +545,7 @@ const AFMMETRICS *PSDRV_UVMetrics(LONG UV, const AFM *afm) DECLSPEC_HIDDEN; SHORT PSDRV_CalcAvgCharWidth(const AFM *afm) DECLSPEC_HIDDEN;
extern BOOL PSDRV_SelectBuiltinFont(PHYSDEV dev, HFONT hfont, - LOGFONTW *plf, LPSTR FaceName) DECLSPEC_HIDDEN; + LOGFONTW *plf, WCHAR *face_name) DECLSPEC_HIDDEN; extern BOOL PSDRV_WriteSetBuiltinFont(PHYSDEV dev) DECLSPEC_HIDDEN; extern BOOL PSDRV_WriteBuiltinGlyphShow(PHYSDEV dev, LPCWSTR str, INT count) DECLSPEC_HIDDEN;
diff --git a/dlls/wineps.drv/type1afm.c b/dlls/wineps.drv/type1afm.c index c78753393c0..c5ecfb843f0 100644 --- a/dlls/wineps.drv/type1afm.c +++ b/dlls/wineps.drv/type1afm.c @@ -319,6 +319,32 @@ static BOOL ReadString(FILE *file, CHAR buffer[], INT bufsize, LPCSTR key, return TRUE; }
+static BOOL ReadStringW(FILE *file, CHAR *buffer, int size, const char *key, WCHAR **out) +{ + char *outA; + int len; + + if (!ReadString(file, buffer, size, key, &outA)) + return FALSE; + if (!outA) + { + *out = NULL; + return TRUE; + } + + len = MultiByteToWideChar(CP_ACP, 0, outA, -1, NULL, 0); + if (len) + *out = HeapAlloc(PSDRV_Heap, 0, len * sizeof(WCHAR)); + if (!len || !*out) + { + HeapFree(PSDRV_Heap, 0, outA); + return FALSE; + } + MultiByteToWideChar(CP_ACP, 0, outA, -1, *out, len); + HeapFree(PSDRV_Heap, 0, outA); + return TRUE; +} + /******************************************************************************* * ReadBBox * @@ -851,7 +877,7 @@ static VOID Unicodify(AFM *afm, OLD_AFMMETRICS *metrics) { INT i;
- if (strcmp(afm->EncodingScheme, "FontSpecific") == 0) + if (wcscmp(afm->EncodingScheme, L"FontSpecific") == 0) { for (i = 0; i < afm->NumofMetrics; ++i) { @@ -1028,8 +1054,9 @@ static BOOL BuildAFM(FILE *file) CHAR buffer[258]; /* allow for <cr>, <lf>, and <nul> */ AFM *afm; AFMMETRICS *metrics; - LPSTR font_name, full_name, family_name, encoding_scheme; - BOOL retval, added; + WCHAR *full_name, *family_name, *encoding_scheme; + char *font_name; + BOOL retval, added;
retval = ReadFontMetrics(file, buffer, sizeof(buffer), &afm); if (retval == FALSE || afm == NULL) @@ -1039,16 +1066,16 @@ static BOOL BuildAFM(FILE *file) if (retval == FALSE || font_name == NULL) goto cleanup_afm;
- retval = ReadString(file, buffer, sizeof(buffer), "FullName", &full_name); + retval = ReadStringW(file, buffer, sizeof(buffer), "FullName", &full_name); if (retval == FALSE || full_name == NULL) goto cleanup_font_name;
- retval = ReadString(file, buffer, sizeof(buffer), "FamilyName", + retval = ReadStringW(file, buffer, sizeof(buffer), "FamilyName", &family_name); if (retval == FALSE || family_name == NULL) goto cleanup_full_name;
- retval = ReadString(file, buffer, sizeof(buffer), "EncodingScheme", + retval = ReadStringW(file, buffer, sizeof(buffer), "EncodingScheme", &encoding_scheme); if (retval == FALSE || encoding_scheme == NULL) goto cleanup_family_name;
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/Makefile.in | 1 + dlls/wineps.drv/init.c | 1 - dlls/wineps.drv/unixlib.c | 294 ++++++++++++++++++++++++++++++++++++ 3 files changed, 295 insertions(+), 1 deletion(-)
diff --git a/dlls/wineps.drv/Makefile.in b/dlls/wineps.drv/Makefile.in index 4dd315757da..aa6bdf60996 100644 --- a/dlls/wineps.drv/Makefile.in +++ b/dlls/wineps.drv/Makefile.in @@ -1,6 +1,7 @@ MODULE = wineps.drv UNIXLIB = wineps.so IMPORTS = user32 gdi32 winspool advapi32 win32u +UNIX_LIBS = -lwin32u
C_SRCS = \ afm.c \ diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index 6d1de9132c3..a33ec19e741 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -697,7 +697,6 @@ static struct gdi_dc_funcs psdrv_funcs = .pGetCharWidth = PSDRV_GetCharWidth, .pGetTextExtentExPoint = PSDRV_GetTextExtentExPoint, .pGetTextMetrics = PSDRV_GetTextMetrics, - .pSelectFont = PSDRV_SelectFont, .priority = GDI_PRIORITY_GRAPHICS_DRV };
diff --git a/dlls/wineps.drv/unixlib.c b/dlls/wineps.drv/unixlib.c index 2c80e2f75e2..859d612320c 100644 --- a/dlls/wineps.drv/unixlib.c +++ b/dlls/wineps.drv/unixlib.c @@ -31,12 +31,23 @@
#include "psdrv.h" #include "unixlib.h" +#include "ntgdi.h" #include "wine/gdi_driver.h" #include "wine/debug.h" #include "wine/wingdi16.h"
WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
+static const WCHAR timesW[] = {'T','i','m','e','s',0}; +static const WCHAR helveticaW[] = {'H','e','l','v','e','t','i','c','a',0}; +static const WCHAR courierW[] = {'C','o','u','r','i','e','r',0}; +static const WCHAR symbolW[] = {'S','y','m','b','o','l',0}; +static const WCHAR arialW[] = {'A','r','i','a','l',0}; +static const WCHAR systemW[] = {'S','y','s','t','e','m',0}; +static const WCHAR times_new_romanW[] = {'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n',0}; +static const WCHAR courier_newW[] = {'C','o','u','r','i','e','r',' ','N','e','w',0}; + + /* copied from kernelbase */ static int muldiv(int a, int b, int c) { @@ -763,6 +774,288 @@ static int CDECL ext_escape(PHYSDEV dev, int escape, int input_size, const void } }
+static BOOL select_download_font(PHYSDEV dev) +{ + PSDRV_PDEVICE *pdev = get_psdrv_dev(dev); + + pdev->font.fontloc = Download; + pdev->font.fontinfo.Download = NULL; + return TRUE; +} + +static inline float gdi_round(float f) +{ + return f > 0 ? f + 0.5 : f - 0.5; +} + +static void scale_font(const AFM *afm, LONG height, PSFONT *font, TEXTMETRICW *tm) +{ + const WINMETRICS *wm = &(afm->WinMetrics); + USHORT units_per_em, win_ascent, win_descent; + SHORT ascender, descender, line_gap, avg_char_width; + + TRACE("'%s' %i\n", afm->FontName, (int)height); + + if (height < 0) /* match em height */ + { + font->fontinfo.Builtin.scale = -((float)height / (float)wm->usUnitsPerEm); + } + else /* match cell height */ + { + font->fontinfo.Builtin.scale = (float)height / + (float)(wm->usWinAscent + wm->usWinDescent); + } + + font->size.xx = (INT)gdi_round(font->fontinfo.Builtin.scale * (float)wm->usUnitsPerEm); + font->size.xy = font->size.yx = 0; + font->size.yy = -(INT)gdi_round(font->fontinfo.Builtin.scale * (float)wm->usUnitsPerEm); + + units_per_em = (USHORT)gdi_round((float)wm->usUnitsPerEm * font->fontinfo.Builtin.scale); + ascender = (SHORT)gdi_round((float)wm->sAscender * font->fontinfo.Builtin.scale); + descender = (SHORT)gdi_round((float)wm->sDescender * font->fontinfo.Builtin.scale); + line_gap = (SHORT)gdi_round((float)wm->sLineGap * font->fontinfo.Builtin.scale); + win_ascent = (USHORT)gdi_round((float)wm->usWinAscent * font->fontinfo.Builtin.scale); + win_descent = (USHORT)gdi_round((float)wm->usWinDescent * font->fontinfo.Builtin.scale); + avg_char_width = (SHORT)gdi_round((float)wm->sAvgCharWidth * font->fontinfo.Builtin.scale); + + tm->tmAscent = (LONG)win_ascent; + tm->tmDescent = (LONG)win_descent; + tm->tmHeight = tm->tmAscent + tm->tmDescent; + + tm->tmInternalLeading = tm->tmHeight - (LONG)units_per_em; + if (tm->tmInternalLeading < 0) + tm->tmInternalLeading = 0; + + tm->tmExternalLeading = + (LONG)(ascender - descender + line_gap) - tm->tmHeight; + if (tm->tmExternalLeading < 0) + tm->tmExternalLeading = 0; + + tm->tmAveCharWidth = (LONG)avg_char_width; + + tm->tmWeight = afm->Weight; + tm->tmItalic = (afm->ItalicAngle != 0.0); + tm->tmUnderlined = 0; + tm->tmStruckOut = 0; + tm->tmFirstChar = (WCHAR)(afm->Metrics[0].UV); + tm->tmLastChar = (WCHAR)(afm->Metrics[afm->NumofMetrics - 1].UV); + tm->tmDefaultChar = 0x001f; /* Win2K does this - FIXME? */ + tm->tmBreakChar = tm->tmFirstChar; /* should be 'space' */ + + tm->tmPitchAndFamily = TMPF_DEVICE | TMPF_VECTOR; + if (!afm->IsFixedPitch) + tm->tmPitchAndFamily |= TMPF_FIXED_PITCH; /* yes, it's backwards */ + if (wm->usUnitsPerEm != 1000) + tm->tmPitchAndFamily |= TMPF_TRUETYPE; + + tm->tmCharSet = ANSI_CHARSET; /* FIXME */ + tm->tmOverhang = 0; + + /* + * This is kludgy. font->scale is used in several places in the driver + * to adjust PostScript-style metrics. Since these metrics have been + * "normalized" to an em-square size of 1000, font->scale needs to be + * similarly adjusted.. + */ + + font->fontinfo.Builtin.scale *= (float)wm->usUnitsPerEm / 1000.0; + + tm->tmMaxCharWidth = (LONG)gdi_round( + (afm->FontBBox.urx - afm->FontBBox.llx) * font->fontinfo.Builtin.scale); + + font->underlinePosition = afm->UnderlinePosition * font->fontinfo.Builtin.scale; + font->underlineThickness = afm->UnderlineThickness * font->fontinfo.Builtin.scale; + font->strikeoutPosition = tm->tmAscent / 2; + font->strikeoutThickness = font->underlineThickness; + + TRACE("Selected PS font '%s' size %d weight %d.\n", afm->FontName, + font->size.xx, (int)tm->tmWeight); + TRACE("H = %d As = %d Des = %d IL = %d EL = %d\n", (int)tm->tmHeight, + (int)tm->tmAscent, (int)tm->tmDescent, (int)tm->tmInternalLeading, + (int)tm->tmExternalLeading); +} + +static inline BOOL is_stock_font(HFONT font) +{ + int i; + for (i = OEM_FIXED_FONT; i <= DEFAULT_GUI_FONT; i++) + { + if (i != DEFAULT_PALETTE && font == GetStockObject(i)) return TRUE; + } + return FALSE; +} + +static BOOL select_builtin_font(PHYSDEV dev, HFONT hfont, + LOGFONTW *plf, WCHAR *face_name) +{ + PSDRV_PDEVICE *pdev = get_psdrv_dev(dev); + AFMLISTENTRY *afmle; + FONTFAMILY *family; + BOOL bd = FALSE, it = FALSE; + LONG height; + + TRACE("Trying to find facename %s\n", debugstr_w(face_name)); + + /* Look for a matching font family */ + for (family = pdev->pi->Fonts; family; family = family->next) + { + if (!wcsicmp(face_name, family->FamilyName)) + break; + } + + if (!family) + { + /* Fallback for Window's font families to common PostScript families */ + if (!wcscmp(face_name, arialW)) + wcscpy(face_name, helveticaW); + else if (!wcscmp(face_name, systemW)) + wcscpy(face_name, helveticaW); + else if (!wcscmp(face_name, times_new_romanW)) + wcscpy(face_name, timesW); + else if (!wcscmp(face_name, courier_newW)) + wcscpy(face_name, courierW); + + for (family = pdev->pi->Fonts; family; family = family->next) + { + if (!wcscmp(face_name, family->FamilyName)) + break; + } + } + /* If all else fails, use the first font defined for the printer */ + if (!family) + family = pdev->pi->Fonts; + + TRACE("Got family %s\n", debugstr_w(family->FamilyName)); + + if (plf->lfItalic) + it = TRUE; + if (plf->lfWeight > 550) + bd = TRUE; + + for (afmle = family->afmlist; afmle; afmle = afmle->next) + { + if (bd == (afmle->afm->Weight == FW_BOLD) && + it == (afmle->afm->ItalicAngle != 0.0)) + break; + } + if (!afmle) + afmle = family->afmlist; /* not ideal */ + + TRACE("Got font '%s'\n", afmle->afm->FontName); + + pdev->font.fontloc = Builtin; + pdev->font.fontinfo.Builtin.afm = afmle->afm; + + height = plf->lfHeight; + /* stock fonts ignore the mapping mode */ + if (!is_stock_font(hfont)) + { + POINT pts[2]; + pts[0].x = pts[0].y = pts[1].x = 0; + pts[1].y = height; + NtGdiTransformPoints(dev->hdc, pts, pts, 2, NtGdiLPtoDP); + height = pts[1].y - pts[0].y; + } + scale_font(pdev->font.fontinfo.Builtin.afm, height, + &(pdev->font), &(pdev->font.fontinfo.Builtin.tm)); + + + /* Does anyone know if these are supposed to be reversed like this? */ + pdev->font.fontinfo.Builtin.tm.tmDigitizedAspectX = pdev->logPixelsY; + pdev->font.fontinfo.Builtin.tm.tmDigitizedAspectY = pdev->logPixelsX; + return TRUE; +} + +static HFONT CDECL select_font(PHYSDEV dev, HFONT hfont, UINT *aa_flags) +{ + PSDRV_PDEVICE *pdev = get_psdrv_dev(dev); + PHYSDEV next = GET_NEXT_PHYSDEV(dev, pSelectFont); + HFONT ret; + LOGFONTW lf; + BOOL subst = FALSE; + + if (!NtGdiExtGetObjectW(hfont, sizeof(lf), &lf)) return 0; + + *aa_flags = GGO_BITMAP; /* no anti-aliasing on printer devices */ + + TRACE("FaceName = %s Height = %d Italic = %d Weight = %d\n", + debugstr_w(lf.lfFaceName), (int)lf.lfHeight, lf.lfItalic, + (int)lf.lfWeight); + + if (lf.lfFaceName[0] == '\0') + { + switch(lf.lfPitchAndFamily & 0xf0) + { + case FF_DONTCARE: + break; + case FF_ROMAN: + case FF_SCRIPT: + wcscpy(lf.lfFaceName, timesW); + break; + case FF_SWISS: + wcscpy(lf.lfFaceName, helveticaW); + break; + case FF_MODERN: + wcscpy(lf.lfFaceName, courierW); + break; + case FF_DECORATIVE: + wcscpy(lf.lfFaceName, symbolW); + break; + } + } + + if (lf.lfFaceName[0] == '\0') + { + switch(lf.lfPitchAndFamily & 0x0f) + { + case VARIABLE_PITCH: + wcscpy(lf.lfFaceName, timesW); + break; + default: + wcscpy(lf.lfFaceName, courierW); + break; + } + } + + if (pdev->pi->FontSubTableSize != 0) + { + DWORD i; + + for (i = 0; i < pdev->pi->FontSubTableSize; ++i) + { + if (!wcsicmp(lf.lfFaceName, pdev->pi->FontSubTable[i].pValueName)) + { + TRACE("substituting facename %s for %s\n", + debugstr_w((WCHAR *)pdev->pi->FontSubTable[i].pData), debugstr_w(lf.lfFaceName)); + if (wcslen((WCHAR *)pdev->pi->FontSubTable[i].pData) < LF_FACESIZE) + { + wcscpy(lf.lfFaceName, (WCHAR *)pdev->pi->FontSubTable[i].pData); + subst = TRUE; + } + else + { + WARN("Facename %s is too long; ignoring substitution\n", + debugstr_w((WCHAR *)pdev->pi->FontSubTable[i].pData)); + } + break; + } + } + } + + pdev->font.escapement = lf.lfEscapement; + pdev->font.set = UNSET; + + if (!subst && ((ret = next->funcs->pSelectFont(next, hfont, aa_flags)))) + { + select_download_font(dev); + return ret; + } + + select_builtin_font(dev, hfont, &lf, lf.lfFaceName); + next->funcs->pSelectFont(next, 0, aa_flags); /* tell next driver that we selected a device font */ + return hfont; +} + static NTSTATUS init_dc(void *arg) { struct init_dc_params *params = arg; @@ -770,6 +1063,7 @@ static NTSTATUS init_dc(void *arg) params->funcs->pGetDeviceCaps = get_device_caps; params->funcs->pResetDC = reset_dc; params->funcs->pExtEscape = ext_escape; + params->funcs->pSelectFont = select_font; return TRUE; }
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/builtin.c | 80 ------------------------------------- dlls/wineps.drv/init.c | 1 - dlls/wineps.drv/printproc.c | 6 --- dlls/wineps.drv/psdrv.h | 1 - dlls/wineps.drv/unixlib.c | 78 ++++++++++++++++++++++++++++++++++++ 5 files changed, 78 insertions(+), 88 deletions(-)
diff --git a/dlls/wineps.drv/builtin.c b/dlls/wineps.drv/builtin.c index 5100539764d..f661aeaa591 100644 --- a/dlls/wineps.drv/builtin.c +++ b/dlls/wineps.drv/builtin.c @@ -374,83 +374,3 @@ BOOL CDECL PSDRV_GetCharWidth(PHYSDEV dev, UINT first, UINT count, const WCHAR *
return TRUE; } - - -/*********************************************************************** - * PSDRV_GetFontMetric - */ -static UINT PSDRV_GetFontMetric(HDC hdc, const AFM *afm, - NEWTEXTMETRICEXW *ntmx, ENUMLOGFONTEXW *elfx) -{ - /* ntmx->ntmTm is NEWTEXTMETRICW; compatible w/ TEXTMETRICW per Win32 doc */ - - TEXTMETRICW *tm = (TEXTMETRICW *)&(ntmx->ntmTm); - LOGFONTW *lf = &(elfx->elfLogFont); - PSFONT font; - - memset(ntmx, 0, sizeof(*ntmx)); - memset(elfx, 0, sizeof(*elfx)); - - ScaleFont(afm, -(LONG)(afm->WinMetrics.usUnitsPerEm), &font, tm); - - lf->lfHeight = tm->tmHeight; - lf->lfWidth = tm->tmAveCharWidth; - lf->lfWeight = tm->tmWeight; - lf->lfItalic = tm->tmItalic; - lf->lfCharSet = tm->tmCharSet; - - lf->lfPitchAndFamily = (afm->IsFixedPitch) ? FIXED_PITCH : VARIABLE_PITCH; - - lstrcpynW(lf->lfFaceName, afm->FamilyName, LF_FACESIZE); - - return DEVICE_FONTTYPE; -} - -/*********************************************************************** - * PSDRV_EnumFonts - */ -BOOL CDECL PSDRV_EnumFonts( PHYSDEV dev, LPLOGFONTW plf, FONTENUMPROCW proc, LPARAM lp ) -{ - PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); - PHYSDEV next = GET_NEXT_PHYSDEV( dev, pEnumFonts ); - ENUMLOGFONTEXW lf; - NEWTEXTMETRICEXW tm; - BOOL ret; - AFMLISTENTRY *afmle; - FONTFAMILY *family; - - ret = next->funcs->pEnumFonts( next, plf, proc, lp ); - if (!ret) return FALSE; - - if( plf && plf->lfFaceName[0] ) { - TRACE("lfFaceName = %s\n", debugstr_w(plf->lfFaceName)); - for(family = physDev->pi->Fonts; family; family = family->next) { - if(!wcsncmp(plf->lfFaceName, family->FamilyName, - wcslen(family->FamilyName))) - break; - } - if(family) { - for(afmle = family->afmlist; afmle; afmle = afmle->next) { - UINT fm; - - TRACE("Got '%s'\n", afmle->afm->FontName); - fm = PSDRV_GetFontMetric( dev->hdc, afmle->afm, &tm, &lf ); - if (!(ret = (*proc)( &lf.elfLogFont, (TEXTMETRICW *)&tm, fm, lp ))) - break; - } - } - } else { - - TRACE("lfFaceName = NULL\n"); - for(family = physDev->pi->Fonts; family; family = family->next) { - UINT fm; - - afmle = family->afmlist; - TRACE("Got '%s'\n", afmle->afm->FontName); - fm = PSDRV_GetFontMetric( dev->hdc, afmle->afm, &tm, &lf ); - if (!(ret = (*proc)( &lf.elfLogFont, (TEXTMETRICW *)&tm, fm, lp ))) - break; - } - } - return ret; -} diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index a33ec19e741..576021c6b1e 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -693,7 +693,6 @@ static struct gdi_dc_funcs psdrv_funcs = .pCreateCompatibleDC = PSDRV_CreateCompatibleDC, .pCreateDC = PSDRV_CreateDC, .pDeleteDC = PSDRV_DeleteDC, - .pEnumFonts = PSDRV_EnumFonts, .pGetCharWidth = PSDRV_GetCharWidth, .pGetTextExtentExPoint = PSDRV_GetTextExtentExPoint, .pGetTextMetrics = PSDRV_GetTextMetrics, diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index d7f9ab65369..bd4e79bb96f 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -155,11 +155,6 @@ static struct pp_data* get_handle_data(HANDLE pp) return ret; }
-static BOOL CDECL font_EnumFonts(PHYSDEV dev, LOGFONTW *lf, FONTENUMPROCW proc, LPARAM lp) -{ - return EnumFontFamiliesExW(dev->hdc, lf, proc, lp, 0); -} - static BOOL CDECL font_GetCharWidth(PHYSDEV dev, UINT first, UINT count, const WCHAR *chars, INT *buffer) { XFORM old, xform = { .eM11 = 1.0f }; @@ -204,7 +199,6 @@ static HFONT CDECL font_SelectFont(PHYSDEV dev, HFONT hfont, UINT *aa_flags)
static const struct gdi_dc_funcs font_funcs = { - .pEnumFonts = font_EnumFonts, .pGetCharWidth = font_GetCharWidth, .pGetTextExtentExPoint = font_GetTextExtentExPoint, .pGetTextMetrics = font_GetTextMetrics, diff --git a/dlls/wineps.drv/psdrv.h b/dlls/wineps.drv/psdrv.h index 038798df9eb..add30651043 100644 --- a/dlls/wineps.drv/psdrv.h +++ b/dlls/wineps.drv/psdrv.h @@ -429,7 +429,6 @@ extern BOOL CDECL PSDRV_Chord( PHYSDEV dev, INT left, INT top, INT right, INT bo extern BOOL CDECL PSDRV_Ellipse( PHYSDEV dev, INT left, INT top, INT right, INT bottom) DECLSPEC_HIDDEN; extern INT CDECL PSDRV_EndDoc( PHYSDEV dev ) DECLSPEC_HIDDEN; extern INT CDECL PSDRV_EndPage( PHYSDEV dev ) DECLSPEC_HIDDEN; -extern BOOL CDECL PSDRV_EnumFonts( PHYSDEV dev, LPLOGFONTW plf, FONTENUMPROCW proc, LPARAM lp ) DECLSPEC_HIDDEN; extern INT CDECL PSDRV_ExtEscape( PHYSDEV dev, INT nEscape, INT cbInput, LPCVOID in_data, INT cbOutput, LPVOID out_data ) DECLSPEC_HIDDEN; extern BOOL CDECL PSDRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, diff --git a/dlls/wineps.drv/unixlib.c b/dlls/wineps.drv/unixlib.c index 859d612320c..1dd9aafadb0 100644 --- a/dlls/wineps.drv/unixlib.c +++ b/dlls/wineps.drv/unixlib.c @@ -1056,6 +1056,83 @@ static HFONT CDECL select_font(PHYSDEV dev, HFONT hfont, UINT *aa_flags) return hfont; }
+static UINT get_font_metric(HDC hdc, const AFM *afm, + NEWTEXTMETRICEXW *ntmx, ENUMLOGFONTEXW *elfx) +{ + /* ntmx->ntmTm is NEWTEXTMETRICW; compatible w/ TEXTMETRICW per Win32 doc */ + TEXTMETRICW *tm = (TEXTMETRICW *)&(ntmx->ntmTm); + LOGFONTW *lf = &(elfx->elfLogFont); + PSFONT font; + + memset(ntmx, 0, sizeof(*ntmx)); + memset(elfx, 0, sizeof(*elfx)); + + scale_font(afm, -(LONG)afm->WinMetrics.usUnitsPerEm, &font, tm); + + lf->lfHeight = tm->tmHeight; + lf->lfWidth = tm->tmAveCharWidth; + lf->lfWeight = tm->tmWeight; + lf->lfItalic = tm->tmItalic; + lf->lfCharSet = tm->tmCharSet; + + lf->lfPitchAndFamily = afm->IsFixedPitch ? FIXED_PITCH : VARIABLE_PITCH; + + lstrcpynW(lf->lfFaceName, afm->FamilyName, LF_FACESIZE); + return DEVICE_FONTTYPE; +} + +static BOOL CDECL enum_fonts(PHYSDEV dev, LPLOGFONTW plf, FONTENUMPROCW proc, LPARAM lp) +{ + PSDRV_PDEVICE *pdev = get_psdrv_dev(dev); + PHYSDEV next = GET_NEXT_PHYSDEV(dev, pEnumFonts); + ENUMLOGFONTEXW lf; + NEWTEXTMETRICEXW tm; + BOOL ret; + AFMLISTENTRY *afmle; + FONTFAMILY *family; + + ret = next->funcs->pEnumFonts(next, plf, proc, lp); + if (!ret) return FALSE; + + if (plf && plf->lfFaceName[0]) + { + TRACE("lfFaceName = %s\n", debugstr_w(plf->lfFaceName)); + for (family = pdev->pi->Fonts; family; family = family->next) + { + if (!wcsncmp(plf->lfFaceName, family->FamilyName, + wcslen(family->FamilyName))) + break; + } + if (family) + { + for (afmle = family->afmlist; afmle; afmle = afmle->next) + { + UINT fm; + + TRACE("Got '%s'\n", afmle->afm->FontName); + fm = get_font_metric(dev->hdc, afmle->afm, &tm, &lf); + if (!(ret = (*proc)(&lf.elfLogFont, (TEXTMETRICW *)&tm, fm, lp))) + break; + } + } + } + else + { + TRACE("lfFaceName = NULL\n"); + for (family = pdev->pi->Fonts; family; family = family->next) + { + UINT fm; + + afmle = family->afmlist; + TRACE("Got '%s'\n", afmle->afm->FontName); + fm = get_font_metric(dev->hdc, afmle->afm, &tm, &lf); + if (!(ret = (*proc)(&lf.elfLogFont, (TEXTMETRICW *)&tm, fm, lp))) + break; + } + } + return ret; +} + static NTSTATUS init_dc(void *arg) { struct init_dc_params *params = arg; @@ -1064,6 +1141,7 @@ static NTSTATUS init_dc(void *arg) params->funcs->pResetDC = reset_dc; params->funcs->pExtEscape = ext_escape; params->funcs->pSelectFont = select_font; + params->funcs->pEnumFonts = enum_fonts; return TRUE; }
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/Makefile.in | 2 +- dlls/wineps.drv/builtin.c | 35 ---------------------- dlls/wineps.drv/init.c | 1 - dlls/wineps.drv/printproc.c | 13 -------- dlls/wineps.drv/psdrv.h | 1 - dlls/wineps.drv/unixlib.c | 59 +++++++++++++++++++++++++++++++++++++ 6 files changed, 60 insertions(+), 51 deletions(-)
diff --git a/dlls/wineps.drv/Makefile.in b/dlls/wineps.drv/Makefile.in index aa6bdf60996..97e75bf02b8 100644 --- a/dlls/wineps.drv/Makefile.in +++ b/dlls/wineps.drv/Makefile.in @@ -1,7 +1,7 @@ MODULE = wineps.drv UNIXLIB = wineps.so IMPORTS = user32 gdi32 winspool advapi32 win32u -UNIX_LIBS = -lwin32u +UNIX_LIBS = -lwin32u -lm
C_SRCS = \ afm.c \ diff --git a/dlls/wineps.drv/builtin.c b/dlls/wineps.drv/builtin.c index f661aeaa591..270ce1bef8a 100644 --- a/dlls/wineps.drv/builtin.c +++ b/dlls/wineps.drv/builtin.c @@ -339,38 +339,3 @@ BOOL CDECL PSDRV_GetTextExtentExPoint(PHYSDEV dev, LPCWSTR str, INT count, LPINT } return TRUE; } - -/*********************************************************************** - * PSDRV_GetCharWidth - */ -BOOL CDECL PSDRV_GetCharWidth(PHYSDEV dev, UINT first, UINT count, const WCHAR *chars, INT *buffer) -{ - PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); - UINT i, c; - - if (physDev->font.fontloc == Download) - { - dev = GET_NEXT_PHYSDEV( dev, pGetCharWidth ); - return dev->funcs->pGetCharWidth( dev, first, count, chars, buffer ); - } - - TRACE("U+%.4X +%u\n", first, count); - - for (i = 0; i < count; ++i) - { - c = chars ? chars[i] : first + i; - - if (c > 0xffff) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - *buffer = floor( PSDRV_UVMetrics(c, physDev->font.fontinfo.Builtin.afm)->WX - * physDev->font.fontinfo.Builtin.scale + 0.5 ); - TRACE("U+%.4X: %i\n", i, *buffer); - ++buffer; - } - - return TRUE; -} diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index 576021c6b1e..8c2c6d4af4b 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -693,7 +693,6 @@ static struct gdi_dc_funcs psdrv_funcs = .pCreateCompatibleDC = PSDRV_CreateCompatibleDC, .pCreateDC = PSDRV_CreateDC, .pDeleteDC = PSDRV_DeleteDC, - .pGetCharWidth = PSDRV_GetCharWidth, .pGetTextExtentExPoint = PSDRV_GetTextExtentExPoint, .pGetTextMetrics = PSDRV_GetTextMetrics, .priority = GDI_PRIORITY_GRAPHICS_DRV diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index bd4e79bb96f..417766d4093 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -155,18 +155,6 @@ static struct pp_data* get_handle_data(HANDLE pp) return ret; }
-static BOOL CDECL font_GetCharWidth(PHYSDEV dev, UINT first, UINT count, const WCHAR *chars, INT *buffer) -{ - XFORM old, xform = { .eM11 = 1.0f }; - BOOL ret; - - GetWorldTransform(dev->hdc, &old); - SetWorldTransform(dev->hdc, &xform); - ret = NtGdiGetCharWidthW(dev->hdc, first, count, (WCHAR *)chars, NTGDI_GETCHARWIDTH_INT, buffer); - SetWorldTransform(dev->hdc, &old); - return ret; -} - static BOOL CDECL font_GetTextExtentExPoint(PHYSDEV dev, const WCHAR *str, INT count, INT *dxs) { SIZE size; @@ -199,7 +187,6 @@ static HFONT CDECL font_SelectFont(PHYSDEV dev, HFONT hfont, UINT *aa_flags)
static const struct gdi_dc_funcs font_funcs = { - .pGetCharWidth = font_GetCharWidth, .pGetTextExtentExPoint = font_GetTextExtentExPoint, .pGetTextMetrics = font_GetTextMetrics, .pSelectFont = font_SelectFont, diff --git a/dlls/wineps.drv/psdrv.h b/dlls/wineps.drv/psdrv.h index add30651043..a1eb444ad14 100644 --- a/dlls/wineps.drv/psdrv.h +++ b/dlls/wineps.drv/psdrv.h @@ -434,7 +434,6 @@ extern INT CDECL PSDRV_ExtEscape( PHYSDEV dev, INT nEscape, INT cbInput, LPCVOID extern BOOL CDECL PSDRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, const RECT *lprect, LPCWSTR str, UINT count, const INT *lpDx ) DECLSPEC_HIDDEN; extern BOOL CDECL PSDRV_FillPath( PHYSDEV dev ) DECLSPEC_HIDDEN; -extern BOOL CDECL PSDRV_GetCharWidth(PHYSDEV dev, UINT first, UINT count, const WCHAR *chars, INT *buffer) DECLSPEC_HIDDEN; extern BOOL CDECL PSDRV_GetTextExtentExPoint(PHYSDEV dev, LPCWSTR str, INT count, LPINT alpDx) DECLSPEC_HIDDEN; extern BOOL CDECL PSDRV_GetTextMetrics(PHYSDEV dev, TEXTMETRICW *metrics) DECLSPEC_HIDDEN; extern BOOL CDECL PSDRV_LineTo(PHYSDEV dev, INT x, INT y) DECLSPEC_HIDDEN; diff --git a/dlls/wineps.drv/unixlib.c b/dlls/wineps.drv/unixlib.c index 1dd9aafadb0..283c5b8d4a7 100644 --- a/dlls/wineps.drv/unixlib.c +++ b/dlls/wineps.drv/unixlib.c @@ -25,6 +25,8 @@ #endif
#include <stdarg.h> +#include <stdlib.h> +#include <math.h>
#include "windef.h" #include "winbase.h" @@ -1133,6 +1135,62 @@ static BOOL CDECL enum_fonts(PHYSDEV dev, LPLOGFONTW plf, FONTENUMPROCW proc, LP return ret; }
+static int metrics_by_uv(const void *a, const void *b) +{ + return (int)(((const AFMMETRICS *)a)->UV - ((const AFMMETRICS *)b)->UV); +} + +const AFMMETRICS *uv_metrics(LONG uv, const AFM *afm) +{ + const AFMMETRICS *needle; + AFMMETRICS key; + + /* + * Ugly work-around for symbol fonts. Wine is sending characters which + * belong in the Unicode private use range (U+F020 - U+F0FF) as ASCII + * characters (U+0020 - U+00FF). + */ + if ((afm->Metrics->UV & 0xff00) == 0xf000 && uv < 0x100) + uv |= 0xf000; + + key.UV = uv; + needle = bsearch(&key, afm->Metrics, afm->NumofMetrics, sizeof(AFMMETRICS), metrics_by_uv); + if (!needle) + { + WARN("No glyph for U+%.4X in '%s'\n", (int)uv, afm->FontName); + needle = afm->Metrics; + } + return needle; +} + +static BOOL CDECL get_char_width(PHYSDEV dev, UINT first, UINT count, const WCHAR *chars, INT *buffer) +{ + PSDRV_PDEVICE *pdev = get_psdrv_dev(dev); + UINT i, c; + + if (pdev->font.fontloc == Download) + { + dev = GET_NEXT_PHYSDEV(dev, pGetCharWidth); + return dev->funcs->pGetCharWidth(dev, first, count, chars, buffer); + } + + TRACE("U+%.4X +%u\n", first, count); + + for (i = 0; i < count; ++i) + { + c = chars ? chars[i] : first + i; + + if (c > 0xffff) + return FALSE; + + *buffer = floor(uv_metrics(c, pdev->font.fontinfo.Builtin.afm)->WX + * pdev->font.fontinfo.Builtin.scale + 0.5); + TRACE("U+%.4X: %i\n", i, *buffer); + ++buffer; + } + return TRUE; +} + static NTSTATUS init_dc(void *arg) { struct init_dc_params *params = arg; @@ -1142,6 +1200,7 @@ static NTSTATUS init_dc(void *arg) params->funcs->pExtEscape = ext_escape; params->funcs->pSelectFont = select_font; params->funcs->pEnumFonts = enum_fonts; + params->funcs->pGetCharWidth = get_char_width; return TRUE; }
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/init.c | 1 - dlls/wineps.drv/unixlib.c | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index 8c2c6d4af4b..66c052db27c 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -694,7 +694,6 @@ static struct gdi_dc_funcs psdrv_funcs = .pCreateDC = PSDRV_CreateDC, .pDeleteDC = PSDRV_DeleteDC, .pGetTextExtentExPoint = PSDRV_GetTextExtentExPoint, - .pGetTextMetrics = PSDRV_GetTextMetrics, .priority = GDI_PRIORITY_GRAPHICS_DRV };
diff --git a/dlls/wineps.drv/unixlib.c b/dlls/wineps.drv/unixlib.c index 283c5b8d4a7..d7f8eb7e9a9 100644 --- a/dlls/wineps.drv/unixlib.c +++ b/dlls/wineps.drv/unixlib.c @@ -1191,6 +1191,21 @@ static BOOL CDECL get_char_width(PHYSDEV dev, UINT first, UINT count, const WCHA return TRUE; }
+static BOOL CDECL get_text_metrics(PHYSDEV dev, TEXTMETRICW *metrics) +{ + PSDRV_PDEVICE *pdev = get_psdrv_dev(dev); + + if (pdev->font.fontloc == Download) + { + dev = GET_NEXT_PHYSDEV(dev, pGetTextMetrics); + return dev->funcs->pGetTextMetrics(dev, metrics); + } + + memcpy(metrics, &(pdev->font.fontinfo.Builtin.tm), + sizeof(pdev->font.fontinfo.Builtin.tm)); + return TRUE; +} + static NTSTATUS init_dc(void *arg) { struct init_dc_params *params = arg; @@ -1201,6 +1216,7 @@ static NTSTATUS init_dc(void *arg) params->funcs->pSelectFont = select_font; params->funcs->pEnumFonts = enum_fonts; params->funcs->pGetCharWidth = get_char_width; + params->funcs->pGetTextMetrics = get_text_metrics; return TRUE; }
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/init.c | 1 - dlls/wineps.drv/unixlib.c | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index 66c052db27c..b08f02ddb11 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -693,7 +693,6 @@ static struct gdi_dc_funcs psdrv_funcs = .pCreateCompatibleDC = PSDRV_CreateCompatibleDC, .pCreateDC = PSDRV_CreateDC, .pDeleteDC = PSDRV_DeleteDC, - .pGetTextExtentExPoint = PSDRV_GetTextExtentExPoint, .priority = GDI_PRIORITY_GRAPHICS_DRV };
diff --git a/dlls/wineps.drv/unixlib.c b/dlls/wineps.drv/unixlib.c index d7f8eb7e9a9..72f63c81300 100644 --- a/dlls/wineps.drv/unixlib.c +++ b/dlls/wineps.drv/unixlib.c @@ -1206,6 +1206,28 @@ static BOOL CDECL get_text_metrics(PHYSDEV dev, TEXTMETRICW *metrics) return TRUE; }
+static BOOL CDECL get_text_extent_ex_point(PHYSDEV dev, const WCHAR *str, int count, int *dx) +{ + PSDRV_PDEVICE *pdev = get_psdrv_dev(dev); + int i; + float width = 0.0; + + if (pdev->font.fontloc == Download) + { + dev = GET_NEXT_PHYSDEV(dev, pGetTextExtentExPoint); + return dev->funcs->pGetTextExtentExPoint(dev, str, count, dx); + } + + TRACE("%s %i\n", debugstr_wn(str, count), count); + + for (i = 0; i < count; ++i) + { + width += uv_metrics(str[i], pdev->font.fontinfo.Builtin.afm)->WX; + dx[i] = width * pdev->font.fontinfo.Builtin.scale; + } + return TRUE; +} + static NTSTATUS init_dc(void *arg) { struct init_dc_params *params = arg; @@ -1217,6 +1239,7 @@ static NTSTATUS init_dc(void *arg) params->funcs->pEnumFonts = enum_fonts; params->funcs->pGetCharWidth = get_char_width; params->funcs->pGetTextMetrics = get_text_metrics; + params->funcs->pGetTextExtentExPoint = get_text_extent_ex_point; return TRUE; }
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/builtin.c | 43 -------------- dlls/wineps.drv/printproc.c | 115 ++---------------------------------- dlls/wineps.drv/psdrv.h | 2 - 3 files changed, 4 insertions(+), 156 deletions(-)
diff --git a/dlls/wineps.drv/builtin.c b/dlls/wineps.drv/builtin.c index 270ce1bef8a..74ffda36f92 100644 --- a/dlls/wineps.drv/builtin.c +++ b/dlls/wineps.drv/builtin.c @@ -258,24 +258,6 @@ BOOL PSDRV_WriteBuiltinGlyphShow(PHYSDEV dev, LPCWSTR str, INT count) return TRUE; }
-/*********************************************************************** - * PSDRV_GetTextMetrics - */ -BOOL CDECL PSDRV_GetTextMetrics(PHYSDEV dev, TEXTMETRICW *metrics) -{ - PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); - - if (physDev->font.fontloc == Download) - { - dev = GET_NEXT_PHYSDEV( dev, pGetTextMetrics ); - return dev->funcs->pGetTextMetrics( dev, metrics ); - } - - memcpy(metrics, &(physDev->font.fontinfo.Builtin.tm), - sizeof(physDev->font.fontinfo.Builtin.tm)); - return TRUE; -} - /****************************************************************************** * PSDRV_UVMetrics * @@ -314,28 +296,3 @@ const AFMMETRICS *PSDRV_UVMetrics(LONG UV, const AFM *afm)
return needle; } - -/*********************************************************************** - * PSDRV_GetTextExtentExPoint - */ -BOOL CDECL PSDRV_GetTextExtentExPoint(PHYSDEV dev, LPCWSTR str, INT count, LPINT alpDx) -{ - PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); - int i; - float width = 0.0; - - if (physDev->font.fontloc == Download) - { - dev = GET_NEXT_PHYSDEV( dev, pGetTextExtentExPoint ); - return dev->funcs->pGetTextExtentExPoint( dev, str, count, alpDx ); - } - - TRACE("%s %i\n", debugstr_wn(str, count), count); - - for (i = 0; i < count; ++i) - { - width += PSDRV_UVMetrics(str[i], physDev->font.fontinfo.Builtin.afm)->WX; - alpDx[i] = width * physDev->font.fontinfo.Builtin.scale; - } - return TRUE; -} diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index 417766d4093..a4fa9f8c45c 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -155,17 +155,6 @@ static struct pp_data* get_handle_data(HANDLE pp) return ret; }
-static BOOL CDECL font_GetTextExtentExPoint(PHYSDEV dev, const WCHAR *str, INT count, INT *dxs) -{ - SIZE size; - return GetTextExtentExPointW(dev->hdc, str, count, -1, NULL, dxs, &size); -} - -static BOOL CDECL font_GetTextMetrics(PHYSDEV dev, TEXTMETRICW *metrics) -{ - return GetTextMetricsW(dev->hdc, metrics); -} - static HFONT CDECL font_SelectFont(PHYSDEV dev, HFONT hfont, UINT *aa_flags) { HFONT tt_font, old_font; @@ -187,8 +176,6 @@ static HFONT CDECL font_SelectFont(PHYSDEV dev, HFONT hfont, UINT *aa_flags)
static const struct gdi_dc_funcs font_funcs = { - .pGetTextExtentExPoint = font_GetTextExtentExPoint, - .pGetTextMetrics = font_GetTextMetrics, .pSelectFont = font_SelectFont, .priority = GDI_PRIORITY_FONT_DRV }; @@ -1170,19 +1157,6 @@ static inline INT INTERNAL_XDSTOWS(HDC hdc, INT width) /* Performs a device to world transformation on the specified size (which * is in integer format). */ -static inline INT INTERNAL_YDSTOWS(HDC hdc, INT height) -{ - double floatHeight; - XFORM xform; - - GetWorldTransform(hdc, &xform); - - /* Perform operation with floating point */ - floatHeight = (double)height * xform.eM22; - /* Round to integers */ - return GDI_ROUND(floatHeight); -} - static inline INT INTERNAL_YWSTODS(HDC hdc, INT height) { POINT pt[2]; @@ -1193,87 +1167,6 @@ static inline INT INTERNAL_YWSTODS(HDC hdc, INT height) return pt[1].y - pt[0].y; }
-/* compute positions for text rendering, in device coords */ -static BOOL get_char_positions(struct pp_data *data, const WCHAR *str, - INT count, INT *dx, SIZE *size) -{ - TEXTMETRICW tm; - - size->cx = size->cy = 0; - if (!count) return TRUE; - - PSDRV_GetTextMetrics(&data->pdev->dev, &tm); - if (!PSDRV_GetTextExtentExPoint(&data->pdev->dev, str, count, dx)) return FALSE; - - if (data->break_extra || data->break_rem) - { - int i, space = 0, rem = data->break_rem; - - for (i = 0; i < count; i++) - { - if (str[i] == tm.tmBreakChar) - { - space += data->break_extra; - if (rem > 0) - { - space++; - rem--; - } - } - dx[i] += space; - } - } - size->cx = dx[count - 1]; - size->cy = tm.tmHeight; - return TRUE; -} - -static BOOL get_text_extent(struct pp_data *data, const WCHAR *str, INT count, - INT max_ext, INT *nfit, INT *dxs, SIZE *size, UINT flags) -{ - INT buffer[256], *pos = dxs; - int i, char_extra; - BOOL ret; - - if (flags) - return GetTextExtentExPointI(data->pdev->dev.hdc, str, count, max_ext, nfit, dxs, size); - else if (data->pdev->font.fontloc == Download) - return GetTextExtentExPointW(data->pdev->dev.hdc, str, count, max_ext, nfit, dxs, size); - - if (!dxs) - { - pos = buffer; - if (count > 256 && !(pos = malloc(count * sizeof(*pos)))) - return FALSE; - } - - if ((ret = get_char_positions(data, str, count, pos, size))) - { - char_extra = GetTextCharacterExtra(data->pdev->dev.hdc); - if (dxs || nfit) - { - for (i = 0; i < count; i++) - { - unsigned int dx = abs(INTERNAL_XDSTOWS(data->pdev->dev.hdc, pos[i])) - + (i + 1) * char_extra; - if (nfit && dx > (unsigned int)max_ext) break; - if (dxs) dxs[i] = dx; - } - if (nfit) *nfit = i; - } - - size->cx = abs(INTERNAL_XDSTOWS(data->pdev->dev.hdc, size->cx)) - + count * char_extra; - size->cy = abs(INTERNAL_YDSTOWS(data->pdev->dev.hdc, size->cy)); - } - - if (pos != buffer && pos != dxs) free(pos); - - TRACE("(%s, %d) returning %dx%d\n", debugstr_wn(str,count), - max_ext, (int)size->cx, (int)size->cy); - return ret; -} - extern const unsigned short bidi_direction_table[] DECLSPEC_HIDDEN;
/*------------------------------------------------------------------------ @@ -1938,7 +1831,7 @@ static BOOL ext_text_out(struct pp_data *data, HANDLETABLE *htable, y = pt.y; }
- PSDRV_GetTextMetrics(&data->pdev->dev, &tm); + GetTextMetricsW(hdc, &tm); GetObjectW(GetCurrentObject(hdc, OBJ_FONT), sizeof(lf), &lf);
if(!(tm.tmPitchAndFamily & TMPF_VECTOR)) /* Non-scalable fonts shouldn't be rotated */ @@ -2017,7 +1910,7 @@ static BOOL ext_text_out(struct pp_data *data, HANDLETABLE *htable, { INT *dx = malloc(count * sizeof(*dx));
- get_text_extent(data, str, count, -1, NULL, dx, &sz, !!(flags & ETO_GLYPH_INDEX)); + NtGdiGetTextExtentExW(hdc, str, count, -1, NULL, dx, &sz, !!(flags & ETO_GLYPH_INDEX));
deltas[0].x = dx[0]; deltas[0].y = 0; @@ -2062,7 +1955,7 @@ static BOOL ext_text_out(struct pp_data *data, HANDLETABLE *htable, { POINT desired[2];
- get_text_extent(data, str, count, 0, NULL, NULL, &sz, !!(flags & ETO_GLYPH_INDEX)); + NtGdiGetTextExtentExW(hdc, str, count, 0, NULL, NULL, &sz, !!(flags & ETO_GLYPH_INDEX)); desired[0].x = desired[0].y = 0; desired[1].x = sz.cx; desired[1].y = 0; @@ -3122,7 +3015,7 @@ HANDLE WINAPI OpenPrintProcessor(WCHAR *port, PRINTPROCESSOROPENDATA *open_data) data->doc_name = wcsdup(open_data->pDocumentName); data->out_file = wcsdup(open_data->pOutputFile);
- hdc = CreateCompatibleDC(NULL); + hdc = CreateDCW(L"winspool", open_data->pPrinterName, NULL, open_data->pDevMode); if (!hdc) { LocalFree(data); diff --git a/dlls/wineps.drv/psdrv.h b/dlls/wineps.drv/psdrv.h index a1eb444ad14..40f590d0afd 100644 --- a/dlls/wineps.drv/psdrv.h +++ b/dlls/wineps.drv/psdrv.h @@ -434,8 +434,6 @@ extern INT CDECL PSDRV_ExtEscape( PHYSDEV dev, INT nEscape, INT cbInput, LPCVOID extern BOOL CDECL PSDRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, const RECT *lprect, LPCWSTR str, UINT count, const INT *lpDx ) DECLSPEC_HIDDEN; extern BOOL CDECL PSDRV_FillPath( PHYSDEV dev ) DECLSPEC_HIDDEN; -extern BOOL CDECL PSDRV_GetTextExtentExPoint(PHYSDEV dev, LPCWSTR str, INT count, LPINT alpDx) DECLSPEC_HIDDEN; -extern BOOL CDECL PSDRV_GetTextMetrics(PHYSDEV dev, TEXTMETRICW *metrics) DECLSPEC_HIDDEN; extern BOOL CDECL PSDRV_LineTo(PHYSDEV dev, INT x, INT y) DECLSPEC_HIDDEN; extern BOOL CDECL PSDRV_PaintRgn( PHYSDEV dev, HRGN hrgn ) DECLSPEC_HIDDEN; extern BOOL CDECL PSDRV_PatBlt(PHYSDEV dev, struct bitblt_coords *dst, DWORD dwRop) DECLSPEC_HIDDEN;
This merge request was approved by Huw Davies.