Leaked source code of windows server 2003
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.

988 lines
25 KiB

  1. /*++
  2. Copyright (c) 1996-2002 Microsoft Corp. & Ricoh Co., Ltd. All rights reserved.
  3. FILE: DDI.C
  4. Abstract: Implementation of OEM DDI exports & OEM DDI hooks.
  5. Functions: OEMEnablePDEV
  6. OEMDisablePDEV
  7. OEMResetPDEV
  8. OEMEnableDriver
  9. OEMDisableDriver
  10. OEMxxx (DDI hooks)
  11. Environment: Windows NT Unidrv5 driver
  12. Revision History:
  13. 04/07/1997 -zhanw-
  14. Created it.
  15. 02/29/2000 -Masatoshi Kubokura-
  16. Modified for PCL5e/PScript plugin from RPDL code.
  17. 03/15/2000 -Masatoshi Kubokura-
  18. V.1.11
  19. 08/01/2000 -Masatoshi Kubokura-
  20. Modified for NT4
  21. 09/07/2000 -Masatoshi Kubokura-
  22. Last Modified for XP inbox.
  23. 02/26/2002 -Masatoshi Kubokura-
  24. Include strsafe.h.
  25. --*/
  26. #include <ctype.h>
  27. #include "pdev.h"
  28. #ifndef WINNT_40
  29. #include "strsafe.h" // @Feb/26/2002
  30. #endif // !WINNT_40
  31. #ifdef DDIHOOK
  32. static const DRVFN OEMHookFuncs[] =
  33. {
  34. // { INDEX_DrvRealizeBrush, (PFN) OEMRealizeBrush },
  35. // { INDEX_DrvDitherColor, (PFN) OEMDitherColor },
  36. // { INDEX_DrvCopyBits, (PFN) OEMCopyBits },
  37. // { INDEX_DrvBitBlt, (PFN) OEMBitBlt },
  38. // { INDEX_DrvStretchBlt, (PFN) OEMStretchBlt },
  39. // { INDEX_DrvStretchBltROP, (PFN) OEMStretchBltROP },
  40. // { INDEX_DrvPlgBlt, (PFN) OEMPlgBlt },
  41. // { INDEX_DrvTransparentBlt, (PFN) OEMTransparentBlt },
  42. // { INDEX_DrvAlphaBlend, (PFN) OEMAlphaBlend },
  43. // { INDEX_DrvGradientFill, (PFN) OEMGradientFill },
  44. // { INDEX_DrvTextOut, (PFN) OEMTextOut },
  45. // { INDEX_DrvStrokePath, (PFN) OEMStrokePath },
  46. // { INDEX_DrvFillPath, (PFN) OEMFillPath },
  47. // { INDEX_DrvStrokeAndFillPath, (PFN) OEMStrokeAndFillPath },
  48. // { INDEX_DrvPaint, (PFN) OEMPaint },
  49. // { INDEX_DrvLineTo, (PFN) OEMLineTo },
  50. // { INDEX_DrvStartPage, (PFN) OEMStartPage },
  51. // { INDEX_DrvSendPage, (PFN) OEMSendPage },
  52. // { INDEX_DrvEscape, (PFN) OEMEscape },
  53. { INDEX_DrvStartDoc, (PFN) OEMStartDoc }
  54. //, { INDEX_DrvEndDoc, (PFN) OEMEndDoc },
  55. // { INDEX_DrvNextBand, (PFN) OEMNextBand },
  56. // { INDEX_DrvStartBanding, (PFN) OEMStartBanding },
  57. // { INDEX_DrvQueryFont, (PFN) OEMQueryFont },
  58. // { INDEX_DrvQueryFontTree, (PFN) OEMQueryFontTree },
  59. // { INDEX_DrvQueryFontData, (PFN) OEMQueryFontData },
  60. // { INDEX_DrvQueryAdvanceWidths, (PFN) OEMQueryAdvanceWidths },
  61. // { INDEX_DrvFontManagement, (PFN) OEMFontManagement },
  62. // { INDEX_DrvGetGlyphMode, (PFN) OEMGetGlyphMode }
  63. };
  64. #endif // DDIHOOK
  65. PDEVOEM APIENTRY
  66. OEMEnablePDEV(
  67. PDEVOBJ pdevobj,
  68. PWSTR pPrinterName,
  69. ULONG cPatterns,
  70. HSURF *phsurfPatterns,
  71. ULONG cjGdiInfo,
  72. GDIINFO *pGdiInfo,
  73. ULONG cjDevInfo,
  74. DEVINFO *pDevInfo,
  75. DRVENABLEDATA *pded) // Unidrv's hook table
  76. {
  77. POEMPDEV poempdev;
  78. INT i, j;
  79. PFN pfn;
  80. DWORD dwDDIIndex;
  81. PDRVFN pdrvfn;
  82. VERBOSE(("OEMEnablePDEV() entry.\n"));
  83. // Allocate the OEMPDEV
  84. if (!(poempdev = MemAlloc(sizeof(OEMPDEV))))
  85. return NULL;
  86. // Initialize OEMPDEV
  87. // poempdev->fGeneral = 0;
  88. #ifdef DDIHOOK
  89. // Fill Unidrv's hooks in OEMPDEV
  90. for (i = 0; i < MAX_DDI_HOOKS; i++)
  91. {
  92. // search through Unidrv's hooks and locate the function ptr
  93. dwDDIIndex = OEMHookFuncs[i].iFunc;
  94. for (j = pded->c, pdrvfn = pded->pdrvfn; j > 0; j--, pdrvfn++)
  95. {
  96. if (dwDDIIndex == pdrvfn->iFunc)
  97. {
  98. poempdev->pfnUnidrv[i] = pdrvfn->pfn;
  99. break;
  100. }
  101. }
  102. if (j == 0)
  103. {
  104. // didn't find the Unidrv hook. Should happen only with DrvRealizeBrush
  105. poempdev->pfnUnidrv[i] = NULL;
  106. }
  107. }
  108. #endif // DDIHOOK
  109. return (POEMPDEV) poempdev;
  110. } //*** OEMEnablePDEV
  111. VOID APIENTRY OEMDisablePDEV(
  112. PDEVOBJ pdevobj)
  113. {
  114. VERBOSE(("OEMDisablePDEV() entry.\n"));
  115. // free memory for OEMPDEV and any memory block that hangs off OEMPDEV.
  116. MemFree(MINIDEV_DATA(pdevobj));
  117. } //*** OEMDisablePDEV
  118. BOOL APIENTRY OEMResetPDEV(
  119. PDEVOBJ pdevobjOld,
  120. PDEVOBJ pdevobjNew)
  121. {
  122. POEMPDEV poempdevOld = MINIDEV_DATA(pdevobjOld);
  123. POEMPDEV poempdevNew = MINIDEV_DATA(pdevobjNew);
  124. VERBOSE(("OEMResetPDEV() entry.\n"));
  125. if (poempdevOld && poempdevNew)
  126. {
  127. LPBYTE pSrc = (LPBYTE)poempdevOld;
  128. LPBYTE pDst = (LPBYTE)poempdevNew;
  129. DWORD dwCount = sizeof(OEMPDEV);
  130. // carry over from old OEMPDEV to new OEMPDEV
  131. while (dwCount-- > 0)
  132. *pDst++ = *pSrc++;
  133. // set pointers of old OEMPDEV to NULL not to free memory
  134. // poempdevOld->pRPDLHeap2K = NULL;
  135. }
  136. return TRUE;
  137. } //*** OEMResetPDEV
  138. VOID APIENTRY OEMDisableDriver()
  139. {
  140. VERBOSE(("OEMDisableDriver() entry.\n"));
  141. } //*** OEMDisableDriver
  142. BOOL APIENTRY OEMEnableDriver(DWORD dwOEMintfVersion, DWORD dwSize, PDRVENABLEDATA pded)
  143. {
  144. // VERBOSE(("OEMEnableDriver() entry.\n"));
  145. // Validate paramters.
  146. if( (PRINTER_OEMINTF_VERSION != dwOEMintfVersion)
  147. ||
  148. (sizeof(DRVENABLEDATA) > dwSize)
  149. ||
  150. (NULL == pded)
  151. )
  152. {
  153. // DbgPrint(ERRORTEXT("OEMEnableDriver() ERROR_INVALID_PARAMETER.\n"));
  154. return FALSE;
  155. }
  156. pded->iDriverVersion = PRINTER_OEMINTF_VERSION ; // not DDI_DRIVER_VERSION;
  157. #ifdef DDIHOOK
  158. pded->c = sizeof(OEMHookFuncs) / sizeof(DRVFN);
  159. pded->pdrvfn = (DRVFN *) OEMHookFuncs;
  160. #else
  161. pded->c = 0;
  162. pded->pdrvfn = NULL;
  163. #endif // DDIHOOK
  164. return TRUE;
  165. } //*** OEMEnableDriver
  166. #ifdef DDIHOOK
  167. //
  168. // DDI hooks
  169. //
  170. BOOL APIENTRY
  171. OEMStartDoc(
  172. SURFOBJ *pso,
  173. PWSTR pwszDocName,
  174. DWORD dwJobId)
  175. {
  176. PDEVOBJ pdevobj = (PDEVOBJ)pso->dhpdev;
  177. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  178. INT iLen;
  179. #if DBG
  180. // You can see debug messages on debugger terminal. (debug mode boot)
  181. giDebugLevel = DBG_VERBOSE;
  182. // You can debug with MS Visual Studio. (normal mode boot)
  183. // DebugBreak();
  184. #endif // DBG
  185. VERBOSE(("OEMStartDoc() entry.\n"));
  186. VERBOSE((" DocName=%ls\n", pwszDocName));
  187. #ifdef WINNT_40 // @Aug/01/2000
  188. if (pwszDocName)
  189. {
  190. USHORT OemCodePage, AnsiCodePage;
  191. EngGetCurrentCodePage(&OemCodePage, &AnsiCodePage);
  192. EngWideCharToMultiByte((UINT)AnsiCodePage, (LPWSTR)pwszDocName,
  193. (INT)(JOBNAMESIZE * sizeof(WCHAR)),
  194. (LPSTR)poempdev->JobName, (INT)JOBNAMESIZE);
  195. }
  196. #else // !WINNT_40
  197. if (pwszDocName)
  198. CharToOemBuff((LPWSTR)pwszDocName, (LPSTR)poempdev->JobName, JOBNAMESIZE);
  199. #endif // !WINNT_40
  200. #if DBG
  201. giDebugLevel = DBG_ERROR;
  202. #endif // DBG
  203. return (((PFN_DrvStartDoc)(poempdev->pfnUnidrv[UD_DrvStartDoc])) (
  204. pso,
  205. pwszDocName,
  206. dwJobId));
  207. } //*** OEMStartDoc
  208. #if 0
  209. BOOL APIENTRY
  210. OEMBitBlt(
  211. SURFOBJ *psoTrg,
  212. SURFOBJ *psoSrc,
  213. SURFOBJ *psoMask,
  214. CLIPOBJ *pco,
  215. XLATEOBJ *pxlo,
  216. RECTL *prclTrg,
  217. POINTL *pptlSrc,
  218. POINTL *pptlMask,
  219. BRUSHOBJ *pbo,
  220. POINTL *pptlBrush,
  221. ROP4 rop4)
  222. {
  223. PDEVOBJ pdevobj = (PDEVOBJ)psoTrg->dhpdev;
  224. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  225. VERBOSE(("OEMBitBlt() entry.\n"));
  226. //
  227. // turn around to call Unidrv
  228. //
  229. return (((PFN_DrvBitBlt)(poempdev->pfnUnidrv[UD_DrvBitBlt])) (
  230. psoTrg,
  231. psoSrc,
  232. psoMask,
  233. pco,
  234. pxlo,
  235. prclTrg,
  236. pptlSrc,
  237. pptlMask,
  238. pbo,
  239. pptlBrush,
  240. rop4));
  241. } //*** OEMBitBlt
  242. BOOL APIENTRY
  243. OEMStretchBlt(
  244. SURFOBJ *psoDst,
  245. SURFOBJ *psoSrc,
  246. SURFOBJ *psoMask,
  247. CLIPOBJ *pco,
  248. XLATEOBJ *pxlo,
  249. COLORADJUSTMENT *pca,
  250. POINTL *pptlHTOrg,
  251. RECTL *prclDst,
  252. RECTL *prclSrc,
  253. POINTL *pptlMask,
  254. ULONG iMode)
  255. {
  256. PDEVOBJ pdevobj = (PDEVOBJ)psoDst->dhpdev;
  257. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  258. VERBOSE(("OEMStretchBlt() entry.\n"));
  259. return (((PFN_DrvStretchBlt)(poempdev->pfnUnidrv[UD_DrvStretchBlt])) (
  260. psoDst,
  261. psoSrc,
  262. psoMask,
  263. pco,
  264. pxlo,
  265. pca,
  266. pptlHTOrg,
  267. prclDst,
  268. prclSrc,
  269. pptlMask,
  270. iMode));
  271. } //*** OEMStretchBlt
  272. BOOL APIENTRY
  273. OEMStretchBltROP(
  274. SURFOBJ *psoDst,
  275. SURFOBJ *psoSrc,
  276. SURFOBJ *psoMask,
  277. CLIPOBJ *pco,
  278. XLATEOBJ *pxlo,
  279. COLORADJUSTMENT *pca,
  280. POINTL *pptlHTOrg,
  281. RECTL *prclDst,
  282. RECTL *prclSrc,
  283. POINTL *pptlMask,
  284. ULONG iMode,
  285. BRUSHOBJ *pbo,
  286. ROP4 rop4)
  287. {
  288. PDEVOBJ pdevobj = (PDEVOBJ)psoDst->dhpdev;
  289. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  290. VERBOSE(("OEMStretchBltROP() entry.\n"));
  291. return (((PFN_DrvStretchBltROP)(poempdev->pfnUnidrv[UD_DrvStretchBltROP])) (
  292. psoDst,
  293. psoSrc,
  294. psoMask,
  295. pco,
  296. pxlo,
  297. pca,
  298. pptlHTOrg,
  299. prclDst,
  300. prclSrc,
  301. pptlMask,
  302. iMode,
  303. pbo,
  304. rop4
  305. ));
  306. } //*** OEMStretchBltROP
  307. BOOL APIENTRY
  308. OEMCopyBits(
  309. SURFOBJ *psoDst,
  310. SURFOBJ *psoSrc,
  311. CLIPOBJ *pco,
  312. XLATEOBJ *pxlo,
  313. RECTL *prclDst,
  314. POINTL *pptlSrc)
  315. {
  316. PDEVOBJ pdevobj = (PDEVOBJ)psoDst->dhpdev;
  317. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  318. VERBOSE(("OEMCopyBits() entry.\n"));
  319. return (((PFN_DrvCopyBits)(poempdev->pfnUnidrv[UD_DrvCopyBits])) (
  320. psoDst,
  321. psoSrc,
  322. pco,
  323. pxlo,
  324. prclDst,
  325. pptlSrc));
  326. } //*** OEMCopyBits
  327. BOOL APIENTRY
  328. OEMPlgBlt(
  329. SURFOBJ *psoDst,
  330. SURFOBJ *psoSrc,
  331. SURFOBJ *psoMask,
  332. CLIPOBJ *pco,
  333. XLATEOBJ *pxlo,
  334. COLORADJUSTMENT *pca,
  335. POINTL *pptlBrushOrg,
  336. POINTFIX *pptfixDst,
  337. RECTL *prclSrc,
  338. POINTL *pptlMask,
  339. ULONG iMode)
  340. {
  341. PDEVOBJ pdevobj = (PDEVOBJ)psoDst->dhpdev;
  342. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  343. VERBOSE(("OEMPlgBlt() entry.\n"));
  344. return (((PFN_DrvPlgBlt)(poempdev->pfnUnidrv[UD_DrvPlgBlt])) (
  345. psoDst,
  346. psoSrc,
  347. psoMask,
  348. pco,
  349. pxlo,
  350. pca,
  351. pptlBrushOrg,
  352. pptfixDst,
  353. prclSrc,
  354. pptlMask,
  355. iMode));
  356. } //*** OEMPlgBlt
  357. BOOL APIENTRY
  358. OEMAlphaBlend(
  359. SURFOBJ *psoDst,
  360. SURFOBJ *psoSrc,
  361. CLIPOBJ *pco,
  362. XLATEOBJ *pxlo,
  363. RECTL *prclDst,
  364. RECTL *prclSrc,
  365. BLENDOBJ *pBlendObj)
  366. {
  367. PDEVOBJ pdevobj = (PDEVOBJ)psoDst->dhpdev;
  368. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  369. VERBOSE(("OEMAlphaBlend() entry.\n"));
  370. return (((PFN_DrvAlphaBlend)(poempdev->pfnUnidrv[UD_DrvAlphaBlend])) (
  371. psoDst,
  372. psoSrc,
  373. pco,
  374. pxlo,
  375. prclDst,
  376. prclSrc,
  377. pBlendObj
  378. ));
  379. } //*** OEMAlphaBlend
  380. BOOL APIENTRY
  381. OEMGradientFill(
  382. SURFOBJ *psoDst,
  383. CLIPOBJ *pco,
  384. XLATEOBJ *pxlo,
  385. TRIVERTEX *pVertex,
  386. ULONG nVertex,
  387. PVOID pMesh,
  388. ULONG nMesh,
  389. RECTL *prclExtents,
  390. POINTL *pptlDitherOrg,
  391. ULONG ulMode)
  392. {
  393. PDEVOBJ pdevobj = (PDEVOBJ)psoDst->dhpdev;
  394. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  395. VERBOSE(("OEMGradientFill() entry.\n"));
  396. return (((PFN_DrvGradientFill)(poempdev->pfnUnidrv[UD_DrvGradientFill])) (
  397. psoDst,
  398. pco,
  399. pxlo,
  400. pVertex,
  401. nVertex,
  402. pMesh,
  403. nMesh,
  404. prclExtents,
  405. pptlDitherOrg,
  406. ulMode
  407. ));
  408. } //*** OEMGradientFill
  409. BOOL APIENTRY
  410. OEMTextOut(
  411. SURFOBJ *pso,
  412. STROBJ *pstro,
  413. FONTOBJ *pfo,
  414. CLIPOBJ *pco,
  415. RECTL *prclExtra,
  416. RECTL *prclOpaque,
  417. BRUSHOBJ *pboFore,
  418. BRUSHOBJ *pboOpaque,
  419. POINTL *pptlOrg,
  420. MIX mix)
  421. {
  422. PDEVOBJ pdevobj = (PDEVOBJ)pso->dhpdev;
  423. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  424. VERBOSE(("OEMTextOut() entry.\n"));
  425. return (((PFN_DrvTextOut)(poempdev->pfnUnidrv[UD_DrvTextOut])) (
  426. pso,
  427. pstro,
  428. pfo,
  429. pco,
  430. prclExtra,
  431. prclOpaque,
  432. pboFore,
  433. pboOpaque,
  434. pptlOrg,
  435. mix));
  436. } //*** OEMTextOut
  437. BOOL APIENTRY
  438. OEMStrokePath(
  439. SURFOBJ *pso,
  440. PATHOBJ *ppo,
  441. CLIPOBJ *pco,
  442. XFORMOBJ *pxo,
  443. BRUSHOBJ *pbo,
  444. POINTL *pptlBrushOrg,
  445. LINEATTRS *plineattrs,
  446. MIX mix)
  447. {
  448. PDEVOBJ pdevobj = (PDEVOBJ)pso->dhpdev;
  449. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  450. VERBOSE(("OEMStokePath() entry.\n"));
  451. return (((PFN_DrvStrokePath)(poempdev->pfnUnidrv[UD_DrvStrokePath])) (
  452. pso,
  453. ppo,
  454. pco,
  455. pxo,
  456. pbo,
  457. pptlBrushOrg,
  458. plineattrs,
  459. mix));
  460. } //*** OEMStrokePath
  461. BOOL APIENTRY
  462. OEMFillPath(
  463. SURFOBJ *pso,
  464. PATHOBJ *ppo,
  465. CLIPOBJ *pco,
  466. BRUSHOBJ *pbo,
  467. POINTL *pptlBrushOrg,
  468. MIX mix,
  469. FLONG flOptions)
  470. {
  471. PDEVOBJ pdevobj = (PDEVOBJ)pso->dhpdev;
  472. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  473. VERBOSE(("OEMFillPath() entry.\n"));
  474. return (((PFN_DrvFillPath)(poempdev->pfnUnidrv[UD_DrvFillPath])) (
  475. pso,
  476. ppo,
  477. pco,
  478. pbo,
  479. pptlBrushOrg,
  480. mix,
  481. flOptions));
  482. } //*** OEMFillPath
  483. BOOL APIENTRY
  484. OEMStrokeAndFillPath(
  485. SURFOBJ *pso,
  486. PATHOBJ *ppo,
  487. CLIPOBJ *pco,
  488. XFORMOBJ *pxo,
  489. BRUSHOBJ *pboStroke,
  490. LINEATTRS *plineattrs,
  491. BRUSHOBJ *pboFill,
  492. POINTL *pptlBrushOrg,
  493. MIX mixFill,
  494. FLONG flOptions)
  495. {
  496. PDEVOBJ pdevobj = (PDEVOBJ)pso->dhpdev;
  497. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  498. VERBOSE(("OEMStrokeAndFillPath() entry.\n"));
  499. return (((PFN_DrvStrokeAndFillPath)(poempdev->pfnUnidrv[UD_DrvStrokeAndFillPath])) (
  500. pso,
  501. ppo,
  502. pco,
  503. pxo,
  504. pboStroke,
  505. plineattrs,
  506. pboFill,
  507. pptlBrushOrg,
  508. mixFill,
  509. flOptions));
  510. } //*** OEMStrokeAndFillPath
  511. BOOL APIENTRY
  512. OEMRealizeBrush(
  513. BRUSHOBJ *pbo,
  514. SURFOBJ *psoTarget,
  515. SURFOBJ *psoPattern,
  516. SURFOBJ *psoMask,
  517. XLATEOBJ *pxlo,
  518. ULONG iHatch)
  519. {
  520. PDEVOBJ pdevobj = (PDEVOBJ)psoTarget->dhpdev;
  521. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  522. VERBOSE(("OEMStrokeAndFillPath() entry.\n"));
  523. //
  524. // the OEM DLL should NOT hook out this function unless it wants to draw
  525. // graphics directly to the device surface. In that case, it calls
  526. // EngRealizeBrush which causes GDI to call DrvRealizeBrush.
  527. // Note that it cannot call back into Unidrv since Unidrv doesn't hook it.
  528. //
  529. //
  530. // In this test DLL, the drawing hooks does not call EngRealizeBrush. So this
  531. // this function will never be called. Do nothing.
  532. //
  533. return TRUE;
  534. } //*** OEMRealizeBrush
  535. BOOL APIENTRY
  536. OEMStartPage(
  537. SURFOBJ *pso)
  538. {
  539. PDEVOBJ pdevobj = (PDEVOBJ)pso->dhpdev;
  540. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  541. VERBOSE(("OEMStartPage() entry.\n"));
  542. return (((PFN_DrvStartPage)(poempdev->pfnUnidrv[UD_DrvStartPage]))(pso));
  543. } //*** OEMStartPage
  544. #define OEM_TESTSTRING "The DDICMDCB DLL adds this line of text."
  545. BOOL APIENTRY
  546. OEMSendPage(
  547. SURFOBJ *pso)
  548. {
  549. PDEVOBJ pdevobj = (PDEVOBJ)pso->dhpdev;
  550. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  551. VERBOSE(("OEMEndPage() entry.\n"));
  552. #if 0
  553. //
  554. // print a line of text, just for testing
  555. //
  556. if (pso->iType == STYPE_BITMAP)
  557. {
  558. pdevobj->pDrvProcs->DrvXMoveTo(pdevobj, 0, 0);
  559. pdevobj->pDrvProcs->DrvYMoveTo(pdevobj, 0, 0);
  560. pdevobj->pDrvProcs->DrvWriteSpoolBuf(pdevobj, OEM_TESTSTRING,
  561. sizeof(OEM_TESTSTRING));
  562. }
  563. #endif
  564. return (((PFN_DrvSendPage)(poempdev->pfnUnidrv[UD_DrvSendPage]))(pso));
  565. } //*** OEMSendPage
  566. ULONG APIENTRY
  567. OEMEscape(
  568. SURFOBJ *pso,
  569. ULONG iEsc,
  570. ULONG cjIn,
  571. PVOID pvIn,
  572. ULONG cjOut,
  573. PVOID pvOut)
  574. {
  575. PDEVOBJ pdevobj = (PDEVOBJ)pso->dhpdev;
  576. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  577. VERBOSE(("OEMEscape() entry.\n"));
  578. return (((PFN_DrvEscape)(poempdev->pfnUnidrv[UD_DrvEscape])) (
  579. pso,
  580. iEsc,
  581. cjIn,
  582. pvIn,
  583. cjOut,
  584. pvOut));
  585. } //*** OEMEscape
  586. BOOL APIENTRY
  587. OEMEndDoc(
  588. SURFOBJ *pso,
  589. FLONG fl)
  590. {
  591. PDEVOBJ pdevobj = (PDEVOBJ)pso->dhpdev;
  592. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  593. VERBOSE(("OEMEndDoc() entry.\n"));
  594. return (((PFN_DrvEndDoc)(poempdev->pfnUnidrv[UD_DrvEndDoc])) (
  595. pso,
  596. fl));
  597. } //*** OEMEndDoc
  598. ////////
  599. // NOTE:
  600. // OEM DLL needs to hook out the following six font related DDI calls only
  601. // if it enumerates additional fonts beyond what's in the GPD file.
  602. // And if it does, it needs to take care of its own fonts for all font DDI
  603. // calls and DrvTextOut call.
  604. ///////
  605. PIFIMETRICS APIENTRY
  606. OEMQueryFont(
  607. DHPDEV dhpdev,
  608. ULONG_PTR iFile,
  609. ULONG iFace,
  610. ULONG_PTR *pid)
  611. {
  612. PDEVOBJ pdevobj = (PDEVOBJ)dhpdev;
  613. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  614. VERBOSE(("OEMQueryFont() entry.\n"));
  615. return (((PFN_DrvQueryFont)(poempdev->pfnUnidrv[UD_DrvQueryFont])) (
  616. dhpdev,
  617. iFile,
  618. iFace,
  619. pid));
  620. } //*** OEMQueryFont
  621. PVOID APIENTRY
  622. OEMQueryFontTree(
  623. DHPDEV dhpdev,
  624. ULONG_PTR iFile,
  625. ULONG iFace,
  626. ULONG iMode,
  627. ULONG_PTR *pid)
  628. {
  629. PDEVOBJ pdevobj = (PDEVOBJ)dhpdev;
  630. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  631. VERBOSE(("OEMQueryFontTree() entry.\n"));
  632. return (((PFN_DrvQueryFontTree)(poempdev->pfnUnidrv[UD_DrvQueryFontTree])) (
  633. dhpdev,
  634. iFile,
  635. iFace,
  636. iMode,
  637. pid));
  638. } //*** OEMQueryFontTree
  639. LONG APIENTRY
  640. OEMQueryFontData(
  641. DHPDEV dhpdev,
  642. FONTOBJ *pfo,
  643. ULONG iMode,
  644. HGLYPH hg,
  645. GLYPHDATA *pgd,
  646. PVOID pv,
  647. ULONG cjSize)
  648. {
  649. PDEVOBJ pdevobj = (PDEVOBJ)dhpdev;
  650. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  651. VERBOSE(("OEMQueryFontData() entry.\n"));
  652. return (((PFN_DrvQueryFontData)(poempdev->pfnUnidrv[UD_DrvQueryFontData])) (
  653. dhpdev,
  654. pfo,
  655. iMode,
  656. hg,
  657. pgd,
  658. pv,
  659. cjSize));
  660. } //*** OEMQueryFontData
  661. BOOL APIENTRY
  662. OEMQueryAdvanceWidths(
  663. DHPDEV dhpdev,
  664. FONTOBJ *pfo,
  665. ULONG iMode,
  666. HGLYPH *phg,
  667. PVOID pvWidths,
  668. ULONG cGlyphs)
  669. {
  670. PDEVOBJ pdevobj = (PDEVOBJ)dhpdev;
  671. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  672. VERBOSE(("OEMQueryAdvanceWidths() entry.\n"));
  673. return (((PFN_DrvQueryAdvanceWidths)
  674. (poempdev->pfnUnidrv[UD_DrvQueryAdvanceWidths])) (
  675. dhpdev,
  676. pfo,
  677. iMode,
  678. phg,
  679. pvWidths,
  680. cGlyphs));
  681. } //*** OEMQueryAdvanceWidths
  682. ULONG APIENTRY
  683. OEMFontManagement(
  684. SURFOBJ *pso,
  685. FONTOBJ *pfo,
  686. ULONG iMode,
  687. ULONG cjIn,
  688. PVOID pvIn,
  689. ULONG cjOut,
  690. PVOID pvOut)
  691. {
  692. //
  693. // Note that Unidrv will not call OEM DLL for iMode==QUERYESCSUPPORT.
  694. // So pso is not NULL for sure.
  695. //
  696. PDEVOBJ pdevobj = (PDEVOBJ)pso->dhpdev;
  697. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  698. VERBOSE(("OEMFontManagement() entry.\n"));
  699. return (((PFN_DrvFontManagement)(poempdev->pfnUnidrv[UD_DrvFontManagement])) (
  700. pso,
  701. pfo,
  702. iMode,
  703. cjIn,
  704. pvIn,
  705. cjOut,
  706. pvOut));
  707. } //*** OEMFontManagement
  708. ULONG APIENTRY
  709. OEMGetGlyphMode(
  710. DHPDEV dhpdev,
  711. FONTOBJ *pfo)
  712. {
  713. PDEVOBJ pdevobj = (PDEVOBJ)dhpdev;
  714. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  715. VERBOSE(("OEMGetGlyphMode() entry.\n"));
  716. return (((PFN_DrvGetGlyphMode)(poempdev->pfnUnidrv[UD_DrvGetGlyphMode])) (
  717. dhpdev,
  718. pfo));
  719. } //*** OEMGetGlyphMode
  720. /////// <- six font related DDI calls
  721. BOOL APIENTRY
  722. OEMNextBand(
  723. SURFOBJ *pso,
  724. POINTL *pptl)
  725. {
  726. PDEVOBJ pdevobj = (PDEVOBJ)pso->dhpdev;
  727. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  728. VERBOSE(("OEMNextBand() entry.\n"));
  729. return (((PFN_DrvNextBand)(poempdev->pfnUnidrv[UD_DrvNextBand])) (
  730. pso,
  731. pptl));
  732. } //*** OEMNextBand
  733. BOOL APIENTRY
  734. OEMStartBanding(
  735. SURFOBJ *pso,
  736. POINTL *pptl)
  737. {
  738. PDEVOBJ pdevobj = (PDEVOBJ)pso->dhpdev;
  739. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  740. VERBOSE(("OEMStartBanding() entry.\n"));
  741. return (((PFN_DrvStartBanding)(poempdev->pfnUnidrv[UD_DrvStartBanding])) (
  742. pso,
  743. pptl));
  744. } //*** OEMStartBanding
  745. ULONG APIENTRY
  746. OEMDitherColor(
  747. DHPDEV dhpdev,
  748. ULONG iMode,
  749. ULONG rgbColor,
  750. ULONG *pulDither)
  751. {
  752. PDEVOBJ pdevobj = (PDEVOBJ)dhpdev;
  753. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  754. VERBOSE(("OEMDitherColor() entry.\n"));
  755. return (((PFN_DrvDitherColor)(poempdev->pfnUnidrv[UD_DrvDitherColor])) (
  756. dhpdev,
  757. iMode,
  758. rgbColor,
  759. pulDither));
  760. } //*** OEMDitherColor
  761. BOOL APIENTRY
  762. OEMPaint(
  763. SURFOBJ *pso,
  764. CLIPOBJ *pco,
  765. BRUSHOBJ *pbo,
  766. POINTL *pptlBrushOrg,
  767. MIX mix)
  768. {
  769. PDEVOBJ pdevobj = (PDEVOBJ)pso->dhpdev;
  770. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  771. VERBOSE(("OEMPaint() entry.\n"));
  772. return (((PFN_DrvPaint)(poempdev->pfnUnidrv[UD_DrvPaint])) (
  773. pso,
  774. pco,
  775. pbo,
  776. pptlBrushOrg,
  777. mix));
  778. } //*** OEMPaint
  779. BOOL APIENTRY
  780. OEMLineTo(
  781. SURFOBJ *pso,
  782. CLIPOBJ *pco,
  783. BRUSHOBJ *pbo,
  784. LONG x1,
  785. LONG y1,
  786. LONG x2,
  787. LONG y2,
  788. RECTL *prclBounds,
  789. MIX mix)
  790. {
  791. PDEVOBJ pdevobj = (PDEVOBJ)pso->dhpdev;
  792. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  793. VERBOSE(("OEMLineTo() entry.\n"));
  794. return (((PFN_DrvLineTo)(poempdev->pfnUnidrv[UD_DrvLineTo])) (
  795. pso,
  796. pco,
  797. pbo,
  798. x1,
  799. y1,
  800. x2,
  801. y2,
  802. prclBounds,
  803. mix));
  804. } //*** OEMLineTo
  805. BOOL APIENTRY
  806. OEMTransparentBlt(
  807. SURFOBJ *psoDst,
  808. SURFOBJ *psoSrc,
  809. CLIPOBJ *pco,
  810. XLATEOBJ *pxlo,
  811. RECTL *prclDst,
  812. RECTL *prclSrc,
  813. ULONG iTransColor,
  814. ULONG ulReserved)
  815. {
  816. PDEVOBJ pdevobj = (PDEVOBJ)psoDst->dhpdev;
  817. POEMPDEV poempdev = MINIDEV_DATA(pdevobj);
  818. VERBOSE(("OEMTransparentBlt() entry.\n"));
  819. return (((PFN_DrvTransparentBlt)(poempdev->pfnUnidrv[UD_DrvTransparentBlt])) (
  820. psoDst,
  821. psoSrc,
  822. pco,
  823. pxlo,
  824. prclDst,
  825. prclSrc,
  826. iTransColor,
  827. ulReserved
  828. ));
  829. } //*** OEMTransparentBlt
  830. #endif // if 0
  831. #endif // DDIHOOK