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 CDECL
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 if(physDev
->job
.id
== 0) return FALSE
;
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
)
102 if(physDev
->font
.fontloc
== Download
)
103 glyphs
= (LPWORD
)str
;
105 PSDRV_WriteMoveTo(physDev
, x
, y
);
108 if(physDev
->font
.fontloc
== Download
)
109 PSDRV_WriteDownloadGlyphShow(physDev
, glyphs
, count
);
111 PSDRV_WriteBuiltinGlyphShow(physDev
, str
, count
);
115 float dx
= 0.0, dy
= 0.0;
116 float cos_theta
= cos(physDev
->font
.escapement
* M_PI
/ 1800.0);
117 float sin_theta
= sin(physDev
->font
.escapement
* M_PI
/ 1800.0);
118 for(i
= 0; i
< count
-1; i
++) {
119 TRACE("lpDx[%d] = %d\n", i
, lpDx
[i
]);
120 if(physDev
->font
.fontloc
== Download
)
121 PSDRV_WriteDownloadGlyphShow(physDev
, glyphs
+ i
, 1);
123 PSDRV_WriteBuiltinGlyphShow(physDev
, str
+ i
, 1);
124 dx
+= lpDx
[i
] * cos_theta
;
125 dy
-= lpDx
[i
] * sin_theta
;
126 PSDRV_WriteMoveTo(physDev
, x
+ dx
, y
+ dy
);
128 if(physDev
->font
.fontloc
== Download
)
129 PSDRV_WriteDownloadGlyphShow(physDev
, glyphs
+ i
, 1);
131 PSDRV_WriteBuiltinGlyphShow(physDev
, str
+ i
, 1);