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.

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