2 * PostScript driver text functions
4 * Copyright 1998 Huw D M Davies
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.
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.
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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
30 #include "wine/debug.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(psdrv
);
34 static BOOL
PSDRV_Text(PSDRV_PDEVICE
*physDev
, INT x
, INT y
, UINT flags
,
35 LPCWSTR str
, UINT count
,
36 BOOL bDrawBackground
, const INT
*lpDx
);
38 /***********************************************************************
41 BOOL
PSDRV_ExtTextOut( PSDRV_PDEVICE
*physDev
, INT x
, INT y
, UINT flags
,
42 const RECT
*lprect
, LPCWSTR str
, UINT count
,
46 BOOL bClipped
= FALSE
;
49 TRACE("(x=%d, y=%d, flags=0x%08x, str=%s, count=%d, lpDx=%p)\n", x
, y
,
50 flags
, debugstr_wn(str
, count
), count
, lpDx
);
52 /* write font if not already written */
53 PSDRV_SetFont(physDev
);
55 PSDRV_SetClip(physDev
);
57 /* set clipping and/or draw background */
58 if ((flags
& (ETO_CLIPPED
| ETO_OPAQUE
)) && (lprect
!= NULL
))
60 PSDRV_WriteGSave(physDev
);
61 PSDRV_WriteRectangle(physDev
, lprect
->left
, lprect
->top
, lprect
->right
- lprect
->left
,
62 lprect
->bottom
- lprect
->top
);
64 if (flags
& ETO_OPAQUE
)
67 PSDRV_WriteGSave(physDev
);
68 PSDRV_WriteSetColor(physDev
, &physDev
->bkColor
);
69 PSDRV_WriteFill(physDev
);
70 PSDRV_WriteGRestore(physDev
);
73 if (flags
& ETO_CLIPPED
)
76 PSDRV_WriteClip(physDev
);
79 bResult
= PSDRV_Text(physDev
, x
, y
, flags
, str
, count
, !(bClipped
&& bOpaque
), lpDx
);
80 PSDRV_WriteGRestore(physDev
);
84 bResult
= PSDRV_Text(physDev
, x
, y
, flags
, str
, count
, TRUE
, lpDx
);
87 PSDRV_ResetClip(physDev
);
91 /***********************************************************************
94 static BOOL
PSDRV_Text(PSDRV_PDEVICE
*physDev
, INT x
, INT y
, UINT flags
, LPCWSTR str
,
95 UINT count
, BOOL bDrawBackground
, const INT
*lpDx
)
98 double cosEsc
, sinEsc
;
104 GetObjectW(GetCurrentObject(physDev
->hdc
, OBJ_FONT
), sizeof(lf
), &lf
);
105 if(lf
.lfEscapement
!= 0) {
106 cosEsc
= cos(lf
.lfEscapement
* M_PI
/ 1800);
107 sinEsc
= sin(lf
.lfEscapement
* M_PI
/ 1800);
113 if(physDev
->font
.fontloc
== Download
)
114 glyphs
= (LPWORD
)str
;
116 PSDRV_WriteMoveTo(physDev
, x
, y
);
119 if(physDev
->font
.fontloc
== Download
)
120 PSDRV_WriteDownloadGlyphShow(physDev
, glyphs
, count
);
122 PSDRV_WriteBuiltinGlyphShow(physDev
, str
, count
);
126 float dx
= 0.0, dy
= 0.0;
127 float cos_theta
= cos(physDev
->font
.escapement
* M_PI
/ 1800.0);
128 float sin_theta
= sin(physDev
->font
.escapement
* M_PI
/ 1800.0);
129 for(i
= 0; i
< count
-1; i
++) {
130 TRACE("lpDx[%d] = %d\n", i
, lpDx
[i
]);
131 if(physDev
->font
.fontloc
== Download
)
132 PSDRV_WriteDownloadGlyphShow(physDev
, glyphs
+ i
, 1);
134 PSDRV_WriteBuiltinGlyphShow(physDev
, str
+ i
, 1);
135 dx
+= lpDx
[i
] * cos_theta
;
136 dy
-= lpDx
[i
] * sin_theta
;
137 PSDRV_WriteMoveTo(physDev
, x
+ dx
, y
+ dy
);
139 if(physDev
->font
.fontloc
== Download
)
140 PSDRV_WriteDownloadGlyphShow(physDev
, glyphs
+ i
, 1);
142 PSDRV_WriteBuiltinGlyphShow(physDev
, str
+ i
, 1);