source: trunk/src/gdi32/oslibgpi.cpp@ 10174

Last change on this file since 10174 was 10174, checked in by sandervl, 22 years ago

KOM: Fixed GetTextFaceW() to support unicode correctly; Fixed calcDimensions

File size: 11.8 KB
Line 
1/* $Id: oslibgpi.cpp,v 1.14 2003-07-16 15:47:37 sandervl Exp $ */
2
3/*
4 * GPI interface code
5 *
6 * Copyright 1999 Christoph Bratschi (cbratschi@datacomm.ch)
7 *
8 * Project Odin Software License can be found in LICENSE.TXT
9 *
10 */
11
12#define INCL_GPI
13#define INCL_WIN
14#include <os2wrap.h> //Odin32 OS/2 api wrappers
15#include <stdlib.h>
16#include <string.h>
17#include <math.h>
18#include "win32type.h"
19#include <winconst.h>
20#include "oslibgpi.h"
21#include <dcdata.h>
22#include <misc.h>
23
24#define DBG_LOCALLOG DBG_oslibgpi
25#include "dbglocal.h"
26
27#define GetDCData(a) ((pDCData)a)
28
29LONG APIENTRY _GpiQueryTabbedTextExtent(HPS hps,LONG lCount,PCH pchString,LONG lTabCount,PULONG puTabStops);
30
31inline LONG GpiQueryTabbedTextExtent(HPS hps,LONG lCount,PCH pchString,LONG lTabCount,PULONG puTabStops)
32{
33 LONG yyrc;
34 USHORT sel = RestoreOS2FS();
35
36 yyrc = _GpiQueryTabbedTextExtent(hps,lCount,pchString,lTabCount,puTabStops);
37 SetFS(sel);
38
39 return yyrc;
40}
41
42LONG APIENTRY _GpiTabbedCharStringAt(HPS hps,PPOINTL pPtStart,PRECTL prclRect,ULONG flOptions,LONG lCount,PCH pchString,LONG lTabCount,PULONG puTabStops,LONG lTabOrigin);
43
44inline LONG GpiTabbedCharStringAt(HPS hps,PPOINTL pPtStart,PRECTL prclRect,ULONG flOptions,LONG lCount,PCH pchString,LONG lTabCount,PULONG puTabStops,LONG lTabOrigin)
45{
46 LONG yyrc;
47 USHORT sel = RestoreOS2FS();
48
49 yyrc = _GpiTabbedCharStringAt(hps,pPtStart,prclRect,flOptions,lCount,pchString,lTabCount,puTabStops,lTabOrigin);
50 SetFS(sel);
51
52 return yyrc;
53}
54
55LONG APIENTRY WinDrawTabbedText(HPS hps,LONG cchText,LONG lTabWidth,PCH lpchText,PRECTL prcl,LONG clrFore,LONG clrBack,ULONG flCmd);
56
57inline LONG _WinDrawTabbedText(HPS hps,LONG cchText,LONG lTabWidth,PCH lpchText,PRECTL prcl,LONG clrFore,LONG clrBack,ULONG flCmd)
58{
59 LONG yyrc;
60 USHORT sel = RestoreOS2FS();
61
62 yyrc = WinDrawTabbedText(hps,cchText,lTabWidth,lpchText,prcl,clrFore,clrBack,flCmd);
63 SetFS(sel);
64
65 return yyrc;
66}
67
68#undef WinDrawTabbedText
69#define WinDrawTabbedText _WinDrawTabbedText
70
71void inline swap(LONG &a,LONG &b)
72{
73 LONG temp = a;
74
75 a = b;
76 b = temp;
77}
78
79void inline swap(int &a,int &b)
80{
81 int temp = a;
82
83 a = b;
84 b = temp;
85}
86
87void inline sortAscending(LONG &a,LONG &b)
88{
89 if (a > b) swap(a,b);
90}
91
92void inline sortAscending(int &a,int &b)
93{
94 if (a > b) swap(a,b);
95}
96
97void inline sortAscending(POINTLOS2 &a,POINTLOS2 &b)
98{
99 sortAscending(a.x,b.x);
100 sortAscending(a.y,b.y);
101}
102
103BOOL excludeBottomRightPoint(PVOID pHps,PPOINTLOS2 pptl)
104{
105 sortAscending(pptl[0],pptl[1]);
106
107 if (GetDCData(pHps)->graphicsMode != GM_COMPATIBLE_W)
108 {
109 return TRUE;
110 }
111
112 if (pptl[0].x == pptl[1].x || pptl[0].y == pptl[1].y)
113 {
114 return FALSE;
115 }
116
117 if (abs((int)GetDCData(pHps)->viewportXExt) <= abs((int)GetDCData(pHps)->windowExt.cx))
118 {
119 if (GetDCData(pHps)->isLeftLeft)
120 pptl[1].x -= abs(GetDCData(pHps)->worldXDeltaFor1Pixel);
121 else
122 pptl[0].x += abs(GetDCData(pHps)->worldXDeltaFor1Pixel);
123 }
124
125 if (abs((int)GetDCData(pHps)->viewportYExt) <= abs((int)GetDCData(pHps)->windowExt.cy))
126 {
127 if (GetDCData(pHps)->isTopTop)
128 pptl[1].y -= abs(GetDCData(pHps)->worldYDeltaFor1Pixel);
129 else
130 pptl[0].y += abs(GetDCData(pHps)->worldYDeltaFor1Pixel);
131 }
132
133 sortAscending(pptl[0], pptl[1]);
134
135 return TRUE;
136}
137
138BOOL includeBottomRightPoint(PVOID pHps,PPOINTLOS2 pptl)
139{
140 if(GetDCData(pHps)->graphicsMode != GM_COMPATIBLE_W)
141 {
142 return TRUE; // already inclusive/inclusive
143 }
144
145 if(GetDCData(pHps)->isLeftLeft)
146 {
147 pptl[1].x += abs(GetDCData(pHps)->worldXDeltaFor1Pixel);
148 sortAscending(pptl[0].x, pptl[1].x);
149 }
150 else
151 {
152 pptl[0].x -= abs(GetDCData(pHps)->worldXDeltaFor1Pixel);
153 sortAscending(pptl[1].x, pptl[0].x);
154 }
155
156 if(GetDCData(pHps)->isTopTop)
157 {
158 pptl[1].y += abs(GetDCData(pHps)->worldYDeltaFor1Pixel);
159 sortAscending(pptl[1].y, pptl[0].y);
160 }
161 else
162 {
163 pptl[0].y -= abs(GetDCData(pHps)->worldYDeltaFor1Pixel);
164 sortAscending(pptl[0].y, pptl[1].y);
165 }
166 return TRUE;
167}
168
169BOOL getAlignUpdateCP(PVOID pHps)
170{
171 return GetDCData(pHps)->alignUpdateCP;
172}
173
174INT getWorldYDeltaFor1Pixel(PVOID pHps)
175{
176 return GetDCData(pHps)->worldYDeltaFor1Pixel;
177}
178
179INT getWorldXDeltaFor1Pixel(PVOID pHps)
180{
181 return GetDCData(pHps)->worldXDeltaFor1Pixel;
182}
183
184BOOL getInPath(PVOID pHps)
185{
186 return GetDCData(pHps)->inPath;
187}
188
189VOID setInPath(PVOID pHps,BOOL inPath)
190{
191 GetDCData(pHps)->inPath = inPath;
192}
193
194BOOL getIsWideLine(PVOID pHps)
195{
196 return GetDCData(pHps)->isWideLine;
197}
198
199BOOL getIsTopTop(PVOID pHps)
200{
201 return GetDCData(pHps)->isTopTop;
202}
203
204ULONG getMapMode(PVOID pHps)
205{
206 return GetDCData(pHps)->MapMode;
207}
208
209BOOL OSLibGpiQueryCurrentPosition(PVOID pHps,PPOINTLOS2 ptl)
210{
211 return GpiQueryCurrentPosition(GetDCData(pHps)->hps,(PPOINTL)ptl);
212}
213
214BOOL OSLibGpiSetCurrentPosition(PVOID pHps,PPOINTLOS2 ptl)
215{
216 return GpiSetCurrentPosition(GetDCData(pHps)->hps,(PPOINTL)ptl);
217}
218
219BOOL OSLibGpiCharStringPosAt(PVOID pHps,PPOINTLOS2 ptl,PRECTLOS2 rct,ULONG flOptions,LONG lCount,LPCSTR pchString,CONST INT *alAdx)
220{
221 return GpiCharStringPosAt(GetDCData(pHps)->hps,(PPOINTL)ptl,(PRECTL)rct,flOptions,lCount,(PCH)pchString,(PLONG)alAdx);
222}
223
224BOOL OSLibGpiQueryCharStringPosAt(PVOID pHps,PPOINTLOS2 ptl,ULONG flOptions,LONG lCount,LPCSTR pchString,CONST INT *alAdx,PPOINTLOS2 aptlPos)
225{
226 return GpiQueryCharStringPosAt(GetDCData(pHps)->hps,(PPOINTL)ptl,flOptions,lCount,(PCH)pchString,(PLONG)alAdx,(PPOINTL)aptlPos);
227}
228
229BOOL OSLibGpiSetTextAlignment(PVOID pHps,LONG lHoriz,LONG lVert)
230{
231 return GpiSetTextAlignment(GetDCData(pHps)->hps,lHoriz,lVert);
232}
233
234BOOL OSLibGpiQueryTextAlignment(PVOID pHps,PLONG plHoriz,PLONG plVert)
235{
236 return GpiQueryTextAlignment(GetDCData(pHps)->hps,plHoriz,plVert);
237}
238
239LONG OSLibGpiQueryTabbedTextExtent(pDCData pHps,INT lCount,LPCSTR pchString,INT lTabCount,PINT puTabStops)
240{
241 return GpiQueryTabbedTextExtent(pHps->hps,lCount,(PCH)pchString,lTabCount,(PULONG)puTabStops);
242}
243
244LONG OSLibGpiTabbedCharStringAt(PVOID pHps,PPOINTLOS2 pPtStart,PRECTLOS2 prclRect,ULONG flOptions,INT lCount,LPCSTR pchString,INT lTabCount,PINT puTabStops,INT lTabOrigin)
245{
246 return GpiTabbedCharStringAt(GetDCData(pHps)->hps,(PPOINTL)pPtStart,(PRECTL)prclRect,flOptions,lCount,(PCH)pchString,lTabCount,(PULONG)puTabStops,lTabOrigin);
247}
248
249BOOL OSLibGpiQueryTextBox(pDCData pHps,LONG lCount1,LPCSTR pchString,LONG lCount2,PPOINTLOS2 aptlPoints)
250{
251 return GpiQueryTextBox(pHps->hps,lCount1,(PCH)pchString,lCount2,(PPOINTL)aptlPoints);
252}
253
254VOID calcDimensions(POINTLOS2 box[],PPOINTLOS2 point)
255{
256 ULONG cx;
257 ULONG cy;
258
259 if (box[TXTBOX_BOTTOMLEFT].y == box[TXTBOX_BOTTOMRIGHT].y)
260 {
261 point->y = labs (box[TXTBOX_BOTTOMLEFT].y-box[TXTBOX_TOPLEFT].y) + 1;
262 point->x = labs (box[TXTBOX_BOTTOMRIGHT].x-box[TXTBOX_BOTTOMLEFT].x) + 1;
263 if (box[TXTBOX_BOTTOMLEFT].x != box[TXTBOX_TOPLEFT].x)
264 {
265 if (point->y < 25)
266 cx = 2;
267 else
268 cx = ((point->y*10)+50)/100;
269 point->x += cx;
270 }
271 } else
272 {
273 cx = labs (box[TXTBOX_BOTTOMLEFT].x-box[TXTBOX_TOPLEFT].x) + 1;
274 cy = labs (box[TXTBOX_BOTTOMLEFT].y-box[TXTBOX_TOPLEFT].y) + 1;
275 point->y = (ULONG)hypot(cx,cy);
276
277 cx = labs (box[TXTBOX_TOPRIGHT].x-box[TXTBOX_TOPLEFT].x) + 1;
278 cy = labs (box[TXTBOX_TOPRIGHT].y-box[TXTBOX_TOPLEFT].y) + 1;
279 point->x = (ULONG)hypot(cx,cy);
280 }
281}
282
283LONG OSLibGpiQueryBackMix(PVOID pHps)
284{
285 return GpiQueryBackMix(GetDCData(pHps)->hps);
286}
287
288BOOL doesYAxisGrowNorth(PVOID pHps)
289{
290 if ((GetDCData(pHps)->windowExt.cy < 0 && GetDCData(pHps)->viewportYExt > 0.0) ||
291 (GetDCData(pHps)->windowExt.cy > 0 && GetDCData(pHps)->viewportYExt < 0.0))
292 {
293 if (GetDCData(pHps)->graphicsMode == GM_COMPATIBLE_W ||
294 (GetDCData(pHps)->graphicsMode == GM_ADVANCED_W && GetDCData(pHps)->xform.eM22 >= 0.0))
295 return TRUE;
296 } else
297 {
298 if (GetDCData(pHps)->graphicsMode == GM_ADVANCED_W && GetDCData(pHps)->xform.eM22 < 0.0)
299 return TRUE;
300 }
301
302 return FALSE;
303}
304
305LONG OSLibWinDrawTabbedText(PVOID pHps,LONG cchText,LONG lTabs,LPCSTR lpchText,PVOID prcl,LONG clrFore,LONG clrBack,ULONG flCmd)
306{
307 return WinDrawTabbedText(GetDCData(pHps)->hps,cchText,lTabs,(PCH)lpchText,(PRECTL)prcl,clrFore,clrBack,flCmd);
308}
309
310BOOL OSLibGpiMove(PVOID pHps,PPOINTLOS2 pptlPoint)
311{
312 return GpiMove(GetDCData(pHps)->hps,(PPOINTL)pptlPoint);
313}
314
315LONG OSLibGpiLine(PVOID pHps,PPOINTLOS2 pptlEndPoint)
316{
317 return GpiLine(GetDCData(pHps)->hps,(PPOINTL)pptlEndPoint);
318}
319
320#define FSP_ENDPATH 0x00000010
321#define FSP_FILL 0x00000020
322#define FSP_CLOSEPATH 0x00000040
323
324BOOL APIENTRY _PaxStrokeAndFillPath(HPS hPS,ULONG ulAction,ULONG ulStrokeAttrs,PAREABUNDLE pPenStroke);
325
326inline BOOL PaxStrokeAndFillPath(HPS hPS,ULONG ulAction,ULONG ulStrokeAttrs,PAREABUNDLE pPenStroke)
327{
328 BOOL yyrc;
329 USHORT sel = RestoreOS2FS();
330
331 yyrc = _PaxStrokeAndFillPath(hPS,ulAction,ulStrokeAttrs,pPenStroke);
332 SetFS(sel);
333
334 return yyrc;
335}
336
337
338BOOL OSLibGpiEndPath(PVOID pHps)
339{
340 return GpiEndPath(GetDCData(pHps)->hps);
341}
342
343BOOL drawLinePointCircle(PVOID pHps,INT width,INT height,LONG color)
344{
345 ARCPARAMS arcp;
346 BOOL rc = TRUE;
347
348 arcp.lP = 1;
349 arcp.lQ = 1;
350 arcp.lR = 0;
351 arcp.lS = 0;
352 if (!GpiSetArcParams(GetDCData(pHps)->hps,&arcp))
353 return FALSE;
354
355 AREABUNDLE newAreaBundle, oldAreaBundle;
356 LINEBUNDLE lineBundle;
357
358 GpiQueryAttrs(GetDCData(pHps)->hps,PRIM_AREA,ABB_COLOR | ABB_MIX_MODE | ABB_SET | ABB_SYMBOL,(PBUNDLE)&oldAreaBundle);
359 GpiQueryAttrs(GetDCData(pHps)->hps,PRIM_LINE,LBB_MIX_MODE, (PBUNDLE)&lineBundle);
360
361 newAreaBundle = oldAreaBundle;
362 newAreaBundle.lColor = color;
363 newAreaBundle.usMixMode = lineBundle.usMixMode;
364 newAreaBundle.usSet = LCID_DEFAULT;
365 newAreaBundle.usSymbol = PATSYM_SOLID;
366
367 if (!GpiSetAttrs(GetDCData(pHps)->hps,PRIM_AREA,ABB_COLOR | ABB_MIX_MODE | ABB_SET | ABB_SYMBOL,0,(PBUNDLE)&newAreaBundle))
368 return FALSE;
369
370 if (GpiFullArc(GetDCData(pHps)->hps,DRO_FILL,MAKEFIXED((width-1)>>1,0)) == GPI_ERROR)
371 rc = FALSE;
372 GpiSetAttrs(GetDCData(pHps)->hps,PRIM_AREA,ABB_COLOR | ABB_MIX_MODE | ABB_SET | ABB_SYMBOL,0,(PBUNDLE)&oldAreaBundle);
373
374 return rc;
375}
376
377BOOL drawLinePoint(PVOID pHps,PPOINTLOS2 pt,LONG color)
378{
379 LINEBUNDLE lbOld, lbNew;
380 LONG defaults = GpiQueryAttrs(GetDCData(pHps)->hps, PRIM_LINE, LBB_COLOR, &lbOld);
381
382 lbNew.lColor = color;
383 BOOL rc = GpiSetAttrs(GetDCData(pHps)->hps,PRIM_LINE,LBB_COLOR,0,&lbNew) && GpiSetPel(GetDCData(pHps)->hps,(PPOINTL)pt) != GPI_ERROR;
384
385 GpiSetAttrs(GetDCData(pHps)->hps,PRIM_LINE,LBB_COLOR,defaults,&lbOld);
386
387 return rc;
388}
389
390ULONG OSLibGpiQueryCp(HDC hdc)
391{
392 return GpiQueryCp(hdc);
393}
394
395BOOL OSLibGpiSetCp(HDC hdc, ULONG codepage)
396{
397 return GpiSetCp(hdc, codepage);
398}
399
400
401int OSLibGpiQueryFontMaxHeight(HDC hdc)
402{
403 FONTMETRICS metrics;
404 BOOL rc;
405
406 rc = GpiQueryFontMetrics(hdc, sizeof(metrics), &metrics);
407 if(rc) {
408 return max(metrics.lMaxBaselineExt,
409 max(metrics.lMaxAscender+metrics.lMaxDescender,
410 metrics.lInternalLeading+metrics.lEmHeight));
411 }
412 else {
413 dprintf(("GpiQueryFontMetrics returned FALSE!!"));
414 return 0;
415 }
416}
417
418#ifdef DEBUG
419void dprintfOrigin(HDC hdc)
420{
421 POINTL point;
422
423 pDCData pHps = (pDCData)OSLibGpiQueryDCData((HPS)hdc);
424 if(!pHps)
425 {
426 return;
427 }
428
429 GreGetDCOrigin(pHps->hps, &point);
430 dprintf2(("HDC %x origin (%d,%d) org (%d,%d)", hdc, point.x, point.y, pHps->ptlOrigin.x, pHps->ptlOrigin.y));
431}
432#endif
433//******************************************************************************
434//******************************************************************************
435BOOL OSLibDevQueryCaps(pDCData pHps, LONG lStart, LONG lCount, LONG *alArray)
436{
437 return DevQueryCaps(pHps->hdc, lStart, lCount, alArray);
438}
439//******************************************************************************
440//******************************************************************************
441BOOL OSLibGpiLoadFonts(LPSTR lpszFontFile)
442{
443 return GpiLoadFonts(0, lpszFontFile);
444}
445//******************************************************************************
446//******************************************************************************
Note: See TracBrowser for help on using the repository browser.