/* * Postscript driver text functions * * Copyright 1998 Huw D M Davies * */ #include #include "windows.h" #include "psdrv.h" #include "debug.h" #include "print.h" /*********************************************************************** * PSDRV_ExtTextOut */ BOOL32 PSDRV_ExtTextOut( DC *dc, INT32 x, INT32 y, UINT32 flags, const RECT32 *lprect, LPCSTR str, UINT32 count, const INT32 *lpDx ) { PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev; char *strbuf; SIZE32 sz; TRACE(psdrv, "(x=%d, y=%d, flags=0x%08x, str='%s', count=%d)\n", x, y, flags, str, count); strbuf = (char *)HeapAlloc( GetProcessHeap(), 0, count + 1); if(!strbuf) { WARN(psdrv, "HeapAlloc failed\n"); return FALSE; } if(dc->w.textAlign & TA_UPDATECP) { x = dc->w.CursPosX; y = dc->w.CursPosY; } x = XLPTODP(dc, x); y = YLPTODP(dc, y); GetTextExtentPoint32A(dc->hSelf, str, count, &sz); sz.cx = XLSTODS(dc, sz.cx); sz.cy = YLSTODS(dc, sz.cy); switch(dc->w.textAlign & (TA_LEFT | TA_CENTER | TA_RIGHT) ) { case TA_LEFT: if(dc->w.textAlign & TA_UPDATECP) dc->w.CursPosX = XDPTOLP(dc, x + sz.cx); break; case TA_CENTER: x -= sz.cx/2; break; case TA_RIGHT: x -= sz.cx; if(dc->w.textAlign & TA_UPDATECP) dc->w.CursPosX = XDPTOLP(dc, x); break; } switch(dc->w.textAlign & (TA_TOP | TA_BASELINE | TA_BOTTOM) ) { case TA_TOP: break; case TA_BASELINE: y -= physDev->font.tm.tmAscent; break; case TA_BOTTOM: y -= sz.cy; break; } memcpy(strbuf, str, count); *(strbuf + count) = '\0'; PSDRV_SetFont(dc); PSDRV_WriteMoveTo(dc, x, y); PSDRV_WriteShow(dc, strbuf, strlen(strbuf)); HeapFree(GetProcessHeap(), 0, strbuf); return TRUE; }