|  | /* | 
|  | *	PostScript driver text 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 <string.h> | 
|  | #include <stdarg.h> | 
|  | #include <stdlib.h> | 
|  | #include <math.h> | 
|  |  | 
|  | #include "windef.h" | 
|  | #include "wingdi.h" | 
|  | #include "psdrv.h" | 
|  | #include "wine/debug.h" | 
|  |  | 
|  | WINE_DEFAULT_DEBUG_CHANNEL(psdrv); | 
|  |  | 
|  | static BOOL PSDRV_Text(PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, | 
|  | LPCWSTR str, UINT count, | 
|  | BOOL bDrawBackground, const INT *lpDx); | 
|  |  | 
|  | /*********************************************************************** | 
|  | *           PSDRV_ExtTextOut | 
|  | */ | 
|  | BOOL CDECL PSDRV_ExtTextOut( PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, | 
|  | const RECT *lprect, LPCWSTR str, UINT count, | 
|  | const INT *lpDx ) | 
|  | { | 
|  | BOOL bResult = TRUE; | 
|  | BOOL bClipped = FALSE; | 
|  | BOOL bOpaque = FALSE; | 
|  |  | 
|  | TRACE("(x=%d, y=%d, flags=0x%08x, str=%s, count=%d, lpDx=%p)\n", x, y, | 
|  | flags, debugstr_wn(str, count), count, lpDx); | 
|  |  | 
|  | if(physDev->job.hJob == 0) return FALSE; | 
|  |  | 
|  | /* write font if not already written */ | 
|  | PSDRV_SetFont(physDev); | 
|  |  | 
|  | PSDRV_SetClip(physDev); | 
|  |  | 
|  | /* set clipping and/or draw background */ | 
|  | if ((flags & (ETO_CLIPPED | ETO_OPAQUE)) && (lprect != NULL)) | 
|  | { | 
|  | PSDRV_WriteGSave(physDev); | 
|  | PSDRV_WriteRectangle(physDev, lprect->left, lprect->top, lprect->right - lprect->left, | 
|  | lprect->bottom - lprect->top); | 
|  |  | 
|  | if (flags & ETO_OPAQUE) | 
|  | { | 
|  | bOpaque = TRUE; | 
|  | PSDRV_WriteGSave(physDev); | 
|  | PSDRV_WriteSetColor(physDev, &physDev->bkColor); | 
|  | PSDRV_WriteFill(physDev); | 
|  | PSDRV_WriteGRestore(physDev); | 
|  | } | 
|  |  | 
|  | if (flags & ETO_CLIPPED) | 
|  | { | 
|  | bClipped = TRUE; | 
|  | PSDRV_WriteClip(physDev); | 
|  | } | 
|  |  | 
|  | bResult = PSDRV_Text(physDev, x, y, flags, str, count, !(bClipped && bOpaque), lpDx); | 
|  | PSDRV_WriteGRestore(physDev); | 
|  | } | 
|  | else | 
|  | { | 
|  | bResult = PSDRV_Text(physDev, x, y, flags, str, count, TRUE, lpDx); | 
|  | } | 
|  |  | 
|  | PSDRV_ResetClip(physDev); | 
|  | return bResult; | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | *           PSDRV_Text | 
|  | */ | 
|  | static BOOL PSDRV_Text(PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, LPCWSTR str, | 
|  | UINT count, BOOL bDrawBackground, const INT *lpDx) | 
|  | { | 
|  | WORD *glyphs = NULL; | 
|  |  | 
|  | if (!count) | 
|  | return TRUE; | 
|  |  | 
|  | if(physDev->font.fontloc == Download) | 
|  | glyphs = (LPWORD)str; | 
|  |  | 
|  | PSDRV_WriteMoveTo(physDev, x, y); | 
|  |  | 
|  | if(!lpDx) { | 
|  | if(physDev->font.fontloc == Download) | 
|  | PSDRV_WriteDownloadGlyphShow(physDev, glyphs, count); | 
|  | else | 
|  | PSDRV_WriteBuiltinGlyphShow(physDev, str, count); | 
|  | } | 
|  | else { | 
|  | UINT i; | 
|  | float dx = 0.0, dy = 0.0; | 
|  | float cos_theta = cos(physDev->font.escapement * M_PI / 1800.0); | 
|  | float sin_theta = sin(physDev->font.escapement * M_PI / 1800.0); | 
|  | for(i = 0; i < count-1; i++) { | 
|  | TRACE("lpDx[%d] = %d\n", i, lpDx[i]); | 
|  | if(physDev->font.fontloc == Download) | 
|  | PSDRV_WriteDownloadGlyphShow(physDev, glyphs + i, 1); | 
|  | else | 
|  | PSDRV_WriteBuiltinGlyphShow(physDev, str + i, 1); | 
|  | dx += lpDx[i] * cos_theta; | 
|  | dy -= lpDx[i] * sin_theta; | 
|  | PSDRV_WriteMoveTo(physDev, x + dx, y + dy); | 
|  | } | 
|  | if(physDev->font.fontloc == Download) | 
|  | PSDRV_WriteDownloadGlyphShow(physDev, glyphs + i, 1); | 
|  | else | 
|  | PSDRV_WriteBuiltinGlyphShow(physDev, str + i, 1); | 
|  | } | 
|  |  | 
|  | return TRUE; | 
|  | } |