source: trunk/src/gdi32/text.cpp@ 2052

Last change on this file since 2052 was 2052, checked in by achimha, 26 years ago

added more logging

File size: 9.5 KB
Line 
1/* $Id: text.cpp,v 1.4 1999-12-10 08:34:06 achimha Exp $ */
2
3/*
4 * GDI32 text apis
5 *
6 * Based on Wine code (991031) (objects\text.c)
7 *
8 * Copyright 1993, 1994 Alexandre Julliard
9 *
10 *
11 * Project Odin Software License can be found in LICENSE.TXT
12 *
13 */
14#include <os2win.h>
15#include <stdlib.h>
16#include <misc.h>
17#include <string.h>
18#include "oslibgpi.h"
19
20//******************************************************************************
21//******************************************************************************
22UINT WINAPI GetTextCharsetInfo(
23 HDC hdc, /* [in] Handle to device context */
24 LPFONTSIGNATURE fs, /* [out] Pointer to struct to receive data */
25 DWORD flags) /* [in] Reserved - must be 0 */
26{
27 HGDIOBJ hFont;
28 UINT charSet = DEFAULT_CHARSET;
29 LOGFONTW lf;
30 CHARSETINFO csinfo;
31
32 dprintf(("GetTextCharsetInfo %x %x %x", hdc, fs, flags));
33
34 hFont = GetCurrentObject(hdc, OBJ_FONT);
35 if (hFont == 0)
36 return(DEFAULT_CHARSET);
37 if ( GetObjectW(hFont, sizeof(LOGFONTW), &lf) != 0 )
38 charSet = lf.lfCharSet;
39
40 if (fs != NULL) {
41 if (!TranslateCharsetInfo((LPDWORD)charSet, &csinfo, TCI_SRCCHARSET))
42 return (DEFAULT_CHARSET);
43 memcpy(fs, &csinfo.fs, sizeof(FONTSIGNATURE));
44 }
45 return charSet;
46}
47/***********************************************************************
48 * GetTextCharset32 [GDI32.226] Gets character set for font in DC
49 *
50 * NOTES
51 * Should it return a UINT32 instead of an INT32?
52 * => YES, as GetTextCharsetInfo returns UINT32
53 *
54 * RETURNS
55 * Success: Character set identifier
56 * Failure: DEFAULT_CHARSET
57 */
58UINT WINAPI GetTextCharset(HDC hdc) /* [in] Handle to device context */
59{
60 /* MSDN docs say this is equivalent */
61 return GetTextCharsetInfo(hdc, NULL, 0);
62}
63//******************************************************************************
64// CB: USER32 function, but here is the better place
65//******************************************************************************
66INT WIN32API InternalDrawTextExA(HDC hdc,LPCSTR lpchText,INT cchText,LPRECT lprc,UINT dwDTFormat,LPDRAWTEXTPARAMS lpDTParams)
67{
68 //CB: todo
69 dprintf(("GDI32: InternalDrawTextExA, unimplemented stub!\n"));
70 return 0;
71}
72//******************************************************************************
73//******************************************************************************
74INT WIN32API InternalDrawTextExW(HDC hdc,LPWSTR lpchText,INT cchText,LPRECT lprc,UINT dwDTFormat,LPDRAWTEXTPARAMS lpDTParams)
75{
76 char *astring = UnicodeToAsciiStringN((LPWSTR)lpchText,cchText);
77 INT rc;
78
79 rc = InternalDrawTextExA(hdc,astring,cchText,lprc,dwDTFormat,lpDTParams);
80 FreeAsciiString(astring);
81
82 return(rc);
83}
84//******************************************************************************
85// CB: USER32 function, but here is the better place
86//******************************************************************************
87LONG WIN32API InternalTabbedTextOutA( HDC hdc, int x, int y, LPCSTR lpString, int nCount, int nTabPositions, LPINT lpnTabStopPositions, int nTabOrigin)
88{
89 //CB: todo
90 dprintf(("GDI32: InternalTabbedTextOutA, unimplemented stub!\n"));
91 return 0;
92}
93//******************************************************************************
94//******************************************************************************
95LONG WIN32API InternalTabbedTextOutW( HDC hdc, int x, int y, LPCWSTR lpString, int nCount, int nTabPositions, LPINT lpnTabStopPositions, int nTabOrigin)
96{
97 char *astring = UnicodeToAsciiStringN((LPWSTR)lpString,nCount);
98 LONG rc;
99
100 rc = InternalTabbedTextOutA(hdc,x,y,astring,nCount,nTabPositions,lpnTabStopPositions,nTabOrigin);
101 FreeAsciiString(astring);
102
103 return(rc);
104}
105//******************************************************************************
106// CB: USER32 function, but here is the better place
107//******************************************************************************
108DWORD WIN32API InternalGetTabbedTextExtentA( HDC hDC, LPCSTR lpString, int nCount, int nTabPositions, LPINT lpnTabStopPositions)
109{
110 //CB: todo
111 dprintf(("GDI32: InternalGetTabbedTexExtentA, unimplemented stub!\n"));
112 return 0;
113}
114//******************************************************************************
115//******************************************************************************
116DWORD WIN32API InternalGetTabbedTextExtentW( HDC hDC, LPCWSTR lpString, int nCount, int nTabPositions, LPINT lpnTabStopPositions)
117{
118 char *astring = UnicodeToAsciiStringN((LPWSTR)lpString,nCount);
119 DWORD rc;
120
121 rc = InternalGetTabbedTextExtentA(hDC,astring,nCount,nTabPositions,lpnTabStopPositions);
122 FreeAsciiString(astring);
123
124 return(rc);
125}
126//******************************************************************************
127// todo: metafile support
128//******************************************************************************
129BOOL InternalTextOutA(HDC hdc,int X,int Y,UINT fuOptions,CONST RECT *lprc,LPCSTR lpszString,INT cbCount,CONST INT *lpDx,BOOL IsExtTextOut)
130{
131 PVOID pHps = OSLibGpiQueryDCData(hdc);
132 ULONG flOptions = 0;
133 RECTLOS2 pmRect;
134 POINTLOS2 ptl;
135 LONG hits;
136
137 if (!pHps || cbCount < 0 || (lpszString == NULL && cbCount != 0))
138 {
139 SetLastError(ERROR_INVALID_HANDLE);
140 return FALSE;
141 }
142
143 if (cbCount > 512)
144 {
145 SetLastError(ERROR_INVALID_PARAMETER);
146 return FALSE;
147 }
148 if (fuOptions & ~((UINT)(ETO_CLIPPED | ETO_OPAQUE)))
149 {
150 //ETO_GLYPH_INDEX, ETO_RTLLEADING, ETO_NUMERICSLOCAL, ETO_NUMERICSLATIN, ETO_IGNORELANGUAGE, ETO_PDY are ignored
151 return TRUE;
152 }
153
154 //CB: add metafile info
155
156 if (lprc)
157 {
158 if (fuOptions)
159 {
160 MapWin32ToOS2Rect(*lprc,pmRect);
161 if (excludeBottomRightPoint(pHps,(PPOINTLOS2)&pmRect) == 0)
162 {
163 return TRUE;
164 }
165
166 if (fuOptions & ETO_CLIPPED) flOptions |= CHSOS_CLIP;
167 if (fuOptions & ETO_OPAQUE) flOptions |= CHSOS_OPAQUE;
168 }
169 } else
170 {
171 if (fuOptions)
172 {
173 SetLastError(ERROR_INVALID_HANDLE);
174 return FALSE;
175 }
176 }
177
178 if (cbCount == 0)
179 {
180 if (fuOptions & ETO_OPAQUE)
181 {
182 lpszString = " ";
183 cbCount = 1;
184 flOptions |= CHSOS_CLIP;
185 } else return TRUE;
186 }
187 if (lpDx)
188 flOptions |= CHSOS_VECTOR;
189
190 if (getAlignUpdateCP(pHps) == FALSE)
191 {
192 ptl.x = X;
193 ptl.y = Y;
194
195 flOptions |= CHSOS_LEAVEPOS;
196 } else OSLibGpiQueryCurrentPosition(pHps,&ptl);
197
198 UINT align = GetTextAlign(hdc);
199 LONG pmHAlign,pmVAlign;
200
201 //CB: TA_RIGHT not supported, only TA_CENTER and TA_LEFT
202 if ((align & 0x6) == TA_RIGHT)
203 {
204 PPOINTLOS2 pts = (PPOINTLOS2)malloc((cbCount+1)*sizeof(POINTLOS2));
205
206 OSLibGpiQueryCharStringPosAt(pHps,&ptl,flOptions,cbCount,lpszString,lpDx,pts);
207 ptl.x -= pts[cbCount].x-pts[0].x;
208 free(pts);
209 }
210
211 if (lprc && (align & 0x18) == TA_BASELINE)
212 {
213 //CB: if TA_BASELINE is set, GPI doesn't fill rect
214 // TA_BOTTOM fills rect
215 OSLibGpiQueryTextAlignment(pHps,&pmHAlign,&pmVAlign);
216 OSLibGpiSetTextAlignment(pHps,pmHAlign,(pmVAlign & ~TAOS_BASE) | TAOS_BOTTOM);
217 }
218
219 ptl.y += getWorldYDeltaFor1Pixel(pHps);
220
221 hits = OSLibGpiCharStringPosAt(pHps,&ptl,&pmRect,flOptions,cbCount,lpszString,lpDx);
222
223 if (lprc && (align & 0x18) == TA_BASELINE)
224 OSLibGpiSetTextAlignment(pHps,pmHAlign,pmVAlign);
225
226 if (hits == GPIOS_ERROR)
227 {
228 return FALSE;
229 }
230 if (getAlignUpdateCP(pHps))
231 {
232 OSLibGpiQueryCurrentPosition(pHps,&ptl);
233 ptl.y -= getWorldYDeltaFor1Pixel(pHps);
234 OSLibGpiSetCurrentPosition(pHps,&ptl);
235 }
236
237 return TRUE;
238}
239//******************************************************************************
240//******************************************************************************
241BOOL InternalTextOutW(HDC hdc,int X,int Y,UINT fuOptions,CONST RECT *lprc,LPCWSTR lpszString,INT cbCount,CONST INT *lpDx,BOOL IsExtTextOut)
242{
243 char *astring = UnicodeToAsciiStringN((LPWSTR)lpszString,cbCount);
244 BOOL rc;
245
246 rc = InternalTextOutA(hdc,X,Y,fuOptions,lprc,(LPCSTR)astring,cbCount,lpDx,IsExtTextOut);
247 FreeAsciiString(astring);
248
249 return(rc);
250}
251//******************************************************************************
252//******************************************************************************
253BOOL WIN32API ExtTextOutA(HDC hdc,int X,int Y,UINT fuOptions,CONST RECT *lprc,LPCSTR lpszString,UINT cbCount,CONST INT *lpDx)
254{
255 dprintf(("GDI32: ExtTextOutA\n"));
256
257 return InternalTextOutA(hdc,X,Y,fuOptions,lprc,lpszString,cbCount,lpDx,TRUE);
258}
259//******************************************************************************
260//******************************************************************************
261BOOL WIN32API ExtTextOutW(HDC hdc,int X,int Y,UINT fuOptions,CONST RECT *lprc,LPCWSTR lpszString,UINT cbCount,CONST int *lpDx)
262{
263 dprintf(("GDI32: ExtTextOutW\n"));
264
265 return InternalTextOutW(hdc,X,Y,fuOptions,lprc,lpszString,cbCount,lpDx,TRUE);
266}
267//******************************************************************************
268//******************************************************************************
269BOOL WIN32API TextOutA(HDC hdc,int nXStart,int nYStart,LPCSTR lpszString,int cbString)
270{
271 dprintf(("GDI32: TextOutA"));
272
273 return InternalTextOutA(hdc,nXStart,nYStart,0,NULL,lpszString,cbString,NULL,FALSE);
274}
275//******************************************************************************
276//******************************************************************************
277BOOL WIN32API TextOutW(HDC hdc,int nXStart,int nYStart,LPCWSTR lpszString,int cbString)
278{
279 dprintf(("GDI32: TextOutW"));
280
281 return InternalTextOutW(hdc,nXStart,nYStart,0,NULL,lpszString,cbString,NULL,FALSE);
282}
283//******************************************************************************
284//******************************************************************************
Note: See TracBrowser for help on using the repository browser.