Tizen 2.1 base
[platform/upstream/hplip.git] / prnt / hpijs / ljzjs.cpp
1 /*****************************************************************************\
2   ljzjs.cpp : Implementation for the LJZjs class
3
4   Copyright (c) 1996 - 2007, Hewlett-Packard Co.
5   All rights reserved.
6
7   Redistribution and use in source and binary forms, with or without
8   modification, are permitted provided that the following conditions
9   are met:
10   1. Redistributions of source code must retain the above copyright
11      notice, this list of conditions and the following disclaimer.
12   2. Redistributions in binary form must reproduce the above copyright
13      notice, this list of conditions and the following disclaimer in the
14      documentation and/or other materials provided with the distribution.
15   3. Neither the name of Hewlett-Packard nor the names of its
16      contributors may be used to endorse or promote products derived
17      from this software without specific prior written permission.
18
19   THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
20   WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
22   NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
24   TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
25   OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 \*****************************************************************************/
30
31
32 #if defined (APDK_LJZJS_MONO) || defined (APDK_LJZJS_COLOR) || defined (APDK_LJM1005)
33
34 #include "header.h"
35 #include "io_defs.h"
36 #include "printerproxy.h"
37 #include "resources.h"
38 #include "ljzjs.h"
39 #ifdef HAVE_LIBDL
40 #include <dlfcn.h>
41 #endif
42
43 extern "C"
44 {
45 int (*HPLJJBGCompress) (int iWidth, int iHeight, unsigned char **pBuff,
46                         HPLJZjcBuff *pOutBuff, HPLJZjsJbgEncSt *pJbgEncSt);
47 int (*HPLJSoInit) (int iFlag);
48 }
49
50 APDK_BEGIN_NAMESPACE
51
52 #ifdef HAVE_LIBDL
53 extern void *LoadPlugin (const char *szPluginName);
54 #endif
55
56 const unsigned char LJZjs::szByte1[256] =
57     {
58           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
59           0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,
60           2,   2,   2,   2,   2,   2,   2,   2,   8,   8,   8,   8,
61           8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
62          10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,  10,
63          10,  10,  10,  10,  32,  32,  32,  32,  32,  32,  32,  32,
64          32,  32,  32,  32,  32,  32,  32,  32,  34,  34,  34,  34,
65          34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,
66          40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
67          40,  40,  40,  40,  42,  42,  42,  42,  42,  42,  42,  42,
68          42,  42,  42,  42,  42,  42,  42,  42, 128, 128, 128, 128,
69         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
70         130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
71         130, 130, 130, 130, 136, 136, 136, 136, 136, 136, 136, 136,
72         136, 136, 136, 136, 136, 136, 136, 136, 138, 138, 138, 138,
73         138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
74         160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
75         160, 160, 160, 160, 162, 162, 162, 162, 162, 162, 162, 162,
76         162, 162, 162, 162, 162, 162, 162, 162, 168, 168, 168, 168,
77         168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
78         170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
79         170, 170, 170, 170, 
80     };
81 const unsigned char LJZjs::szByte2[256] =
82     {
83           0,   2,   8,  10,  32,  34,  40,  42, 128, 130, 136, 138,
84         160, 162, 168, 170,   0,   2,   8,  10,  32,  34,  40,  42,
85         128, 130, 136, 138, 160, 162, 168, 170,   0,   2,   8,  10,
86          32,  34,  40,  42, 128, 130, 136, 138, 160, 162, 168, 170,
87           0,   2,   8,  10,  32,  34,  40,  42, 128, 130, 136, 138,
88         160, 162, 168, 170,   0,   2,   8,  10,  32,  34,  40,  42,
89         128, 130, 136, 138, 160, 162, 168, 170,   0,   2,   8,  10,
90          32,  34,  40,  42, 128, 130, 136, 138, 160, 162, 168, 170,
91           0,   2,   8,  10,  32,  34,  40,  42, 128, 130, 136, 138,
92         160, 162, 168, 170,   0,   2,   8,  10,  32,  34,  40,  42,
93         128, 130, 136, 138, 160, 162, 168, 170,   0,   2,   8,  10,
94          32,  34,  40,  42, 128, 130, 136, 138, 160, 162, 168, 170,
95           0,   2,   8,  10,  32,  34,  40,  42, 128, 130, 136, 138,
96         160, 162, 168, 170,   0,   2,   8,  10,  32,  34,  40,  42,
97         128, 130, 136, 138, 160, 162, 168, 170,   0,   2,   8,  10,
98          32,  34,  40,  42, 128, 130, 136, 138, 160, 162, 168, 170,
99           0,   2,   8,  10,  32,  34,  40,  42, 128, 130, 136, 138,
100         160, 162, 168, 170,   0,   2,   8,  10,  32,  34,  40,  42,
101         128, 130, 136, 138, 160, 162, 168, 170,   0,   2,   8,  10,
102          32,  34,  40,  42, 128, 130, 136, 138, 160, 162, 168, 170,
103           0,   2,   8,  10,  32,  34,  40,  42, 128, 130, 136, 138,
104         160, 162, 168, 170, 
105     };
106
107 LJZjs::LJZjs (SystemServices* pSS, int numfonts, BOOL proto)
108     : Printer(pSS, numfonts, proto)
109 {
110
111     CMYMap = NULL;
112 #ifdef  APDK_AUTODUPLEX
113     m_bRotateBackPage = FALSE;  // Lasers don't require back side image to be rotated
114 #endif
115     m_pszInputRasterData = NULL;
116     m_dwCurrentRaster = 0;
117     m_bStartPageSent = FALSE;
118     HPLJJBGCompress = NULL;
119     m_hHPLibHandle = NULL;
120     m_iPrinterType = UNSUPPORTED;
121 #ifdef HAVE_LIBDL
122     m_hHPLibHandle = LoadPlugin ("lj.so");
123     if (m_hHPLibHandle)
124     {
125         dlerror ();
126         *(void **) (&HPLJJBGCompress) = dlsym (m_hHPLibHandle, "hp_encode_bits_to_jbig");
127         *(void **) (&HPLJSoInit) = dlsym (m_hHPLibHandle, "hp_init_lib");
128         if (!HPLJSoInit || (HPLJSoInit && !HPLJSoInit (1)))
129         {
130             constructor_error = PLUGIN_LIBRARY_MISSING;
131         }
132     }
133 #endif
134     if (HPLJJBGCompress == NULL)
135     {
136         constructor_error = PLUGIN_LIBRARY_MISSING;
137     }
138         //Issue: LJZJSMono class printers not printing in RHEL \r
139         //Cause: Since start page is common for LJZJSMono and LJZJSColor class, the items of \r
140         //LJZJSColor-2 format was used for LJZJSMono due to below variable not initialised \r
141         //Fix: Added initialisation so that correct LJZJSMono items are used.  \r
142         //Variable is updated in LJZJSColor. \r
143         m_bLJZjsColor2Printer = FALSE; \r
144
145 }
146
147 LJZjs::~LJZjs ()
148 {
149 #ifdef HAVE_LIBDL
150     if (m_hHPLibHandle)
151     {
152         dlclose (m_hHPLibHandle);
153     }
154 #endif
155     if (m_pszInputRasterData)
156     {
157         delete [] m_pszInputRasterData;
158     }
159 }
160
161 HeaderLJZjs::HeaderLJZjs (Printer* p,PrintContext* pc)
162     : Header(p,pc)
163 {
164 }
165
166 DRIVER_ERROR HeaderLJZjs::Send ()
167 {
168     DRIVER_ERROR err = NO_ERROR;
169     char        szStr[256];
170     WORD        wItems[3] = {ZJI_DMCOLLATE, ZJI_PAGECOUNT, ZJI_DMDUPLEX};
171     int         i = 4;
172
173     QUALITY_MODE    eQuality;
174     MEDIATYPE       cmt;
175     BOOL            cdt;
176     COLORMODE       ccm;
177     thePrintContext->GetPrintModeSettings (eQuality, cmt, ccm, cdt);
178
179     if (((LJZjs *) thePrinter)->m_iPrinterType == eLJM1005)
180     {
181         strcpy (szStr, "\x1B\x25-12345X@PJL JOB\x0D\x0A");
182         strcpy (szStr+strlen (szStr), "@PJL SET JAMRECOVERY=OFF\x0D\x0A");
183         strcpy (szStr+strlen (szStr), "@PJL SET DENSITY=3\x0D\x0A");
184         strcpy (szStr+strlen (szStr), "@PJL SET RET=MEDIUM\x0D\x0A");
185         strcpy (szStr+strlen (szStr), "@PJL SET ECONOMODE=");
186         if (eQuality == QUALITY_DRAFT)
187         {
188             strcpy (szStr+strlen (szStr), "ON\x0D\x0A");
189         }
190         else
191         {
192             strcpy (szStr+strlen (szStr), "OFF\x0D\x0A");
193         }
194         err = thePrinter->Send ((const BYTE *) szStr, strlen (szStr));
195         ERRCHECK;
196
197         strcpy (szStr, "\x1B\x25-12345X,XQX");
198         err = thePrinter->Send ((const BYTE *) szStr, strlen (szStr));
199         memset (szStr, 0x0, 92);
200         szStr[3] = 0x01;
201         szStr[7] = 0x07;
202         i = 8;
203         i += ((LJZjs *) thePrinter)->SendIntItem ((BYTE *) szStr+i, 0x80000000, 0x04, 0x54);
204         i += ((LJZjs *) thePrinter)->SendIntItem ((BYTE *) szStr+i, 0x10000005, 0x04, 0x01);
205         i += ((LJZjs *) thePrinter)->SendIntItem ((BYTE *) szStr+i, 0x10000001, 0x04, 0x00);
206         i += ((LJZjs *) thePrinter)->SendIntItem ((BYTE *) szStr+i, 0x10000002, 0x04, 0x00);
207         i += ((LJZjs *) thePrinter)->SendIntItem ((BYTE *) szStr+i, 0x10000000, 0x04, 0x00);
208         i += ((LJZjs *) thePrinter)->SendIntItem ((BYTE *) szStr+i, 0x10000003, 0x04, 0x01);
209         i += ((LJZjs *) thePrinter)->SendIntItem ((BYTE *) szStr+i, 0x80000001, 0x04, 0xDEADBEEF);
210         err = thePrinter->Send ((const BYTE *) szStr, i);
211         return err;
212     }
213     
214     strcpy (szStr, "\x1B\x25-12345X@PJL ENTER LANGUAGE=ZJS\x0A");
215     err = thePrinter->Send ((const BYTE *) szStr, strlen (szStr));
216     ERRCHECK;
217
218     memset (szStr, 0, 256);
219
220     strcpy (szStr, "JZJZ");
221     i = 0;
222     szStr[i+7]  = 52;
223     szStr[i+11] = ZJT_START_DOC;
224     szStr[i+15] = 3;
225     szStr[i+17] = 36;
226     szStr[i+18] = 'Z';
227     szStr[i+19] = 'Z';
228
229     i += 20;
230     for (int j = 0; j < 3; j++)
231     {
232         szStr[i+3] = 12;
233         szStr[i+5] = (char) wItems[j];
234         szStr[i+6] = ZJIT_UINT32;
235         szStr[i+11] = j / 2;
236         i += 12;
237     }
238     err = thePrinter->Send ((const BYTE *) szStr, i);
239     return err;
240 }
241
242 int LJZjs::MapPaperSize ()
243 {
244     switch (thePrintContext->GetPaperSize ())
245     {
246         case LETTER:         return 1;
247         case LEGAL:          return 5;
248         case A4:             return 9;
249         case B4:             return 12;
250         case B5:             return 357;
251         case OUFUKU:         return 43;
252         case HAGAKI:         return 43;
253 #ifdef APDK_EXTENDED_MEDIASIZE
254         case A3:             return 8;
255         case A5:             return 11;
256 //        case LEDGER:         return 4;
257         case EXECUTIVE:      return 7;
258 //        case CUSTOM_SIZE:    return 96;
259         case ENVELOPE_NO_10: return 20;
260         case ENVELOPE_DL:    return 27;
261         case FLSA:           return 258;
262 #endif
263         default:             return 1;
264     }
265 }
266
267 DRIVER_ERROR LJZjs::StartPage (DWORD dwWidth, DWORD dwHeight)
268 {
269     DRIVER_ERROR        err = NO_ERROR;
270     QUALITY_MODE        cqm;
271     MEDIATYPE           cmt;
272     BOOL                cdt;
273     DWORD               dwNumItems = (m_bIamColor) ? 15 : 14;
274     BYTE                szStr[16 + 15 * 12];
275     int                 iPlanes = 1;
276     int                 i;
277     int                 iMediaType = 1; // Plain paper
278
279     if (m_bStartPageSent)
280     {
281         return NO_ERROR;
282     }
283     m_bStartPageSent = TRUE;
284     err = thePrintContext->GetPrintModeSettings (cqm, cmt, m_cmColorMode, cdt);
285     if (cmt == MEDIA_TRANSPARENCY)
286     {
287         iMediaType = 2;
288     }
289     else if (cmt == MEDIA_PHOTO)
290     {
291         iMediaType = 3;
292     }
293
294     if (m_iPrinterType == eLJM1005)
295     {\r
296         int    iOutputResolution = GetOutputResolutionY ();\r
297         if (cqm == QUALITY_BEST)\r
298             iOutputResolution = (int) thePrintContext->EffectiveResolutionY ();
299         memset (szStr, 0x0, sizeof (szStr));
300         szStr[3] = 0x03;
301         szStr[7] = 0x0F;
302         err = Send ((const BYTE *) szStr, 8);
303         i = 0;
304         i += SendIntItem (szStr+i, 0x80000000, 0x04, 0xB4);
305         i += SendIntItem (szStr+i, 0x20000005, 0x04, 0x01);
306         i += SendIntItem (szStr+i, 0x20000006, 0x04, 0x07);
307         i += SendIntItem (szStr+i, 0x20000000, 0x04, 0x01);
308         i += SendIntItem (szStr+i, 0x20000007, 0x04, 0x01);
309         i += SendIntItem (szStr+i, 0x20000008, 0x04, (int) thePrintContext->EffectiveResolutionX ());
310         i += SendIntItem (szStr+i, 0x20000009, 0x04, iOutputResolution);
311         i += SendIntItem (szStr+i, 0x2000000D, 0x04, (int) dwWidth);
312         i += SendIntItem (szStr+i, 0x2000000E, 0x04, (int) m_dwLastRaster);
313         i += SendIntItem (szStr+i, 0x2000000A, 0x04, m_iBPP);
314         i += SendIntItem (szStr+i, 0x2000000F, 0x04, (int) dwWidth/m_iBPP);
315         i += SendIntItem (szStr+i, 0x20000010, 0x04, (int) m_dwLastRaster);
316         i += SendIntItem (szStr+i, 0x20000011, 0x04, 0x01);
317         i += SendIntItem (szStr+i, 0x20000001, 0x04, MapPaperSize ());
318         i += SendIntItem (szStr+i, 0x80000001, 0x04, 0xDEADBEEF);
319         err = Send ((const BYTE *) szStr, i);
320         return err;
321     }
322
323         if(m_bLJZjsColor2Printer)
324         {
325                 dwNumItems = 13;
326         }
327     if (m_cmColorMode == COLOR && m_bIamColor)
328     {
329         iPlanes = 4;
330     }
331
332     i = 0;
333     i += SendChunkHeader (szStr, 16 + dwNumItems * 12, ZJT_START_PAGE, dwNumItems);
334
335     if (m_bIamColor)
336     {
337         i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE, iPlanes);
338     }
339     i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMPAPER, MapPaperSize ());
340     i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMCOPIES, thePrintContext->GetCopyCount ());
341     i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMDEFAULTSOURCE, thePrintContext->GetMediaSource ());
342     i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMMEDIATYPE, iMediaType);
343     i += SendItem (szStr+i, ZJIT_UINT32, ZJI_NBIE, iPlanes);
344     i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RESOLUTION_X, thePrintContext->EffectiveResolutionX ());
345     i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RESOLUTION_Y, thePrintContext->EffectiveResolutionY ());
346     i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RASTER_X, dwWidth);
347     i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RASTER_Y, m_dwLastRaster);
348     i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_BPP, m_iBPP);
349     i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_X, dwWidth/m_iBPP);
350     i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_Y, m_dwLastRaster);
351         if(!m_bLJZjsColor2Printer)
352         {
353                 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RET, RET_ON);
354                 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_TONER_SAVE, (cqm == QUALITY_DRAFT) ? 1 : 0);
355         }
356
357     err = Send ((const BYTE *) szStr, i);
358     return err;
359 }
360
361 int LJZjs::SendChunkHeader (BYTE *szStr, DWORD dwSize, DWORD dwChunkType, DWORD dwNumItems)
362 {
363     for (int j = 3, i = 0; j >= 0; j--)
364     {
365         szStr[i] = (BYTE) ((dwSize >> (8 * (j))) & 0xFF);
366         szStr[4+i] = (BYTE) ((dwChunkType >> (8 * (j))) & 0xFF);
367         szStr[8+i] = (BYTE) ((dwNumItems >> (8 * (j))) & 0xFF);
368         i++;
369     }
370
371     szStr[12] = (BYTE) (((dwNumItems * 12) & 0xFF00) >> 8);
372     szStr[13] = (BYTE) (((dwNumItems * 12) & 0x00FF));
373
374     szStr[14] = 'Z';
375     szStr[15] = 'Z';
376     return 16;
377 }
378
379 int LJZjs::SendItem (BYTE *szStr, BYTE cType, WORD wItem, DWORD dwValue, DWORD dwExtra)
380 {
381     int        i, j;
382     dwExtra += 12;
383     for (j = 3, i = 0; j >= 0; j--)
384     {
385         szStr[i++] = (BYTE) ((dwExtra >> (8 * (j))) & 0xFF);
386     }
387     szStr[i++] = (BYTE) ((wItem & 0xFF00) >> 8);
388     szStr[i++] = (BYTE) ((wItem & 0x00FF));
389     szStr[i++] = (BYTE) cType;
390     szStr[i++] = 0;
391     for (j = 3; j >= 0; j--)
392     {
393         szStr[i++] = (BYTE) ((dwValue >> (8 * (j))) & 0xFF);
394     }
395     return i;
396 }
397
398 int LJZjs::SendIntItem (BYTE *szStr, int iItem, int iItemType, int iItemValue)
399 {
400     int        i = 0;
401     int        j;
402     for (j = 3; j >= 0; j--)
403     {
404         szStr[i++] = (BYTE) ((iItem >> (8 * (j))) & 0xFF);
405     }
406     for (j = 3; j >= 0; j--)
407     {
408         szStr[i++] = (BYTE) ((iItemType >> (8 * (j))) & 0xFF);
409     }
410     for (j = 3; j >= 0; j--)
411     {
412         szStr[i++] = (BYTE) ((iItemValue >> (8 * (j))) & 0xFF);
413     }
414     return i;
415 }
416
417 DRIVER_ERROR LJZjs::SkipRasters (int iBlankRasters)
418 {
419     DRIVER_ERROR    err = NO_ERROR;
420     BOOL            bLastPlane;
421     int             iPlanes = (m_cmColorMode == COLOR) ? 4 : 1;
422     for (int i = 1; i <= iPlanes; i++)
423     {
424         bLastPlane = (i == iPlanes) ? TRUE : FALSE;
425         for (int j = 0; j < iBlankRasters; j++)
426         {
427             err = this->Encapsulate (NULL, bLastPlane);
428         }
429     }
430     return err;
431 }
432
433 DRIVER_ERROR HeaderLJZjs::FormFeed ()
434 {
435     DRIVER_ERROR err = NO_ERROR;
436
437     err = thePrinter->Flush (0);
438
439     return err;
440 }
441
442 DRIVER_ERROR HeaderLJZjs::SendCAPy (unsigned int iAbsY)
443 {
444     return NO_ERROR;
445 }
446
447 DRIVER_ERROR LJZjs::Flush (int FlushSize)
448 {
449     DRIVER_ERROR    err = NO_ERROR;
450     if (m_dwCurrentRaster == 0)
451     {
452         return NO_ERROR;
453     }
454     err = SkipRasters ((m_dwLastRaster - m_dwCurrentRaster));
455     return err;
456 }
457
458 DRIVER_ERROR LJZjs::JbigCompress ()
459 {
460     DRIVER_ERROR        err = NO_ERROR;
461     HPLJZjcBuff         myBuffer;
462     int                 iPlanes = (m_cmColorMode == COLOR) ? 4 : 1;
463     int                 iIncr = (m_bIamColor) ? 100 : m_dwLastRaster;
464
465     HPLJZjsJbgEncSt   se;
466     BYTE    *bitmaps[4] =
467             {
468                 m_pszInputRasterData,
469                 m_pszInputRasterData + (m_dwWidth * m_iBPP * m_dwLastRaster),
470                 m_pszInputRasterData + (m_dwWidth * m_iBPP * m_dwLastRaster * 2),
471                 m_pszInputRasterData + (m_dwWidth * m_iBPP * m_dwLastRaster * 3)
472             };
473     myBuffer.pszCompressedData = new BYTE[m_dwWidth * m_dwLastRaster * m_iBPP];
474     myBuffer.dwTotalSize = 0;
475
476     BYTE    *p;
477     int      iHeight;
478     for (DWORD y = 0; y < m_dwLastRaster; y += iIncr)
479     {
480         for (int i = 0; i < iPlanes; i++)
481         {
482             memset (myBuffer.pszCompressedData, 0, m_dwWidth * m_dwLastRaster * m_iBPP);
483             myBuffer.dwTotalSize = 0;
484             p = bitmaps[i] + (y * m_dwWidth * m_iBPP);
485             iHeight = iIncr;
486             if (y + iIncr > m_dwLastRaster)
487             {
488                 iHeight = m_dwLastRaster - y;
489             }
490
491             HPLJJBGCompress (m_dwWidth * 8 * m_iBPP, iHeight, &p, &myBuffer, &se);
492
493             if (i == 0)
494             {
495                 StartPage (se.xd, se.yd);
496             }
497             err = this->SendPlaneData (i + 1, &se, &myBuffer, (y + iIncr) >= m_dwLastRaster);
498         }
499     }
500
501     delete [] myBuffer.pszCompressedData;
502     m_dwCurrentRaster = 0;
503     m_pszCurPtr = m_pszInputRasterData;
504     memset (m_pszCurPtr, 0, (m_dwWidth * m_dwLastRaster * iPlanes * m_iBPP));
505
506     err = EndPage ();
507
508     return err;
509 }
510
511
512 /*JBig Compress for LJZjsColor-2 Printers
513 Separate function written for LJZjsColor-2 Printers, since for them, compression is done for whole plane data at a time
514 whereas for other deiveces, compression is done for 100 lines of each plane*/
515 DRIVER_ERROR LJZjs::JbigCompress_LJZjsColor2 ()
516 {
517     DRIVER_ERROR        err = NO_ERROR;
518     HPLJZjcBuff         myBuffer;
519     
520         int                 iPlanes = (m_cmColorMode == COLOR) ? 4 : 1;
521         int                                     arrPlanesOrder[] = {3,2,1,4};
522         int                                     nByteCount = 0;
523         int                                     iHeight = 0;
524         
525     HPLJZjsJbgEncSt   se;
526     BYTE    *pbUnCompressedData = NULL;
527     
528         BYTE    *bitmaps[4] =
529         {
530                 m_pszInputRasterData,
531                         m_pszInputRasterData + (m_dwWidth * m_iBPP * m_dwLastRaster),
532                         m_pszInputRasterData + (m_dwWidth * m_iBPP * m_dwLastRaster * 2),
533                         m_pszInputRasterData + (m_dwWidth * m_iBPP * m_dwLastRaster * 3)
534         };
535
536     myBuffer.pszCompressedData = new BYTE[m_dwWidth * m_dwLastRaster * m_iBPP];
537         if(NULL == myBuffer.pszCompressedData)
538         {
539                 return ALLOCMEM_ERROR;
540         }
541     myBuffer.dwTotalSize = 0;           
542         
543         for (int nPlaneCount = 0; nPlaneCount < iPlanes; nPlaneCount++)    
544     {
545                 
546                 memset (myBuffer.pszCompressedData, 0, m_dwWidth * m_dwLastRaster * m_iBPP);
547                 myBuffer.dwTotalSize = 0;
548                 
549                 if(4 == iPlanes)/*If there are 4 planes follow LJZjsColor-2 order of 3 2 1 4*/
550                 {
551                         pbUnCompressedData = bitmaps[arrPlanesOrder[nPlaneCount]-1] ;
552                 }
553                 else /* Should not happen */
554                 {
555                         return SYSTEM_ERROR;
556                 }
557
558                 
559                 iHeight = m_dwLastRaster; /*Send all scan lines at one go*/
560                 
561                 HPLJJBGCompress (m_dwWidth * 8 * m_iBPP, iHeight, &pbUnCompressedData, &myBuffer, &se);
562                 
563                 if(0 == nPlaneCount)
564                 {
565                         StartPage (se.xd, se.yd);
566                 }
567                 
568                 err = this->SendPlaneData (arrPlanesOrder[nPlaneCount], &se, &myBuffer, FALSE);
569         
570     }
571         
572     delete [] myBuffer.pszCompressedData;
573     m_dwCurrentRaster = 0;
574     m_pszCurPtr = m_pszInputRasterData;
575     memset (m_pszCurPtr, 0, (m_dwWidth * m_dwLastRaster * iPlanes * m_iBPP));
576         
577     err = EndPage ();
578         
579     return err;
580 }
581
582 DRIVER_ERROR HeaderLJZjs::EndJob ()
583 {
584     DRIVER_ERROR    err = NO_ERROR;
585     char            szStr[64];
586
587     if (((LJZjs *) thePrinter)->m_iPrinterType == eLJM1005)
588     {
589         memset (szStr, 0, 8);
590         szStr[3] = 2;
591         strcpy ((char *) szStr+8, "\x1B\x25-12345X@PJL EOJ\x0D\x0A\x1B\x25-12345X");
592         err = thePrinter->Send ((const BYTE *) szStr, 8 + strlen ((char *) (szStr+8)));
593         return err;
594     }
595
596
597     memset (szStr, 0, 64);
598
599     szStr[3] = 16;
600     szStr[7] = ZJT_END_DOC;
601     szStr[14] = 'Z';
602     szStr[15] = 'Z';
603     err = thePrinter->Send ((const BYTE *) szStr, 16);
604     return err;
605 }
606
607 Header *LJZjs::SelectHeader (PrintContext* pc)
608 {
609     DRIVER_ERROR    err = NO_ERROR;
610     DWORD           dwSize;
611     int             iPlanes = 1;
612     QUALITY_MODE        cqm;
613     MEDIATYPE           cmt;
614     BOOL                cdt;
615     err = pc->GetPrintModeSettings (cqm, cmt, m_cmColorMode, cdt);
616
617     if (m_cmColorMode == COLOR && m_bIamColor)
618     {
619         iPlanes = 4;
620         m_iP[0] = 3;
621     }
622     m_dwWidth = pc->OutputPixelsPerRow () / 8;
623     if (m_dwWidth % 8)
624     {
625         m_dwWidth = (m_dwWidth / 8 + 1) * 8;
626     }
627     m_dwLastRaster = (int) (pc->PrintableHeight () * pc->EffectiveResolutionY () + 0.5);
628     dwSize = m_dwWidth * m_dwLastRaster * iPlanes * m_iBPP;
629     m_pszInputRasterData = new BYTE[dwSize];
630     if (m_pszInputRasterData == NULL)
631     {
632         return NULL;
633     }
634     m_pszCurPtr = m_pszInputRasterData;
635     memset (m_pszCurPtr, 0, dwSize);
636     thePrintContext = pc;
637     return new HeaderLJZjs (this,pc);
638 }
639
640 DRIVER_ERROR LJZjs::VerifyPenInfo()
641 {
642
643     ePen = BOTH_PENS;
644     return NO_ERROR;
645 }
646
647 DRIVER_ERROR LJZjs::ParsePenInfo (PEN_TYPE& ePen, BOOL QueryPrinter)
648 {
649
650     ePen = BOTH_PENS;
651
652     return NO_ERROR;
653 }
654
655 APDK_END_NAMESPACE
656
657 #endif  // defined APDK_LJZJS_MONO || defined APDK_LJZJS_COLOR || defined APDK_LJM1005