Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1013 lines
24 KiB

  1. /*++
  2. *
  3. * WOW v1.0
  4. *
  5. * Copyright (c) 1991, Microsoft Corporation
  6. *
  7. * WGDI31.C
  8. * WOW32 16-bit Win 3.1 GDI API support
  9. *
  10. * History:
  11. * Created 16-Mar-1992 by Chandan S. Chauhan (ChandanC)
  12. *
  13. --*/
  14. #include "precomp.h"
  15. #pragma hdrstop
  16. #include "wowgdip.h"
  17. MODNAME(wgdi31.c);
  18. // This must be removed POSTBETA 2 for sure. We should be using common defines between
  19. // GDI and WOW. ChandanC 5/27/94.
  20. #define NOFIRSTSAVE 0x7FFFFFFE
  21. #define ADD_MSTT 0x7FFFFFFD
  22. // located in wgdi.c
  23. extern void SendFormFeedHack(HDC hdc);
  24. extern void RemoveFormFeedHack(HDC hdc);
  25. ULONG FASTCALL WG32AbortDoc(PVDMFRAME pFrame)
  26. {
  27. ULONG ul;
  28. register PABORTDOC16 parg16;
  29. GETARGPTR(pFrame, sizeof(ABORTDOC16), parg16);
  30. // remove any buffered data streams.
  31. if(CURRENTPTD()->dwWOWCompatFlagsEx & WOWCFEX_FORMFEEDHACK) {
  32. RemoveFormFeedHack(HDC32(parg16->f1));
  33. }
  34. ul = GETINT16(AbortDoc(HDC32(parg16->f1)));
  35. if ((INT)ul < 0) {
  36. WOW32ASSERT ("WOW::WG32AbortDoc: Failed\n");
  37. }
  38. FREEARGPTR(parg16);
  39. RETURN(ul);
  40. }
  41. ULONG FASTCALL WG32CreateScalableFontResource(PVDMFRAME pFrame)
  42. {
  43. ULONG ul;
  44. PSZ t2;
  45. PSZ t3;
  46. PSZ t4;
  47. DWORD fHidden;
  48. register PCREATESCALABLEFONTRESOURCE16 parg16;
  49. GETARGPTR(pFrame, sizeof(CREATESCALABLEFONTRESOURCE16), parg16);
  50. GETPSZPTR(parg16->f2, t2);
  51. GETPSZPTR(parg16->f3, t3);
  52. GETPSZPTR(parg16->f4, t4);
  53. // We need to convert this param to 2 if the app gives 1. This tells GDI
  54. // to embed client TID in the private (hidden) font.
  55. //
  56. fHidden = (parg16->f1 == 1) ? 2 : (parg16->f1);
  57. ul = GETBOOL16(CreateScalableFontResource(fHidden,
  58. t2,
  59. t3,
  60. t4));
  61. FREEARGPTR(parg16);
  62. RETURN(ul);
  63. }
  64. ULONG FASTCALL WG32EndDoc(PVDMFRAME pFrame)
  65. {
  66. ULONG ul;
  67. register PENDDOC16 parg16;
  68. GETARGPTR(pFrame, sizeof(ENDDOC16), parg16);
  69. // send any buffered data streams to the printer.
  70. if(CURRENTPTD()->dwWOWCompatFlagsEx & WOWCFEX_FORMFEEDHACK) {
  71. SendFormFeedHack(HDC32(parg16->f1));
  72. }
  73. ul = GETINT16(EndDoc(HDC32(parg16->f1)));
  74. FREEARGPTR(parg16);
  75. RETURN(ul);
  76. }
  77. ULONG FASTCALL WG32EnumFontFamilies(PVDMFRAME pFrame)
  78. {
  79. return( W32EnumFontHandler(pFrame, TRUE) );
  80. }
  81. ULONG FASTCALL WG32GetAspectRatioFilterEx(PVDMFRAME pFrame)
  82. {
  83. ULONG ul;
  84. SIZE AspectRatio;
  85. register PGETASPECTRATIOFILTEREX16 parg16;
  86. GETARGPTR(pFrame, sizeof(GETASPECTRATIOFILTEREX16), parg16);
  87. ul = GETBOOL16(GetAspectRatioFilterEx(HDC32(parg16->f1), &AspectRatio));
  88. PUTSIZE16(parg16->f2, &AspectRatio);
  89. FREEARGPTR(parg16);
  90. RETURN(ul);
  91. }
  92. ULONG FASTCALL WG32GetBitmapDimensionEx(PVDMFRAME pFrame)
  93. {
  94. ULONG ul;
  95. SIZE Dimension;
  96. register PGETBITMAPDIMENSIONEX16 parg16;
  97. GETARGPTR(pFrame, sizeof(GETBITMAPDIMENSIONEX16), parg16);
  98. ul = GETBOOL16(GetBitmapDimensionEx(HBITMAP32(parg16->f1), &Dimension));
  99. PUTSIZE16(parg16->f2, &Dimension);
  100. FREEARGPTR(parg16);
  101. RETURN (ul);
  102. }
  103. ULONG FASTCALL WG32GetBoundsRect(PVDMFRAME pFrame)
  104. {
  105. ULONG ul = 0;
  106. RECT Bounds;
  107. register PGETBOUNDSRECT16 parg16;
  108. GETARGPTR(pFrame, sizeof(GETBOUNDSRECT16), parg16);
  109. ul = GETUINT16(GetBoundsRect(HDC32(parg16->f1),
  110. &Bounds,
  111. UINT32(parg16->f3)));
  112. //
  113. // Win16 GetBoundsRect always returns DCB_SET or DCB_RESET.
  114. //
  115. ul = (ul & DCB_SET) ? DCB_SET : DCB_RESET;
  116. PUTRECT16(parg16->f2, &Bounds);
  117. FREEARGPTR(parg16);
  118. RETURN (ul);
  119. }
  120. ULONG FASTCALL WG32GetBrushOrgEx(PVDMFRAME pFrame)
  121. {
  122. ULONG ul;
  123. POINT Point;
  124. register PGETBRUSHORGEX16 parg16;
  125. GETARGPTR(pFrame, sizeof(GETBRUSHORGEX16), parg16);
  126. ul = GETBOOL16(GetBrushOrgEx(HDC32(parg16->f1), &Point));
  127. PUTPOINT16(parg16->f2, &Point);
  128. FREEARGPTR(parg16);
  129. RETURN (ul);
  130. }
  131. ULONG FASTCALL WG32GetCharABCWidths(PVDMFRAME pFrame)
  132. {
  133. ULONG ul=0;
  134. LPABC lpAbc;
  135. WORD cb;
  136. register PGETCHARABCWIDTHS16 parg16;
  137. GETARGPTR(pFrame, sizeof(GETCHARABCWIDTHS16), parg16);
  138. cb = WORD32(parg16->f3) - WORD32(parg16->f2) + 1;
  139. if (lpAbc = (LPABC) malloc_w (sizeof(ABC) * cb)) {
  140. ul = GETBOOL16(GetCharABCWidths(HDC32(parg16->f1),
  141. WORD32(parg16->f2),
  142. WORD32(parg16->f3),
  143. lpAbc));
  144. if (ul) {
  145. putabcpairs16(parg16->f4, cb, lpAbc);
  146. }
  147. free_w (lpAbc);
  148. }
  149. FREEARGPTR(parg16);
  150. RETURN (ul);
  151. }
  152. ULONG FASTCALL WG32GetCurrentPositionEx(PVDMFRAME pFrame)
  153. {
  154. ULONG ul;
  155. POINT Point;
  156. register PGETCURRENTPOSITIONEX16 parg16;
  157. GETARGPTR(pFrame, sizeof(GETCURRENTPOSITIONEX16), parg16);
  158. ul = GETBOOL16(GetCurrentPositionEx(HDC32(parg16->f1), &Point));
  159. PUTPOINT16(parg16->f2, &Point);
  160. FREEARGPTR(parg16);
  161. RETURN (ul);
  162. }
  163. ULONG FASTCALL WG32GetGlyphOutline(PVDMFRAME pFrame)
  164. {
  165. ULONG ul;
  166. LPSTR lpBuffer;
  167. MAT2 Matrix;
  168. GLYPHMETRICS Metrics;
  169. register PGETGLYPHOUTLINE16 parg16;
  170. GETARGPTR(pFrame, sizeof(GETGLYPHOUTLINE16), parg16);
  171. GETMAT2(parg16->f7, &Matrix);
  172. GETVDMPTR(parg16->f6, parg16->f5, lpBuffer);
  173. ul = GETDWORD16(GetGlyphOutlineWow(HDC32(parg16->f1),
  174. WORD32(parg16->f2),
  175. WORD32(parg16->f3),
  176. parg16->f4 ? &Metrics : (GLYPHMETRICS*)NULL,
  177. DWORD32(parg16->f5),
  178. lpBuffer,
  179. &Matrix));
  180. if ( FETCHDWORD(parg16->f4) != 0 ) {
  181. PUTGLYPHMETRICS16(FETCHDWORD(parg16->f4), &Metrics);
  182. }
  183. FREEVDMPTR(lpBuffer);
  184. FREEARGPTR(parg16);
  185. RETURN (ul);
  186. }
  187. ULONG FASTCALL WG32GetKerningPairs(PVDMFRAME pFrame)
  188. {
  189. ULONG ul;
  190. LPKERNINGPAIR lpkrnpair = NULL;
  191. register PGETKERNINGPAIRS16 parg16;
  192. GETARGPTR(pFrame, sizeof(GETKERNINGPAIRS16), parg16);
  193. if (FETCHDWORD(parg16->f3)) {
  194. lpkrnpair = (LPKERNINGPAIR) malloc_w (sizeof(KERNINGPAIR) * (parg16->f2));
  195. if (!lpkrnpair) {
  196. LOGDEBUG (0, ("WOW::WG32GetKeriningPairs: *** MALLOC failed ***\n"));
  197. FREEARGPTR(parg16);
  198. RETURN (0);
  199. }
  200. }
  201. ul = GetKerningPairs(HDC32(parg16->f1), parg16->f2, lpkrnpair);
  202. if (FETCHDWORD(parg16->f3)) {
  203. putkerningpairs16 (FETCHDWORD(parg16->f3), parg16->f2, lpkrnpair);
  204. free_w (lpkrnpair);
  205. }
  206. FREEARGPTR(parg16);
  207. RETURN (ul);
  208. }
  209. ULONG FASTCALL WG32GetOutlineTextMetrics(PVDMFRAME pFrame)
  210. {
  211. ULONG ul;
  212. register PGETOUTLINETEXTMETRICS16 parg16;
  213. UINT cb;
  214. UINT new_cb;
  215. VPOUTLINETEXTMETRIC16 vpotm;
  216. LPOUTLINETEXTMETRIC lpBuffer;
  217. GETARGPTR(pFrame, sizeof(GETOUTLINETEXTMETRICS16), parg16);
  218. vpotm = (VPOUTLINETEXTMETRIC16)FETCHDWORD(parg16->f3);
  219. new_cb = cb = FETCHWORD(parg16->f2);
  220. if ( vpotm ) {
  221. new_cb += sizeof(OUTLINETEXTMETRIC) - sizeof(OUTLINETEXTMETRIC16);
  222. if (!(lpBuffer = (LPOUTLINETEXTMETRIC)malloc_w(new_cb))) {
  223. FREEARGPTR(parg16);
  224. RETURN (0);
  225. }
  226. } else {
  227. lpBuffer = NULL;
  228. }
  229. ul = GETDWORD16(GetOutlineTextMetrics(HDC32(parg16->f1), new_cb, lpBuffer));
  230. if ( vpotm ) {
  231. PUTOUTLINETEXTMETRIC16(vpotm, cb, lpBuffer);
  232. free_w( lpBuffer );
  233. } else {
  234. if ( ul != 0 ) {
  235. ul -= sizeof(OUTLINETEXTMETRIC) - sizeof(OUTLINETEXTMETRIC16);
  236. }
  237. }
  238. FREEARGPTR(parg16);
  239. RETURN (ul);
  240. }
  241. ULONG FASTCALL WG32GetRasterizerCaps(PVDMFRAME pFrame)
  242. {
  243. ULONG ul;
  244. RASTERIZER_STATUS RStatus;
  245. register PGETRASTERIZERCAPS16 parg16;
  246. GETARGPTR(pFrame, sizeof(GETRASTERIZERCAPS16), parg16);
  247. ul = GETBOOL16(GetRasterizerCaps(&RStatus, INT32(parg16->f2)));
  248. PUTRASTERIZERSTATUS16(parg16->f1, &RStatus);
  249. FREEARGPTR(parg16);
  250. RETURN (ul);
  251. }
  252. #define PUTEXTSIZE16(vp, lp) \
  253. { \
  254. PSIZE16 p16; \
  255. GETVDMPTR(vp, sizeof(SIZE16), p16); \
  256. if (((lp)->cx|(lp)->cy) & ~SHRT_MAX) \
  257. { \
  258. if ((lp)->cx > SHRT_MAX) \
  259. STORESHORT(p16->cx, SHRT_MAX); \
  260. else \
  261. STORESHORT(p16->cx, (lp)->cx); \
  262. if ((lp)->cy > SHRT_MAX) \
  263. STORESHORT(p16->cy, SHRT_MAX); \
  264. else \
  265. STORESHORT(p16->cy, (lp)->cy); \
  266. } \
  267. else \
  268. { \
  269. STORESHORT(p16->cx, (lp)->cx); \
  270. STORESHORT(p16->cy, (lp)->cy); \
  271. } \
  272. FREEVDMPTR(p16); \
  273. }
  274. ULONG FASTCALL WG32GetTextExtentPoint(PVDMFRAME pFrame)
  275. {
  276. ULONG ul;
  277. PSZ lpString;
  278. SIZE Size;
  279. register PGETTEXTEXTENTPOINT16 parg16;
  280. HDC hDC32;
  281. HDC hDCMenu = NULL;
  282. HGDIOBJ hOldFont;
  283. HGDIOBJ hFont = NULL;
  284. NONCLIENTMETRICS ncm;
  285. PTD ptd = CURRENTPTD();
  286. GETARGPTR(pFrame, sizeof(GETTEXTEXTENTPOINT16), parg16);
  287. GETPSZPTR(parg16->f2, lpString);
  288. hDC32 = HDC32(parg16->f1);
  289. // WP tutorial assumes that the font selected in the hDC for desktop window
  290. // (ie, result of GetDC(NULL)) is the same font as the font selected for
  291. // drawing the menu. Unfortunetly in SUR this is not true as the user can
  292. // select any font for the menu. So we remember the hDC returned for GetDC(0)
  293. // and check for it in GetTextExtentPoint. If the app does try to use it we
  294. // find the hDC for the current menu window and substitute that. When the app
  295. // does another GetDC or ReleaseDC we forget the hDC returned for the original
  296. // GetDC(0).
  297. if ((ptd->dwWOWCompatFlagsEx & WOWCFEX_FIXDCFONT4MENUSIZE) &&
  298. (parg16->f1 == ptd->ulLastDesktophDC) &&
  299. ((hDCMenu = GetDC(NULL)) != NULL) &&
  300. ((ncm.cbSize = sizeof(NONCLIENTMETRICS)) != 0) &&
  301. (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, (PVOID)&ncm, 0)) &&
  302. ((hFont = CreateFontIndirect(&(ncm.lfMenuFont))) != NULL)) {
  303. hOldFont = SelectObject(hDCMenu, hFont);
  304. hDC32 = hDCMenu;
  305. }
  306. ul = GETBOOL16(GetTextExtentPoint(hDC32,
  307. lpString,
  308. INT32(parg16->f3),
  309. &Size));
  310. if (hDCMenu != NULL) {
  311. if (hFont != NULL) {
  312. SelectObject(hDCMenu, hOldFont);
  313. DeleteObject(hFont);
  314. }
  315. ReleaseDC(NULL, hDCMenu);
  316. }
  317. PUTEXTSIZE16(parg16->f4, &Size);
  318. FREEARGPTR(parg16);
  319. RETURN (ul);
  320. }
  321. ULONG FASTCALL WG32GetViewportExtEx(PVDMFRAME pFrame)
  322. {
  323. ULONG ul;
  324. SIZE Size;
  325. register PGETVIEWPORTEXTEX16 parg16;
  326. GETARGPTR(pFrame, sizeof(GETVIEWPORTEXTEX16), parg16);
  327. ul = GETBOOL16(GetViewportExtEx(HDC32(parg16->f1), &Size));
  328. PUTSIZE16(parg16->f2, &Size);
  329. FREEARGPTR(parg16);
  330. RETURN (ul);
  331. }
  332. ULONG FASTCALL WG32GetViewportOrgEx(PVDMFRAME pFrame)
  333. {
  334. ULONG ul;
  335. POINT Point;
  336. register PGETVIEWPORTORGEX16 parg16;
  337. GETARGPTR(pFrame, sizeof(GETVIEWPORTORGEX16), parg16);
  338. ul = GETBOOL16(GetViewportOrgEx(HDC32(parg16->f1), &Point));
  339. PUTPOINT16(parg16->f2, &Point);
  340. FREEARGPTR(parg16);
  341. RETURN (ul);
  342. }
  343. ULONG FASTCALL WG32GetWindowExtEx(PVDMFRAME pFrame)
  344. {
  345. ULONG ul;
  346. SIZE Size;
  347. register PGETWINDOWEXTEX16 parg16;
  348. GETARGPTR(pFrame, sizeof(GETWINDOWEXTEX16), parg16);
  349. ul = GETBOOL16(GetWindowExtEx( HDC32(parg16->f1),&Size));
  350. PUTSIZE16(parg16->f2, &Size);
  351. FREEARGPTR(parg16);
  352. RETURN (ul);
  353. }
  354. ULONG FASTCALL WG32GetWindowOrgEx(PVDMFRAME pFrame)
  355. {
  356. ULONG ul;
  357. POINT Point;
  358. register PGETWINDOWORGEX16 parg16;
  359. GETARGPTR(pFrame, sizeof(GETWINDOWORGEX16), parg16);
  360. ul = GETBOOL16(GetWindowOrgEx(HDC32(parg16->f1), &Point));
  361. PUTPOINT16(parg16->f2, &Point);
  362. FREEARGPTR(parg16);
  363. RETURN (ul);
  364. }
  365. ULONG FASTCALL WG32MoveToEx(PVDMFRAME pFrame)
  366. {
  367. ULONG ul;
  368. POINT Point;
  369. LPPOINT lpPoint = NULL;
  370. register PMOVETOEX16 parg16;
  371. GETARGPTR(pFrame, sizeof(MOVETOEX16), parg16);
  372. if (parg16->f4) {
  373. lpPoint = &Point;
  374. }
  375. ul = GETBOOL16(MoveToEx(HDC32(parg16->f1),
  376. INT32(parg16->f2),
  377. INT32(parg16->f3),
  378. lpPoint));
  379. if (parg16->f4) {
  380. PUTPOINT16(parg16->f4, lpPoint);
  381. }
  382. FREEARGPTR(parg16);
  383. RETURN (ul);
  384. }
  385. ULONG FASTCALL WG32OffsetViewportOrgEx(PVDMFRAME pFrame)
  386. {
  387. ULONG ul;
  388. POINT Point;
  389. LPPOINT lpPoint = NULL;
  390. register POFFSETVIEWPORTORGEX16 parg16;
  391. GETARGPTR(pFrame, sizeof(OFFSETVIEWPORTEX16), parg16);
  392. if (parg16->f4) {
  393. lpPoint = &Point;
  394. }
  395. ul = GETBOOL16(OffsetViewportOrgEx(HDC32(parg16->f1),
  396. INT32(parg16->f2),
  397. INT32(parg16->f3),
  398. lpPoint));
  399. if (parg16->f4) {
  400. PUTPOINT16(parg16->f4, lpPoint);
  401. }
  402. FREEARGPTR(parg16);
  403. RETURN (ul);
  404. }
  405. ULONG FASTCALL WG32OffsetWindowOrgEx(PVDMFRAME pFrame)
  406. {
  407. ULONG ul;
  408. POINT Point;
  409. LPPOINT lpPoint = NULL;
  410. register POFFSETWINDOWORGEX16 parg16;
  411. GETARGPTR(pFrame, sizeof(OFFSETWINDOWORGEX16), parg16);
  412. if (parg16->f4) {
  413. lpPoint = &Point;
  414. }
  415. ul = GETBOOL16(OffsetWindowOrgEx(HDC32(parg16->f1),
  416. INT32(parg16->f2),
  417. INT32(parg16->f3),
  418. lpPoint));
  419. if (parg16->f4) {
  420. PUTPOINT16(parg16->f4, lpPoint);
  421. }
  422. FREEARGPTR(parg16);
  423. RETURN (ul);
  424. }
  425. ULONG FASTCALL WG32ResetDC(PVDMFRAME pFrame)
  426. {
  427. ULONG ul = 0;
  428. LPDEVMODE lpInitData;
  429. register PRESETDC16 parg16;
  430. GETARGPTR(pFrame, sizeof(RESETDC16), parg16);
  431. if( lpInitData = ThunkDevMode16to32(FETCHDWORD(parg16->f2)) ) {
  432. // send any buffered data streams.
  433. if(CURRENTPTD()->dwWOWCompatFlagsEx & WOWCFEX_FORMFEEDHACK) {
  434. SendFormFeedHack(HDC32(parg16->f1));
  435. }
  436. ul = GETHDC16(ResetDC(HDC32(parg16->f1), lpInitData));
  437. FREEDEVMODE32(lpInitData);
  438. }
  439. RETURN (ul);
  440. }
  441. ULONG FASTCALL WG32ScaleViewportExtEx(PVDMFRAME pFrame)
  442. {
  443. ULONG ul;
  444. SIZE Size;
  445. LPSIZE lpSize = NULL;
  446. register PSCALEVIEWPORTEXTEX16 parg16;
  447. GETARGPTR(pFrame, sizeof(SCALEVIEWPORTEXTEX16), parg16);
  448. if (parg16->f6) {
  449. lpSize = &Size;
  450. }
  451. ul = GETBOOL16(ScaleViewportExtEx(HDC32(parg16->f1),
  452. INT32(parg16->f2),
  453. INT32(parg16->f3),
  454. INT32(parg16->f4),
  455. INT32(parg16->f5),
  456. lpSize));
  457. if (parg16->f6) {
  458. PUTSIZE16(parg16->f6, lpSize);
  459. }
  460. FREEARGPTR(parg16);
  461. RETURN (ul);
  462. }
  463. ULONG FASTCALL WG32ScaleWindowExtEx(PVDMFRAME pFrame)
  464. {
  465. ULONG ul;
  466. SIZE Size;
  467. LPSIZE lpSize = NULL;
  468. register PSCALEWINDOWEXTEX16 parg16;
  469. GETARGPTR(pFrame, sizeof(SCALEWINDOWEXTEX16), parg16);
  470. if (parg16->f6) {
  471. lpSize = &Size;
  472. }
  473. ul = GETBOOL16(ScaleWindowExtEx(HDC32(parg16->f1),
  474. INT32(parg16->f2),
  475. INT32(parg16->f3),
  476. INT32(parg16->f4),
  477. INT32(parg16->f5),
  478. lpSize));
  479. if (parg16->f6) {
  480. PUTSIZE16(parg16->f6, lpSize);
  481. }
  482. FREEARGPTR(parg16);
  483. RETURN (ul);
  484. }
  485. ULONG FASTCALL WG32SetAbortProc(PVDMFRAME pFrame)
  486. {
  487. ULONG ul;
  488. register PSETABORTPROC16 parg16;
  489. GETARGPTR(pFrame, sizeof(SETABORTPROC16), parg16);
  490. ((PTDB)SEGPTR(pFrame->wTDB, 0))->TDB_vpfnAbortProc = FETCHDWORD(parg16->f2);
  491. ul = GETINT16(SetAbortProc(HDC32(parg16->f1), (ABORTPROC) W32AbortProc));
  492. FREEARGPTR(parg16);
  493. RETURN (ul);
  494. }
  495. ULONG FASTCALL WG32SetBitmapDimensionEx(PVDMFRAME pFrame)
  496. {
  497. ULONG ul;
  498. SIZE Size;
  499. LPSIZE lpSize = NULL;
  500. register PSETBITMAPDIMENSIONEX16 parg16;
  501. GETARGPTR(pFrame, sizeof(SETBITMAPDIMENSIONEX16), parg16);
  502. if (parg16->f4) {
  503. lpSize = &Size;
  504. }
  505. ul = GETBOOL16(SetBitmapDimensionEx(HBITMAP32(parg16->f1),
  506. INT32(parg16->f2),
  507. INT32(parg16->f3),
  508. lpSize));
  509. if (parg16->f4) {
  510. PUTSIZE16(parg16->f4, lpSize);
  511. }
  512. FREEARGPTR(parg16);
  513. RETURN (ul);
  514. }
  515. ULONG FASTCALL WG32SetBoundsRect(PVDMFRAME pFrame)
  516. {
  517. ULONG ul = 0;
  518. RECT rcBounds;
  519. register PSETBOUNDSRECT16 parg16;
  520. GETARGPTR(pFrame, sizeof(SETBOUNDSRECT16), parg16);
  521. GETRECT16(parg16->f2, &rcBounds);
  522. ul = GETWORD16(SetBoundsRect(HDC32(parg16->f1),
  523. &rcBounds,
  524. WORD32(parg16->f3)));
  525. FREEARGPTR(parg16);
  526. RETURN (ul);
  527. }
  528. #if 0 // implemented in gdi.exe
  529. ULONG FASTCALL WG32SetMetaFileBitsBetter(PVDMFRAME pFrame)
  530. {
  531. return(WG32SetMetaFileBits(pFrame));
  532. }
  533. #endif
  534. ULONG FASTCALL WG32SetViewportExtEx(PVDMFRAME pFrame)
  535. {
  536. ULONG ul;
  537. SIZE Size;
  538. LPSIZE lpSize = NULL;
  539. register PSETVIEWPORTEXTEX16 parg16;
  540. GETARGPTR(pFrame, sizeof(SETVIEWPORTEXTEX16), parg16);
  541. if (parg16->f4) {
  542. lpSize = &Size;
  543. }
  544. ul = GETBOOL16(SetViewportExtEx(HDC32(parg16->f1),
  545. INT32(parg16->f2),
  546. INT32(parg16->f3),
  547. lpSize));
  548. if (parg16->f4) {
  549. PUTSIZE16(parg16->f4, lpSize);
  550. }
  551. FREEARGPTR(parg16);
  552. RETURN (ul);
  553. }
  554. ULONG FASTCALL WG32SetViewportOrgEx(PVDMFRAME pFrame)
  555. {
  556. ULONG ul;
  557. POINT Point;
  558. LPPOINT lpPoint = NULL;
  559. register PSETVIEWPORTORGEX16 parg16;
  560. GETARGPTR(pFrame, sizeof(SETVIEWPORTORGEX16), parg16);
  561. if (parg16->f4) {
  562. lpPoint = &Point;
  563. }
  564. ul = GETBOOL16(SetViewportOrgEx(HDC32(parg16->f1),
  565. INT32(parg16->f2),
  566. INT32(parg16->f3),
  567. lpPoint));
  568. if (parg16->f4) {
  569. PUTPOINT16(parg16->f4, lpPoint);
  570. }
  571. FREEARGPTR(parg16);
  572. RETURN (ul);
  573. }
  574. ULONG FASTCALL WG32SetWindowExtEx(PVDMFRAME pFrame)
  575. {
  576. ULONG ul;
  577. SIZE Size;
  578. LPSIZE lpSize = NULL;
  579. register PSETWINDOWEXTEX16 parg16;
  580. GETARGPTR(pFrame, sizeof(SETWINDOWEXTEX16), parg16);
  581. if (parg16->f4) {
  582. lpSize = &Size;
  583. }
  584. ul = GETBOOL16(SetWindowExtEx(HDC32(parg16->f1),
  585. INT32(parg16->f2),
  586. INT32(parg16->f3),
  587. lpSize));
  588. if (parg16->f4) {
  589. PUTSIZE16(parg16->f4, lpSize);
  590. }
  591. FREEARGPTR(parg16);
  592. RETURN (ul);
  593. }
  594. ULONG FASTCALL WG32SetWindowOrgEx(PVDMFRAME pFrame)
  595. {
  596. ULONG ul;
  597. POINT Point;
  598. LPPOINT lpPoint = NULL;
  599. register PSETWINDOWORGEX16 parg16;
  600. GETARGPTR(pFrame, sizeof(SETWINDOWORGEX16), parg16);
  601. if (parg16->f4) {
  602. lpPoint = &Point;
  603. }
  604. ul = GETBOOL16(SetWindowOrgEx(HDC32(parg16->f1),
  605. INT32(parg16->f2),
  606. INT32(parg16->f3),
  607. lpPoint));
  608. if (parg16->f4) {
  609. PUTPOINT16(parg16->f4, lpPoint);
  610. }
  611. FREEARGPTR(parg16);
  612. RETURN (ul);
  613. }
  614. ULONG FASTCALL WG32StartDoc(PVDMFRAME pFrame)
  615. {
  616. ULONG ul;
  617. VPVOID vpDocName;
  618. VPVOID vpOutput;
  619. DOCINFO DocInfo;
  620. LPDOCINFO16 pdi16;
  621. register PSTARTDOC16 parg16;
  622. GETARGPTR(pFrame, sizeof(STARTDOC16), parg16);
  623. GETVDMPTR(parg16->f2, sizeof(DOCINFO16), pdi16);
  624. //
  625. // Win32 StartDoc depends on having the correct current directory
  626. // when printing to FILE: (which pops up for a filename).
  627. //
  628. UpdateDosCurrentDirectory(DIR_DOS_TO_NT);
  629. DocInfo.cbSize = sizeof(DOCINFO);
  630. vpDocName = FETCHDWORD(pdi16->lpszDocName);
  631. vpOutput = FETCHDWORD(pdi16->lpszOutput);
  632. GETPSZPTR(vpDocName, DocInfo.lpszDocName);
  633. GETPSZPTR(vpOutput, DocInfo.lpszOutput);
  634. DocInfo.lpszDatatype = NULL;
  635. DocInfo.fwType = 0;
  636. FREEVDMPTR(pdi16);
  637. ul = GETINT16(StartDoc(HDC32(parg16->f1), &DocInfo));
  638. if (CURRENTPTD()->dwWOWCompatFlags & WOWCF_NOFIRSTSAVE) {
  639. int l;
  640. char szBuf[80];
  641. if ((l = ExtEscape(HDC32(parg16->f1),
  642. GETTECHNOLOGY,
  643. 0,
  644. NULL,
  645. sizeof(szBuf),
  646. szBuf)) > 0) {
  647. if (!WOW32_stricmp(szBuf, szPostscript)) {
  648. l = ExtEscape(HDC32(parg16->f1),
  649. NOFIRSTSAVE,
  650. 0,
  651. NULL,
  652. 0,
  653. NULL);
  654. // This HACK is for FH4.0 only. If you have any questions
  655. // talk to PingW or ChandanC.
  656. // July 21st 1994.
  657. //
  658. if (CURRENTPTD()->dwWOWCompatFlags & WOWCF_ADD_MSTT) {
  659. l = ExtEscape(HDC32(parg16->f1),
  660. ADD_MSTT,
  661. 0,
  662. NULL,
  663. 0,
  664. NULL);
  665. }
  666. }
  667. }
  668. }
  669. FREEPSZPTR(DocInfo.lpszDocName);
  670. FREEPSZPTR(DocInfo.lpszOutput);
  671. FREEARGPTR(parg16);
  672. RETURN (ul);
  673. }
  674. // InquireVisRgn is an undocumented Win 3.1 API. This code has been
  675. // suggested by ChuckWh. If this does not fix the FileMaker Pro 2.0
  676. // problem, then ChuckWh would be providing us with an private entry
  677. // point.
  678. // ChandanC 7th Feb 93
  679. //
  680. HRGN ghrgnVis = NULL;
  681. ULONG FASTCALL WG32InquireVisRgn(PVDMFRAME pFrame)
  682. {
  683. register PINQUIREVISRGN16 parg16;
  684. extern int GetRandomRgn(HDC hdc, HRGN hrgn, int cmd);
  685. GETARGPTR(pFrame, sizeof(INQUIREVISRGN16), parg16);
  686. // call special gdi entry point to get copy of vis rgn
  687. GetRandomRgn(HDC32(parg16->f1), ghrgnVis, 4);
  688. FREEARGPTR(parg16);
  689. RETURN (GETHRGN16(ghrgnVis));
  690. }
  691. BOOL InitVisRgn()
  692. {
  693. ghrgnVis = CreateRectRgn(0,0,0,0);
  694. return(ghrgnVis != NULL);
  695. }
  696. VOID putabcpairs16(VPABC16 vpAbc, UINT cb, LPABC lpAbc)
  697. {
  698. UINT i;
  699. register PABC16 pAbc16;
  700. GETVDMPTR(vpAbc, sizeof(ABC16), pAbc16);
  701. for (i=0; i < cb; i++) {
  702. pAbc16[i].abcA = (INT16) lpAbc[i].abcA;
  703. pAbc16[i].abcB = (WORD) lpAbc[i].abcB;
  704. pAbc16[i].abcC = (INT16) lpAbc[i].abcC;
  705. }
  706. FLUSHVDMPTR(vpAbc, sizeof(ABC16), pAbc16);
  707. FREEVDMPTR(pAbc16);
  708. }
  709. ULONG FASTCALL WG32GetClipRgn(PVDMFRAME pFrame)
  710. {
  711. register PGETCLIPRGN16 parg16;
  712. // this is a private win3.1 entry pointed defined as HRGN GetClipRgn(HDC);
  713. // NT exports the entry point defined as DWORD GetClipRgn(HDC,HRGN);
  714. // NT will not give out the handle to its internal cliprgn so instead
  715. // makes a copy. Any app uses this private win3.1 entry point will
  716. // have a global region created for it that will go away when the
  717. // app goes away.
  718. GETARGPTR(pFrame, sizeof(GETCLIPRGN16), parg16);
  719. if (CURRENTPTD()->hrgnClip == NULL)
  720. CURRENTPTD()->hrgnClip = CreateRectRgn(0,0,0,0);
  721. GetClipRgn(HDC32(parg16->f1), CURRENTPTD()->hrgnClip);
  722. FREEARGPTR(parg16);
  723. RETURN (GETHRGN16(CURRENTPTD()->hrgnClip));
  724. }