-DSTRICT is now the default behavior.
[wine] / dlls / wineps / font.c
1 /*
2  *      PostScript driver font functions
3  *
4  *      Copyright 1998  Huw D M Davies
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20 #include <string.h>
21 #include <assert.h>
22 #include <stdlib.h>
23 #include "winspool.h"
24 #include "gdi.h"
25 #include "psdrv.h"
26 #include "wine/debug.h"
27
28 WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
29
30 /***********************************************************************
31  *           SelectFont   (WINEPS.@)
32  */
33 HFONT PSDRV_SelectFont( PSDRV_PDEVICE *physDev, HFONT hfont )
34 {
35     LOGFONTW lf;
36     BOOL subst = FALSE;
37     char FaceName[LF_FACESIZE];
38
39     if (!GetObjectW( hfont, sizeof(lf), &lf )) return HGDI_ERROR;
40
41     TRACE("FaceName = %s Height = %ld Italic = %d Weight = %ld\n",
42           debugstr_w(lf.lfFaceName), lf.lfHeight, lf.lfItalic,
43           lf.lfWeight);
44
45     WideCharToMultiByte(CP_ACP, 0, lf.lfFaceName, -1,
46                         FaceName, sizeof(FaceName), NULL, NULL);
47
48     if(FaceName[0] == '\0') {
49         switch(lf.lfPitchAndFamily & 0xf0) {
50         case FF_DONTCARE:
51             break;
52         case FF_ROMAN:
53         case FF_SCRIPT:
54             strcpy(FaceName, "Times");
55             break;
56         case FF_SWISS:
57             strcpy(FaceName, "Helvetica");
58             break;
59         case FF_MODERN:
60             strcpy(FaceName, "Courier");
61             break;
62         case FF_DECORATIVE:
63             strcpy(FaceName, "Symbol");
64             break;
65         }
66     }
67
68     if(FaceName[0] == '\0') {
69         switch(lf.lfPitchAndFamily & 0x0f) {
70         case VARIABLE_PITCH:
71             strcpy(FaceName, "Times");
72             break;
73         default:
74             strcpy(FaceName, "Courier");
75             break;
76         }
77     }
78
79     if (physDev->pi->FontSubTableSize != 0)
80     {
81         DWORD i;
82
83         for (i = 0; i < physDev->pi->FontSubTableSize; ++i)
84         {
85             if (!strcasecmp (FaceName,
86                     physDev->pi->FontSubTable[i].pValueName))
87             {
88                 TRACE ("substituting facename '%s' for '%s'\n",
89                         (LPSTR) physDev->pi->FontSubTable[i].pData, FaceName);
90                 if (strlen ((LPSTR) physDev->pi->FontSubTable[i].pData) <
91                         LF_FACESIZE)
92                 {
93                     strcpy (FaceName,
94                             (LPSTR) physDev->pi->FontSubTable[i].pData);
95                     subst = TRUE;
96                 }
97                 else
98                     WARN ("Facename '%s' is too long; ignoring substitution\n",
99                             (LPSTR) physDev->pi->FontSubTable[i].pData);
100                 break;
101             }
102         }
103     }
104
105     physDev->font.escapement = lf.lfEscapement;
106     physDev->font.set = FALSE;
107
108     if(physDev->dc->gdiFont && !subst) {
109         if(PSDRV_SelectDownloadFont(physDev))
110             return 0; /* use gdi font */
111     }
112
113     PSDRV_SelectBuiltinFont(physDev, hfont, &lf, FaceName);
114     return (HFONT)1; /* use device font */
115 }
116
117 /***********************************************************************
118  *           PSDRV_SetFont
119  */
120 BOOL PSDRV_SetFont( PSDRV_PDEVICE *physDev )
121 {
122     PSDRV_WriteSetColor(physDev, &physDev->font.color);
123     if(physDev->font.set) return TRUE;
124
125     switch(physDev->font.fontloc) {
126     case Builtin:
127         PSDRV_WriteSetBuiltinFont(physDev);
128         break;
129     case Download:
130         PSDRV_WriteSetDownloadFont(physDev);
131         break;
132     default:
133         ERR("fontloc = %d\n", physDev->font.fontloc);
134         assert(1);
135         break;
136     }
137     physDev->font.set = TRUE;
138     return TRUE;
139 }