1 /*_______________________________ epson-escpage-mono.c ______________________________*/
\r
3 /* 1 2 3 4 5 6 7 8 */
\r
4 /*34567890123456789012345678901234567890123456789012345678901234567890123456789012345678*/
\r
5 /*******************************************|********************************************/
\r
7 * Copyright (c) 2010 Seiko Epson Corporation All rights reserved.
\r
9 * Copyright protection claimed includes all forms and matters of
\r
10 * copyrightable material and information now allowed by statutory or judicial
\r
11 * law or hereinafter granted, including without limitation, material generated
\r
12 * from the software programs which are displayed on the screen such as icons,
\r
13 * screen display looks, etc.
\r
17 /*------------------------------------ Includes -------------------------------------*/
\r
18 /*******************************************|********************************************/
\r
19 #include "epson-escpr-err.h"
\r
20 #include "epson-escpr-media.h"
\r
21 #include "epson-escpr-mem.h"
\r
22 #include "epson-escpage.h"
\r
23 #include "epson-escpage-mono.h"
\r
25 /*----------------------------- Local Macro Definitions -------------------------------*/
\r
26 /*******************************************|********************************************/
\r
27 #ifdef EPS_LOG_MODULE_PAGE
\r
28 #define EPS_LOG_MODULE EPS_LOG_MODULE_PAGE
\r
30 #define EPS_LOG_MODULE 0
\r
33 /*-------------------------------- ESC/PAGE commands ----------------------------------*/
\r
34 /*******************************************|********************************************/
\r
35 const static EPS_UINT8 sbCR[] = {0x0D}; /* Carriage return "CR" */
\r
36 const static EPS_UINT8 sbFF[] = {0x0C}; /* Form Feed "FF" */
\r
37 const static EPS_UINT8 sbIP[] = {0x1D, 'r', 'h', 'E'};
\r
39 const static EPS_UINT8 sbCSE[] = {0x1D, '1', 'c', 's', 'E'};
\r
41 /* Initialize printer */
\r
42 const static EPS_UINT8 sbSU150[] = {0x1D, '0', ';', '.', '4', '8', 'm', 'u', 'E'}; /* Set unit to 150 */
\r
43 const static EPS_UINT8 sbSU300[] = {0x1D, '0', ';', '.', '2', '4', 'm', 'u', 'E'}; /* Set unit to 300 */
\r
44 const static EPS_UINT8 sbSU600[] = {0x1D, '0', ';', '.', '1', '2', 'm', 'u', 'E'}; /* Set unit to 600 */
\r
45 const static EPS_UINT8 sbSU1200[] = {0x1D, '0', ';', '.', '0', '6', 'm', 'u', 'E'}; /* Set unit to 1200 */
\r
47 const static EPS_UINT8 sbHTME300[] = {0x1D, '1', ';', '4', '5', ';', '7', '1', 'h', 't', 'm', 'E'};
\r
48 const static EPS_UINT8 sbHTME600[] = {0x1D, '1', ';', '4', '5', ';', '1', '0', '6', 'h', 't', 'm', 'E'};
\r
49 const static EPS_UINT8 sbHTME1200[] = {0x1D, '1', ';', '4', '5', ';', '1', '5', '6', 'h', 't', 'm', 'E'};
\r
51 const static EPS_UINT8 sbBGPG[] = {0x1D, '1', 'b', 'g', 'p', 'G'};
\r
53 const static EPS_UINT8 sbCAPG[] = {0x1D, '1', ';', '2', 'c', 'a', 'p', 'G'};
\r
56 const static EPS_UINT8 sbSDE0[] = {0x1D, '0', 's', 'd', 'E'}; /* Set Duplex OFF */
\r
57 const static EPS_UINT8 sbSDE1[] = {0x1D, '1', 's', 'd', 'E'}; /* Set Duplex ON */
\r
58 const static EPS_UINT8 sbBDE0[] = {0x1D, '0', 'b', 'd', 'E'}; /* Set Duplex long */
\r
59 const static EPS_UINT8 sbBDE1[] = {0x1D, '1', 'b', 'd', 'E'}; /* Set Duplex short */
\r
61 const static EPS_UINT8 sbPSSL[] = {0x1D, '3', '0', 'p', 's', 'E'}; /* Set Letter paper */
\r
62 const static EPS_UINT8 sbPSSA4[] = {0x1D, '1', '4', 'p', 's', 'E'}; /* Set A4 paper */
\r
63 const static EPS_UINT8 sbPSSB5[] = {0x1D, '2', '5', 'p', 's', 'E'}; /* Set B5 paper */
\r
64 const static EPS_UINT8 sbPSSLE[] = {0x1D, '3', '2', 'p', 's', 'E'}; /* Set Legal paper */
\r
65 const static EPS_UINT8 sbPSSA3[] = {0x1D, '1', '3', 'p', 's', 'E'}; /* Set A3 paper */
\r
66 const static EPS_UINT8 sbPSSB4[] = {0x1D, '2', '4', 'p', 's', 'E'}; /* Set B4 paper */
\r
67 const static EPS_UINT8 sbPSSPS[] = {0x1D, '3', '8', 'p', 's', 'E'}; /* Set B4 paper */
\r
68 const static EPS_UINT8 sbPSSF4[] = {0x1D, '3', '7', 'p', 's', 'E'}; /* Set F4 paper */
\r
69 const static EPS_UINT8 sbPSSA5[] = {0x1D, '1', '5', 'p', 's', 'E'}; /* Set A5 paper */
\r
70 const static EPS_UINT8 sbPSSHLT[] = {0x1D, '3', '1', 'p', 's', 'E'}; /* Set HLT paper */
\r
71 const static EPS_UINT8 sbPSSEXE[] = {0x1D, '3', '3', 'p', 's', 'E'}; /* Set EXE paper */
\r
72 const static EPS_UINT8 sbPSSB[] = {0x1D, '3', '6', 'p', 's', 'E'}; /* Set B paper */
\r
73 const static EPS_UINT8 sbPSSGLT[] = {0x1D, '3', '5', 'p', 's', 'E'}; /* Set GLT paper */
\r
74 const static EPS_UINT8 sbPSSGLG[] = {0x1D, '3', '4', 'p', 's', 'E'}; /* Set GLG paper */
\r
75 const static EPS_UINT8 sbPSSMON[] = {0x1D, '8', '0', 'p', 's', 'E'}; /* Set MON paper */
\r
76 const static EPS_UINT8 sbPSSC10[] = {0x1D, '8', '1', 'p', 's', 'E'}; /* Set C10 paper */
\r
77 const static EPS_UINT8 sbPSSDL[] = {0x1D, '9', '0', 'p', 's', 'E'}; /* Set DL paper */
\r
78 const static EPS_UINT8 sbPSSC5[] = {0x1D, '9', '1', 'p', 's', 'E'}; /* Set C5 paper */
\r
79 const static EPS_UINT8 sbPSSC6[] = {0x1D, '9', '2', 'p', 's', 'E'}; /* Set C6 paper */
\r
80 const static EPS_UINT8 sbPSSIB5[] = {0x1D, '9', '9', 'p', 's', 'E'}; /* Set IB5 paper */
\r
83 const static EPS_UINT8 sbIUE1[] = {0x1D, '0', ';', '0', 'i', 'u', 'E'};
\r
84 const static EPS_UINT8 sbIUE0[] = {0x1D, '1', '6', ';', '1', 'i', 'u', 'E'};
\r
85 const static EPS_UINT8 sbIUE2[] = {0x1D, '1', ';', '1', 'i', 'u', 'E'};
\r
86 const static EPS_UINT8 sbIUE3[] = {0x1D, '2', ';', '1', 'i', 'u', 'E'};
\r
87 const static EPS_UINT8 sbIUE4[] = {0x1D, '3', ';', '1', 'i', 'u', 'E'};
\r
88 const static EPS_UINT8 sbIUE5[] = {0x1D, '4', ';', '1', 'i', 'u', 'E'};
\r
89 const static EPS_UINT8 sbIUE6[] = {0x1D, '5', ';', '1', 'i', 'u', 'E'};
\r
90 const static EPS_UINT8 sbIUE7[] = {0x1D, '6', ';', '1', 'i', 'u', 'E'};
\r
91 const static EPS_UINT8 sbIUE8[] = {0x1D, '7', ';', '1', 'i', 'u', 'E'};
\r
92 const static EPS_UINT8 sbIUE9[] = {0x1D, '8', ';', '1', 'i', 'u', 'E'};
\r
93 const static EPS_UINT8 sbIUE10[] = {0x1D, '9', ';', '1', 'i', 'u', 'E'};
\r
94 const static EPS_UINT8 sbIUE11[] = {0x1D, '1', '0', ';', '1', 'i', 'u', 'E'};
\r
95 const static EPS_UINT8 sbIUE12[] = {0x1D, '1', '1', ';', '1', 'i', 'u', 'E'};
\r
96 const static EPS_UINT8 sbIUE13[] = {0x1D, '1', '2', ';', '1', 'i', 'u', 'E'};
\r
97 const static EPS_UINT8 sbIUE14[] = {0x1D, '1', '3',';', '1', 'i', 'u', 'E'};
\r
98 const static EPS_UINT8 sbIUE15[] = {0x1D, '2', '4',';', '1', 'i', 'u', 'E'};
\r
99 const static EPS_UINT8 sbIUE16[] = {0x1D, '2', '5',';', '1', 'i', 'u', 'E'};
\r
102 const static EPS_UINT8 sbPTE0[] = {0x1D, '0', 'p', 't', 'E'}; /* select paper type 0:other */
\r
103 const static EPS_UINT8 sbPTE1[] = {0x1D, '1', 'p', 't', 'E'}; /* select paper type 1:plane */
\r
104 const static EPS_UINT8 sbPTE2[] = {0x1D, '1', '3', 'p', 't', 'E'}; /* select paper type 1:semi thick */
\r
105 const static EPS_UINT8 sbPTE3[] = {0x1D, '2', 'p', 't', 'E'}; /* select paper type 1:preprinter */
\r
106 const static EPS_UINT8 sbPTE4[] = {0x1D, '3', 'p', 't', 'E'}; /* select paper type 1:letterhead */
\r
107 const static EPS_UINT8 sbPTE5[] = {0x1D, '6', 'p', 't', 'E'}; /* select paper type 1:Recycled */
\r
108 const static EPS_UINT8 sbPTE6[] = {0x1D, '7', 'p', 't', 'E'}; /* select paper type 1:color */
\r
109 const static EPS_UINT8 sbPTE7[] = {0x1D, '9', 'p', 't', 'E'}; /* select paper type 1:labels */
\r
110 const static EPS_UINT8 sbPTE8[] = {0x1D, '1', '2', 'p', 't', 'E'}; /* select paper type 1:thick */
\r
111 const static EPS_UINT8 sbPTE9[] = {0x1D, '1', '6', 'p', 't', 'E'}; /* select paper type 1:coated */
\r
112 const static EPS_UINT8 sbPTE10[] = {0x1D, '1', '0', 'p', 't', 'E'}; /* select paper type 1:special */
\r
113 const static EPS_UINT8 sbPTE11[] = {0x1D, '1', '7', 'p', 't', 'E'}; /* select paper type 1:transparent */
\r
117 const static EPS_UINT8 sbCMS[] = {0x1D, '1', 'c', 'm', 'E'}; /* Clip Mode Set */
\r
118 const static EPS_UINT8 sbSDS300[] = {0x1D, '0', ';', '3', '0', '0', ';', '3', '0', '0', 'd', 'r', 'E'}; /* Select Dot Size(300) */
\r
119 const static EPS_UINT8 sbSDS600[] = {0x1D, '0', ';', '6', '0', '0', ';', '6', '0', '0', 'd', 'r', 'E'}; /* Select Dot Size(600) */
\r
120 const static EPS_UINT8 sbSDS1200[] = {0x1D, '0', ';', '1', '2', '0', '0', ';', '1', '2', '0', '0', 'd', 'r', 'E'}; /* Select Dot Size(600) */
\r
121 const static EPS_UINT8 sbSDS150[] = {0x1D, '0', ';', '1', '5', '0', ';', '1', '5', '0', 'd', 'r', 'E'}; /* Select Dot Size(150) */
\r
122 const static EPS_UINT8 sbSDS300_0[] = {0x1D, '0', ';', '3', '0', '0', ';', '3', '0', '0', 'd', 'r', 'E'}; /* Select Dot Size(300) */
\r
123 const static EPS_UINT8 sbSDS300_1[] = {0x1D, '1', ';', '3', '0', '0', ';', '3', '0', '0', 'd', 'r', 'E'}; /* Select Dot Size(300) */
\r
124 const static EPS_UINT8 sbSDS300_2[] = {0x1D, '2', ';', '3', '0', '0', ';', '3', '0', '0', 'd', 'r', 'E'}; /* Select Dot Size(300) */
\r
125 const static EPS_UINT8 sbSDS300_9[] = {0x1D, '9', ';', '3', '0', '0', ';', '3', '0', '0', 'd', 'r', 'E'}; /* Select Dot Size(300) */
\r
126 const static EPS_UINT8 sbSDS600_0[] = {0x1D, '0', ';', '6', '0', '0', ';', '6', '0', '0', 'd', 'r', 'E'}; /* Select Dot Size(600) */
\r
127 const static EPS_UINT8 sbSDS600_1[] = {0x1D, '1', ';', '6', '0', '0', ';', '6', '0', '0', 'd', 'r', 'E'}; /* Select Dot Size(600) */
\r
128 const static EPS_UINT8 sbSDS600_2[] = {0x1D, '2', ';', '6', '0', '0', ';', '6', '0', '0', 'd', 'r', 'E'}; /* Select Dot Size(600) */
\r
129 const static EPS_UINT8 sbSDS600_9[] = {0x1D, '9', ';', '6', '0', '0', ';', '6', '0', '0', 'd', 'r', 'E'}; /* Select Dot Size(600) */
\r
130 const static EPS_UINT8 sbSDS1200_0[] = {0x1D, '0', ';', '1', '2', '0', '0', ';', '1', '2', '0', '0', 'd', 'r', 'E'};
\r
131 const static EPS_UINT8 sbSDS1200_1[] = {0x1D, '1', ';', '1', '2', '0', '0', ';', '1', '2', '0', '0', 'd', 'r', 'E'};
\r
132 const static EPS_UINT8 sbSDS1200_2[] = {0x1D, '2', ';', '1', '2', '0', '0', ';', '1', '2', '0', '0', 'd', 'r', 'E'};
\r
133 const static EPS_UINT8 sbSDS1200_9[] = {0x1D, '9', ';', '1', '2', '0', '0', ';', '1', '2', '0', '0', 'd', 'r', 'E'};
\r
134 const static EPS_UINT8 sbSS1200[] = {0x1D, '1', ';', '1', ';', 'r', 'a', 'E'};
\r
136 const static EPS_UINT8 sbMMS[] = {0x1D, '0', 'm', 'm', 'E'}; /* Select Page memory mode */
\r
137 const static EPS_UINT8 sbPDS0[] = {0x1D, '0', 'p', 'o', 'E'}; /* Set paper direction to normal */
\r
138 const static EPS_UINT8 sbPDS1[] = {0x1D, '1', 'p', 'o', 'E'}; /* Set paper direction to rotate */
\r
139 const static EPS_UINT8 sbACRLFS[] = {0x1D, '0', 'a', 'l', 'f', 'P'}; /* Does not perform auto carriage return */
\r
140 const static EPS_UINT8 sbAFFS[] = {0x1D, '0', 'a', 'f', 'f', 'P'};
\r
142 const static EPS_UINT8 sbCLFP[] = {0x1D, '0', ';', '0', ';', '0', 'c', 'l', 'f', 'P'};
\r
143 /* Does not perform auto Form Feed */
\r
144 const static EPS_UINT8 sbABPS[] = {0x1D, '0', 'a', 'b', 'P'}; /* Set current position to 0 after bit image draw */
\r
145 const static EPS_UINT8 sbSARGAS[] = {0x1D, '0', 's', 'a', 'r', 'G'}; /* Set Absolute Graph Coordinate mode */
\r
146 const static EPS_UINT8 sbPMPPS[] = {0x1D, '1', 'p', 'm', 'P'}; /* Set current move mode to print pitch mode */
\r
148 const static EPS_UINT8 sbSPRCS[] = {0x1D, '1', '6', '0', 'i', 's', 'E'}; /* Screen Pattern Record Count set to 160 */
\r
149 const static EPS_UINT8 sbFASCS[] = {0x1D, '7', 'i', 'a', 'F'}; /* Font Attribute Store Count set to 7 */
\r
150 const static EPS_UINT8 sbCPSCS[] = {0x1D, '5', 'i', 'p', 'P'}; /* Current Position Store Count set to 5 */
\r
151 const static EPS_UINT8 sbMRCS[] = {0x1D, '1', '6', '0', 'i', 'm', 'M'}; /* Macro Record Store Count set to 160 */
\r
152 const static EPS_UINT8 sbBIRCS[] = {0x1D, '2', '3', '2', '8', 'i', 'b', 'I'}; /* Bit Image Count Store Count set to 2328 */
\r
153 const static EPS_UINT8 sbBIOS[] = {0x1D, '0', 'b', 'o', 'P'}; /* Set the bit image drawing offset to 0 */
\r
154 const static EPS_UINT8 sbILGS[] = {0x1D, '1', '6', '0', 'i', 'l', 'G'}; /* Set line type record count to 160 */
\r
155 const static EPS_UINT8 sbTSESS[] = {0x1D, '1', 't', 's', 'E'}; /* Set Screen Mode */
\r
156 const static EPS_UINT8 sbSPES[] = {0x1D, '1', ';', '0', ';', '1', '0', '0', 's', 'p', 'E'}; /* Set Screen Pattern */
\r
157 const static EPS_UINT8 sbOWES[] = {0x1D, '2', 'o', 'w', 'E'}; /* Set Superimpose Mode */
\r
159 const static EPS_UINT8 sbCCE[] = {0x1D, '1', ';', '0', ';', '0', 'c', 'c', 'E'};
\r
161 const static EPS_UINT8 sbBCI1S[] = {0x1D, '1', 'b', 'c', 'I'}; /* Select Data
\r
162 compression type #1 */
\r
164 const static EPS_UINT8 sbMLG[] = {0x1D, '1', ';', '1', '0', 'm', 'l', 'G'};
\r
166 const static EPS_INT8 sbBID[] = "\x1D""%d;%d;1;0bi{I"; /* Output data */
\r
168 /*----------------------------- Local Macro Definitions -------------------------------*/
\r
169 /*******************************************|********************************************/
\r
170 #define EPS_EJL_LINEMAX (256)
\r
171 #define EPS_PAGE_CMDBUFF_SIZE EPS_EJL_LINEMAX
\r
173 #define EMIT_TIFF_REPEAT(n, x) \
\r
180 *RowTIFF++ = (EPS_UINT8)n; \
\r
184 #define EMIT_TIFF_LITERAL(n, p) \
\r
189 memcpy(RowTIFF, p, n); \
\r
194 #define TIFF_MAXIMUM_LITERAL 128
\r
195 #define TIFF_MAXIMUM_REPEAT 129
\r
197 #define CALCULATE_INTENSITY(r,g,b) (((((b)<<8) * 11)/100 + (((g)<<8) * 59)/100 + (((r)<<8) * 30)/100)/256)
\r
198 #define MAX_8 ((1 << 8) - 1)
\r
200 #define E_MAX (1 << 13)
\r
201 #define E_MID (E_MAX >> 1)
\r
203 /* The following table is used to convert a from an intensity we desire */
\r
204 /* to an intensity to tell the device. It is calibrated for the */
\r
205 /* error-diffusion code. */
\r
206 const EPS_UINT8 Intensity2Intensity[256] =
\r
208 0, 3, 7, 10, 14, 17, 21, 24, 28, 35, 42, 49, 56, 63, 70, 77,
\r
209 85, 88, 92, 95, 99, 103, 106, 110, 114, 117, 121, 125, 129, 132, 136, 140,
\r
210 144, 144, 144, 144, 145, 145, 145, 145, 146, 147, 149, 151, 153, 154, 156, 158,
\r
211 160, 161, 163, 164, 166, 167, 169, 170, 172, 173, 174, 175, 176, 177, 178, 179,
\r
212 180, 181, 182, 183, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 194,
\r
213 195, 195, 196, 196, 197, 198, 198, 199, 200, 200, 201, 202, 203, 203, 204, 205,
\r
214 206, 206, 206, 206, 207, 207, 207, 207, 208, 208, 208, 208, 209, 209, 209, 209,
\r
215 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 214, 214, 215, 215, 215, 215,
\r
216 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 220, 220, 221, 221, 221, 221,
\r
217 222, 222, 222, 222, 223, 223, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227,
\r
218 228, 228, 228, 228, 229, 229, 229, 229, 230, 230, 230, 230, 231, 231, 231, 231,
\r
219 232, 232, 232, 232, 233, 233, 233, 233, 234, 234, 234, 234, 235, 235, 235, 235,
\r
220 236, 236, 236, 236, 237, 237, 237, 237, 238, 238, 239, 239, 240, 240, 241, 241,
\r
221 242, 242, 242, 242, 243, 243, 243, 243, 244, 244, 244, 244, 245, 245, 245, 245,
\r
222 246, 246, 246, 246, 247, 247, 247, 247, 248, 248, 248, 248, 249, 249, 249, 249,
\r
223 250, 250, 251, 251, 252, 252, 253, 253, 254, 254, 254, 254, 254, 254, 255, 255
\r
226 /* Used in color correction */
\r
227 const static EPS_INT32 BitMask[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
\r
230 /*--------------------------- Data Structure Declarations ---------------------------*/
\r
231 /*******************************************|********************************************/
\r
233 typedef struct _tagEPS_PAGE_BAND_M_ {
\r
234 EPS_INT32 WidthInBytes;
\r
235 EPS_INT32 WidthInPixels;
\r
236 EPS_INT32 currentWidthInPixels;
\r
237 EPS_UINT8 *pRasterData;
\r
238 EPS_UINT8 *pIntensity;
\r
239 EPS_INT32 encDataSize;
\r
240 EPS_UINT8 *pEncData;
\r
241 EPS_UINT8 *pZeroRow;
\r
244 /* Error Diffusion */
\r
245 typedef struct tagHT_PARAM{
\r
249 EPS_INT32 iScanPels;
\r
253 /*---------------------------- ESC/P-R Lib Global Variables --------------------------*/
\r
254 /*******************************************|********************************************/
\r
255 extern EPS_CMN_FUNC epsCmnFnc;
\r
256 extern EPS_PRINT_JOB printJob;
\r
258 /*---------------------------------- Local Variables --------------------------------*/
\r
259 /*******************************************|********************************************/
\r
260 static EPS_PAGE_BAND_M band;
\r
261 static EPS_COMMAND_BUFFER cmdBuf;
\r
262 static EPS_UINT8* Palette2DeviceIntensity = NULL;
\r
263 static EPS_INT32 iRow = 0;
\r
264 static EPS_INT32 iNumBytes = 0;
\r
265 static EPS_INT32 iNumDots = 0;
\r
266 static EPS_INT32 pageCount = 0; /* Current Page number */
\r
268 #if EPS_PAGE_HT_ERR_DIFFUSION
\r
271 EPS_UINT8 * pP = 0;
\r
273 EPS_INT32 iScanPels;
\r
276 /*-------------------------- Local Functions Declaration ----------------------------*/
\r
277 /*******************************************|********************************************/
\r
278 static EPS_ERR_CODE CmdBuffInit (EPS_COMMAND_BUFFER *pCmdBuff);
\r
279 static EPS_ERR_CODE CmdBuffGrow (EPS_COMMAND_BUFFER *pCmdBuff, EPS_INT32 addSize);
\r
280 static void CmdBuffTerm (EPS_COMMAND_BUFFER *pCmdBuff);
\r
282 static void ConvertBYTE2Intensity (const EPS_BANDBMP* pInBmp, EPS_PAGE_BAND_M *pBand);
\r
283 static EPS_ERR_CODE ConvertPaletteToIntensity(EPS_UINT16 paletteSize, EPS_UINT8 *paletteData);
\r
285 static EPS_ERR_CODE BandInit (EPS_PAGE_BAND_M *pBand, EPS_INT32 widthInPixels);
\r
286 static void BandTerm (EPS_PAGE_BAND_M* pBand);
\r
287 static void BandEncode (EPS_PAGE_BAND_M* pBand);
\r
288 static EPS_ERR_CODE BandEmit (EPS_PAGE_BAND_M *pBand, EPS_INT32 iNByte, EPS_INT32 iNDot);
\r
290 static EPS_ERR_CODE HT_Init (EPS_INT32 WidthPixels);
\r
291 static void HT_End (void);
\r
292 static void HT_StartPage (void);
\r
293 static void HT_Scan (EPS_UINT8 *Con, EPS_UINT8 *Bin, EPS_INT32 widthInPixels);
\r
295 static EPS_INT32 DoDeltaRow (EPS_UINT8 *Row, EPS_INT32 nRow, EPS_UINT8 *RowDeltaRow, EPS_UINT8 *Seed);
\r
298 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
299 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
300 /*%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%*/
\r
301 /*-------------------- Public Functions ---------------------*/
\r
302 /*%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%*/
\r
303 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
304 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
306 /*******************************************|********************************************/
\r
308 /* Function name: pageAllocBuffer_M() */
\r
312 /* Name: Type: Description: */
\r
315 /* Return value: */
\r
316 /* EPS_ERR_NONE - Success */
\r
317 /* EPS_ERR_MEMORY_ALLOCATION - Fail to memory allocation */
\r
320 /* Allocate buffer for ESC/Page Job. */
\r
322 /*******************************************|********************************************/
\r
323 EPS_ERR_CODE pageAllocBuffer_M(void)
\r
325 EPS_ERR_CODE ret = EPS_ERR_NONE;
\r
329 ret = BandInit(&band, printJob.printableAreaWidth);
\r
330 if ( EPS_ERR_NONE != ret ) {
\r
334 if (printJob.attr.colorPlane == EPS_CP_256COLOR){
\r
335 ret = ConvertPaletteToIntensity(printJob.attr.paletteSize, printJob.attr.paletteData);
\r
336 if ( EPS_ERR_NONE != ret ) {
\r
341 /* Halftoning Initialization */
\r
342 ret = HT_Init( printJob.printableAreaWidth );
\r
343 if ( EPS_ERR_NONE != ret ) {
\r
347 ret = CmdBuffInit(&cmdBuf);
\r
353 /*******************************************|********************************************/
\r
355 /* Function name: pageRelaseBuffer_M() */
\r
359 /* Name: Type: Description: */
\r
362 /* Return value: */
\r
366 /* Free buffer for ESC/Page Job. */
\r
368 /*******************************************|********************************************/
\r
369 void pageRelaseBuffer_M(void)
\r
375 EPS_SAFE_RELEASE( Palette2DeviceIntensity );
\r
377 CmdBuffTerm(&cmdBuf);
\r
379 /* Halftoning Ending process */
\r
386 /*******************************************|********************************************/
\r
388 /* Function name: pageStartJob_M() */
\r
392 /* Name: Type: Description: */
\r
395 /* Return value: */
\r
396 /* EPS_ERR_NONE - Success */
\r
397 /* EPS_ERR_MEMORY_ALLOCATION - Fail to memory allocation */
\r
398 /* EPS_ERR_OPR_FAIL - Internal Error */
\r
399 /* EPS_ERR_COMM_ERROR - Communication Error */
\r
400 /* EPS_ERR_PRINTER_ERR_OCCUR - Printer Error happened */
\r
403 /* Send ESC/Page start job commands. */
\r
405 /*******************************************|********************************************/
\r
406 EPS_ERR_CODE pageStartJob_M(void)
\r
408 EPS_ERR_CODE ret = EPS_ERR_NONE;
\r
409 EPS_UINT32 retBufSize = 0;
\r
413 #define pgStartJob_ADDCMD(CMD) { \
\r
414 ret = CmdBuffGrow(&cmdBuf, sizeof(CMD) ); \
\r
415 if( EPS_ERR_NONE != ret){EPS_RETURN( ret )} \
\r
416 memcpy(cmdBuf.p + cmdBuf.len, CMD, sizeof(CMD)); \
\r
417 cmdBuf.len += sizeof(CMD); \
\r
420 cmdBuf.len = 0; /* reset */
\r
421 debug_msg("start Job MONO\n");
\r
422 ret = ejlStart(&cmdBuf, CmdBuffGrow);
\r
423 if( EPS_ERR_NONE != ret){
\r
426 debug_msg("step 10.0\n");
\r
427 /* Step 1 - Start Job */
\r
428 /* Initialize the printer. */
\r
429 pgStartJob_ADDCMD(sbIP)
\r
430 /* Set Memory Mode Selection to Page memory mode */
\r
431 pgStartJob_ADDCMD(sbMMS);
\r
432 pgStartJob_ADDCMD(sbCSE);
\r
433 /* Set the minimum Unit Setting (600 or 300 resolution) */
\r
434 /* Dot Pattern Resolution Selection */
\r
435 if( EPS_IR_600X600 == printJob.attr.inputResolution) {
\r
437 pgStartJob_ADDCMD(sbSU600);
\r
438 pgStartJob_ADDCMD(sbHTME600);
\r
439 pgStartJob_ADDCMD(sbSDS600_9);
\r
440 pgStartJob_ADDCMD(sbSDS600_2);
\r
441 pgStartJob_ADDCMD(sbSDS600_1);
\r
442 pgStartJob_ADDCMD(sbSDS600_0);
\r
444 else if(EPS_IR_1200X1200 == printJob.attr.inputResolution) {
\r
446 pgStartJob_ADDCMD(sbSU1200);
\r
447 pgStartJob_ADDCMD(sbHTME1200);
\r
448 pgStartJob_ADDCMD(sbSDS1200_9);
\r
449 pgStartJob_ADDCMD(sbSDS1200_2);
\r
450 pgStartJob_ADDCMD(sbSDS1200_1);
\r
451 pgStartJob_ADDCMD(sbSDS1200_0);
\r
452 pgStartJob_ADDCMD(sbSS1200);
\r
454 else if(EPS_IR_300X300 == printJob.attr.inputResolution) {
\r
456 pgStartJob_ADDCMD(sbSU300);
\r
457 pgStartJob_ADDCMD(sbHTME300);
\r
458 pgStartJob_ADDCMD(sbSDS300_9);
\r
459 pgStartJob_ADDCMD(sbSDS300_2);
\r
460 pgStartJob_ADDCMD(sbSDS300_1);
\r
461 pgStartJob_ADDCMD(sbSDS300_0);
\r
463 pgStartJob_ADDCMD(sbSU150);
\r
464 pgStartJob_ADDCMD(sbSDS150);
\r
467 /* Set Screen Mode */
\r
469 pgStartJob_ADDCMD(sbTSESS);
\r
472 /* Set Screen Pattern */
\r
473 pgStartJob_ADDCMD(sbOWES);
\r
477 /* Does not perform automatic carriage return line feed */
\r
478 pgStartJob_ADDCMD(sbACRLFS);
\r
480 /* Does not perform automatic Form Feed */
\r
481 pgStartJob_ADDCMD(sbAFFS);
\r
483 pgStartJob_ADDCMD(sbCLFP);
\r
485 /* Set current position move mode to print pitch */
\r
486 pgStartJob_ADDCMD(sbPMPPS);
\r
488 /* Set Bit Image Record Store Count */
\r
489 pgStartJob_ADDCMD(sbBIRCS);
\r
491 /* Set Clip Mode */
\r
492 pgStartJob_ADDCMD(sbCMS);
\r
494 /* Select compression type */
\r
495 pgStartJob_ADDCMD(sbBCI1S);
\r
497 pgStartJob_ADDCMD(sbMLG);
\r
499 /* Set Absolute graph coordinate mode */
\r
500 pgStartJob_ADDCMD(sbSARGAS);
\r
502 /* Set Screen Pattern */
\r
503 pgStartJob_ADDCMD(sbSPES);
\r
505 pgStartJob_ADDCMD(sbCCE);
\r
507 if( EPS_IR_1200X1200 == printJob.attr.inputResolution){
\r
508 pgStartJob_ADDCMD(sbHTME1200);
\r
510 else if(EPS_IR_300X300 == printJob.attr.inputResolution){
\r
511 pgStartJob_ADDCMD(sbHTME300);
\r
513 else if(EPS_IR_600X600 == printJob.attr.inputResolution){
\r
514 pgStartJob_ADDCMD(sbHTME600);
\r
517 //pgStartJob_ADDCMD(sbBGPG);
\r
519 pgStartJob_ADDCMD(sbCAPG);
\r
522 if(printJob.attr.duplex == EPS_DUPLEX_NONE){
\r
523 pgStartJob_ADDCMD(sbSDE0);
\r
525 pgStartJob_ADDCMD(sbSDE1);
\r
526 if(printJob.attr.duplex == EPS_DUPLEX_SHORT){
\r
527 pgStartJob_ADDCMD(sbBDE1);
\r
529 pgStartJob_ADDCMD(sbBDE0);
\r
535 /* Set Screen Record Count */
\r
536 pgStartJob_ADDCMD(sbSPRCS);
\r
538 /* Set Font Attribute Store Count */
\r
539 pgStartJob_ADDCMD(sbFASCS);
\r
541 /* Set Current Position Store Count */
\r
542 pgStartJob_ADDCMD(sbCPSCS);
\r
546 /* Set Macro Record Store Count */
\r
547 pgStartJob_ADDCMD(sbMRCS);
\r
550 /* Set Manual Feed */
\r
551 if(printJob.attr.manualFeed == 1)
\r
553 pgStartJob_ADDCMD(sbIUE0); /* manual */
\r
555 switch(printJob.attr.paperSource){
\r
556 case IPS_MPTID_AUTO:
\r
557 pgStartJob_ADDCMD(sbIUE1);
\r
559 case IPS_MPTID_TRAY1:
\r
560 pgStartJob_ADDCMD(sbIUE2);
\r
562 case IPS_MPTID_TRAY2:
\r
563 pgStartJob_ADDCMD(sbIUE3);
\r
565 case IPS_MPTID_TRAY3:
\r
566 pgStartJob_ADDCMD(sbIUE4);
\r
568 case IPS_MPTID_TRAY4:
\r
569 pgStartJob_ADDCMD(sbIUE5);
\r
571 case IPS_MPTID_TRAY5:
\r
572 pgStartJob_ADDCMD(sbIUE6);
\r
574 case IPS_MPTID_TRAY6:
\r
575 pgStartJob_ADDCMD(sbIUE7);
\r
577 case IPS_MPTID_TRAY7:
\r
578 pgStartJob_ADDCMD(sbIUE8);
\r
580 case IPS_MPTID_TRAY8:
\r
581 pgStartJob_ADDCMD(sbIUE9);
\r
583 case IPS_MPTID_TRAY9:
\r
584 pgStartJob_ADDCMD(sbIUE10);
\r
586 case IPS_MPTID_TRAY10:
\r
587 pgStartJob_ADDCMD(sbIUE11);
\r
589 case IPS_MPTID_TRAY11:
\r
590 pgStartJob_ADDCMD(sbIUE12);
\r
592 case IPS_MPTID_TRAY12:
\r
593 pgStartJob_ADDCMD(sbIUE13);
\r
595 case IPS_MPTID_TRAY13:
\r
596 pgStartJob_ADDCMD(sbIUE14);
\r
598 case IPS_MPTID_TRAY14:
\r
599 pgStartJob_ADDCMD(sbIUE15);
\r
601 case IPS_MPTID_TRAY15:
\r
602 pgStartJob_ADDCMD(sbIUE16);
\r
605 pgStartJob_ADDCMD(sbIUE1);
\r
612 debug_msg("step 1\n");
\r
613 /* Set Paper Size */
\r
614 switch ( printJob.attr.mediaSizeIdx ) {
\r
615 case EPS_MSID_A4: pgStartJob_ADDCMD(sbPSSA4); break;
\r
616 case EPS_MSID_A5: pgStartJob_ADDCMD(sbPSSA5); break;
\r
617 case EPS_MSID_HLT: pgStartJob_ADDCMD(sbPSSHLT); break;
\r
618 case EPS_MSID_EXECUTIVE: pgStartJob_ADDCMD(sbPSSEXE); break;
\r
619 case EPS_MSID_B: pgStartJob_ADDCMD(sbPSSB); break;
\r
620 case EPS_MSID_GLT: pgStartJob_ADDCMD(sbPSSGLT); break;
\r
621 case EPS_MSID_GLG: pgStartJob_ADDCMD(sbPSSGLG); break;
\r
622 case EPS_MSID_MON: pgStartJob_ADDCMD(sbPSSMON); break;
\r
623 case EPS_MSID_C10: pgStartJob_ADDCMD(sbPSSC10); break;
\r
624 case EPS_MSID_DL: pgStartJob_ADDCMD(sbPSSDL); break;
\r
625 case EPS_MSID_C5: pgStartJob_ADDCMD(sbPSSC5); break;
\r
626 case EPS_MSID_C6: pgStartJob_ADDCMD(sbPSSC6); break;
\r
627 case EPS_MSID_IB5: pgStartJob_ADDCMD(sbPSSIB5); break;
\r
628 case EPS_MSID_F4: pgStartJob_ADDCMD(sbPSSF4); break;
\r
629 case EPS_MSID_B5: pgStartJob_ADDCMD(sbPSSB5); break;
\r
630 case EPS_MSID_B4: pgStartJob_ADDCMD(sbPSSB4); break;
\r
631 case EPS_MSID_A3: pgStartJob_ADDCMD(sbPSSA3); break;
\r
632 case EPS_MSID_LETTER: pgStartJob_ADDCMD(sbPSSL); break;
\r
633 case EPS_MSID_LEGAL: pgStartJob_ADDCMD(sbPSSLE); break;
\r
634 //case EPS_MSID_POSTCARD: pgStartJob_ADDCMD(sbPSSPS); break;
\r
635 default: pgStartJob_ADDCMD(sbPSSA4); break;
\r
638 /* select paper type */
\r
640 switch(printJob.attr.mediaTypeIdx){
\r
641 case EPS_MTID_PLAIN: pgStartJob_ADDCMD(sbPTE1); break;
\r
642 case EPS_MTID_SEMITHICK: pgStartJob_ADDCMD(sbPTE2); break;
\r
643 case EPS_MTID_PREPRINTED: pgStartJob_ADDCMD(sbPTE3); break;
\r
644 case EPS_MTID_LETTERHEAD: pgStartJob_ADDCMD(sbPTE4); break;
\r
645 case EPS_MTID_RECYCLED: pgStartJob_ADDCMD(sbPTE5); break;
\r
646 case EPS_MTID_COLOR: pgStartJob_ADDCMD(sbPTE6); break;
\r
647 case EPS_MTID_LABEL: pgStartJob_ADDCMD(sbPTE7); break;
\r
648 case EPS_MTID_THICK: pgStartJob_ADDCMD(sbPTE8); break;
\r
649 case EPS_MTID_COATED: pgStartJob_ADDCMD(sbPTE9); break;
\r
650 case EPS_MTID_SPECIAL: pgStartJob_ADDCMD(sbPTE10); break;
\r
651 case EPS_MTID_TRANSPARENT: pgStartJob_ADDCMD(sbPTE11); break;
\r
652 case EPS_MTID_UNSPECIFIED: pgStartJob_ADDCMD(sbPTE0); break;
\r
653 default: pgStartJob_ADDCMD(sbPTE0); break;
\r
656 /* Set paper direction */
\r
657 if(printJob.attr.orienTation == 1)
\r
659 pgStartJob_ADDCMD(sbPDS1); /* Landscape */
\r
661 pgStartJob_ADDCMD(sbPDS0); /* Potrait */
\r
664 ret = ejlPageEsc(&cmdBuf, CmdBuffGrow);
\r
665 if( EPS_ERR_NONE != ret){
\r
668 debug_msg("step 2\n");
\r
672 /* Set the bit image drawing offset to 0 */
\r
673 pgStartJob_ADDCMD(sbBIOS);
\r
675 /* Set current position to 0 after Bit image draw */
\r
676 pgStartJob_ADDCMD(sbABPS);
\r
678 /* Set line type record count to 160 */
\r
679 pgStartJob_ADDCMD(sbILGS);
\r
681 /* Step 4 - Adjust Vertical Print Position (if necessary) */
\r
683 pgStartJob_ADDCMD(sbCR);
\r
692 ret = SendCommand((EPS_UINT8*)cmdBuf.p, cmdBuf.len, &retBufSize, TRUE);
\r
700 /*******************************************|********************************************/
\r
702 /* Function name: pageEndJob_M() */
\r
706 /* Name: Type: Description: */
\r
709 /* Return value: */
\r
710 /* EPS_ERR_NONE - Success */
\r
711 /* EPS_ERR_MEMORY_ALLOCATION - Fail to memory allocation */
\r
712 /* EPS_ERR_OPR_FAIL - Internal Error */
\r
713 /* EPS_ERR_COMM_ERROR - Communication Error */
\r
714 /* EPS_ERR_PRINTER_ERR_OCCUR - Printer Error happened */
\r
717 /* Send ESC/Page end job commands. */
\r
719 /*******************************************|********************************************/
\r
720 EPS_ERR_CODE pageEndJob_M()
\r
722 EPS_ERR_CODE ret = EPS_ERR_NONE; /* Return status of internal calls */
\r
723 EPS_UINT32 retBufSize = 0;
\r
727 cmdBuf.len = 0; /* reset */
\r
729 /* Check empty document */
\r
731 /* Formfeed (FF) */
\r
732 memcpy((EPS_INT8*)cmdBuf.p, sbFF, sizeof(sbFF));
\r
733 cmdBuf.len += sizeof(sbFF);
\r
735 /* Send command to initialize the printer. */
\r
736 memcpy((EPS_INT8*)cmdBuf.p+cmdBuf.len, sbIP, sizeof(sbIP));
\r
737 cmdBuf.len += sizeof(sbIP);
\r
740 /*** Make EJL Command ***/
\r
741 ret = ejlEnd(&cmdBuf, CmdBuffGrow, pageCount);
\r
742 if( EPS_ERR_NONE != ret){
\r
746 ret = SendCommand((EPS_UINT8*)cmdBuf.p, cmdBuf.len, &retBufSize, TRUE);
\r
752 /*******************************************|********************************************/
\r
754 /* Function name: pageStartPage_M() */
\r
758 /* Name: Type: Description: */
\r
761 /* Return value: */
\r
762 /* EPS_ERR_NONE - Success */
\r
763 /* EPS_ERR_MEMORY_ALLOCATION - Fail to memory allocation */
\r
764 /* EPS_ERR_OPR_FAIL - Internal Error */
\r
765 /* EPS_ERR_COMM_ERROR - Communication Error */
\r
766 /* EPS_ERR_PRINTER_ERR_OCCUR - Printer Error happened */
\r
769 /* Send ESC/Page start page commands. */
\r
771 /*******************************************|********************************************/
\r
772 EPS_ERR_CODE pageStartPage_M()
\r
774 debug_msg("check call function pageStartPage_M \n");
\r
775 EPS_ERR_CODE ret = EPS_ERR_NONE;
\r
776 EPS_UINT32 retBufSize = 0;
\r
785 cmdBuf.len = 0; /* reset */
\r
787 memcpy(cmdBuf.p, sbFF, sizeof(sbFF));
\r
788 cmdBuf.len += sizeof(sbFF);
\r
790 ret = ejlPageEsc(&cmdBuf, CmdBuffGrow);
\r
791 if( EPS_ERR_NONE != ret){
\r
795 ret = SendCommand((EPS_UINT8*)cmdBuf.p, cmdBuf.len, &retBufSize, TRUE);
\r
802 /*******************************************|********************************************/
\r
804 /* Function name: pageColorRow_M() */
\r
808 /* Name: Type: Description: */
\r
811 /* Return value: */
\r
812 /* EPS_ERR_NONE - Success */
\r
813 /* EPS_ERR_MEMORY_ALLOCATION - Fail to memory allocation */
\r
814 /* EPS_ERR_OPR_FAIL - Internal Error */
\r
815 /* EPS_ERR_COMM_ERROR - Communication Error */
\r
816 /* EPS_ERR_PRINTER_ERR_OCCUR - Printer Error happened */
\r
819 /* Send ESC/Page raster commands. */
\r
821 /*******************************************|********************************************/
\r
822 EPS_ERR_CODE pageColorRow_M(
\r
824 const EPS_BANDBMP* pInBmp,
\r
828 EPS_ERR_CODE ret = EPS_ERR_NONE;
\r
832 if( (EPS_UINT32)(pBandRec->right - pBandRec->left) <= printJob.printableAreaWidth){
\r
833 band.currentWidthInPixels = (EPS_UINT16)(pBandRec->right - pBandRec->left);
\r
835 band.currentWidthInPixels = (EPS_UINT16) printJob.printableAreaWidth;
\r
838 ConvertBYTE2Intensity( pInBmp, &band );
\r
840 memset( band.pRasterData, 0, band.WidthInBytes);
\r
841 HT_Scan( band.pIntensity, (EPS_UINT8*)band.pRasterData, band.currentWidthInPixels);
\r
848 if( band.encDataSize ) {
\r
849 ret = BandEmit(&band, iNumBytes, iNumDots);
\r
858 /*******************************************|********************************************/
\r
860 /* Function name: pageSendLeftovers_M() */
\r
864 /* Name: Type: Description: */
\r
867 /* Return value: */
\r
868 /* EPS_ERR_NONE - Success */
\r
869 /* EPS_ERR_INVALID_CALL - This call was unnecessary */
\r
870 /* EPS_ERR_OPR_FAIL - Internal Error */
\r
871 /* EPS_ERR_COMM_ERROR - Communication Error */
\r
872 /* EPS_ERR_PRINTER_ERR_OCCUR - Printer Error happened */
\r
875 /* send leftovers data. */
\r
877 /*******************************************|********************************************/
\r
878 EPS_ERR_CODE pageSendLeftovers_M(
\r
883 EPS_ERR_CODE ret = EPS_ERR_NONE;
\r
884 EPS_UINT32 retBufSize = 0;
\r
888 if( NULL != printJob.contData.sendData && 0 < printJob.contData.sendDataSize){
\r
890 ret = SendCommand(printJob.contData.sendData,
\r
891 printJob.contData.sendDataSize, &retBufSize, TRUE);
\r
893 ret = EPS_ERR_INVALID_CALL;
\r
900 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
901 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
902 /*%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%*/
\r
903 /*-------------------- Local Functions ---------------------*/
\r
904 /*%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%*/
\r
905 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
906 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
908 /*******************************************|********************************************/
\r
910 /* Function name: CmdBuffInit() */
\r
914 /* Name: Type: Description: */
\r
915 /* pCmdBuff EPS_COMMAND_BUFFER* I: command buffer strcture */
\r
917 /* Return value: */
\r
918 /* EPS_ERR_NONE - Success */
\r
919 /* EPS_ERR_MEMORY_ALLOCATION - Fail to memory allocation */
\r
922 /* Allocate command buffer. */
\r
924 /*******************************************|********************************************/
\r
925 static EPS_ERR_CODE CmdBuffInit(
\r
927 EPS_COMMAND_BUFFER *pCmdBuff
\r
930 pCmdBuff->size = EPS_EJL_LINEMAX*2;
\r
931 pCmdBuff->p = (EPS_INT8*)EPS_ALLOC(pCmdBuff->size);
\r
932 if( NULL == pCmdBuff->p){
\r
933 return EPS_ERR_MEMORY_ALLOCATION;
\r
938 return EPS_ERR_NONE;
\r
942 /*******************************************|********************************************/
\r
944 /* Function name: CmdBuffGrow() */
\r
948 /* Name: Type: Description: */
\r
949 /* pCmdBuff EPS_COMMAND_BUFFER* I: command buffer strcture */
\r
950 /* addSize EPS_INT32 I: growing size */
\r
952 /* Return value: */
\r
953 /* EPS_ERR_NONE - Success */
\r
954 /* EPS_ERR_MEMORY_ALLOCATION - Fail to memory allocation */
\r
957 /* ReAllocate command buffer. */
\r
959 /*******************************************|********************************************/
\r
960 static EPS_ERR_CODE CmdBuffGrow(
\r
962 EPS_COMMAND_BUFFER *pCmdBuff,
\r
966 EPS_INT32 block, sizeNew;
\r
968 if(pCmdBuff->size < pCmdBuff->len + addSize){
\r
969 block = (((pCmdBuff->len+addSize) / EPS_PAGE_CMDBUFF_SIZE) + 1);
\r
970 sizeNew = block * EPS_PAGE_CMDBUFF_SIZE;
\r
971 pCmdBuff->p = memRealloc(pCmdBuff->p, pCmdBuff->size, sizeNew);
\r
972 if( NULL == pCmdBuff->p){
\r
973 return EPS_ERR_MEMORY_ALLOCATION;
\r
975 pCmdBuff->size = sizeNew;
\r
978 return EPS_ERR_NONE;
\r
982 /*******************************************|********************************************/
\r
984 /* Function name: CmdBuffTerm() */
\r
988 /* Name: Type: Description: */
\r
989 /* pCmdBuff EPS_COMMAND_BUFFER* I: command buffer strcture */
\r
991 /* Return value: */
\r
995 /* Free command buffer. */
\r
997 /*******************************************|********************************************/
\r
998 static void CmdBuffTerm (
\r
1000 EPS_COMMAND_BUFFER *pCmdBuff
\r
1003 EPS_SAFE_RELEASE(pCmdBuff->p);
\r
1004 pCmdBuff->len = 0;
\r
1005 pCmdBuff->size = 0;
\r
1006 pCmdBuff->pExtent = NULL;
\r
1010 /*******************************************|********************************************/
\r
1012 /* Function name: ConvertBYTE2Intensity() */
\r
1016 /* Name: Type: Description: */
\r
1017 /* paletteSize EPS_UINT16 I: Palette Size */
\r
1018 /* paletteData EPS_UINT8* I: Palette Size */
\r
1020 /* Return value: */
\r
1023 /* Description: */
\r
1024 /* Convert palette to Intensity. */
\r
1026 /*******************************************|********************************************/
\r
1027 static void ConvertBYTE2Intensity(
\r
1029 const EPS_BANDBMP* pInBmp,
\r
1030 EPS_PAGE_BAND_M *pBand
\r
1034 EPS_INT32 i, j, widthBytes;
\r
1038 widthBytes = pBand->currentWidthInPixels * printJob.bpp;
\r
1041 debug_msg("printJob.bpp = %d\n", printJob.bpp);
\r
1042 if(printJob.bpp == 3){
\r
1043 for (i = 0; i < widthBytes; i += printJob.bpp) {
\r
1044 /* idx = CALCULATE_INTENSITY(pInBmp->bits[i], pInBmp->bits[i+1], pInBmp->bits[i+2]);*/
\r
1045 idx = pInBmp->bits[i];
\r
1047 if (idx > 255) idx = 255;
\r
1049 pBand->pIntensity[j++] = 255-Intensity2Intensity[255-idx];
\r
1051 if(j >= pBand->WidthInPixels){
\r
1056 for (i = 0; i < widthBytes; i += printJob.bpp) {
\r
1057 idx = pInBmp->bits[i];
\r
1058 pBand->pIntensity[j++] = Palette2DeviceIntensity[idx];
\r
1059 if(j >= pBand->WidthInPixels){
\r
1069 /*******************************************|********************************************/
\r
1071 /* Function name: ConvertPaletteToIntensity() */
\r
1075 /* Name: Type: Description: */
\r
1076 /* paletteSize EPS_UINT16 I: Palette Size */
\r
1077 /* paletteData EPS_UINT8* I: Palette Size */
\r
1079 /* Return value: */
\r
1080 /* EPS_ERR_NONE - Success */
\r
1081 /* EPS_ERR_MEMORY_ALLOCATION - Fail to memory allocation */
\r
1083 /* Description: */
\r
1084 /* Convert palette to Intensity. */
\r
1086 /*******************************************|********************************************/
\r
1087 static EPS_ERR_CODE ConvertPaletteToIntensity(
\r
1089 EPS_UINT16 paletteSize,
\r
1090 EPS_UINT8 *paletteData
\r
1097 Palette2DeviceIntensity = (EPS_UINT8*)EPS_ALLOC( (paletteSize/3)*sizeof(EPS_UINT8) );
\r
1098 if (!Palette2DeviceIntensity) {
\r
1099 EPS_RETURN( EPS_ERR_MEMORY_ALLOCATION )
\r
1102 for (i = 0; i < paletteSize; i += 3) {
\r
1103 /* idx = CALCULATE_INTENSITY(paletteData[i], paletteData[i+1], paletteData[i+2]); */
\r
1104 idx = paletteData[i];
\r
1106 if (idx > 255) idx = 255;
\r
1107 Palette2DeviceIntensity[j++] = Intensity2Intensity[idx];
\r
1110 EPS_RETURN( EPS_ERR_NONE )
\r
1114 /*******************************************|********************************************/
\r
1116 /* Function name: BandInit() */
\r
1120 /* Name: Type: Description: */
\r
1121 /* pBand EPS_PAGE_BAND_M* I: band data strcture */
\r
1122 /* widthInPixels EPS_INT32 I: width in Pixels */
\r
1124 /* Return value: */
\r
1125 /* EPS_ERR_NONE - Success */
\r
1126 /* EPS_ERR_MEMORY_ALLOCATION - Fail to memory allocation */
\r
1128 /* Description: */
\r
1129 /* Allocate band data buffers. */
\r
1131 /*******************************************|********************************************/
\r
1132 static EPS_ERR_CODE BandInit(
\r
1134 EPS_PAGE_BAND_M* pBand,
\r
1135 EPS_INT32 widthInPixels
\r
1138 EPS_ERR_CODE ret = EPS_ERR_NONE;
\r
1139 EPS_INT32 maxEpsonEncodedData;
\r
1143 memset(pBand, 0, sizeof(pBand));
\r
1145 pBand->WidthInPixels = widthInPixels;
\r
1146 pBand->WidthInBytes = (pBand->WidthInPixels+7)/8;
\r
1148 /* We leave room for an entire TIFF literal -plus- room */
\r
1149 /* for the longest possible XFER header (3 bytes). */
\r
1150 maxEpsonEncodedData = 256 + 3 + pBand->WidthInBytes
\r
1151 + (pBand->WidthInBytes + TIFF_MAXIMUM_LITERAL - 1)/TIFF_MAXIMUM_LITERAL;
\r
1153 pBand->pRasterData = (EPS_UINT8*)EPS_ALLOC(pBand->WidthInBytes);
\r
1154 if (NULL == pBand->pRasterData) {
\r
1155 EPS_RETURN( EPS_ERR_MEMORY_ALLOCATION )
\r
1158 pBand->pEncData = (EPS_UINT8*)EPS_ALLOC(maxEpsonEncodedData);
\r
1159 if (NULL == pBand->pEncData) {
\r
1160 EPS_RETURN( EPS_ERR_MEMORY_ALLOCATION )
\r
1163 pBand->pZeroRow = (EPS_UINT8*)EPS_ALLOC(pBand->WidthInBytes);
\r
1164 if (NULL == pBand->pZeroRow) {
\r
1165 EPS_RETURN( EPS_ERR_MEMORY_ALLOCATION )
\r
1167 memset(pBand->pZeroRow, 0, pBand->WidthInBytes);
\r
1169 pBand->pIntensity = (EPS_UINT8*)EPS_ALLOC(pBand->WidthInPixels);
\r
1170 if (!pBand->pIntensity){
\r
1171 EPS_RETURN( EPS_ERR_MEMORY_ALLOCATION )
\r
1178 /*******************************************|********************************************/
\r
1180 /* Function name: BandTerm() */
\r
1184 /* Name: Type: Description: */
\r
1185 /* pBand EPS_PAGE_BAND_M* I: band data strcture */
\r
1187 /* Return value: */
\r
1190 /* Description: */
\r
1191 /* free band data buffers. */
\r
1193 /*******************************************|********************************************/
\r
1194 static void BandTerm(
\r
1196 EPS_PAGE_BAND_M* pBand
\r
1201 EPS_SAFE_RELEASE( pBand->pRasterData );
\r
1202 EPS_SAFE_RELEASE( pBand->pEncData );
\r
1203 EPS_SAFE_RELEASE( pBand->pZeroRow );
\r
1204 EPS_SAFE_RELEASE( pBand->pIntensity );
\r
1210 /*******************************************|********************************************/
\r
1212 /* Function name: BandEmit() */
\r
1216 /* Name: Type: Description: */
\r
1217 /* pBand EPS_PAGE_BAND_M* I: band data strcture */
\r
1218 /* pCmdBuff EPS_COMMAND_BUFFER* I: command buffer strcture */
\r
1219 /* iNByte EPS_INT32 I: number of data bytes */
\r
1220 /* iNDot EPS_INT32 I: number of data dots */
\r
1222 /* Return value: */
\r
1223 /* EPS_ERR_NONE - Success */
\r
1224 /* EPS_ERR_MEMORY_ALLOCATION - Fail to memory allocation */
\r
1225 /* EPS_ERR_OPR_FAIL - Internal Error */
\r
1226 /* EPS_ERR_COMM_ERROR - Communication Error */
\r
1227 /* EPS_ERR_PRINTER_ERR_OCCUR - Printer Error happened */
\r
1229 /* Description: */
\r
1230 /* Emit data to printer. */
\r
1232 /*******************************************|********************************************/
\r
1233 static EPS_ERR_CODE BandEmit(
\r
1235 EPS_PAGE_BAND_M* pBand,
\r
1236 EPS_INT32 iNByte,
\r
1240 EPS_ERR_CODE ret = EPS_ERR_NONE;
\r
1242 EPS_UINT32 retBufSize = 0;
\r
1246 cmdBuf.len = 0; /* reset */
\r
1247 p = (EPS_INT8*)cmdBuf.p;
\r
1249 EPS_DBGPRINT(("Y = %d \r\n", iRow));
\r
1250 sprintf(p, "\x1D%dY", iRow);
\r
1253 /* Number of data bytes */
\r
1254 /* Bit image width */
\r
1255 /* Bit image height */
\r
1256 /* Angle of rotation */
\r
1257 sprintf(p, sbBID, iNByte, iNDot);
\r
1260 cmdBuf.len += (EPS_UINT32)(p - cmdBuf.p);
\r
1261 ret = CmdBuffGrow(&cmdBuf, pBand->encDataSize);
\r
1262 if( EPS_ERR_NONE != ret){
\r
1265 p = cmdBuf.p + cmdBuf.len;
\r
1267 memcpy(p, pBand->pEncData, pBand->encDataSize);
\r
1268 cmdBuf.len += pBand->encDataSize;
\r
1270 pBand->encDataSize = 0;
\r
1272 ret = SendCommand((EPS_UINT8*)cmdBuf.p, cmdBuf.len, &retBufSize, TRUE);
\r
1278 /*******************************************|********************************************/
\r
1280 /* Function name: BandEncode() */
\r
1284 /* Name: Type: Description: */
\r
1285 /* pBand EPS_PAGE_BAND_M* I: band data strcture */
\r
1287 /* Return value: */
\r
1290 /* Description: */
\r
1291 /* Do Compression. */
\r
1293 /*******************************************|********************************************/
\r
1294 static void BandEncode(
\r
1296 EPS_PAGE_BAND_M* pBand
\r
1299 EPS_BOOL isZero = FALSE;
\r
1300 EPS_INT32 widthInBytes = (pBand->currentWidthInPixels+7)/8;
\r
1304 /* Check blank line */
\r
1305 isZero = (memcmp(pBand->pRasterData, pBand->pZeroRow, widthInBytes) == 0)?TRUE:FALSE;
\r
1307 /* No compression for blank line */
\r
1309 pBand->encDataSize = 0;
\r
1311 pBand->encDataSize = DoDeltaRow( pBand->pRasterData,
\r
1322 /*=========================================================*/
\r
1328 /* Description: */
\r
1330 /* Halftoning initialization */
\r
1332 /*=========================================================*/
\r
1333 static EPS_ERR_CODE HT_Init(EPS_INT32 WidthPixels)
\r
1339 htParam.pEK = NULL;
\r
1340 htParam.iScanPels = WidthPixels;
\r
1341 htParam.iOrder = 5;
\r
1342 htParam.iDK = DOT_K * E_MAX / 100;
\r
1344 htParam.pEK = (EPS_INT16*)EPS_ALLOC((htParam.iScanPels + 2)*sizeof(EPS_INT16));
\r
1345 if( NULL == htParam.pEK){
\r
1346 EPS_RETURN( EPS_ERR_MEMORY_ALLOCATION )
\r
1349 EPS_RETURN( EPS_ERR_NONE )
\r
1353 /*=========================================================*/
\r
1359 /* Description: */
\r
1361 /* Halftoning Ending process */
\r
1363 /*=========================================================*/
\r
1364 static void HT_End()
\r
1367 EPS_SAFE_RELEASE( htParam.pEK );
\r
1372 /*=========================================================*/
\r
1376 /* HT_StartPage */
\r
1378 /* Description: */
\r
1380 /* Halftoning start page process */
\r
1382 /*=========================================================*/
\r
1383 static void HT_StartPage()
\r
1388 memset(htParam.pEK, 0, (htParam.iScanPels + 2) * sizeof(EPS_INT16));
\r
1395 /*=========================================================*/
\r
1401 /* Description: */
\r
1403 /* Check halftoning method */
\r
1405 /*=========================================================*/
\r
1406 static void HT_Scan(EPS_UINT8 *Con, EPS_UINT8 *Bin, EPS_INT32 widthInPixels)
\r
1408 /* Error Diffusion */
\r
1409 EPS_INT32 i, j, k;
\r
1410 EPS_INT32 iE, iE1, iE3, iE5, iE7, iR;
\r
1418 p = htParam.pEK + 1;
\r
1419 iDot = htParam.iDK;
\r
1428 for (k = 0; k < widthInPixels; k++) {
\r
1429 if (Con[i] == 0) {
\r
1430 } else if (Con[i] == MAX_8) {
\r
1431 Bin[i >> 3] |= BitMask[i & 7];
\r
1433 iCon = Con[i] * (E_MAX / (MAX_8 + 1));
\r
1435 iE = rand() * (iCon - E_MID) / RAND_MAX;
\r
1436 if (((iR > 0) && (iE > 0)) || ((iR < 0) && (iE < 0))) {
\r
1441 iCon += p[i] + iE7;
\r
1443 if (iCon + iR > E_MID) {
\r
1444 Bin[i >> 3] |= BitMask[i & 7];
\r
1458 iE7 = iE - iE1 - iE3 - iE5;
\r
1464 p[i - j] += iE7 + iE1;
\r
1467 p[htParam.iScanPels - 1] += p[htParam.iScanPels];
\r
1470 p[htParam.iScanPels] = 0;
\r
1476 /*=========================================================*/
\r
1482 /* Description: */
\r
1484 /* Do TIFF compression */
\r
1486 /*=========================================================*/
\r
1487 EPS_INT32 DoTIFF(EPS_UINT8 *Row, EPS_INT32 nRow, EPS_UINT8 *RowTIFF)
\r
1489 EPS_INT32 nRowTIFF = 0; /* Total size of TIFF encoded row. */
\r
1490 EPS_INT32 nLiteral = 0; /* Count of literal bytes. */
\r
1491 EPS_INT32 nRepeat = 0; /* Count of repeated byte. */
\r
1495 /* Load first byte from row into parser. */
\r
1500 for( ; nRow--; ch = *Row++ ) {
\r
1501 if( nLiteral > TIFF_MAXIMUM_LITERAL ) {
\r
1502 /* Literal part has grown too large, emit the largest literal pattern we can. */
\r
1503 EMIT_TIFF_LITERAL( TIFF_MAXIMUM_LITERAL, Row-nLiteral );
\r
1504 nLiteral -= TIFF_MAXIMUM_LITERAL;
\r
1505 } else if( nRepeat > TIFF_MAXIMUM_REPEAT ) {
\r
1506 /* Repeated part has grown too large, emit the literal (if present) and then */
\r
1507 /* emit the largest repeated pattern we can. */
\r
1508 EMIT_TIFF_REPEAT( TIFF_MAXIMUM_REPEAT, ch );
\r
1509 nRepeat -= TIFF_MAXIMUM_REPEAT;
\r
1511 if( ch == *Row ) {
\r
1513 if( nLiteral >= 2 ) {
\r
1515 EMIT_TIFF_LITERAL( nLiteral-1, Row-nLiteral );
\r
1521 if( nRepeat >= 2 ) {
\r
1522 EMIT_TIFF_REPEAT( nRepeat, ch );
\r
1529 if( nRepeat == 1 ) {
\r
1532 if( nLiteral == 1 && nRepeat >= 2 ) {
\r
1536 while (nLiteral) {
\r
1538 if (n > TIFF_MAXIMUM_LITERAL) {
\r
1539 n = TIFF_MAXIMUM_LITERAL;
\r
1542 EMIT_TIFF_LITERAL(n-1, Row-nLiteral);
\r
1544 EMIT_TIFF_LITERAL(n-1, Row-nLiteral);
\r
1551 if (n > TIFF_MAXIMUM_REPEAT) {
\r
1552 n = TIFF_MAXIMUM_REPEAT;
\r
1554 EMIT_TIFF_REPEAT(n, ch);
\r
1562 /*=========================================================*/
\r
1566 /* DeltaRowEmitXFER */
\r
1568 /* Description: */
\r
1570 /* Construct DeltaRow control code and data */
\r
1572 /*=========================================================*/
\r
1573 void DeltaRowEmitXFER(EPS_UINT8 *Row, EPS_INT32 nXFER, EPS_INT32 nXFERTIFF, EPS_INT32 *nRowDeltaRow, EPS_UINT8 **RowDeltaRow)
\r
1577 /* Get data length and send before all data of the current row */
\r
1578 iNumBytes += nXFERTIFF;
\r
1579 iNumDots += nXFER * 8;
\r
1581 /* TIFF data for XFER */
\r
1582 *nRowDeltaRow += nXFERTIFF;
\r
1585 DoTIFF(Row, nXFER, *RowDeltaRow);
\r
1586 *RowDeltaRow += nXFERTIFF;
\r
1592 /*=========================================================*/
\r
1596 /* DeltaRowEmitMOVX */
\r
1598 /* Description: */
\r
1600 /* Construct DeltaRow horizontal position movement */
\r
1602 /*=========================================================*/
\r
1603 void DeltaRowEmitMOVX(EPS_INT32 nSkip, EPS_INT32 *nRowDeltaRow, EPS_UINT8 **RowDeltaRow)
\r
1611 /* Send repeat "00" instead. Send 255 "00" the most each time */
\r
1612 if( nSkip == 0 ) {
\r
1616 if( nSkip > 255 ) {
\r
1617 num1 = nSkip - 255;
\r
1622 *nRowDeltaRow += 3;
\r
1624 iNumDots += num * 8;
\r
1626 if (*RowDeltaRow) {
\r
1628 *((*RowDeltaRow)++) = 0x00;
\r
1629 *((*RowDeltaRow)++) = 0x00;
\r
1630 *((*RowDeltaRow)++) = N;
\r
1632 if( num1 > 255 ) {
\r
1633 /* Still have more than 255 "00" */
\r
1634 DeltaRowEmitMOVX(num1, nRowDeltaRow, RowDeltaRow);
\r
1637 *nRowDeltaRow += 3;
\r
1639 iNumDots += num1 * 8;
\r
1643 *((*RowDeltaRow)++) = 0x00;
\r
1644 *((*RowDeltaRow)++) = 0x00;
\r
1645 *((*RowDeltaRow)++) = N;
\r
1654 /*=========================================================*/
\r
1658 /* DeltaRowEmitReduce */
\r
1660 /* Description: */
\r
1664 /*=========================================================*/
\r
1665 void DeltaRowEmitReduce(EPS_UINT8 *Row, EPS_INT32 *nDelta0, EPS_INT32 *nSkip, EPS_INT32 *nDelta1, EPS_INT32 *nRowDeltaRow, EPS_UINT8 **RowDeltaRow)
\r
1667 EPS_INT32 nDelta0TIFF, nDelta1TIFF, nDeltaTIFF, SizeofDSD, SizeofD;
\r
1672 /* (DSD) state. */
\r
1673 nDelta0TIFF = DoTIFF(Row - *nDelta1 - *nSkip - *nDelta0, *nDelta0, 0);
\r
1674 nDelta1TIFF = DoTIFF(Row - *nDelta1, *nDelta1, 0);
\r
1675 nDeltaTIFF = DoTIFF(Row - *nDelta1 - *nSkip - *nDelta0, *nDelta0 + *nSkip + *nDelta1, 0);
\r
1677 SizeofDSD = nDelta0TIFF + nDelta1TIFF + (nDelta0TIFF>15?1:0)
\r
1678 + (nDelta0TIFF>255?1:0) + (nDelta1TIFF>15?1:0)
\r
1679 + (nDelta1TIFF>255?1:0) + (*nSkip>7?1:0) + (*nSkip>127?1:0) + 3;
\r
1680 SizeofD = nDeltaTIFF + (nDeltaTIFF>15?1:0) + (nDeltaTIFF>255?1:0) + 1;
\r
1683 /* (-SD) state. */
\r
1685 nDelta1TIFF = DoTIFF(Row - *nDelta1, *nDelta1, 0);
\r
1686 nDeltaTIFF = DoTIFF(Row - *nDelta1 - *nSkip, *nSkip + *nDelta1, 0);
\r
1688 SizeofDSD = nDelta1TIFF + (nDelta1TIFF>15?1:0)
\r
1689 + (nDelta1TIFF>255?1:0) + (*nSkip>7?1:0) + (*nSkip>127?1:0) + 2;
\r
1690 SizeofD = nDeltaTIFF + (nDeltaTIFF>15?1:0) + (nDeltaTIFF>255?1:0) + 1;
\r
1693 if (SizeofD <= SizeofDSD) {
\r
1694 /* Turn the delta/skip/delta into a single delta. */
\r
1695 *nDelta0 += *nSkip + *nDelta1;
\r
1700 /* Emit a delta, then a skip, and the shift the leftover delta. */
\r
1702 DeltaRowEmitXFER(Row- *nDelta0 - *nSkip - *nDelta1, *nDelta0, nDelta0TIFF, nRowDeltaRow, RowDeltaRow);
\r
1704 DeltaRowEmitMOVX(*nSkip, nRowDeltaRow, RowDeltaRow);
\r
1706 /* Shift remaining delta */
\r
1707 *nDelta0 = *nDelta1;
\r
1716 /*=========================================================*/
\r
1722 /* Description: */
\r
1724 /* Do DeltaRow compression */
\r
1726 /*=========================================================*/
\r
1727 static EPS_INT32 DoDeltaRow(EPS_UINT8 *Row, EPS_INT32 nRow, EPS_UINT8 *RowDeltaRow, EPS_UINT8 *Seed)
\r
1729 EPS_INT32 nRowDeltaRow = 0;
\r
1730 EPS_INT32 nSkip = 0;
\r
1731 EPS_INT32 nDelta1 = 0;
\r
1732 EPS_INT32 nDelta0 = 0;
\r
1733 EPS_INT32 nDelta0TIFF;
\r
1735 for ( ; nRow--; Row++, Seed++) {
\r
1736 if (*Row != *Seed) {
\r
1743 if (nDelta0 == 0 && nSkip ==0)
\r
1745 nDelta0 = nDelta1;
\r
1752 nDelta0 += nSkip + nDelta1;
\r
1758 DeltaRowEmitReduce(Row, &nDelta0, &nSkip, &nDelta1,
\r
1759 &nRowDeltaRow, &RowDeltaRow);
\r
1767 /* Have reached the end of the line. */
\r
1772 DeltaRowEmitReduce(Row, &nDelta0, &nSkip, &nDelta1, &nRowDeltaRow, &RowDeltaRow);
\r
1773 nDelta0TIFF = DoTIFF(Row-nDelta0, nDelta0, 0);
\r
1774 DeltaRowEmitXFER(Row-nDelta0, nDelta0, nDelta0TIFF, &nRowDeltaRow, &RowDeltaRow);
\r
1778 nDelta0TIFF = DoTIFF(Row-nSkip-nDelta0, nDelta0, 0);
\r
1779 DeltaRowEmitXFER(Row-nDelta0-nSkip, nDelta0, nDelta0TIFF, &nRowDeltaRow, &RowDeltaRow);
\r
1786 DeltaRowEmitReduce(Row, &nDelta0, &nSkip, &nDelta1, &nRowDeltaRow, &RowDeltaRow);
\r
1787 nDelta0TIFF = DoTIFF(Row-nDelta0, nDelta0, 0);
\r
1788 DeltaRowEmitXFER(Row-nDelta0, nDelta0, nDelta0TIFF, &nRowDeltaRow, &RowDeltaRow);
\r
1792 nDelta0TIFF = DoTIFF(Row-nDelta1, nDelta1, 0);
\r
1793 DeltaRowEmitXFER(Row-nDelta1, nDelta1, nDelta0TIFF, &nRowDeltaRow, &RowDeltaRow);
\r
1797 return nRowDeltaRow;
\r
1800 /*_______________________________ epson-escpage-mono.c ______________________________*/
\r
1802 /*34567890123456789012345678901234567890123456789012345678901234567890123456789012345678*/
\r
1803 /* 1 2 3 4 5 6 7 8 */
\r
1804 /*******************************************|********************************************/
\r
1805 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r
1806 /***** End of File *** End of File *** End of File *** End of File *** End of File ******/
\r
1807 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
\r