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.

1342 lines
43 KiB

  1. /*++
  2. Copyright (c) 1997-1999 Microsoft Corporation
  3. --*/
  4. //-----------------------------------------------------------------------------
  5. // This files contains the module name for this mini driver. Each mini driver
  6. // must have a unique module name. The module name is used to obtain the
  7. // module handle of this Mini Driver. The module handle is used by the
  8. // generic library to load in tables from the Mini Driver.
  9. //-----------------------------------------------------------------------------
  10. #include "pdev.h"
  11. #define SHIFTJIS_CHARSET 128
  12. #define CCHMAXCMDLEN 128
  13. #include <stdio.h>
  14. #define WRITESPOOLBUF(p, s, n) \
  15. ((p)->pDrvProcs->DrvWriteSpoolBuf(p, s, n))
  16. #define PARAM(p,n) \
  17. (*((p)+(n)))
  18. #define ABS(n) \
  19. ((n) > 0 ? (n) : -(n))
  20. #define SWAPW(x) (((WORD)(x)<<8) | ((WORD)(x)>>8))
  21. #define FLAG_SBCS 1
  22. #define FLAG_DBCS 2
  23. WORD SJis2JisNPDL(
  24. WORD usCode)
  25. {
  26. union {
  27. USHORT bBuffer;
  28. struct tags{
  29. UCHAR al;
  30. UCHAR ah;
  31. } s;
  32. } u;
  33. // Replace code values which cannot be mapped into 0x2121 - 0x7e7e
  34. // (94 x 94 cahracter plane) with Japanese defult character, which
  35. // is KATAKANA MIDDLE DOT.
  36. if (usCode >= 0xf040) {
  37. usCode = 0x8145;
  38. }
  39. u.bBuffer = usCode;
  40. u.s.al -= u.s.al >= 0x80 ;
  41. u.s.al -= 0x1F ;
  42. u.s.ah &= 0xBF ;
  43. u.s.ah <<= 1 ;
  44. u.s.ah += 0x21-0x02 ;
  45. if (u.s.al > 0x7E )
  46. {
  47. u.s.al -= (0x7F-0x21) ;
  48. u.s.ah++;
  49. }
  50. return (u.bBuffer);
  51. }
  52. // In case it is a single byte font, we will some of the characters
  53. // (e.g. Yen-mark) to the actual printer font codepoint. Note since
  54. // the GPC data sets 0 to default CTT ID value, single byte codes
  55. // are in codepage 1252 (Latin1) values.
  56. WORD
  57. Ltn1ToAnk(
  58. WORD wCode )
  59. {
  60. // Not a good mapping table now.
  61. switch ( wCode ) {
  62. case 0xa5: // YEN MARK
  63. wCode = 0x5c;
  64. break;
  65. default:
  66. if ( wCode >= 0x7f)
  67. wCode = 0xa5;
  68. }
  69. return wCode;
  70. }
  71. //-----------------------------------------------------------------------------
  72. //
  73. // Function: iDwtoA_FillZero
  74. //
  75. // Description: Convert from numeral into a character and
  76. // fill a field which was specified with 0
  77. //-----------------------------------------------------------------------------
  78. static int
  79. iDwtoA_FillZero(PBYTE buf, long n, int fw)
  80. {
  81. int i , j, k, l;
  82. l = n; // for later
  83. for( i = 0; n; i++ ) {
  84. buf[i] = (char)(n % 10 + '0');
  85. n /= 10;
  86. }
  87. /* n was zero */
  88. if( i == 0 )
  89. buf[i++] = '0';
  90. for( j = 0; j < i / 2; j++ ) {
  91. int tmp;
  92. tmp = buf[j];
  93. buf[j] = buf[i - j - 1];
  94. buf[i - j - 1] = (char)tmp;
  95. }
  96. buf[i] = '\0';
  97. for( k = 0; l; k++ ) {
  98. l /= 10;
  99. }
  100. if( k < 1) k++;
  101. k = fw - k;
  102. if(k > 0){;
  103. for (j = i; 0 < j + 1; j--){
  104. buf[j + k] = buf[j];
  105. }
  106. for ( j = 0; j < k; j++){
  107. buf[j] = '0';
  108. }
  109. i = i + k;
  110. }
  111. return i;
  112. }
  113. VOID
  114. InitMyData(PMYDATA pnp)
  115. {
  116. pnp->wRes = 300;
  117. pnp->wCopies = 1;
  118. pnp->sSBCSX = pnp->sDBCSX = pnp->sSBCSXMove =
  119. pnp->sSBCSYMove = pnp->sDBCSXMove = pnp->sDBCSYMove = 0;
  120. pnp->sEscapement = 0;
  121. pnp->fVertFont = FALSE;
  122. pnp->jAddrMode = ADDR_MODE_NONE;
  123. pnp->wOldFontID = 0;
  124. pnp->fPlus = FALSE;
  125. pnp->wScale = 1;
  126. pnp->lPointsx =
  127. pnp->lPointsy = 0;
  128. pnp->CursorX =
  129. pnp->CursorY = 0;
  130. pnp->jColorMode = MONOCHROME;
  131. }
  132. PDEVOEM APIENTRY
  133. OEMEnablePDEV(
  134. PDEVOBJ pdevobj,
  135. PWSTR pPrinterName,
  136. ULONG cPatterns,
  137. HSURF *phsurfPatterns,
  138. ULONG cjGdiInfo,
  139. GDIINFO* pGdiInfo,
  140. ULONG cjDevInfo,
  141. DEVINFO* pDevInfo,
  142. DRVENABLEDATA *pded)
  143. {
  144. PMYDATA pTemp;
  145. VERBOSE((DLLTEXT("OEMEnablePDEV() entry.\n")));
  146. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  147. if (NULL == pdevobj)
  148. {
  149. ERR(("Invalid parameter(s).\n"));
  150. return NULL;
  151. }
  152. // Allocate minidriver private PDEV block.
  153. pTemp = (PMYDATA)MemAllocZ(sizeof(MYDATA));
  154. if (NULL == pTemp) {
  155. ERR(("Memory allocation failure.\n"));
  156. return NULL;
  157. }
  158. InitMyData(pTemp);
  159. MINIDEV_DATA(pdevobj) = (PVOID)pTemp;
  160. return pdevobj->pdevOEM;
  161. }
  162. VOID APIENTRY
  163. OEMDisablePDEV(
  164. PDEVOBJ pdevobj)
  165. {
  166. VERBOSE((DLLTEXT("OEMDisablePDEV() entry.\n")));
  167. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  168. if (NULL == pdevobj)
  169. {
  170. ERR(("Invalid parameter(s).\n"));
  171. return;
  172. }
  173. if ( NULL != pdevobj->pdevOEM ) {
  174. PMYDATA pnp = (PMYDATA)MINIDEV_DATA(pdevobj);
  175. if (NULL != pnp) {
  176. if (NULL != pnp->pTempBuf) {
  177. MemFree(pnp->pTempBuf);
  178. }
  179. MemFree( pnp );
  180. MINIDEV_DATA(pdevobj) = NULL;
  181. }
  182. }
  183. }
  184. BOOL APIENTRY
  185. OEMResetPDEV(
  186. PDEVOBJ pdevobjOld,
  187. PDEVOBJ pdevobjNew )
  188. {
  189. PMYDATA pTempOld, pTempNew;
  190. VERBOSE((DLLTEXT("OEMResetPDEV entry.\n")));
  191. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  192. if (NULL == pdevobjOld || NULL == pdevobjNew)
  193. {
  194. ERR(("Invalid parameter(s).\n"));
  195. return FALSE;
  196. }
  197. // Do some verificatin on PDEV data passed in.
  198. pTempOld = (PMYDATA)MINIDEV_DATA(pdevobjOld);
  199. pTempNew = (PMYDATA)MINIDEV_DATA(pdevobjNew);
  200. // Copy mindiriver specific part of PDEV
  201. if (NULL != pTempNew && NULL != pTempOld) {
  202. if (NULL != pTempNew->pTempBuf) {
  203. MemFree(pTempNew->pTempBuf);
  204. }
  205. *pTempNew = *pTempOld;
  206. pTempOld->pTempBuf = NULL;
  207. pTempOld->dwTempBufLen = 0;
  208. }
  209. return TRUE;
  210. }
  211. /*****************************************************************************/
  212. /* */
  213. /* Module: OEMFilterGraphics */
  214. /* */
  215. /* Function: */
  216. /* */
  217. /* Syntax: BOOL APIENTRY OEMFilterGraphics(PDEVOBJ, PBYTE, DWORD) */
  218. /* */
  219. /* Input: pdevobj address of PDEVICE structure */
  220. /* pBuf points to buffer of graphics data */
  221. /* dwLen length of buffer in bytes */
  222. /* */
  223. /* Output: BOOL */
  224. /* */
  225. /* Notice: nFunction and Escape numbers are the same */
  226. /* */
  227. /*****************************************************************************/
  228. BOOL
  229. APIENTRY
  230. OEMFilterGraphics(
  231. PDEVOBJ pdevobj,
  232. PBYTE pBuf,
  233. DWORD dwLen)
  234. {
  235. PMYDATA pnp;
  236. DWORD i;
  237. PBYTE pTop, pBot, pTmp;
  238. DWORD dwBlockX;
  239. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  240. if (NULL == pdevobj || NULL == pBuf || 0 == dwLen)
  241. {
  242. ERR(("OEMFilterGraphics: Invalid parameter(s).\n"));
  243. return FALSE;
  244. }
  245. pnp = (PMYDATA)MINIDEV_DATA(pdevobj);
  246. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  247. if (NULL == pnp)
  248. {
  249. ERR(("OEMFilterGraphics: pdevOEM = 0.\n"));
  250. return FALSE;
  251. }
  252. if (IsColorPlanar(pnp)) {
  253. WRITESPOOLBUF(pdevobj, pBuf, dwLen);
  254. // #308001: Garbage appear on device font
  255. WRITESPOOLBUF(pdevobj, "\x1C!o.", 4); // end ROP mode
  256. return TRUE;
  257. }
  258. if (IsColorTrueColor(pnp)) {
  259. // 24bpp color mode:
  260. // Change byt order from RGB to BGR, which
  261. // this printer can accept.
  262. pTop = pBuf;
  263. for (i = 0; i < dwLen; pTop += 3, i += 3)
  264. {
  265. BYTE jTmp;
  266. jTmp = *pTop;
  267. *pTop = *(pTop + 2);
  268. *(pTop + 2) = jTmp;
  269. }
  270. if (pnp->dwTempBufLen < pnp->dwTempDataLen + dwLen) {
  271. ERR(("Internal buffer overflow.\n"));
  272. return FALSE;
  273. }
  274. memcpy(pnp->pTempBuf + pnp->dwTempDataLen, pBuf, dwLen);
  275. pnp->dwTempDataLen += dwLen;
  276. if (pnp->dwTempDataLen < pnp->dwBlockLen) {
  277. // Not all the data has been saved.
  278. return TRUE;
  279. }
  280. // Now send out the block.
  281. // Need to send the last row first.
  282. // We have Y + 1 rows of the bufferes and the
  283. // last row is used as working buffer.
  284. dwBlockX = pnp->dwBlockX;
  285. pTop = pnp->pTempBuf;
  286. pBot = pTop + pnp->dwBlockLen - dwBlockX;
  287. pTmp = pTop + pnp->dwBlockLen;
  288. if(pnp->dwBlockLen+sizeof(dwBlockX)>pnp->dwTempBufLen) {
  289. ERR(("Internal buffer overflow.\n"));
  290. return FALSE;
  291. }
  292. for (i = 0; i < pnp->dwBlockY / 2; i++) {
  293. memcpy(pTmp, pTop, dwBlockX);
  294. memcpy(pTop, pBot, dwBlockX);
  295. memcpy(pBot, pTmp, dwBlockX);
  296. pTop += dwBlockX;
  297. pBot -= dwBlockX;
  298. }
  299. WRITESPOOLBUF(pdevobj, pnp->pTempBuf,
  300. pnp->dwTempDataLen);
  301. pnp->dwTempDataLen = 0;
  302. return TRUE;
  303. }
  304. // Others, should not happen.
  305. WARNING(("Unknown color mode, cannot handle\n"));
  306. return FALSE;
  307. }
  308. /*****************************************************************************/
  309. /* */
  310. /* Module: OEMSendFontCmd */
  311. /* */
  312. /* Function: send font selection command. */
  313. /* */
  314. /* Syntax: VOID APIENTRY OEMSendFontCmd( */
  315. /* PDEVOBJ, PUNIFONTOBJ, PFINVOCATION) */
  316. /* */
  317. /* Input: pdevobj address of PDEVICE structure */
  318. /* pUFObj address of UNIFONTOBJ structure */
  319. /* pFInv address of FINVOCATION */
  320. /* */
  321. /* Output: VOID */
  322. /* */
  323. /* Notice: */
  324. /* */
  325. /*****************************************************************************/
  326. BOOL
  327. myOEMSendFontCmd(
  328. PDEVOBJ pdevobj,
  329. PUNIFONTOBJ pUFObj,
  330. PFINVOCATION pFInv )
  331. {
  332. BYTE i;
  333. long tmpPointsx, tmpPointsy;
  334. PBYTE pcmd;
  335. BYTE rgcmd[CCHMAXCMDLEN]; // build command here
  336. // NTRAID#NTBUG9-579199-2002/03/20-v-sueyas-: Initialize un-initialized valiable
  337. BOOL fDBCS = TRUE;
  338. DWORD dwStdVariable[2 + 2 * 2];
  339. PGETINFO_STDVAR pSV;
  340. PBYTE pch = rgcmd;
  341. size_t rem = sizeof rgcmd;
  342. PMYDATA pnp;
  343. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  344. if (NULL == pdevobj)
  345. {
  346. ERR(("myOEMSendFontCmd: Invalid parameter(s).\n"));
  347. return FALSE;
  348. }
  349. pnp = (PMYDATA)MINIDEV_DATA(pdevobj);
  350. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  351. if (NULL == pnp)
  352. {
  353. ERR(("myOEMSendFontCmd: pdevOEM = 0.\n"));
  354. return FALSE;
  355. }
  356. if(!pUFObj || !pFInv)
  357. return FALSE;
  358. if(!pFInv->pubCommand || !pFInv->dwCount)
  359. {
  360. ERR(("Command string is NULL.\n"));
  361. return FALSE;
  362. }
  363. pSV = (PGETINFO_STDVAR)dwStdVariable;
  364. pSV->dwSize = sizeof(GETINFO_STDVAR) + 2 * (3-1) * sizeof(DWORD);
  365. pSV->dwNumOfVariable = 3;
  366. pSV->StdVar[0].dwStdVarID = FNT_INFO_FONTHEIGHT;
  367. pSV->StdVar[1].dwStdVarID = FNT_INFO_FONTWIDTH;
  368. pSV->StdVar[2].dwStdVarID = FNT_INFO_FONTMAXWIDTH;
  369. if (!pUFObj->pfnGetInfo(pUFObj, UFO_GETINFO_STDVARIABLE, pSV,
  370. pSV->dwSize, NULL))
  371. {
  372. ERR(("UFO_GETINFO_STDVARIABLE failed.\r\n"));
  373. return FALSE;
  374. }
  375. // NTRAID#NTBUG9-579199-2002/03/18-v-sueyas-: Check for deviding by zero
  376. if (0 == pnp->wRes)
  377. {
  378. ERR(("myOEMSendFontCmd: pnp->wRes = 0.\n"));
  379. return FALSE;
  380. }
  381. tmpPointsy = (long)pSV->StdVar[0].lStdVariable * 720 / (long)pnp->wRes;
  382. i = 0;
  383. pcmd = pFInv->pubCommand;
  384. while(pcmd[i] !='#')
  385. {
  386. if(rem==0) return FALSE;
  387. *pch++ = pcmd[i++];
  388. rem--;
  389. }
  390. i++;
  391. pnp->fVertFont = pnp->fPlus = FALSE;
  392. switch(pcmd[i])
  393. {
  394. case 'R':
  395. pnp->fPlus = TRUE;
  396. tmpPointsx = (long)pSV->StdVar[1].lStdVariable * 1200 /
  397. (long)pnp->wRes;
  398. break;
  399. case 'P':
  400. fDBCS = FALSE;
  401. tmpPointsx = ((long)pSV->StdVar[1].lStdVariable * 1200 + 600) /
  402. (long)pnp->wRes;
  403. break;
  404. case 'W':
  405. pnp->fVertFont = TRUE;
  406. case 'Q':
  407. fDBCS = TRUE;
  408. tmpPointsx = (long)pSV->StdVar[1].lStdVariable * 1440 /
  409. (long)pnp->wRes;
  410. break;
  411. case 'Y':
  412. pnp->fVertFont = TRUE;
  413. case 'S':
  414. pnp->fPlus = TRUE;
  415. tmpPointsx = (long)pSV->StdVar[1].lStdVariable * 1440 /
  416. (long)pnp->wRes;
  417. break;
  418. }
  419. if(pnp->fPlus)
  420. {
  421. if(tmpPointsy > 9999)
  422. tmpPointsy = 9999;
  423. else if(tmpPointsy < 10)
  424. tmpPointsy = 10;
  425. if(tmpPointsx > 9999)
  426. tmpPointsx = 9999;
  427. else if(tmpPointsx < 10)
  428. tmpPointsx = 10;
  429. pnp->wScale = tmpPointsx == tmpPointsy;
  430. pnp->lPointsx = tmpPointsx;
  431. pnp->lPointsy = tmpPointsy;
  432. if(pnp->fVertFont)
  433. {
  434. if(pnp->wScale)
  435. {
  436. // ISSUE-2002/03/11-hiroi- This original line overwrites rgcmd[ocmd]. I don't know how this line should be here.
  437. // Must revisit here later
  438. // rgcmd[ocmd] = '\034';
  439. // ocmd += (SHORT)wsprintf(&rgcmd[ocmd], "12S2-");
  440. *pch = '\034';
  441. if (FAILED(StringCchPrintfExA(pch, rem, &pch, &rem, 0,
  442. "12S2-")))
  443. return 0;
  444. if( rem > 4+1+4 ) { // check to see if the remaining buffer size > 4+1+4
  445. pch += (SHORT)iDwtoA_FillZero(pch, tmpPointsx, 4);
  446. *pch++ = '-';
  447. pch += (SHORT)iDwtoA_FillZero(pch, tmpPointsy, 4);
  448. } else
  449. return FALSE;
  450. }
  451. } else {
  452. if( rem > 4+1+4 ) { // check to see if the remaining buffer size > 4+1+4
  453. pch += (SHORT)iDwtoA_FillZero(pch, tmpPointsx, 4);
  454. *pch++ = '-';
  455. pch += (SHORT)iDwtoA_FillZero(pch, tmpPointsy, 4);
  456. } else
  457. return FALSE;
  458. }
  459. goto SEND_COM;
  460. }
  461. pnp->wScale = 1;
  462. if(tmpPointsy > 9999)
  463. {
  464. tmpPointsy = 9999;
  465. goto MAKE_COM;
  466. }
  467. if(tmpPointsy < 10)
  468. {
  469. tmpPointsy = 10;
  470. goto MAKE_COM;
  471. }
  472. pnp->wScale = (int)(tmpPointsx / tmpPointsy);
  473. if(pnp->wScale > 8)
  474. pnp->wScale = 8;
  475. MAKE_COM:
  476. if( rem > 4 ) { // check to see if the remaining buffer size > 4
  477. pch += (SHORT)iDwtoA_FillZero(pch, tmpPointsy, 4);
  478. } else
  479. return FALSE;
  480. SEND_COM:
  481. // write spool builded command
  482. WRITESPOOLBUF(pdevobj, rgcmd, (DWORD)(pch-rgcmd));
  483. i++;
  484. pch = rgcmd;
  485. rem = sizeof rgcmd;
  486. while(pcmd[i] !='#')
  487. {
  488. if( rem == 0 ) return FALSE;
  489. *pch++ = pcmd[i++];
  490. rem--;
  491. }
  492. if( rem > 4+1+4+1 ) { //check to see if the remaining buffer size > 4+1+4+1
  493. pch += (SHORT)iDwtoA_FillZero(pch, (fDBCS ?
  494. pSV->StdVar[1].lStdVariable * 2 : pSV->StdVar[1].lStdVariable), 4);
  495. *pch++ = ',';
  496. pch += (SHORT)iDwtoA_FillZero(pch, pSV->StdVar[0].lStdVariable, 4);
  497. *pch++ = '.';
  498. } else
  499. return FALSE;
  500. WRITESPOOLBUF(pdevobj, rgcmd, (DWORD)(pch-rgcmd));
  501. // save for FS_SINGLE_BYTE and FS_DOUBLE_BYTE
  502. pnp->sSBCSX = pnp->sSBCSXMove = (short)pSV->StdVar[1].lStdVariable;
  503. pnp->sDBCSX = pnp->sDBCSXMove = (short)(pSV->StdVar[1].lStdVariable << 1);
  504. // Reset address mode values.
  505. pnp->sSBCSYMove = pnp->sDBCSYMove = 0;
  506. pnp->jAddrMode = ADDR_MODE_NONE;
  507. return TRUE;
  508. }
  509. /*****************************************************************************/
  510. /* */
  511. /* Module: OEMCommandCallback */
  512. /* */
  513. /* Function: */
  514. /* */
  515. /* Syntax: INT APIENTRY OEMCommandCallback(PDEVOBJ,DWORD,DWORD,PDWORD) */
  516. /* */
  517. /* Input: pdevobj */
  518. /* ddwCmdCbID */
  519. /* dwCount */
  520. /* pdwParams */
  521. /* */
  522. /* Output: INT */
  523. /* */
  524. /* Notice: */
  525. /* */
  526. /*****************************************************************************/
  527. INT APIENTRY
  528. OEMCommandCallback(
  529. PDEVOBJ pdevobj, // Points to private data required by the Unidriver.dll
  530. DWORD dwCmdCbID, // Callback ID
  531. DWORD dwCount, // Counts of command parameter
  532. PDWORD pdwParams ) // points to values of command params
  533. {
  534. BYTE ch[CCHMAXCMDLEN];
  535. WORD wCmdLen = 0;
  536. PBYTE pch = ch;
  537. size_t rem = sizeof ch;
  538. PMYDATA pnp;
  539. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  540. if (NULL == pdevobj)
  541. {
  542. ERR(("OEMCommandCallback: Invalid parameter(s).\n"));
  543. return 0;
  544. }
  545. pnp = (PMYDATA)MINIDEV_DATA(pdevobj);
  546. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  547. if (NULL == pnp)
  548. {
  549. ERR(("OEMCommandCallback: pdevOEM = 0.\n"));
  550. return 0;
  551. }
  552. switch(dwCmdCbID)
  553. {
  554. case MONOCHROME:
  555. pnp->jColorMode = (BYTE)dwCmdCbID;
  556. // OR mode
  557. WRITESPOOLBUF(pdevobj, "\x1C\"O.", 4);
  558. break;
  559. case COLOR_3PLANE:
  560. case COLOR_24BPP_2:
  561. case COLOR_24BPP_4:
  562. case COLOR_24BPP_8:
  563. pnp->jColorMode = (BYTE)dwCmdCbID;
  564. // Replace mode
  565. WRITESPOOLBUF(pdevobj, "\x1C\"R.", 4);
  566. break;
  567. case RES_300:
  568. pnp->wRes = 300;
  569. WRITESPOOLBUF(pdevobj, "\x1CYSU1,300,0;\x1CZ", 14);
  570. WRITESPOOLBUF(pdevobj, "\x1C<1/300,i.", 10);
  571. break;
  572. case RES_SENDBLOCK:
  573. {
  574. DWORD dwCursorX, dwCursorY;
  575. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  576. if (dwCount < 1 || !pdwParams)
  577. return 0;
  578. pnp->dwBlockLen = PARAM(pdwParams, 0);
  579. pnp->dwBlockX = PARAM(pdwParams, 1);
  580. pnp->dwBlockY = PARAM(pdwParams, 2);
  581. dwCursorX = PARAM(pdwParams, 3);
  582. dwCursorY = PARAM(pdwParams, 4);
  583. if (IsColorPlanar(pnp))
  584. {
  585. //NTRAID#355334: no need send cursor command.
  586. // Send cursor move command using saved parameters
  587. //wlen = (WORD)wsprintf(ch, FS_E, dwCursorX, dwCursorY);
  588. //WRITESPOOLBUF(pdevobj, ch, wlen);
  589. //NTRAID#308001: Garbage appear on device font
  590. // Send color command for each sendblocks.
  591. switch (pnp->jCurrentPlane) {
  592. case PLANE_CYAN:
  593. if (FAILED(StringCchPrintfExA(pch, rem, &pch, &rem, 0,
  594. "\x1C!s0,,,,,,.\x1C!o4,204,3.")))
  595. return 0;
  596. break;
  597. case PLANE_MAGENTA:
  598. if (FAILED(StringCchPrintfExA(pch, rem, &pch, &rem, 0,
  599. "\x1C!s0,,,,,,.\x1C!o4,204,2.")))
  600. return 0;
  601. break;
  602. case PLANE_YELLOW:
  603. if (FAILED(StringCchPrintfExA(pch, rem, &pch, &rem, 0,
  604. "\x1C!s0,,,,,,.\x1C!o4,204,1.")))
  605. return 0;
  606. break;
  607. }
  608. if (FAILED(StringCchPrintfExA(pch, rem, &pch, &rem, 0,
  609. "\034R\034i%d,%d,0,1/1,1/1,%d,300.",
  610. (pnp->dwBlockX * 8), pnp->dwBlockY,
  611. pnp->dwBlockLen )))
  612. return 0;
  613. WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch-ch));
  614. pnp->jAddrMode = ADDR_MODE_NONE;
  615. }
  616. else if (IsColorTrueColor(pnp)) {
  617. DWORD dwNewBufLen;
  618. INT iDepth;
  619. // Allocate working buffer. We allocate Y + 1 rows
  620. // to save the block data passed from the Unidrv.
  621. // See the OEMFilterGraphics() code for the details.
  622. VERBOSE(("sb - l,x,y=%d,%d,%d, t=%d\n",
  623. pnp->dwBlockLen, pnp->dwBlockX, pnp->dwBlockY,
  624. pnp->dwTempBufLen));
  625. dwNewBufLen = pnp->dwBlockLen + pnp->dwBlockX;
  626. if (pnp->dwTempBufLen < dwNewBufLen) {
  627. if (NULL != pnp->pTempBuf) {
  628. VERBOSE(("sb - realloc\n"));
  629. MemFree(pnp->pTempBuf);
  630. pnp->pTempBuf = NULL;
  631. }
  632. }
  633. if (NULL == pnp->pTempBuf) {
  634. pnp->pTempBuf = MemAlloc(dwNewBufLen);
  635. if (NULL == pnp->pTempBuf) {
  636. ERR(("Faild to allocate temp. buffer\n"));
  637. return 0;
  638. }
  639. pnp->dwTempBufLen = dwNewBufLen;
  640. pnp->dwTempDataLen = 0;
  641. }
  642. // Construct printer command
  643. // This printer wants left-bottom corner's coordinate
  644. // for the parameter.
  645. iDepth = ColorOutDepth(pnp);
  646. if (FAILED(StringCchPrintfExA(ch, rem, &pch, &rem, 0,
  647. "\034!E%d,%d,%d,%d,%d,%d,%d,%d.",
  648. iDepth, dwCursorX, (dwCursorY + pnp->dwBlockY - 1),
  649. (pnp->dwBlockX / 3), pnp->dwBlockY,
  650. (pnp->dwBlockX / 3), pnp->dwBlockY,
  651. pnp->dwBlockLen)))
  652. return 0;
  653. WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch-ch));
  654. }
  655. else {
  656. ERR(("Unknown color mode, cannot handle.\n"));
  657. }
  658. }
  659. break;
  660. case PC_TYPE_F:
  661. if (FAILED(StringCchPrintfExA(ch, rem, &pch, &rem, 0,
  662. ESC_RESET)))
  663. return 0;
  664. WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch-ch));
  665. break;
  666. case PC_END_F:
  667. if (FAILED(StringCchPrintfExA(ch, rem, &pch, &rem, 0,
  668. FS_RESO0_RESET)))
  669. return 0;
  670. WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch-ch));
  671. break;
  672. case PC_ENDPAGE :
  673. if (FAILED(StringCchPrintfExA(ch, rem, &pch, &rem, 0,
  674. FS_ENDPAGE, pnp->wCopies)))
  675. return 0;
  676. WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch-ch));
  677. break;
  678. case PC_MULT_COPIES_N:
  679. case PC_MULT_COPIES_C:
  680. // FS_COPIES is neccesary for each page
  681. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  682. if (dwCount < 1 || !pdwParams)
  683. return 0;
  684. if(dwCmdCbID == PC_MULT_COPIES_C)
  685. {
  686. // ISSUE-2002/03/11-hiroi- This original line overwrites rgcmd[ocmd]. I don't know how this line should be here.
  687. // Must revisit here later
  688. // ch[wlen] = '\034';
  689. // wlen += (WORD)wsprintf(&ch[wlen], "05F2-02");
  690. ch[0] = '\034';
  691. if (FAILED(StringCchPrintfExA(ch, rem, &pch, &rem, 0,
  692. "05F2-02")))
  693. return 0;
  694. }
  695. pnp->wCopies = (WORD)*pdwParams;
  696. if (FAILED(StringCchPrintfExA(pch, rem, &pch, &rem, 0, INIT_DOC, pnp->wRes, pnp->wRes)))
  697. return 0;
  698. WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch-ch));
  699. break;
  700. case PC_PRN_DIRECTION:
  701. {
  702. short sEsc, sEsc90;
  703. short ESin[] = {0, 1, 0, -1};
  704. short ECos[] = {1, 0, -1, 0};
  705. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  706. if (dwCount < 1 || !pdwParams)
  707. return 0;
  708. pnp->sEscapement = (short)*pdwParams % 360;
  709. sEsc = pnp->sEscapement;
  710. sEsc90 = pnp->sEscapement/90;
  711. pnp->sSBCSXMove = pnp->sSBCSX * ECos[sEsc90];
  712. pnp->sSBCSYMove = -pnp->sSBCSX * ESin[sEsc90];
  713. pnp->sDBCSXMove = pnp->sDBCSX * ECos[sEsc90];
  714. pnp->sDBCSYMove = -pnp->sDBCSX * ESin[sEsc90];
  715. }
  716. break;
  717. // *** Cursor Movement CM *** //
  718. case CM_X_ABS:
  719. case CM_Y_ABS:
  720. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  721. if (dwCount < 1 || !pdwParams)
  722. return 0;
  723. {
  724. INT iRet = (INT)PARAM(pdwParams, 0);
  725. if (CM_X_ABS == dwCmdCbID) {
  726. pnp->CursorX = iRet;
  727. }
  728. else if (CM_Y_ABS == dwCmdCbID){
  729. pnp->CursorY = iRet;
  730. }
  731. if (FAILED(StringCchPrintfExA(ch, rem, &pch, &rem, 0, FS_E, pnp->CursorX, pnp->CursorY)))
  732. return 0;
  733. WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch-ch));
  734. return iRet;
  735. }
  736. case CM_CR:
  737. pnp->CursorX = 0;
  738. //NTRAID#355334: ensure CursorX=0 after CR
  739. if (FAILED(StringCchPrintfExA(ch, rem, &pch, &rem, 0, "\x0D\034e0,%d.", pnp->CursorY)))
  740. return 0;
  741. WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch-ch));
  742. break;
  743. case CM_FF:
  744. pnp->CursorX = pnp->CursorY = 0;
  745. WRITESPOOLBUF(pdevobj, "\x0C", 1);
  746. break;
  747. case CM_LF:
  748. pnp->CursorX = 0;
  749. pnp->CursorY++;
  750. WRITESPOOLBUF(pdevobj, "\x0A", 1);
  751. break;
  752. // *** Font Simulation FS *** //
  753. case FS_DOUBLE_BYTE:
  754. if (FAILED(StringCchPrintfExA(ch, rem, &pch, &rem, 0, FS_ADDRMODE_ON, pnp->sDBCSXMove, pnp->sDBCSYMove)))
  755. return 0;
  756. WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch-ch));
  757. if(pnp->fVertFont)
  758. {
  759. WRITESPOOLBUF(pdevobj, ESC_KANJITATE, 2);
  760. if(pnp->wScale == 1)
  761. break;
  762. if(!pnp->fPlus)
  763. {
  764. char *bcom[] = {"1/2", "1/1", "2/1", "3/1",
  765. "4/1", "4/1", "6/1", "6/1", "8/1"};
  766. rem = sizeof ch;
  767. if (FAILED(StringCchPrintfExA(ch, rem, &pch, &rem, 0,
  768. FS_M_T, (PBYTE)bcom[pnp->wScale])))
  769. return 0;
  770. WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch-ch));
  771. break;
  772. } else {
  773. // ISSUE-2002/03/11-hiroi- This original line overwrites ch[wlen]. I don't know how this line should be here.
  774. // Must revisit here later
  775. // ch[wlen] = '\034';
  776. // wlen += (WORD)wsprintf(&ch[wlen], "12S2-");
  777. // wlen += (WORD)iDwtoA_FillZero(&ch[wlen], pnp->lPointsx, 4);
  778. // ch[wlen++] = '-';
  779. // wlen += (WORD)iDwtoA_FillZero(&ch[wlen], pnp->lPointsy, 4);
  780. *pch = '\034';
  781. if (FAILED(StringCchPrintfExA(pch, rem, &pch, &rem, 0, "12S2-")))
  782. return 0;
  783. if( rem > 4+1+4 ) { // check to see if the remaining buffer size > 4+1+4
  784. pch += (WORD)iDwtoA_FillZero(pch, pnp->lPointsx, 4);
  785. *pch++ = '-';
  786. pch += (WORD)iDwtoA_FillZero(pch, pnp->lPointsy, 4);
  787. } else
  788. return 0;
  789. }
  790. WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch-ch));
  791. }
  792. break;
  793. case FS_SINGLE_BYTE:
  794. if (FAILED(StringCchPrintfExA(ch, rem, &pch, &rem, 0, FS_ADDRMODE_ON, pnp->sSBCSXMove,pnp->sSBCSYMove)))
  795. return 0;
  796. WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch-ch));
  797. if(pnp->fVertFont)
  798. {
  799. WRITESPOOLBUF(pdevobj, ESC_KANJIYOKO, 2);
  800. if(pnp->wScale == 1)
  801. break;
  802. if(!pnp->fPlus)
  803. {
  804. char *bcom[] = {"1/2", "1/1", "2/1", "3/1",
  805. "4/1", "4/1", "6/1", "6/1", "8/1"};
  806. rem = sizeof ch;
  807. if (FAILED(StringCchPrintfExA(ch, rem, &pch, &rem, 0, FS_M_Y, (LPSTR)bcom[pnp->wScale])))
  808. return 0;
  809. WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch-ch));
  810. break;
  811. } else {
  812. // ISSUE-2002/03/11-hiroi- This original line overwrites ch[wlen]. I don't know how this line should be here.
  813. // Must revisit here later
  814. // ch[wlen] = '\034';
  815. // wlen += (WORD)wsprintf(&ch[wlen], "12S2-");
  816. // wlen += (WORD)iDwtoA_FillZero(&ch[wlen], pnp->lPointsx, 4);
  817. // ch[wlen++] = '-';
  818. // wlen += (WORD)iDwtoA_FillZero(&ch[wlen], pnp->lPointsy, 4);
  819. *pch = '\034';
  820. if (FAILED(StringCchPrintfExA(ch, rem, &pch, &rem, 0, "12S2-")))
  821. return 0;
  822. if( rem > 4+1+4 ) { // check to see if the remaining buffer size > 4+1+4
  823. pch += (WORD)iDwtoA_FillZero(pch, pnp->lPointsx, 4);
  824. *pch++ = '-';
  825. pch += (WORD)iDwtoA_FillZero(pch, pnp->lPointsy, 4);
  826. } else
  827. return 0;
  828. }
  829. WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch-ch));
  830. }
  831. break;
  832. case CMD_RECT_WIDTH :
  833. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  834. if (dwCount < 1 || !pdwParams)
  835. return 0;
  836. pnp->dwRectX = PARAM(pdwParams, 0);
  837. break;
  838. case CMD_RECT_HEIGHT :
  839. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  840. if (dwCount < 1 || !pdwParams)
  841. return 0;
  842. pnp->dwRectY = PARAM(pdwParams, 0);
  843. break;
  844. case CMD_BLACK_FILL:
  845. case CMD_GRAY_FILL:
  846. case CMD_WHITE_FILL:
  847. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  848. if (dwCount < 1 || !pdwParams)
  849. return 0;
  850. {
  851. INT iGrayLevel;
  852. // Disable absolute addres mode, enter graphics.
  853. // Set fill mode.
  854. if (FAILED(StringCchPrintfExA(ch, rem, &pch, &rem, 0, "\034R\034YXX1;")))
  855. return 0;
  856. if (CMD_BLACK_FILL == dwCmdCbID) {
  857. iGrayLevel = 0;
  858. }
  859. else if (CMD_WHITE_FILL == dwCmdCbID) {
  860. iGrayLevel = 100;
  861. }
  862. else {
  863. // Gray fill.
  864. // 0 = Black, 100 = White
  865. iGrayLevel = (INT)(100 - (WORD)PARAM(pdwParams, 2));
  866. }
  867. // Select ray level.
  868. if (FAILED(StringCchPrintfExA(pch, rem, &pch, &rem, 0, "SG%d;", iGrayLevel)))
  869. return 0;
  870. // Move pen, fill rect.
  871. if (FAILED(StringCchPrintfExA(pch, rem, &pch, &rem, 0, "MA%d,%d;RR%d,%d;",
  872. (WORD)PARAM(pdwParams, 0),
  873. (WORD)PARAM(pdwParams, 1),
  874. (pnp->dwRectX - 1), (pnp->dwRectY - 1))))
  875. return 0;
  876. // Disable fill mode.
  877. // Exit graphics.
  878. if (FAILED(StringCchPrintfExA(pch, rem, &pch, &rem, 0, "XX0;\034Z")))
  879. return 0;
  880. // Now send command linet to the printer.
  881. WRITESPOOLBUF(pdevobj, ch, (DWORD)(pch-ch));
  882. // Reset some flags to indicate graphics mode
  883. // side effects.
  884. pnp->jAddrMode = ADDR_MODE_NONE;
  885. break;
  886. }
  887. //NTRAID#308001: Garbage appear on device font
  888. case CMD_SENDCYAN:
  889. pnp->jCurrentPlane = PLANE_CYAN;
  890. break;
  891. case CMD_SENDMAGENTA:
  892. pnp->jCurrentPlane = PLANE_MAGENTA;
  893. break;
  894. case CMD_SENDYELLOW:
  895. pnp->jCurrentPlane = PLANE_YELLOW;
  896. break;
  897. default:
  898. WARNING(("Unknown command cllabck ID %d not handled.\n",
  899. dwCmdCbID))
  900. break;
  901. }
  902. return 0;
  903. }
  904. /*****************************************************************************/
  905. /* */
  906. /* Module: OEMOutputCharStr */
  907. /* */
  908. /* Function: */
  909. /* */
  910. /* Syntax: VOID APIENTRY OEMOutputCharStr(PDEVOBJ, PUNIFONTOBJ, DWORD, */
  911. /* DWORD, PVOID) */
  912. /* */
  913. /* Input: pdevobj address of PDEVICE structure */
  914. /* pUFObj */
  915. /* dwType */
  916. /* dwCount */
  917. /* pGlyph */
  918. /* */
  919. /* Output: VOID */
  920. /* */
  921. /* Notice: */
  922. /* */
  923. /*****************************************************************************/
  924. BOOL
  925. myOEMOutputCharStr(
  926. PDEVOBJ pdevobj,
  927. PUNIFONTOBJ pUFObj,
  928. DWORD dwType,
  929. DWORD dwCount,
  930. PVOID pGlyph )
  931. {
  932. GETINFO_GLYPHSTRING GStr;
  933. PTRANSDATA pTrans;
  934. WORD wlen;
  935. WORD i;
  936. WORD wTmpChar;
  937. BYTE ch[512];
  938. BOOL fDBCSFont;
  939. WORD wComLen;
  940. PBYTE pTempBuf;
  941. PBYTE pch = ch;
  942. DWORD rem = sizeof ch;
  943. PMYDATA pnp;
  944. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  945. if(NULL == pdevobj || NULL == pUFObj)
  946. {
  947. ERR(("myOEMOutputCharStr: Invalid parameter(s).\n"));
  948. return FALSE;
  949. }
  950. pnp = (PMYDATA)MINIDEV_DATA(pdevobj);
  951. // NTRAID#NTBUG9-579197-2002/03/18-v-sueyas-: Check for illegal parameters
  952. if(NULL == pnp)
  953. {
  954. ERR(("myOEMOutputCharStr: pdevOEM = 0.\n"));
  955. return FALSE;
  956. }
  957. wlen = 0;
  958. switch(dwType)
  959. {
  960. case TYPE_GLYPHHANDLE: // Device Font
  961. {
  962. if( pUFObj->ulFontID != pnp->wOldFontID )
  963. {
  964. pnp->jAddrMode = ADDR_MODE_NONE;
  965. pnp->wOldFontID = (WORD)pUFObj->ulFontID;
  966. }
  967. switch(pUFObj->ulFontID)
  968. {
  969. case 5: // Courier
  970. case 6: // Helv
  971. case 7: // TmsRmn
  972. case 8: // TmsRmn Italic
  973. fDBCSFont = FALSE;
  974. break;
  975. default:
  976. fDBCSFont = TRUE;
  977. break;
  978. }
  979. //NTRAID#333653: Change I/F for GETINFO_GLYPHSTRING begin
  980. GStr.dwSize = sizeof (GETINFO_GLYPHSTRING);
  981. GStr.dwCount = dwCount;
  982. GStr.dwTypeIn = TYPE_GLYPHHANDLE;
  983. GStr.pGlyphIn = pGlyph;
  984. GStr.dwTypeOut = TYPE_TRANSDATA;
  985. GStr.pGlyphOut = NULL;
  986. GStr.dwGlyphOutSize = 0; /* new member of GETINFO_GLYPHSTRING */
  987. /* Get TRANSDATA buffer size */
  988. if (pUFObj->pfnGetInfo(pUFObj, UFO_GETINFO_GLYPHSTRING, &GStr, 0, NULL)
  989. || !GStr.dwGlyphOutSize )
  990. {
  991. ERR(("UNIFONTOBJ_GetInfo:UFO_GETINFO_GLYPHSTRING failed.\n"));
  992. return FALSE;
  993. }
  994. /* Alloc TRANSDATA buffer */
  995. if(!(pTempBuf = (PBYTE)MemAllocZ(GStr.dwGlyphOutSize)))
  996. {
  997. ERR(("Memory alloc failed.\n"));
  998. return FALSE;
  999. }
  1000. pTrans = (PTRANSDATA)pTempBuf;
  1001. /* Get actual TRANSDATA */
  1002. GStr.pGlyphOut = pTrans;
  1003. if (!pUFObj->pfnGetInfo(pUFObj, UFO_GETINFO_GLYPHSTRING, &GStr, 0, NULL))
  1004. {
  1005. ERR(("GetInfo failed.\n"));
  1006. return FALSE;
  1007. }
  1008. //NTRAID#333653: Change I/F for GETINFO_GLYPHSTRING end
  1009. //NTRAID#346241: SBCS pitch is widely.
  1010. if(fDBCSFont &&
  1011. (pTrans[0].ubType & MTYPE_FORMAT_MASK) == MTYPE_PAIRED &&
  1012. pTrans[0].uCode.ubPairs[0])
  1013. {
  1014. if (ADDR_MODE_DBCS != pnp->jAddrMode)
  1015. {
  1016. BYTE cH[CCHMAXCMDLEN];
  1017. PBYTE pcH = cH;
  1018. size_t reM = sizeof cH;
  1019. if (FAILED(StringCchPrintfExA(cH, reM, &pcH, &reM, 0, FS_ADDRMODE_ON, pnp->sDBCSXMove, pnp->sDBCSYMove)))
  1020. return FALSE;
  1021. WRITESPOOLBUF(pdevobj, cH, (DWORD)(pcH-cH));
  1022. if(pnp->fVertFont)
  1023. {
  1024. WRITESPOOLBUF(pdevobj, ESC_KANJITATE, 2);
  1025. if(pnp->wScale != 1)
  1026. {
  1027. if(!pnp->fPlus)
  1028. {
  1029. char *bcom[] = {"1/2","1/1","2/1","3/1",
  1030. "4/1","4/1","6/1","6/1","8/1"};
  1031. reM = sizeof cH;
  1032. if (FAILED(StringCchPrintfExA(cH, reM, &pcH, &reM, 0, FS_M_T, (PBYTE)bcom[pnp->wScale])))
  1033. return FALSE;
  1034. } else {
  1035. // ISSUE-2002/03/11-hiroi- This original line overwrites ch[wlen]. I don't know how this line should be here.
  1036. // Must revisit here later
  1037. // cH[wLen] = '\034';
  1038. // wLen += (WORD)wsprintf(&cH[wLen], "12S2-");
  1039. // wLen += (WORD)iDwtoA_FillZero(&cH[wLen],
  1040. // pnp->lPointsx, 4);
  1041. // cH[wLen++] = '-';
  1042. // wLen += (WORD)iDwtoA_FillZero(&cH[wLen],
  1043. // pnp->lPointsy, 4);
  1044. *pcH = '\034';
  1045. if (FAILED(StringCchPrintfExA(pcH, reM, &pcH, &reM, 0, "12S2-")))
  1046. return FALSE;
  1047. if( reM > 4+1+4 ) { // check to see if the remaining buffer size > 4+1+4
  1048. pcH += (WORD)iDwtoA_FillZero(pcH,pnp->lPointsx, 4);
  1049. *pcH++ = '-';
  1050. pcH += (WORD)iDwtoA_FillZero(pcH,pnp->lPointsy, 4);
  1051. } else
  1052. return FALSE;
  1053. }
  1054. WRITESPOOLBUF(pdevobj, cH, (DWORD)(pcH-cH));
  1055. }
  1056. }
  1057. pnp->jAddrMode = ADDR_MODE_DBCS;
  1058. }
  1059. } else {
  1060. if(ADDR_MODE_SBCS != pnp->jAddrMode)
  1061. {
  1062. BYTE cH[CCHMAXCMDLEN];
  1063. // NTRAID#NTBUG9-629397-2002/05/24-yasuho-: SBCS font can't printed.
  1064. PBYTE pcH = cH;
  1065. size_t reM = sizeof cH;
  1066. if (FAILED(StringCchPrintfExA(cH, reM, &pcH, &reM, 0, FS_ADDRMODE_ON, pnp->sSBCSXMove, pnp->sSBCSYMove)))
  1067. return FALSE;
  1068. WRITESPOOLBUF(pdevobj, cH, (DWORD)(pcH-cH));
  1069. if(pnp->fVertFont)
  1070. {
  1071. WRITESPOOLBUF(pdevobj, ESC_KANJIYOKO, 2);
  1072. if(pnp->wScale != 1)
  1073. {
  1074. if(!pnp->fPlus)
  1075. {
  1076. char *bcom[] = {"1/2","1/1","2/1","3/1",
  1077. "4/1","4/1","6/1","6/1","8/1"};
  1078. reM = sizeof cH;
  1079. if (FAILED(StringCchPrintfExA(cH, reM, &pcH, &reM, 0, FS_M_Y,(PBYTE)bcom[pnp->wScale])))
  1080. return FALSE;
  1081. } else {
  1082. // ISSUE-2002/03/11-hiroi- This original line overwrites ch[wlen]. I don't know how this line should be here.
  1083. // Must revisit here later
  1084. // cH[wLen] = '\034';
  1085. // wLen += (WORD)wsprintf(&cH[wLen], "12S2-");
  1086. // wLen += (WORD)iDwtoA_FillZero(&cH[wLen],
  1087. // pnp->lPointsx, 4);
  1088. // cH[wLen++] = '-';
  1089. // wLen += (WORD)iDwtoA_FillZero(&cH[wLen],
  1090. // pnp->lPointsy, 4);
  1091. *pcH = '\034';
  1092. if (FAILED(StringCchPrintfExA(pcH, reM, &pcH, &reM, 0,"12S2-")))
  1093. return FALSE;
  1094. if( reM > 4+1+4 ) { // check to see if the remaining buffer size > 4+1+4
  1095. pcH += (WORD)iDwtoA_FillZero(pcH,pnp->lPointsx, 4);
  1096. *pcH++ = '-';
  1097. pcH += (WORD)iDwtoA_FillZero(pcH,pnp->lPointsy, 4);
  1098. } else
  1099. return FALSE;
  1100. }
  1101. WRITESPOOLBUF(pdevobj, cH, (DWORD)(pcH-cH));
  1102. }
  1103. }
  1104. pnp->jAddrMode = ADDR_MODE_SBCS;
  1105. }
  1106. }
  1107. for(i = 0; i < dwCount; i++, pTrans++)
  1108. {
  1109. switch(pTrans->ubType & MTYPE_FORMAT_MASK)
  1110. {
  1111. case MTYPE_PAIRED:
  1112. if(wlen+2<=sizeof ch)
  1113. memcpy(((PBYTE)(ch + wlen)), pTrans->uCode.ubPairs, 2);
  1114. else
  1115. return FALSE;
  1116. wlen += 2;
  1117. break;
  1118. case MTYPE_DIRECT:
  1119. wTmpChar = (WORD)pTrans->uCode.ubCode;
  1120. if (!fDBCSFont)
  1121. wTmpChar = Ltn1ToAnk( wTmpChar );
  1122. if(wlen+2<=sizeof ch)
  1123. *(PWORD)(ch + wlen) = SWAPW(wTmpChar);
  1124. else
  1125. return FALSE;
  1126. wlen += 2;
  1127. break;
  1128. }
  1129. }
  1130. if(wlen)
  1131. WRITESPOOLBUF(pdevobj, ch, wlen);
  1132. break;
  1133. } // case TYPE_GLYPHHANDLE
  1134. default:
  1135. break;
  1136. }
  1137. return TRUE;
  1138. }