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.

1483 lines
50 KiB

  1. // =========================================================================
  2. //
  3. // CASIO PAGEPRESTO Universal Printer Driver for MS-Windows NT 5.0
  4. //
  5. // =========================================================================
  6. //// CSWINRES.C file for Winmode Common DLL
  7. #include "pdev.h"
  8. #include "cswinres.h"
  9. #include "cswinid.h"
  10. #if DBG
  11. # include "mydbg.h"
  12. #endif
  13. #include <stdio.h>
  14. #include "strsafe.h" // Security-Code 2002.3.6
  15. // Replacement of strsafe-api 2002.3.6 >>>
  16. //#undef wsprintf
  17. //#define wsprintf sprintf
  18. // Replacement of strsafe-api 2002.3.6 <<<
  19. #define CCHMAXCMDLEN 256
  20. #define MAX_STRLEN 255
  21. #define WRITESPOOLBUF(p, s, n) \
  22. ((p)->pDrvProcs->DrvWriteSpoolBuf(p, s, n))
  23. #define DRVGETDRIVERSETTING(p, t, o, s, n, r) \
  24. ((p)->pDrvProcs->DrvGetDriverSetting(p, t, o, s, n, r))
  25. #define PARAM(p,n) \
  26. (*((p)+(n)))
  27. BOOL
  28. BInitOEMExtraData(
  29. POEMUD_EXTRADATA pOEMExtra)
  30. {
  31. // Initialize OEM Extra data.
  32. pOEMExtra->dmExtraHdr.dwSize = sizeof(OEMUD_EXTRADATA);
  33. pOEMExtra->dmExtraHdr.dwSignature = OEM_SIGNATURE;
  34. pOEMExtra->dmExtraHdr.dwVersion = OEM_VERSION;
  35. return TRUE;
  36. }
  37. BOOL
  38. BMergeOEMExtraData(
  39. POEMUD_EXTRADATA pdmIn,
  40. POEMUD_EXTRADATA pdmOut)
  41. {
  42. return TRUE;
  43. }
  44. PDEVOEM APIENTRY
  45. OEMEnablePDEV(
  46. PDEVOBJ pdevobj,
  47. PWSTR pPrinterName,
  48. ULONG cPatterns,
  49. HSURF *phsurfPatterns,
  50. ULONG cjGdiInfo,
  51. GDIINFO *pGdiInfo,
  52. ULONG cjDevInfo,
  53. DEVINFO *pDevInfo,
  54. DRVENABLEDATA *pded)
  55. {
  56. PMYPDEV pOEM;
  57. VERBOSE(("OEMEnablePDEV - %08x\n", pdevobj));
  58. if(!pdevobj->pdevOEM)
  59. {
  60. if(!(pdevobj->pdevOEM = MemAllocZ(sizeof(MYPDEV))))
  61. {
  62. ERR(("Faild to allocate memory. (%d)\n",
  63. GetLastError()));
  64. return NULL;
  65. }
  66. }
  67. // misc initializations
  68. pOEM = (PMYPDEV)pdevobj->pdevOEM;
  69. return pdevobj->pdevOEM;
  70. }
  71. VOID APIENTRY
  72. OEMDisablePDEV(
  73. PDEVOBJ pdevobj)
  74. {
  75. PMYPDEV pOEM = (PMYPDEV)pdevobj->pdevOEM;
  76. VERBOSE(("OEMDisablePDEV - %08x\n", pdevobj));
  77. if(pdevobj->pdevOEM)
  78. {
  79. MemFree(pdevobj->pdevOEM);
  80. pdevobj->pdevOEM = NULL;
  81. }
  82. return;
  83. }
  84. BOOL APIENTRY
  85. OEMResetPDEV(
  86. PDEVOBJ pdevobjOld,
  87. PDEVOBJ pdevobjNew)
  88. {
  89. PMYPDEV pOld, pNew;
  90. VERBOSE(("OEMResetPDEV - %08x, %08x\n", pdevobjOld, pdevobjNew));
  91. if (NULL == (pOld = (PMYPDEV)pdevobjOld->pdevOEM) ||
  92. NULL == (pNew = (PMYPDEV)pdevobjNew->pdevOEM)) {
  93. ERR(("Invalid PDEV\n"));
  94. return FALSE;
  95. }
  96. *pNew = *pOld;
  97. return TRUE;
  98. }
  99. static
  100. VOID
  101. LoadJobSetupCmd(
  102. PDEVOBJ pdevobj,
  103. PMYPDEV pOEM)
  104. {
  105. BYTE ajOutput[64];
  106. DWORD dwNeeded;
  107. DWORD dwOptionsReturned;
  108. if (pOEM->dwGeneral & FG_HAS_TSAVE) {
  109. if(!DRVGETDRIVERSETTING(pdevobj, "TonerSave", ajOutput,
  110. sizeof(BYTE) * 64, &dwNeeded, &dwOptionsReturned)) {
  111. WARNING(("DrvGetDriverSetting(1) Failed\n"));
  112. pOEM->jTonerSave = VAL_TS_NOTSELECT;
  113. } else {
  114. VERBOSE(("TonerSave:%s\n", ajOutput));
  115. if (!strcmp(ajOutput, OPT_TS_NORMAL)) {
  116. pOEM->jTonerSave = VAL_TS_NORMAL;
  117. VERBOSE(("VAL_TS_NORMAL\n"));
  118. } else if (!strcmp(ajOutput, OPT_TS_LV1)) {
  119. pOEM->jTonerSave = VAL_TS_LV1;
  120. VERBOSE(("VAL_TS_LV1\n"));
  121. } else if (!strcmp(ajOutput, OPT_TS_LV2)) {
  122. pOEM->jTonerSave = VAL_TS_LV2;
  123. VERBOSE(("VAL_TS_LV2\n"));
  124. } else if (!strcmp(ajOutput, OPT_TS_LV3)) {
  125. pOEM->jTonerSave = VAL_TS_LV3;
  126. VERBOSE(("VAL_TS_LV3\n"));
  127. } else {
  128. pOEM->jTonerSave = VAL_TS_NOTSELECT;
  129. VERBOSE(("VAL_TS_NOTSELECT\n"));
  130. }
  131. }
  132. VERBOSE(("jTonerSave:%x\n", pOEM->jTonerSave));
  133. }
  134. if (pOEM->dwGeneral & FG_HAS_SMOTH) {
  135. if (!DRVGETDRIVERSETTING(pdevobj, "Smoothing", ajOutput,
  136. sizeof(BYTE) * 64, &dwNeeded, &dwOptionsReturned)) {
  137. WARNING(("DrvGetDriverSetting(1) Failed\n"));
  138. pOEM->jSmoothing = VAL_SMOOTH_NOTSELECT;
  139. } else {
  140. VERBOSE(("Smoothing:%s\n", ajOutput));
  141. if (!strcmp(ajOutput, OPT_SMOOTH_OFF)) {
  142. pOEM->jSmoothing = VAL_SMOOTH_OFF;
  143. VERBOSE(("VAL_SMOOTH_OFF\n"));
  144. } else if (!strcmp(ajOutput, OPT_SMOOTH_ON)) {
  145. pOEM->jSmoothing = VAL_SMOOTH_ON;
  146. VERBOSE(("VAL_SMOOTH_ON\n"));
  147. } else {
  148. pOEM->jSmoothing = VAL_SMOOTH_NOTSELECT;
  149. VERBOSE(("VAL_SMOOTH_NOTSELECT\n"));
  150. }
  151. }
  152. VERBOSE(("jSmoothing:%x\n", pOEM->jSmoothing));
  153. }
  154. if (!DRVGETDRIVERSETTING(pdevobj, "MPFSetting", ajOutput,
  155. sizeof(BYTE) * 64, &dwNeeded, &dwOptionsReturned)) {
  156. WARNING(("DrvGetDriverSetting(1) Failed\n"));
  157. pOEM->jMPFSetting = MPF_NOSET;
  158. } else {
  159. VERBOSE(("MPFSetting:%s\n", ajOutput));
  160. if (!strcmp(ajOutput, OPT_A3)) {
  161. pOEM->jMPFSetting = MPF_A3;
  162. VERBOSE(("MPF_A3\n"));
  163. } else if (!strcmp(ajOutput, OPT_B4)) {
  164. pOEM->jMPFSetting = MPF_B4;
  165. VERBOSE(("MPF_B4\n"));
  166. } else if (!strcmp(ajOutput, OPT_A4)) {
  167. pOEM->jMPFSetting = MPF_A4;
  168. VERBOSE(("MPF_A4\n"));
  169. } else if (!strcmp(ajOutput, OPT_B5)) {
  170. pOEM->jMPFSetting = MPF_B5;
  171. VERBOSE(("MPF_B5\n"));
  172. } else if (!strcmp(ajOutput, OPT_A5)) {
  173. pOEM->jMPFSetting = MPF_A5;
  174. VERBOSE(("MPF_A5\n"));
  175. } else if (!strcmp(ajOutput, OPT_LETTER)) {
  176. pOEM->jMPFSetting = MPF_LETTER;
  177. VERBOSE(("MPF_LETTER\n"));
  178. } else if (!strcmp(ajOutput, OPT_POSTCARD)) {
  179. pOEM->jMPFSetting = MPF_POSTCARD;
  180. VERBOSE(("MPF_POSTCARD\n"));
  181. } else {
  182. pOEM->jMPFSetting = MPF_NOSET;
  183. VERBOSE(("MPF_NOSET\n"));
  184. }
  185. }
  186. VERBOSE(("jMPFSetting:%x\n", pOEM->jMPFSetting));
  187. }
  188. static
  189. VOID
  190. LoadPaperSelectCmd(
  191. PDEVOBJ pdevobj,
  192. PMYPDEV pOEM,
  193. INT iPaperID,
  194. WORD wPapSizeX,
  195. WORD wPapSizeY)
  196. {
  197. BYTE cmdbuf[CCHMAXCMDLEN];
  198. WORD wlen = 0;
  199. DWORD dwTemp;
  200. WORD wPapLenX;
  201. WORD wPapLenY;
  202. BYTE ajOutput[64];
  203. DWORD dwNeeded;
  204. DWORD dwOptionsReturned;
  205. BYTE bOrientation;
  206. switch (iPaperID) {
  207. case PS_LETTER:
  208. if (pOEM->jMPFSetting == MPF_LETTER) {
  209. pOEM->jAutoSelect = 0x11; // MPF
  210. } else if (pOEM->jModel == MD_CP3800WM) {
  211. pOEM->jAutoSelect = AutoFeed_3800[iPaperID - PS_SEGMENT];
  212. } else {
  213. pOEM->jAutoSelect = AutoFeed[iPaperID - PS_SEGMENT];
  214. }
  215. // ESC 'i' '|' RT PF AJ PM MF MS PS PO CP OS
  216. // ~~ ~~
  217. // MF(MPF Free size) Not Support Free
  218. // MS(MPF paper Size) 28h: Letter -
  219. cmdbuf[wlen++] = 0x00;
  220. cmdbuf[wlen++] = 0x00;
  221. cmdbuf[wlen++] = 0x00;
  222. cmdbuf[wlen++] = 0x00;
  223. cmdbuf[wlen++] = 0x28;
  224. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  225. break;
  226. case PS_A3:
  227. if (pOEM->jMPFSetting == MPF_A3) {
  228. pOEM->jAutoSelect = 0x11; // MPF
  229. } else if (pOEM->jModel == MD_CP3800WM) {
  230. pOEM->jAutoSelect = AutoFeed_3800[iPaperID - PS_SEGMENT];
  231. } else {
  232. pOEM->jAutoSelect = AutoFeed[iPaperID - PS_SEGMENT];
  233. }
  234. // ESC 'i' '|' RT PF AJ PM MF MS PS PO CP OS
  235. // ~~ ~~
  236. // MF(MPF Free size) Not Support Free
  237. // MS(MPF paper Size) 1Fh: A3 |
  238. cmdbuf[wlen++] = 0x00;
  239. cmdbuf[wlen++] = 0x00;
  240. cmdbuf[wlen++] = 0x00;
  241. cmdbuf[wlen++] = 0x00;
  242. cmdbuf[wlen++] = 0x1F;
  243. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  244. break;
  245. case PS_A4:
  246. if (pOEM->jMPFSetting == MPF_A4) {
  247. pOEM->jAutoSelect = 0x11; // MPF
  248. } else if (pOEM->jModel == MD_CP3800WM) {
  249. pOEM->jAutoSelect = AutoFeed_3800[iPaperID - PS_SEGMENT];
  250. } else {
  251. pOEM->jAutoSelect = AutoFeed[iPaperID - PS_SEGMENT];
  252. }
  253. // ESC 'i' '|' RT PF AJ PM MF MS PS PO CP OS
  254. // ~~ ~~
  255. // MF(MPF Free size) Not Support Free
  256. // MS(MPF paper Size) 2Ah: A4 -
  257. cmdbuf[wlen++] = 0x00;
  258. cmdbuf[wlen++] = 0x00;
  259. cmdbuf[wlen++] = 0x00;
  260. cmdbuf[wlen++] = 0x00;
  261. cmdbuf[wlen++] = 0x2A;
  262. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  263. break;
  264. case PS_B4:
  265. if (pOEM->jMPFSetting == MPF_B4) {
  266. pOEM->jAutoSelect = 0x11; // MPF
  267. } else if (pOEM->jModel == MD_CP3800WM) {
  268. pOEM->jAutoSelect = AutoFeed_3800[iPaperID - PS_SEGMENT];
  269. } else {
  270. pOEM->jAutoSelect = AutoFeed[iPaperID - PS_SEGMENT];
  271. }
  272. // ESC 'i' '|' RT PF AJ PM MF MS PS PO CP OS
  273. // ~~ ~~
  274. // MF(MPF Free size) Not Support Free
  275. // MS(MPF paper Size) 25h: B4 |
  276. cmdbuf[wlen++] = 0x00;
  277. cmdbuf[wlen++] = 0x00;
  278. cmdbuf[wlen++] = 0x00;
  279. cmdbuf[wlen++] = 0x00;
  280. cmdbuf[wlen++] = 0x25;
  281. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  282. break;
  283. case PS_B5:
  284. if (pOEM->jMPFSetting == MPF_B5) {
  285. pOEM->jAutoSelect = 0x11; // MPF
  286. } else if (pOEM->jModel == MD_CP3800WM) {
  287. pOEM->jAutoSelect = AutoFeed_3800[iPaperID - PS_SEGMENT];
  288. } else {
  289. pOEM->jAutoSelect = AutoFeed[iPaperID - PS_SEGMENT];
  290. }
  291. // ESC 'i' '|' RT PF AJ PM MF MS PS PO CP OS
  292. // ~~ ~~
  293. // MF(MPF Free size) Not Support Free
  294. // MS(MPF paper Size) 2Ch: B5 -
  295. cmdbuf[wlen++] = 0x00;
  296. cmdbuf[wlen++] = 0x00;
  297. cmdbuf[wlen++] = 0x00;
  298. cmdbuf[wlen++] = 0x00;
  299. cmdbuf[wlen++] = 0x2C;
  300. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  301. break;
  302. case PS_A5:
  303. if (pOEM->jMPFSetting == MPF_A5) {
  304. pOEM->jAutoSelect = 0x11; // MPF
  305. } else if (pOEM->jModel == MD_CP3800WM) {
  306. pOEM->jAutoSelect = AutoFeed_3800[iPaperID - PS_SEGMENT];
  307. } else {
  308. pOEM->jAutoSelect = AutoFeed[iPaperID - PS_SEGMENT];
  309. }
  310. // ESC 'i' '|' RT PF AJ PM MF MS PS PO CP OS
  311. // ~~ ~~
  312. // MF(MPF Free size) Not Support Free
  313. // MS(MPF paper Size) 2Eh: A5 -
  314. cmdbuf[wlen++] = 0x00;
  315. cmdbuf[wlen++] = 0x00;
  316. cmdbuf[wlen++] = 0x00;
  317. cmdbuf[wlen++] = 0x00;
  318. cmdbuf[wlen++] = 0x2E;
  319. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  320. break;
  321. case PS_POSTCARD:
  322. if (pOEM->jMPFSetting == MPF_POSTCARD) {
  323. pOEM->jAutoSelect = 0x11; // MPF
  324. } else if (pOEM->jModel == MD_CP3800WM) {
  325. pOEM->jAutoSelect = AutoFeed_3800[iPaperID - PS_SEGMENT];
  326. } else {
  327. pOEM->jAutoSelect = AutoFeed[iPaperID - PS_SEGMENT];
  328. }
  329. // ESC 'i' '|' RT PF AJ PM MF MS PS PO CP OS
  330. // ~~ ~~
  331. // MF(MPF Free size) Not Support Free
  332. // MS(MPF paper Size) 31h: PostCard |
  333. cmdbuf[wlen++] = 0x00;
  334. cmdbuf[wlen++] = 0x00;
  335. cmdbuf[wlen++] = 0x00;
  336. cmdbuf[wlen++] = 0x00;
  337. cmdbuf[wlen++] = 0x31;
  338. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  339. break;
  340. case PS_FREE:
  341. pOEM->jAutoSelect = 0x11; // MPF
  342. if(!DRVGETDRIVERSETTING(pdevobj, "Orientation", ajOutput,
  343. sizeof(BYTE) * 64, &dwNeeded, &dwOptionsReturned)) {
  344. WARNING(("LoadPaperSelectCmd(1) Failed\n"));
  345. bOrientation = 1;
  346. } else {
  347. VERBOSE(("Orientation:%s\n", ajOutput));
  348. if (!strcmp(ajOutput, "PORTRAIT")) {
  349. bOrientation = 1;
  350. } else {
  351. bOrientation = 2;
  352. }
  353. }
  354. // ESC 'i' '|' RT PF AJ PM MF MS PS PO CP OS
  355. // ~~ ~~
  356. // MF(MPF Free size) XSize,YSize mm (X[hi],X[lo],Y[hi],Y[lo])
  357. // MS(MPF paper Size) FFh: FreePaper |
  358. // 2001/02/27 ->
  359. // dwTemp = (wPapSizeX * 254) / MASTER_UNIT; // 0.1mm a unit
  360. // wPapLenX = (WORD)((dwTemp + 5) /10); // 1mm a unit, round
  361. dwTemp = (wPapSizeX * 2540) / MASTER_UNIT; // 0.01mm a unit
  362. wPapLenX = (WORD)((dwTemp + 99) /100); // 1mm a unit, roundup
  363. // dwTemp = (wPapSizeY * 254) / MASTER_UNIT; // 0.1mm a unit
  364. // wPapLenY = (WORD)((dwTemp + 5) /10); // 1mm a unit, round
  365. dwTemp = (wPapSizeY * 2540) / MASTER_UNIT; // 0.01mm a unit
  366. wPapLenY = (WORD)((dwTemp + 99) /100); // 1mm a unit, roundup
  367. // 2001/02/27 <-
  368. if (bOrientation == 1) {
  369. cmdbuf[wlen++] = HIBYTE(wPapLenX);
  370. cmdbuf[wlen++] = LOBYTE(wPapLenX);
  371. cmdbuf[wlen++] = HIBYTE(wPapLenY);
  372. cmdbuf[wlen++] = LOBYTE(wPapLenY);
  373. } else {
  374. cmdbuf[wlen++] = HIBYTE(wPapLenY);
  375. cmdbuf[wlen++] = LOBYTE(wPapLenY);
  376. cmdbuf[wlen++] = HIBYTE(wPapLenX);
  377. cmdbuf[wlen++] = LOBYTE(wPapLenX);
  378. }
  379. cmdbuf[wlen++] = 0xFF;
  380. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  381. break;
  382. }
  383. }
  384. INT APIENTRY
  385. OEMCommandCallback(
  386. PDEVOBJ pdevobj,
  387. DWORD dwCmdCbID,
  388. DWORD dwCount,
  389. PDWORD pdwParams)
  390. {
  391. PMYPDEV pOEM;
  392. BYTE cmdbuf[CCHMAXCMDLEN];
  393. WORD wlen, i, wRectCmdLen;
  394. WORD wDestX, wDestY;
  395. BYTE bGrayScale ;
  396. INT iRet = 0;
  397. union _temp {
  398. DWORD dwTemp;
  399. WORD wTemp;
  400. BYTE jTemp;
  401. } Temp;
  402. pOEM = (PMYPDEV)MINIPDEV_DATA(pdevobj);
  403. #if 0
  404. #if DBG
  405. {
  406. int i, max;
  407. for (i = 0; i < (max = sizeof(MyCallbackID) / sizeof(MyCallbackID[0])); i++) {
  408. if (MyCallbackID[i].dwID == dwCmdCbID){
  409. VERBOSE(("%s PARAMS: %d\n", MyCallbackID[i].S, dwCount));
  410. break;
  411. }
  412. }
  413. if (i == max)
  414. WARNING(("%d is Invalid ID\n", dwCmdCbID));
  415. }
  416. #endif
  417. #endif
  418. ASSERT(VALID_PDEVOBJ(pdevobj));
  419. pOEM = (PMYPDEV)MINIPDEV_DATA(pdevobj);
  420. wlen = 0;
  421. //
  422. // fill in printer commands
  423. //
  424. switch (dwCmdCbID) {
  425. case RES_SENDBLOCK:
  426. if (pOEM->dwGeneral & FG_COMP){
  427. Temp.dwTemp = PARAM(pdwParams, 0) + 8; // 8: Parameter Lengeth (except ImageData)
  428. // 'c' LN X Y IW IH D
  429. // ~~~ ~~
  430. cmdbuf[wlen++] = 'c';
  431. cmdbuf[wlen++] = (BYTE)(Temp.dwTemp >> 24);
  432. cmdbuf[wlen++] = (BYTE)(Temp.dwTemp >> 16);
  433. cmdbuf[wlen++] = (BYTE)(Temp.dwTemp >> 8);
  434. cmdbuf[wlen++] = (BYTE)(Temp.dwTemp);
  435. } else {
  436. // 'b' X Y IW IH D
  437. // ~~~
  438. cmdbuf[wlen++] = 'b';
  439. }
  440. // 'c' LN X Y IW IH D
  441. // ~ ~ ~~ ~~
  442. // 'b' X Y IW IH D
  443. // ~ ~ ~~ ~~
  444. cmdbuf[wlen++] = (BYTE)(pOEM->sWMXPosi >> 8);
  445. cmdbuf[wlen++] = (BYTE)(pOEM->sWMXPosi);
  446. cmdbuf[wlen++] = (BYTE)(pOEM->sWMYPosi >> 8);
  447. cmdbuf[wlen++] = (BYTE)(pOEM->sWMYPosi);
  448. cmdbuf[wlen++] = (BYTE)(PARAM(pdwParams, 1) >> 8);
  449. cmdbuf[wlen++] = (BYTE)PARAM(pdwParams, 1);
  450. cmdbuf[wlen++] = (BYTE)(PARAM(pdwParams, 2) >> 8);
  451. cmdbuf[wlen++] = (BYTE)PARAM(pdwParams, 2);
  452. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  453. break;
  454. case RES_SELECTRES_240:
  455. pOEM->sRes = RATIO_240;
  456. // ESC i | RT PF AJ PM MF MS PS PO CP OS
  457. // ~~ ~~ ~~
  458. cmdbuf[wlen++] = 0x18; // 18h -> 24d Page Format
  459. cmdbuf[wlen++] = 0x10; // Not Adjust
  460. cmdbuf[wlen++] = 0x10; // cancell Page Marge
  461. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  462. break;
  463. case RES_SELECTRES_400:
  464. pOEM->sRes = RATIO_400;
  465. // ESC i | RT PF AJ PM MF MS PS PO CP OS
  466. // ~~ ~~ ~~
  467. cmdbuf[wlen++] = 0x28; // 28h -> 40d Page Format
  468. cmdbuf[wlen++] = 0x10; // Not Adjust
  469. cmdbuf[wlen++] = 0x10; // cancell Page Marge
  470. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  471. break;
  472. case CM_XM_ABS:
  473. // Set return value accordingly. Unidrv expects
  474. // the values to be retuned in device's unit here.
  475. iRet = (WORD)(PARAM(pdwParams, 0) / pOEM->sRes);
  476. VERBOSE(("XMOVEABS:X=%d, Y=%d\n", iRet,
  477. (SHORT)(PARAM(pdwParams, 1) / pOEM->sRes)));
  478. pOEM->sWMXPosi = (SHORT)(PARAM(pdwParams, 0) / pOEM->sRes);
  479. break;
  480. case CM_YM_ABS:
  481. // Set return value accordingly. Unidrv expects
  482. // the values to be retuned in device's unit here.
  483. iRet = (WORD)(PARAM(pdwParams, 1) / pOEM->sRes);
  484. VERBOSE(("YMOVEABS:X=%d, Y=%d\n",
  485. (SHORT)(PARAM(pdwParams, 0) / pOEM->sRes), iRet));
  486. pOEM->sWMYPosi = (SHORT)(PARAM(pdwParams, 1) / pOEM->sRes);
  487. break;
  488. case CM_REL_LEFT:
  489. // Set return value accordingly. Unidrv expects
  490. // the values to be retuned in device's unit here.
  491. iRet = (WORD)(PARAM(pdwParams, 0) / pOEM->sRes);
  492. VERBOSE(("CM_REL_LEFT:%d\n", iRet));
  493. VERBOSE(("DestXRel:%d\n", PARAM(pdwParams, 0)));
  494. pOEM->sWMXPosi -= (SHORT)(PARAM(pdwParams, 0) / pOEM->sRes);
  495. VERBOSE(("CurosorPosition X:%d Y:%d\n",
  496. pOEM->sWMXPosi, pOEM->sWMYPosi));
  497. break;
  498. case CM_REL_RIGHT:
  499. // Set return value accordingly. Unidrv expects
  500. // the values to be retuned in device's unit here.
  501. iRet = (WORD)(PARAM(pdwParams, 0) / pOEM->sRes);
  502. VERBOSE(("CM_REL_RIGHT:%d\n", iRet));
  503. VERBOSE(("DestXRel:%d\n", PARAM(pdwParams, 0)));
  504. pOEM->sWMXPosi += (SHORT)(PARAM(pdwParams, 0) / pOEM->sRes);
  505. VERBOSE(("CurosorPosition X:%d Y:%d\n",
  506. pOEM->sWMXPosi, pOEM->sWMYPosi));
  507. break;
  508. case CM_REL_UP:
  509. // Set return value accordingly. Unidrv expects
  510. // the values to be retuned in device's unit here.
  511. iRet = (WORD)(PARAM(pdwParams, 0) / pOEM->sRes);
  512. VERBOSE(("CM_REL_UP:%d\n", iRet));
  513. VERBOSE(("DestYRel:%d\n", PARAM(pdwParams, 0)));
  514. pOEM->sWMYPosi -= (SHORT)(PARAM(pdwParams, 0) / pOEM->sRes);
  515. VERBOSE(("CurosorPosition X:%d Y:%d\n",
  516. pOEM->sWMXPosi, pOEM->sWMYPosi));
  517. break;
  518. case CM_REL_DOWN:
  519. // Set return value accordingly. Unidrv expects
  520. // the values to be retuned in device's unit here.
  521. iRet = (WORD)(PARAM(pdwParams, 0) / pOEM->sRes);
  522. VERBOSE(("CM_REL_DOWN:%d\n", iRet));
  523. VERBOSE(("DestYRel:%d\n", PARAM(pdwParams, 0)));
  524. pOEM->sWMYPosi += (SHORT)(PARAM(pdwParams, 0) / pOEM->sRes);
  525. VERBOSE(("CurosorPosition X:%d Y:%d\n",
  526. pOEM->sWMXPosi, pOEM->sWMYPosi));
  527. break;
  528. case CM_FE_RLE:
  529. pOEM->dwGeneral |= FG_COMP;
  530. break;
  531. case CM_DISABLECOMP:
  532. pOEM->dwGeneral &= ~FG_COMP;
  533. break;
  534. case CSWM_CR:
  535. pOEM->sWMXPosi = 0;
  536. break;
  537. case CSWM_FF:
  538. pOEM->sWMXPosi = 0;
  539. pOEM->sWMYPosi = 0;
  540. cmdbuf[wlen++] = '3';
  541. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  542. break;
  543. case CSWM_LF:
  544. pOEM->sWMXPosi = 0;
  545. break;
  546. case CSWM_COPY:
  547. Temp.dwTemp = PARAM(pdwParams, 0);
  548. if (Temp.dwTemp > 255) Temp.dwTemp = 255; // max
  549. if (Temp.dwTemp < 1) Temp.dwTemp = 1; // min
  550. // ESC 'i' '|' RT PF AJ PM MF MS PS PO CP OS
  551. // ~~ ~~
  552. cmdbuf[wlen++] = (BYTE)Temp.dwTemp; // Copy
  553. cmdbuf[wlen++] = 0x80; // character Offset All 0
  554. if (pOEM->jModel == MD_CP3800WM) {
  555. // ESC 'i' 7Eh LG TS SM VS HS
  556. cmdbuf[wlen++] = 0x1B;
  557. cmdbuf[wlen++] = 'i';
  558. cmdbuf[wlen++] = 0x7E;
  559. cmdbuf[wlen++] = 0x04; // LG(command LenGth)
  560. cmdbuf[wlen++] = pOEM->jTonerSave; // TS(Toner Save)
  561. cmdbuf[wlen++] = pOEM->jSmoothing; // SM(SMoothing) 01h: ON
  562. cmdbuf[wlen++] = 0xFF; // VS(Vertical Shift)
  563. cmdbuf[wlen++] = 0xFF; // HS(Horizontal Shift)
  564. }
  565. // Winmode IN
  566. // ESC 'i' 'z'
  567. VERBOSE(("Enterning Win-mode\n"));
  568. pOEM->bWinmode = TRUE;
  569. cmdbuf[wlen++] = 0x1b;
  570. cmdbuf[wlen++] = 'i';
  571. cmdbuf[wlen++] = 'z';
  572. //Enginge Resolution Setting
  573. // '1' E
  574. cmdbuf[wlen++] = '1';
  575. if (pOEM->sRes == RATIO_400) {
  576. // 0190h->400d
  577. cmdbuf[wlen++] = 0x01;
  578. cmdbuf[wlen++] = 0x90;
  579. } else {
  580. // 00F0h->240d
  581. cmdbuf[wlen++] = 0x00;
  582. cmdbuf[wlen++] = 0xF0;
  583. }
  584. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  585. break;
  586. case AUTOFEED:
  587. // ESC 'i' '|' RT PF AJ PM MF MS PS PO CP OS
  588. // ~~
  589. // PS(Paper feed Select)
  590. cmdbuf[wlen++] = pOEM->jAutoSelect;
  591. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  592. break;
  593. case PS_LETTER:
  594. case PS_A3:
  595. case PS_A4:
  596. case PS_B4:
  597. case PS_B5:
  598. case PS_A5:
  599. case PS_POSTCARD:
  600. // LoadPaperSelectCmd(pdevobj, pOEM, dwCmdCbID);
  601. LoadPaperSelectCmd(pdevobj, pOEM, dwCmdCbID, 0, 0);
  602. break;
  603. case PS_FREE:
  604. LoadPaperSelectCmd(pdevobj, pOEM, dwCmdCbID,
  605. (WORD)PARAM(pdwParams, 0), (WORD)PARAM(pdwParams, 1));
  606. break;
  607. case PRN_3250GTWM:
  608. VERBOSE(("CmdStartJob - CP3250GT\n"));
  609. pOEM->jModel = MD_CP3250GTWM;
  610. pOEM->dwGeneral &= ~FG_HAS_TSAVE;
  611. pOEM->dwGeneral &= ~FG_HAS_SMOTH;
  612. LoadJobSetupCmd(pdevobj, pOEM);
  613. break;
  614. case PRN_3500GTWM:
  615. VERBOSE(("CmdStartJob - CP-3500GT\n"));
  616. pOEM->jModel = MD_CP3500GTWM;
  617. pOEM->dwGeneral &= ~FG_HAS_TSAVE;
  618. pOEM->dwGeneral &= ~FG_HAS_SMOTH;
  619. LoadJobSetupCmd(pdevobj, pOEM);
  620. break;
  621. case PRN_3800WM:
  622. VERBOSE(("CmdStartJob - CP-3800\n"));
  623. pOEM->jModel = MD_CP3800WM;
  624. pOEM->dwGeneral |= FG_HAS_TSAVE;
  625. pOEM->dwGeneral |= FG_HAS_SMOTH;
  626. LoadJobSetupCmd(pdevobj, pOEM);
  627. break;
  628. case SBYTE:
  629. pOEM->dwGeneral &= ~FG_DOUBLE;
  630. break;
  631. case DBYTE:
  632. pOEM->dwGeneral |= FG_DOUBLE;
  633. break;
  634. //+++ For character attribute switch
  635. case CM_BOLD_ON:
  636. pOEM->dwGeneral |= FG_BOLD;
  637. goto SET_ATTRIB;
  638. case CM_BOLD_OFF:
  639. pOEM->dwGeneral &= ~FG_BOLD;
  640. goto SET_ATTRIB;
  641. case CM_ITALIC_ON:
  642. pOEM->dwGeneral |= FG_ITALIC;
  643. goto SET_ATTRIB;
  644. case CM_ITALIC_OFF:
  645. pOEM->dwGeneral &= ~FG_ITALIC;
  646. goto SET_ATTRIB;
  647. case CM_WHITE_ON:
  648. // B CL
  649. cmdbuf[wlen++] = 'B';
  650. cmdbuf[wlen++] = 0x01;
  651. // G OL LW LV FP
  652. cmdbuf[wlen++] = 'G';
  653. cmdbuf[wlen++] = 0x00;
  654. cmdbuf[wlen++] = 0x00;
  655. cmdbuf[wlen++] = 0x01;
  656. cmdbuf[wlen++] = 0x01;
  657. cmdbuf[wlen++] = 0x00;
  658. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  659. pOEM->dwGeneral |= FG_WHITE;
  660. goto SET_ATTRIB;
  661. case CM_WHITE_OFF:
  662. // B CL
  663. cmdbuf[wlen++] = 'B';
  664. cmdbuf[wlen++] = 0x00;
  665. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  666. pOEM->dwGeneral &= ~FG_WHITE;
  667. goto SET_ATTRIB;
  668. SET_ATTRIB: // 'C' As(Attribute Switch)
  669. if (( Temp.jTemp = ((BYTE)(pOEM->dwGeneral & (FG_BOLD | FG_ITALIC | FG_WHITE)) ))
  670. != pOEM->jPreAttrib) {
  671. cmdbuf[wlen++] = 'C';
  672. cmdbuf[wlen++] = Temp.jTemp;
  673. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  674. pOEM->jPreAttrib = Temp.jTemp;
  675. }
  676. break;
  677. //---
  678. case START_DOC:
  679. VERBOSE(("CmdStartDoc\n"));
  680. // For Debug
  681. //*Cmd: "<1B>i|<04>"
  682. // If status is WINMODE IN, then output WINMODE OUT command
  683. if (pOEM->bWinmode) {
  684. VERBOSE(("Leave Win-mode to issue init comands.\n"));
  685. cmdbuf[wlen++] = '0'; // WINMODE OUT
  686. pOEM->bWinmode = FALSE;
  687. }
  688. /*
  689. * The following command(Initialize) is invalid when it is WINMODE.
  690. * WINMODE OUT command must be outputed in END_DOC before Initialize.
  691. * Initialize(START DOC procsee) command must not be ouputed without END DOC process.
  692. * Printer Rom of some version can use 07h command instead of WINMODE OUT.
  693. * ~~~~~~~~~~~~~
  694. *
  695. * 07h WINMODE OUT command when it is Winmode
  696. * NOP commnad in except when it is Winmode
  697. */
  698. // cmdbuf[wlen++] = 0x07;
  699. cmdbuf[wlen++] = 0x1B;
  700. cmdbuf[wlen++] = 'i';
  701. cmdbuf[wlen++] = '|';
  702. cmdbuf[wlen++] = 0x04;
  703. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  704. break;
  705. case END_DOC:
  706. VERBOSE(("CmdEndDoc\n"));
  707. VERBOSE(("Exit Win-mode.\n"));
  708. pOEM->bWinmode = FALSE;
  709. cmdbuf[wlen++] = '0'; // WINMODE OUT
  710. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  711. break;
  712. case DRW_WHITE_RECT:
  713. wDestX = (WORD)PARAM(pdwParams, 0) / pOEM->sRes;
  714. wDestY = (WORD)PARAM(pdwParams, 1) / pOEM->sRes;
  715. cmdbuf[wlen++] = 0x65; //PaintMode
  716. cmdbuf[wlen++] = 0x00; //Pattern
  717. cmdbuf[wlen++] = 0x70; //Draw Box command
  718. cmdbuf[wlen++] = 0x00; //No line
  719. cmdbuf[wlen++] = 0x00; //Line Width(H)
  720. cmdbuf[wlen++] = 0x01; //Line Width(L) : 1dot
  721. cmdbuf[wlen++] = 0x01; //Line Color : white
  722. cmdbuf[wlen++] = 0x00; //OR Line
  723. cmdbuf[wlen++] = 0x00; //Pattern //White
  724. cmdbuf[wlen++] = 0x00; //OR Pattern
  725. cmdbuf[wlen++] = 0x00; //GrayScale
  726. cmdbuf[wlen++] = (BYTE)((wDestX >> 8) & 0xff); //X1 (H)
  727. cmdbuf[wlen++] = (BYTE)((wDestX >> 0) & 0xff); //X1 (L)
  728. cmdbuf[wlen++] = (BYTE)((wDestY >> 8) & 0xff); //Y1 (H)
  729. cmdbuf[wlen++] = (BYTE)((wDestY >> 0) & 0xff); //Y1 (L)
  730. wDestX += (pOEM->wRectWidth - 1);
  731. wDestY += (pOEM->wRectHeight - 1);
  732. cmdbuf[wlen++] = (BYTE)((wDestX >> 8) & 0xff); //X2 (H)
  733. cmdbuf[wlen++] = (BYTE)((wDestX >> 0) & 0xff); //X2 (L)
  734. cmdbuf[wlen++] = (BYTE)((wDestY >> 8) & 0xff); //Y2 (H)
  735. cmdbuf[wlen++] = (BYTE)((wDestY >> 0) & 0xff); //Y2 (L)
  736. cmdbuf[wlen++] = 0x00; //Corner(H) :
  737. cmdbuf[wlen++] = 0x00; //Corner(L) : 90
  738. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  739. break;
  740. case DRW_BLACK_RECT:
  741. wDestX = (WORD)PARAM(pdwParams, 0) / pOEM->sRes;
  742. wDestY = (WORD)PARAM(pdwParams, 1) / pOEM->sRes;
  743. cmdbuf[wlen++] = 0x65; //PaintMode
  744. cmdbuf[wlen++] = 0x00; //Pattern
  745. cmdbuf[wlen++] = 0x70; //Draw Box command
  746. cmdbuf[wlen++] = 0x00; //No line
  747. cmdbuf[wlen++] = 0x00; //Line Width(H)
  748. cmdbuf[wlen++] = 0x01; //Line Width(L) : 1dot
  749. cmdbuf[wlen++] = 0x01; //Line Color : white
  750. cmdbuf[wlen++] = 0x00; //OR Line
  751. cmdbuf[wlen++] = 0x01; //Pattern : black
  752. cmdbuf[wlen++] = 0x00; //OR Pattern
  753. cmdbuf[wlen++] = 0x00; //GrayScale
  754. cmdbuf[wlen++] = (BYTE)((wDestX >> 8) & 0xff); //X1 (H)
  755. cmdbuf[wlen++] = (BYTE)((wDestX >> 0) & 0xff); //X1 (L)
  756. cmdbuf[wlen++] = (BYTE)((wDestY >> 8) & 0xff); //Y1 (H)
  757. cmdbuf[wlen++] = (BYTE)((wDestY >> 0) & 0xff); //Y1 (L)
  758. wDestX += (pOEM->wRectWidth - 1);
  759. wDestY += (pOEM->wRectHeight - 1);
  760. cmdbuf[wlen++] = (BYTE)((wDestX >> 8) & 0xff); //X2 (H)
  761. cmdbuf[wlen++] = (BYTE)((wDestX >> 0) & 0xff); //X2 (L)
  762. cmdbuf[wlen++] = (BYTE)((wDestY >> 8) & 0xff); //Y2 (H)
  763. cmdbuf[wlen++] = (BYTE)((wDestY >> 0) & 0xff); //Y2 (L)
  764. cmdbuf[wlen++] = 0x00; //Corner(H) :
  765. cmdbuf[wlen++] = 0x00; //Corner(L) : 90
  766. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  767. break;
  768. case DRW_GRAY_RECT:
  769. wDestX = (WORD)PARAM(pdwParams, 0) / pOEM->sRes;
  770. wDestY = (WORD)PARAM(pdwParams, 1) / pOEM->sRes;
  771. bGrayScale = (BYTE)((WORD)PARAM(pdwParams, 2) * 255 / 100);
  772. cmdbuf[wlen++] = 0x65; //PaintMode
  773. cmdbuf[wlen++] = 0x02; //GrayScale
  774. cmdbuf[wlen++] = 0x70; //Draw Box command
  775. cmdbuf[wlen++] = 0x00; //No line
  776. cmdbuf[wlen++] = 0x00; //Line Width(H)
  777. cmdbuf[wlen++] = 0x01; //Line Width(L) : 1dot
  778. cmdbuf[wlen++] = 0x01; //Line Color : white
  779. cmdbuf[wlen++] = 0x00; //OR Line
  780. cmdbuf[wlen++] = bGrayScale; //Pattern
  781. cmdbuf[wlen++] = 0x00; //OR Pattern
  782. cmdbuf[wlen++] = bGrayScale; //GrayScale
  783. cmdbuf[wlen++] = (BYTE)((wDestX >> 8) & 0xff); //X1 (H)
  784. cmdbuf[wlen++] = (BYTE)((wDestX >> 0) & 0xff); //X1 (L)
  785. cmdbuf[wlen++] = (BYTE)((wDestY >> 8) & 0xff); //Y1 (H)
  786. cmdbuf[wlen++] = (BYTE)((wDestY >> 0) & 0xff); //Y1 (L)
  787. wDestX += (pOEM->wRectWidth - 1);
  788. wDestY += (pOEM->wRectHeight - 1);
  789. cmdbuf[wlen++] = (BYTE)((wDestX >> 8) & 0xff); //X2 (H)
  790. cmdbuf[wlen++] = (BYTE)((wDestX >> 0) & 0xff); //X2 (L)
  791. cmdbuf[wlen++] = (BYTE)((wDestY >> 8) & 0xff); //Y2 (H)
  792. cmdbuf[wlen++] = (BYTE)((wDestY >> 0) & 0xff); //Y2 (L)
  793. cmdbuf[wlen++] = 0x00; //Corner(H) :
  794. cmdbuf[wlen++] = 0x00; //Corner(L) : 90
  795. WRITESPOOLBUF(pdevobj, cmdbuf, wlen);
  796. break;
  797. case DRW_RECT_WIDTH :
  798. pOEM->wRectWidth = (WORD)PARAM(pdwParams, 0) / pOEM->sRes;
  799. break;
  800. case DRW_RECT_HEIGHT:
  801. pOEM->wRectHeight = (WORD)PARAM(pdwParams, 0) / pOEM->sRes;
  802. break;
  803. }
  804. return iRet;
  805. }
  806. /*
  807. *
  808. * OEMSendFontCmd
  809. *
  810. */
  811. VOID APIENTRY
  812. OEMSendFontCmd(
  813. PDEVOBJ pdevobj,
  814. PUNIFONTOBJ pUFObj,
  815. PFINVOCATION pFInv)
  816. {
  817. PGETINFO_STDVAR pSV;
  818. DWORD adwStdVariable[2+2*4];
  819. DWORD dwIn, dwOut;
  820. PBYTE pubCmd;
  821. BYTE aubCmd[128];
  822. PIFIMETRICS pIFI;
  823. DWORD dwHeight, dwWidth;
  824. PMYPDEV pOEM;
  825. BYTE Cmd[128];
  826. WORD wlen;
  827. DWORD dwNeeded;
  828. VERBOSE(("OEMSendFontCmd() entry.\n"));
  829. pubCmd = pFInv->pubCommand;
  830. pIFI = pUFObj->pIFIMetrics;
  831. pOEM = (PMYPDEV)MINIPDEV_DATA(pdevobj);
  832. //
  833. // Get standard variables.
  834. //
  835. pSV = (PGETINFO_STDVAR)adwStdVariable;
  836. pSV->dwSize = sizeof(GETINFO_STDVAR) + (sizeof(DWORD) + sizeof(LONG)) * (4 - 1);
  837. pSV->dwNumOfVariable = 4;
  838. pSV->StdVar[0].dwStdVarID = FNT_INFO_FONTHEIGHT;
  839. pSV->StdVar[1].dwStdVarID = FNT_INFO_FONTWIDTH;
  840. pSV->StdVar[2].dwStdVarID = FNT_INFO_TEXTYRES;
  841. pSV->StdVar[3].dwStdVarID = FNT_INFO_TEXTXRES;
  842. if (!pUFObj->pfnGetInfo(pUFObj, UFO_GETINFO_STDVARIABLE, pSV, pSV->dwSize, &dwNeeded)) {
  843. ERR(("UFO_GETINFO_STDVARIABLE failed.\n"));
  844. return;
  845. }
  846. // Initialize pOEM
  847. if (pIFI->jWinCharSet == 0x80)
  848. pOEM->dwGeneral |= FG_DOUBLE;
  849. else
  850. pOEM->dwGeneral &= ~FG_DOUBLE;
  851. pOEM->dwGeneral &= ~FG_BOLD;
  852. pOEM->dwGeneral &= ~FG_ITALIC;
  853. dwOut = 0;
  854. // 'L' CT
  855. // CT(Character Table)
  856. aubCmd[dwOut++] = 'L';
  857. if('@' == *((LPSTR)pIFI+pIFI->dpwszFaceName)) {
  858. pOEM->dwGeneral |= FG_VERT;
  859. aubCmd[dwOut++] = 0x01;
  860. aubCmd[dwOut++] = 'A';
  861. aubCmd[dwOut++] = 0x00;
  862. aubCmd[dwOut++] = 0x5A;
  863. pOEM->dwGeneral |= FG_VERT_ROT;
  864. } else {
  865. pOEM->dwGeneral &= ~FG_VERT;
  866. aubCmd[dwOut++] = 0x00;
  867. aubCmd[dwOut++] = 'A';
  868. aubCmd[dwOut++] = 0x00;
  869. aubCmd[dwOut++] = 0x00;
  870. pOEM->dwGeneral &= ~FG_VERT_ROT;
  871. }
  872. // if (pIFI->jWinPitchAndFamily & 0x01)
  873. if (pIFI->jWinPitchAndFamily & FIXED_PITCH)
  874. pOEM->dwGeneral |= FG_PROP;
  875. else
  876. pOEM->dwGeneral &= ~FG_PROP;
  877. // pOEM->dwGeneral &= ~FG_DBCS;
  878. for ( dwIn = 0; dwIn < pFInv->dwCount;) {
  879. if (pubCmd[dwIn] == '#' && pubCmd[dwIn+1] == 'H') {
  880. dwHeight = pSV->StdVar[0].lStdVariable / pOEM->sRes;
  881. if (dwHeight < 16) dwHeight = 8;
  882. if (dwHeight > 2560) dwHeight = 2560;
  883. aubCmd[dwOut++] = (BYTE)(dwHeight >> 8);
  884. aubCmd[dwOut++] = (BYTE)dwHeight;
  885. VERBOSE(("Height=%d\n", dwHeight));
  886. dwIn += 2;
  887. } else if (pubCmd[dwIn] == '#' && pubCmd[dwIn+1] == 'W') {
  888. if (pubCmd[dwIn+2] == 'S') {
  889. dwWidth = pSV->StdVar[1].lStdVariable / pOEM->sRes;
  890. if (dwWidth < 8) dwWidth = 8;
  891. if (dwWidth > 1280) dwWidth = 1280;
  892. aubCmd[dwOut++] = (BYTE)(dwWidth >> 8);
  893. aubCmd[dwOut++] = (BYTE)dwWidth;
  894. dwIn += 3;
  895. } else if (pubCmd[dwIn+2] == 'D') {
  896. dwWidth = (pSV->StdVar[1].lStdVariable / pOEM->sRes) * 2;
  897. if (dwWidth < 8) dwWidth = 8;
  898. if (dwWidth > 1280) dwWidth = 1280;
  899. aubCmd[dwOut++] = (BYTE)(dwWidth >> 8);
  900. aubCmd[dwOut++] = (BYTE)dwWidth;
  901. dwIn += 3;
  902. }
  903. VERBOSE(("Width=%d\n", dwWidth));
  904. } else {
  905. aubCmd[dwOut++] = pubCmd[dwIn++];
  906. }
  907. }
  908. WRITESPOOLBUF(pdevobj, aubCmd, dwOut);
  909. }
  910. /*
  911. *
  912. * OEMOutputCharStr
  913. *
  914. */
  915. #if 0 // >>> Change UFM File(JIS->SJIS) >>>
  916. void jis2sjis(BYTE jJisCode[], BYTE jSjisCode[])
  917. {
  918. BYTE jTmpM, jTmpL;
  919. jTmpM = jJisCode[0];
  920. jTmpL = jJisCode[1];
  921. if (jTmpM % 2)
  922. jTmpM++;
  923. else
  924. jTmpL += 0x5E;
  925. jTmpM = jTmpM/2 + 0x70;
  926. jTmpL += 0x1F;
  927. if (jTmpM > 0x9F) jTmpM += 0x40;
  928. if (jTmpL > 0x7E) jTmpL++;
  929. jSjisCode[0] = jTmpM;
  930. jSjisCode[1] = jTmpL;
  931. }
  932. #endif // <<< Change UFM File(JIS->SJIS) <<<
  933. VOID APIENTRY
  934. OEMOutputCharStr(
  935. PDEVOBJ pdevobj,
  936. PUNIFONTOBJ pUFObj,
  937. DWORD dwType,
  938. DWORD dwCount,
  939. PVOID pGlyph)
  940. {
  941. GETINFO_GLYPHSTRING GStr;
  942. // #333653: Change I/F for GETINFO_GLYPHSTRING
  943. // BYTE aubBuff[1024];
  944. PBYTE aubBuff;
  945. PTRANSDATA pTrans;
  946. PDWORD pdwGlyphID;
  947. PWORD pwUnicode;
  948. DWORD dwI;
  949. DWORD dwNeeded;
  950. PMYPDEV pOEM;
  951. PIFIMETRICS pIFI;
  952. BYTE Cmd[256];
  953. WORD wlen;
  954. #if 0 // >>> Change UFM File(JIS->SJIS) >>>
  955. BYTE ajConvertOut[2];
  956. #endif // <<< Change UFM File(JIS->SJIS) <<<
  957. PGETINFO_STDVAR pSV;
  958. DWORD adwStdVariable[2+2*2];
  959. SHORT sCP, sCP_Double, sCP_Vert;
  960. BYTE jTmp;
  961. LONG lFontHeight, lFontWidth;
  962. pIFI = pUFObj->pIFIMetrics;
  963. pOEM = (PMYPDEV)MINIPDEV_DATA(pdevobj);
  964. VERBOSE(("OEMOutputCharStr() entry.\n"));
  965. //
  966. // Get standard variables.
  967. //
  968. pSV = (PGETINFO_STDVAR)adwStdVariable;
  969. pSV->dwSize = sizeof(GETINFO_STDVAR) + (sizeof(DWORD) + sizeof(LONG)) * (2 - 1);
  970. pSV->dwNumOfVariable = 2;
  971. pSV->StdVar[0].dwStdVarID = FNT_INFO_FONTHEIGHT;
  972. pSV->StdVar[1].dwStdVarID = FNT_INFO_FONTWIDTH;
  973. if (!pUFObj->pfnGetInfo(pUFObj, UFO_GETINFO_STDVARIABLE, pSV, pSV->dwSize, &dwNeeded)) {
  974. ERR(("UFO_GETINFO_STDVARIABLE failed.\n"));
  975. return;
  976. }
  977. lFontHeight = pSV->StdVar[0].lStdVariable / pOEM->sRes;
  978. lFontWidth = pSV->StdVar[1].lStdVariable / pOEM->sRes;
  979. // ---
  980. sCP = (SHORT)lFontWidth;
  981. sCP_Double = sCP * 2;
  982. sCP_Vert = (SHORT)lFontHeight;
  983. switch (dwType){
  984. case TYPE_GLYPHHANDLE:
  985. //
  986. // Call the Unidriver service routine to convert
  987. // glyph-handles into the character code data.
  988. //
  989. // #333653: Change I/F for GETINFO_GLYPHSTRING
  990. GStr.dwSize = sizeof (GETINFO_GLYPHSTRING);
  991. GStr.dwCount = dwCount;
  992. GStr.dwTypeIn = TYPE_GLYPHHANDLE;
  993. GStr.pGlyphIn = pGlyph;
  994. GStr.dwTypeOut = TYPE_TRANSDATA;
  995. GStr.pGlyphOut = NULL;
  996. GStr.dwGlyphOutSize = 0;
  997. // pGlyph = (PVOID)((HGLYPH *)pGlyph + GStr.dwCount);
  998. VERBOSE(("Character Count = %d\n", GStr.dwCount));
  999. if (pUFObj->pfnGetInfo(pUFObj, UFO_GETINFO_GLYPHSTRING, &GStr, GStr.dwSize, &dwNeeded) || !GStr.dwGlyphOutSize) {
  1000. ERR(("UNIFONTOBJ_GetInfo:UFO_GETINFO_GLYPHSTRING failed.\n"));
  1001. return;
  1002. }
  1003. if ((aubBuff = (PBYTE)MemAlloc(GStr.dwGlyphOutSize)) == NULL) {
  1004. ERR(("UNIFONTOBJ_GetInfo:MemAlloc failed.\n"));
  1005. return;
  1006. }
  1007. GStr.pGlyphOut = aubBuff;
  1008. if (!pUFObj->pfnGetInfo(pUFObj, UFO_GETINFO_GLYPHSTRING, &GStr, GStr.dwSize, &dwNeeded)){
  1009. ERR(("UNIFONTOBJ_GetInfo:UFO_GETINFO_GLYPHSTRING failed.\n"));
  1010. MemFree(aubBuff);
  1011. return;
  1012. }
  1013. pTrans = (PTRANSDATA)aubBuff;
  1014. while (dwCount) {
  1015. if (dwCount > MAX_STRLEN) {
  1016. GStr.dwCount = MAX_STRLEN;
  1017. dwCount -= MAX_STRLEN;
  1018. } else {
  1019. GStr.dwCount = dwCount;
  1020. dwCount = 0;
  1021. }
  1022. wlen = 0;
  1023. for (dwI = 0; dwI < GStr.dwCount; dwI++, pTrans++){
  1024. // VERBOSE(("TYPE_TRANSDATA:ubCodePageID:0x%x\n", pTrans->ubCodePageID));
  1025. // VERBOSE(("TYPE_TRANSDATA:ubType:0x%x\n", pTrans->ubType));
  1026. switch (pTrans->ubType & MTYPE_FORMAT_MASK){
  1027. case MTYPE_DIRECT:
  1028. // VERBOSE(("TYPE_TRANSDATA:ubCode:0x%x\n", pTrans->uCode.ubCode));
  1029. if (dwI == 0){
  1030. if('O' == *((LPSTR)pIFI+pIFI->dpwszFaceName)) {
  1031. // OCR
  1032. VERBOSE(("OCR\n"));
  1033. if (GStr.dwCount > 1)
  1034. Cmd[wlen++] = 'W';
  1035. else
  1036. Cmd[wlen++] = 'U';
  1037. } else {
  1038. VERBOSE(("PICA\n"));
  1039. if (GStr.dwCount > 1)
  1040. Cmd[wlen++] = 'O';
  1041. else
  1042. Cmd[wlen++] = 'M';
  1043. }
  1044. Cmd[wlen++] = (BYTE)(pOEM->sWMXPosi >> 8);
  1045. Cmd[wlen++] = (BYTE)pOEM->sWMXPosi;
  1046. Cmd[wlen++] = (BYTE)(pOEM->sWMYPosi >> 8);
  1047. Cmd[wlen++] = (BYTE)pOEM->sWMYPosi;
  1048. if (GStr.dwCount > 1) {
  1049. Cmd[wlen++] = 0x00; // Draw Vector
  1050. Cmd[wlen++] = (BYTE)(sCP >> 8); // Character Pitch
  1051. Cmd[wlen++] = (BYTE)sCP;
  1052. Cmd[wlen++] = (BYTE)GStr.dwCount;
  1053. }
  1054. }
  1055. Cmd[wlen++] = pTrans->uCode.ubCode;
  1056. pOEM->sWMXPosi += sCP;
  1057. break; // MTYPE_DIRECT
  1058. case MTYPE_PAIRED:
  1059. // VERBOSE(("TYPE_TRANSDATA:ubPairs:0x%x\n", *(PWORD)(pTrans->uCode.ubPairs)));
  1060. switch (pTrans->ubType & MTYPE_DOUBLEBYTECHAR_MASK){
  1061. #if 0 // >>> Change UFM File(JIS->SJIS) >>>
  1062. // When JIS CODE
  1063. // In Case of 1byte character, passed MYTYPE_SINGLE
  1064. //
  1065. // When Shift-JIS CODE
  1066. // In Case of 1byte character, passed MTYPE_DIRECT
  1067. case MTYPE_SINGLE:
  1068. if ( (pOEM->dwGeneral & (FG_VERT | FG_VERT_ROT))
  1069. == (FG_VERT | FG_VERT_ROT) ) {
  1070. Cmd[wlen++] = 'A';
  1071. Cmd[wlen++] = 0x00;
  1072. Cmd[wlen++] = 0x00;
  1073. pOEM->dwGeneral &= ~FG_VERT_ROT;
  1074. }
  1075. if (dwI == 0){
  1076. if (GStr.dwCount > 1)
  1077. Cmd[wlen++] = 'O';
  1078. else
  1079. Cmd[wlen++] = 'M';
  1080. Cmd[wlen++] = (BYTE)(pOEM->sWMXPosi >> 8);
  1081. Cmd[wlen++] = (BYTE)pOEM->sWMXPosi;
  1082. Cmd[wlen++] = (BYTE)(pOEM->sWMYPosi >> 8);
  1083. Cmd[wlen++] = (BYTE)pOEM->sWMYPosi;
  1084. if (GStr.dwCount > 1) {
  1085. Cmd[wlen++] = 0x00; // Draw Vector
  1086. Cmd[wlen++] = (BYTE)(sCP >> 8); // Character Pitch
  1087. Cmd[wlen++] = (BYTE)sCP;
  1088. Cmd[wlen++] = (BYTE)GStr.dwCount;
  1089. }
  1090. }
  1091. // JIS -> ASCII
  1092. switch (pTrans->uCode.ubPairs[0]) {
  1093. case 0x21:
  1094. if (Cmd[wlen] = jJis2Ascii[0][pTrans->uCode.ubPairs[1] - 0x20])
  1095. wlen++;
  1096. else // If 0 (no entry), space
  1097. Cmd[wlen++] = 0x20;
  1098. break;
  1099. case 0x23:
  1100. Cmd[wlen++] = pTrans->uCode.ubPairs[1];
  1101. break;
  1102. case 0x25:
  1103. if (Cmd[wlen] = jJis2Ascii[1][pTrans->uCode.ubPairs[1] - 0x20])
  1104. wlen++;
  1105. else // If 0 (no entry), space
  1106. Cmd[wlen++] = 0x20;
  1107. break;
  1108. default: // If 0 (no entry), space
  1109. Cmd[wlen++] = 0x20;
  1110. break;
  1111. }
  1112. pOEM->sWMXPosi += sCP;
  1113. break; // MTYPE_SINGLE
  1114. #endif // <<< Change UFM File(JIS->SJIS) <<<
  1115. case MTYPE_DOUBLE:
  1116. if( (pOEM->dwGeneral & (FG_VERT | FG_VERT_ROT)) == FG_VERT ) {
  1117. Cmd[wlen++] = 'A';
  1118. Cmd[wlen++] = 0x00;
  1119. Cmd[wlen++] = 0x5A;
  1120. pOEM->dwGeneral |= FG_VERT_ROT;
  1121. }
  1122. if (dwI == 0){
  1123. if (GStr.dwCount > 1)
  1124. Cmd[wlen++] = 'S';
  1125. else
  1126. Cmd[wlen++] = 'Q';
  1127. Cmd[wlen++] = (BYTE)(pOEM->sWMXPosi >> 8);
  1128. Cmd[wlen++] = (BYTE)pOEM->sWMXPosi;
  1129. if (pOEM->dwGeneral & FG_VERT) {
  1130. Cmd[wlen++] = (BYTE)(
  1131. (pOEM->sWMYPosi + (SHORT)lFontWidth * 2) >> 8);
  1132. Cmd[wlen++] = (BYTE)(pOEM->sWMYPosi + (SHORT)lFontWidth * 2);
  1133. } else {
  1134. Cmd[wlen++] = (BYTE)(pOEM->sWMYPosi >> 8);
  1135. Cmd[wlen++] = (BYTE)pOEM->sWMYPosi;
  1136. }
  1137. if (GStr.dwCount > 1) {
  1138. Cmd[wlen++] = 0x00; // Draw Vector
  1139. if (pOEM->dwGeneral & FG_VERT){ // Character Pitch
  1140. Cmd[wlen++] = (BYTE)(sCP_Double >> 8);
  1141. Cmd[wlen++] = (BYTE)sCP_Double;
  1142. } else {
  1143. Cmd[wlen++] = (BYTE)(sCP_Vert >> 8);
  1144. Cmd[wlen++] = (BYTE)sCP_Vert;
  1145. }
  1146. Cmd[wlen++] = (BYTE)GStr.dwCount;
  1147. }
  1148. }
  1149. #if 0 // Change UFM File(JIS->SJIS)
  1150. jis2sjis(pTrans->uCode.ubPairs, ajConvertOut);
  1151. Cmd[wlen++] = ajConvertOut[0];
  1152. Cmd[wlen++] = ajConvertOut[1];
  1153. #else
  1154. Cmd[wlen++] = pTrans->uCode.ubPairs[0];
  1155. Cmd[wlen++] = pTrans->uCode.ubPairs[1];
  1156. #endif
  1157. // VERBOSE(("AfterConvert: %x%x\n",
  1158. // ajConvertOut[0], ajConvertOut[1]));
  1159. if (pOEM->dwGeneral & FG_VERT)
  1160. pOEM->sWMXPosi += sCP_Double;
  1161. else
  1162. pOEM->sWMXPosi += sCP_Vert;
  1163. break; // MTYPE_DOUBLE
  1164. }
  1165. break; // MTYPE_PAIRED
  1166. }
  1167. WRITESPOOLBUF(pdevobj, Cmd, wlen);
  1168. wlen = 0;
  1169. } // for
  1170. } // while
  1171. // #333653: Change I/F for GETINFO_GLYPHSTRING
  1172. MemFree(aubBuff);
  1173. break; // TYPE_GLYPHHANDLE
  1174. #if 0
  1175. case TYPE_GLYPHID:
  1176. for (dwI = 0; dwI < dwCount; dwI ++, ((PDWORD)pGlyph)++){
  1177. ERR(("TYEP_GLYPHID:0x%x\n", *(PDWORD)pGlyph));
  1178. }
  1179. break;
  1180. #endif
  1181. }
  1182. }