| /* |
| * PostScript driver font functions |
| * |
| * Copyright 1998 Huw D M Davies |
| * |
| * 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 <stdarg.h> |
| #include <string.h> |
| #include <assert.h> |
| #include <stdlib.h> |
| |
| #include "windef.h" |
| #include "winbase.h" |
| #include "wingdi.h" |
| #include "winnls.h" |
| #include "winspool.h" |
| |
| #include "psdrv.h" |
| #include "wine/debug.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(psdrv); |
| |
| /*********************************************************************** |
| * SelectFont (WINEPS.@) |
| */ |
| HFONT PSDRV_SelectFont( PHYSDEV dev, HFONT hfont, UINT *aa_flags ) |
| { |
| PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); |
| PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSelectFont ); |
| HFONT ret; |
| LOGFONTW lf; |
| BOOL subst = FALSE; |
| char FaceName[LF_FACESIZE]; |
| |
| if (!GetObjectW( 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), lf.lfHeight, lf.lfItalic, |
| lf.lfWeight); |
| |
| WideCharToMultiByte(CP_ACP, 0, lf.lfFaceName, -1, |
| FaceName, sizeof(FaceName), NULL, NULL); |
| |
| if(FaceName[0] == '\0') { |
| switch(lf.lfPitchAndFamily & 0xf0) { |
| case FF_DONTCARE: |
| break; |
| case FF_ROMAN: |
| case FF_SCRIPT: |
| strcpy(FaceName, "Times"); |
| break; |
| case FF_SWISS: |
| strcpy(FaceName, "Helvetica"); |
| break; |
| case FF_MODERN: |
| strcpy(FaceName, "Courier"); |
| break; |
| case FF_DECORATIVE: |
| strcpy(FaceName, "Symbol"); |
| break; |
| } |
| } |
| |
| if(FaceName[0] == '\0') { |
| switch(lf.lfPitchAndFamily & 0x0f) { |
| case VARIABLE_PITCH: |
| strcpy(FaceName, "Times"); |
| break; |
| default: |
| strcpy(FaceName, "Courier"); |
| break; |
| } |
| } |
| |
| if (physDev->pi->FontSubTableSize != 0) |
| { |
| DWORD i; |
| |
| for (i = 0; i < physDev->pi->FontSubTableSize; ++i) |
| { |
| if (!strcasecmp (FaceName, |
| 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) |
| { |
| strcpy (FaceName, |
| (LPSTR) physDev->pi->FontSubTable[i].pData); |
| subst = TRUE; |
| } |
| else |
| WARN ("Facename '%s' is too long; ignoring substitution\n", |
| (LPSTR) physDev->pi->FontSubTable[i].pData); |
| break; |
| } |
| } |
| } |
| |
| physDev->font.escapement = lf.lfEscapement; |
| physDev->font.set = UNSET; |
| |
| if (!subst && ((ret = next->funcs->pSelectFont( next, hfont, aa_flags )))) |
| { |
| PSDRV_SelectDownloadFont(dev); |
| return ret; |
| } |
| |
| PSDRV_SelectBuiltinFont(dev, hfont, &lf, FaceName); |
| next->funcs->pSelectFont( next, 0, aa_flags ); /* tell next driver that we selected a device font */ |
| return hfont; |
| } |
| |
| /*********************************************************************** |
| * PSDRV_SetFont |
| */ |
| BOOL PSDRV_SetFont( PHYSDEV dev, BOOL vertical ) |
| { |
| PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); |
| |
| PSDRV_WriteSetColor(dev, &physDev->font.color); |
| if (vertical && (physDev->font.set == VERTICAL_SET)) return TRUE; |
| if (!vertical && (physDev->font.set == HORIZONTAL_SET)) return TRUE; |
| |
| switch(physDev->font.fontloc) { |
| case Builtin: |
| PSDRV_WriteSetBuiltinFont(dev); |
| break; |
| case Download: |
| PSDRV_WriteSetDownloadFont(dev, vertical); |
| break; |
| default: |
| ERR("fontloc = %d\n", physDev->font.fontloc); |
| assert(1); |
| break; |
| } |
| if (vertical) |
| physDev->font.set = VERTICAL_SET; |
| else |
| physDev->font.set = HORIZONTAL_SET; |
| return TRUE; |
| } |