|
|
1.1 root 1: #include <windows.h>
2: #include <winuser.h>
3:
4: #include <ntmindrv.h>
5:
6:
7: NTMD_INIT ntmdInit; /* Function address in RasDD */
8:
9: /*
10: * Include the module initialisation function so that RasDD will
11: * recognise our module.
12: */
13:
14: #define _GET_FUNC_ADDR 1
15:
16: #include "modinit.c"
17:
18:
19: void CompressIt(PBYTE, PBYTE, int);
20:
21: /***************************** Function Header *****************************
22: * CBFilterGraphics
23: * Manipulate output data before calling RasDD's buffering function.
24: * This function is called with the raw bit data that is to be
25: * sent to the printer.
26: *
27: *
28: * DEC Laser printers require raster graphics to be sent in byte column model
29: * similiar to dot matrix printers. However only six bits in every byte are
30: * used. Our function takes a 3 byte high column of data (24 scanlines) and
31: * converts it to 4 x 6 scanline high blocks.
32: *
33: *
34: * Other massaging includes flipping the data. DEC's PPL3 expects the sixth
35: * scanline to be the low bit etc. 0x3F needs to be added to each byte.
36: *
37: *
38: *
39: * CompressIt function then implements a run length encoding type compression
40: * before WriteSpoolBuf is called
41: *
42: *
43: *
44: ****************************************************************************/
45:
46: int
47: CBFilterGraphics( lpdv, lpBuf, len )
48: void *lpdv;
49: BYTE *lpBuf;
50: int len;
51: {
52: BYTE *lpSrc, *lpTgt;
53: static BYTE localBuf[1300];
54: int i,j, bytesRem, nBytes;
55: static BYTE Blk1[256] = {0};
56: static BYTE Blk4[256] = {0};
57: static BYTE Blk2Byt1[256] = {0};
58: static BYTE Blk2Byt2[256] = {0};
59: static BYTE Blk3Byt1[256] = {0};
60: static BYTE Blk3Byt2[256] = {0};
61: static BYTE BindBlk2[4][16] = {0};
62: static BYTE BindBlk3[16][4] = {0};
63:
64: if (!Blk1[1]) // need to initialize tables
65: {
66: for(i = 0 ; i < 256 ; i++)
67: {
68: BYTE rot;
69:
70: //First Block , one byte only 123456XX to 00654321
71: rot = i;
72: Blk1[i] = 0x10 & (rot <<=1);
73: Blk1[i] |= 0x20 & (rot <<=2);
74: rot = i;
75: Blk1[i] |= 0x08 & (rot >>=1);
76: Blk1[i] |= 0x04 & (rot >>=2);
77: Blk1[i] |= 0x02 & (rot >>=2);
78: Blk1[i] |= 0x01 & (rot >>=2);
79: Blk1[i] = Blk1[i] + 0x3F;
80:
81: //Second Block first byte XXXXXX12 to 00000021
82: Blk2Byt1[i] = 0x01 & (i >>1);
83: Blk2Byt1[i] |= 0x02 & (i <<1); // i byte
84:
85: //Second Block second byte 3456XXXX to 00006543
86: rot = i;
87: Blk2Byt2[i] = 0x08 & (rot >>=1);
88: Blk2Byt2[i] |= 0x04 & (rot >>=2);
89: Blk2Byt2[i] |= 0x02 & (rot >>=2);
90: Blk2Byt2[i] |= 0x01 & (rot >>=2); // j byte
91:
92: //Third Block First byte XXXX1234 to 00004321
93: rot =i;
94: Blk3Byt1[i] = 0x02 & (rot >>=1);
95: Blk3Byt1[i] |= 0x01 & (rot >>=2);
96: rot =i;
97: Blk3Byt1[i] |= 0x04 & (rot <<=1);
98: Blk3Byt1[i] |= 0x08 & (rot <<=2); //j byte
99:
100: //Third Block Second byte 56XXXXXX to 00000065
101: rot =i;
102: Blk3Byt2[i] = 0x02 & (rot >>=5);
103: Blk3Byt2[i] |= 0x01 & (rot >>=2); //i byte
104:
105: //Fourth Block, only byte XX123456 to 00654321
106: rot=i;
107: Blk4[i] = 0x08 & (rot <<=1);
108: Blk4[i] |= 0x10 & (rot <<=2);
109: Blk4[i] |= 0x20 & (rot <<=2);
110: rot=i;
111: Blk4[i] |= 0x04 & (rot >>=1);
112: Blk4[i] |= 0x02 & (rot >>=2);
113: Blk4[i] |= 0x01 & (rot >>=2);
114: Blk4[i] = Blk4[i] + 0x3F;
115:
116:
117: }
118: for(i = 0 ; i < 4 ; i++)
119: for(j = 0 ; j < 16 ; j++)
120: {
121: // Bind 00000021 & 00006543 & add 3F
122: BindBlk2[i][j] = ( (j<< 2 ) | i) + 0x3F;
123: // Bind 00004321 & 00000065 & add 3F
124: BindBlk3[j][i] = ( (i<< 4 ) | j) + 0x3F;
125: }
126: }
127:
128: bytesRem = len;
129: lpSrc = lpBuf;
130: while(bytesRem > 0)
131: {
132: nBytes = (bytesRem > 3072) ? 3072 : bytesRem;
133: bytesRem -= nBytes;
134: lpTgt = localBuf;
135: for(i = 0 ; i < nBytes / 3 ; i++)
136: {
137: *lpTgt++ = Blk1[*lpSrc];
138: lpSrc +=3;
139: }
140: CompressIt(lpdv, localBuf, lpTgt - localBuf);
141: }
142: // End of block send graphics line feed & carriage return
143: ntmdInit.WriteSpoolBuf(lpdv, "\x2D\x24", 2);
144:
145: bytesRem = len;
146: lpSrc = lpBuf;
147: while(bytesRem > 0)
148: {
149: nBytes = (bytesRem > 3072) ? 3072 : bytesRem;
150: bytesRem -= nBytes;
151: lpTgt = localBuf;
152: for(i = 0 ; i < nBytes / 3 ; i++)
153: {
154: *lpTgt++ = BindBlk2[ Blk2Byt1[ *lpSrc] ][ Blk2Byt2[ *(lpSrc +1)] ];
155: lpSrc +=3;
156: }
157: CompressIt(lpdv, localBuf, lpTgt - localBuf);
158: }
159: // End of block send graphics line feed & carriage return
160:
161: ntmdInit.WriteSpoolBuf(lpdv, "\x2D\x24", 2);
162: bytesRem = len;
163: lpSrc = lpBuf;
164: while(bytesRem > 0)
165: {
166: nBytes = (bytesRem > 3072) ? 3072 : bytesRem;
167: bytesRem -= nBytes;
168: lpTgt = localBuf;
169: for(i = 0 ; i < nBytes / 3 ; i++)
170: {
171: *lpTgt++ = BindBlk3[ Blk3Byt1[ *(lpSrc+1) ] ][ Blk3Byt2[ *(lpSrc +2)] ];
172: lpSrc +=3;
173: }
174: CompressIt(lpdv, localBuf, lpTgt - localBuf);
175: }
176: // End of block send graphics line feed & carriage return
177: ntmdInit.WriteSpoolBuf(lpdv, "\x2D\x24", 2);
178:
179: bytesRem = len;
180: lpSrc = lpBuf;
181: while(bytesRem > 0)
182: {
183: nBytes = (bytesRem > 3072) ? 3072 : bytesRem;
184: bytesRem -= nBytes;
185: lpTgt = localBuf;
186: for(i = 0 ; i < nBytes / 3 ; i++)
187: {
188: *lpTgt++ = Blk4[ *(lpSrc+2) ];
189: lpSrc += 3;
190: }
191: CompressIt(lpdv, localBuf, lpTgt - localBuf);
192: }
193:
194: // End of final block send line feed & End Block command
195: ntmdInit.WriteSpoolBuf(lpdv, "\x2D\x9C", 2);
196:
197: return 100; /* Value not used AT PRESENT! */
198: }
199:
200: void
201: CompressIt(lpdv, ExpBuf, ExpLen)
202: BYTE *lpdv;
203: BYTE *ExpBuf;
204: int ExpLen;
205: {
206: static BYTE CompBuf[1200]; //Max size before Compression is 1024
207: BYTE *lpSrc, *lpTgt;
208: int InCompMode =0, count=0,i,FormatLen;
209: BYTE FormatBuf[10];
210: BYTE *pFormat;
211: lpSrc = ExpBuf;
212: lpTgt = CompBuf;
213: for (i=0; i < ExpLen; i++,lpSrc++)
214: {
215: if ( *lpSrc != *(lpSrc +1))
216: {
217: if (!InCompMode)
218: *lpTgt++ = *lpSrc;
219: else
220: {
221: InCompMode = 0;
222: //Send the repeat char sequence - !#X
223: pFormat = FormatBuf;
224: FormatLen = wsprintf(pFormat,"!%d%c",count,*lpSrc);
225: ntmdInit.WriteSpoolBuf(lpdv, FormatBuf,FormatLen);
226: }
227: }
228: else
229: {
230: if (!InCompMode)
231: {
232: InCompMode =1;
233: count =2;
234: ntmdInit.WriteSpoolBuf(lpdv, CompBuf, (PBYTE)lpTgt - (PBYTE)CompBuf);
235: lpTgt = CompBuf;
236: }
237: else
238: count++;
239: }
240: }
241: if (!InCompMode)
242: ntmdInit.WriteSpoolBuf(lpdv, CompBuf, (PBYTE)lpTgt - (PBYTE)CompBuf);
243: else
244: {
245: //Send the repeat char sequence - !#X
246: pFormat = FormatBuf;
247: FormatLen = wsprintf(pFormat,"!%d%c",count-1,*lpSrc);
248: ntmdInit.WriteSpoolBuf(lpdv, FormatBuf,FormatLen);
249: }
250: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.