| /* | |
| * win16 driver text functions | |
| * | |
| * Copyright 1996 John Harvey | |
| * 1998 Huw Davies | |
| */ | |
| #include <stdlib.h> | |
| #include "windows.h" | |
| #include "win16drv.h" | |
| #include "dc.h" | |
| #include "gdi.h" | |
| #include "debug.h" | |
| /*********************************************************************** | |
| * WIN16DRV_ExtTextOut | |
| */ | |
| BOOL32 WIN16DRV_ExtTextOut( DC *dc, INT32 x, INT32 y, UINT32 flags, | |
| const RECT32 *lprect, LPCSTR str, UINT32 count, | |
| const INT32 *lpDx ) | |
| { | |
| WIN16DRV_PDEVICE *physDev = (WIN16DRV_PDEVICE *)dc->physDev; | |
| BOOL32 bRet = 1; | |
| RECT16 clipRect; | |
| RECT16 opaqueRect; | |
| RECT16 *lpOpaqueRect = NULL; | |
| WORD wOptions = 0; | |
| WORD wCount = count; | |
| INT16 width; | |
| if (count == 0) | |
| return FALSE; | |
| TRACE(win16drv, "%04x %d %d %x %p %*s %p\n", | |
| dc->hSelf, x, y, flags, lprect, count > 0 ? count : 8, str, lpDx); | |
| if (dc != NULL) | |
| { | |
| DWORD dwRet; | |
| clipRect.left = 0; | |
| clipRect.top = 0; | |
| clipRect.right = dc->w.devCaps->horzRes; | |
| clipRect.bottom = dc->w.devCaps->vertRes; | |
| if (lprect) | |
| { | |
| opaqueRect.left = lprect->left; | |
| opaqueRect.top = lprect->top; | |
| opaqueRect.right = lprect->right; | |
| opaqueRect.bottom = lprect->bottom; | |
| lpOpaqueRect = &opaqueRect; | |
| } | |
| TRACE(win16drv, "textalign = %d\n", dc->w.textAlign); | |
| if (dc->w.textAlign & TA_UPDATECP) | |
| { | |
| x = dc->w.CursPosX; | |
| y = dc->w.CursPosY; | |
| } | |
| x = XLPTODP( dc, x ); | |
| y = YLPTODP( dc, y ); | |
| dwRet = PRTDRV_ExtTextOut(physDev->segptrPDEVICE, 0, 0, | |
| NULL, str, -count, physDev->FontInfo, | |
| win16drv_SegPtr_DrawMode, win16drv_SegPtr_TextXForm, | |
| NULL, NULL, 0); | |
| width = LOWORD(dwRet); | |
| switch( dc->w.textAlign & (TA_LEFT | TA_RIGHT | TA_CENTER) ) | |
| { | |
| case TA_LEFT: | |
| if (dc->w.textAlign & TA_UPDATECP) | |
| dc->w.CursPosX = XDPTOLP( dc, x + width ); | |
| break; | |
| case TA_RIGHT: | |
| x -= width; | |
| if (dc->w.textAlign & TA_UPDATECP) | |
| dc->w.CursPosX = XDPTOLP( dc, x ); | |
| break; | |
| case TA_CENTER: | |
| x -= width / 2; | |
| break; | |
| } | |
| switch( dc->w.textAlign & (TA_TOP | TA_BOTTOM | TA_BASELINE) ) | |
| { | |
| case TA_TOP: | |
| break; | |
| case TA_BOTTOM: | |
| y -= physDev->FontInfo->dfPixHeight; | |
| break; | |
| case TA_BASELINE: | |
| y -= physDev->FontInfo->dfAscent; | |
| break; | |
| } | |
| dwRet = PRTDRV_ExtTextOut(physDev->segptrPDEVICE, | |
| x, y, &clipRect, str, wCount, | |
| physDev->FontInfo, win16drv_SegPtr_DrawMode, | |
| win16drv_SegPtr_TextXForm, NULL, lpOpaqueRect, wOptions); | |
| } | |
| return bRet; | |
| } | |