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
28 #include "wine/debug.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(psdrv
);
32 static BOOL
PSDRV_Text(PSDRV_PDEVICE
*physDev
, INT x
, INT y
, UINT flags
,
33 LPCWSTR str
, UINT count
,
34 BOOL bDrawBackground
, const INT
*lpDx
);
36 /***********************************************************************
39 BOOL
PSDRV_ExtTextOut( PSDRV_PDEVICE
*physDev
, INT x
, INT y
, UINT flags
,
40 const RECT
*lprect
, LPCWSTR str
, UINT count
,
44 BOOL bClipped
= FALSE
;
47 TRACE("(x=%d, y=%d, flags=0x%08x, str=%s, count=%d, lpDx=%p)\n", x
, y
,
48 flags
, debugstr_wn(str
, count
), count
, lpDx
);
50 /* write font if not already written */
51 PSDRV_SetFont(physDev
);
53 PSDRV_SetClip(physDev
);
55 /* set clipping and/or draw background */
56 if ((flags
& (ETO_CLIPPED
| ETO_OPAQUE
)) && (lprect
!= NULL
))
58 PSDRV_WriteGSave(physDev
);
59 PSDRV_WriteRectangle(physDev
, lprect
->left
, lprect
->top
, lprect
->right
- lprect
->left
,
60 lprect
->bottom
- lprect
->top
);
62 if (flags
& ETO_OPAQUE
)
65 PSDRV_WriteGSave(physDev
);
66 PSDRV_WriteSetColor(physDev
, &physDev
->bkColor
);
67 PSDRV_WriteFill(physDev
);
68 PSDRV_WriteGRestore(physDev
);
71 if (flags
& ETO_CLIPPED
)
74 PSDRV_WriteClip(physDev
);
77 bResult
= PSDRV_Text(physDev
, x
, y
, flags
, str
, count
, !(bClipped
&& bOpaque
), lpDx
);
78 PSDRV_WriteGRestore(physDev
);
82 bResult
= PSDRV_Text(physDev
, x
, y
, flags
, str
, count
, TRUE
, lpDx
);
85 PSDRV_ResetClip(physDev
);
89 /***********************************************************************
92 static BOOL
PSDRV_Text(PSDRV_PDEVICE
*physDev
, INT x
, INT y
, UINT flags
, LPCWSTR str
,
93 UINT count
, BOOL bDrawBackground
, const INT
*lpDx
)
96 double cosEsc
, sinEsc
;
102 GetObjectW(GetCurrentObject(physDev
->hdc
, OBJ_FONT
), sizeof(lf
), &lf
);
103 if(lf
.lfEscapement
!= 0) {
104 cosEsc
= cos(lf
.lfEscapement
* M_PI
/ 1800);
105 sinEsc
= sin(lf
.lfEscapement
* M_PI
/ 1800);
111 if(physDev
->font
.fontloc
== Download
)
112 glyphs
= (LPWORD
)str
;
114 PSDRV_WriteMoveTo(physDev
, x
, y
);
117 if(physDev
->font
.fontloc
== Download
)
118 PSDRV_WriteDownloadGlyphShow(physDev
, glyphs
, count
);
120 PSDRV_WriteBuiltinGlyphShow(physDev
, str
, count
);
124 float dx
= 0.0, dy
= 0.0;
125 float cos_theta
= cos(physDev
->font
.escapement
* M_PI
/ 1800.0);
126 float sin_theta
= sin(physDev
->font
.escapement
* M_PI
/ 1800.0);
127 for(i
= 0; i
< count
-1; i
++) {
128 TRACE("lpDx[%d] = %d\n", i
, lpDx
[i
]);
129 if(physDev
->font
.fontloc
== Download
)
130 PSDRV_WriteDownloadGlyphShow(physDev
, glyphs
+ i
, 1);
132 PSDRV_WriteBuiltinGlyphShow(physDev
, str
+ i
, 1);
133 dx
+= lpDx
[i
] * cos_theta
;
134 dy
-= lpDx
[i
] * sin_theta
;
135 PSDRV_WriteMoveTo(physDev
, x
+ dx
, y
+ dy
);
137 if(physDev
->font
.fontloc
== Download
)
138 PSDRV_WriteDownloadGlyphShow(physDev
, glyphs
+ i
, 1);
140 PSDRV_WriteBuiltinGlyphShow(physDev
, str
+ i
, 1);