1 /*****************************************************************************\
2 LJZjStream.cpp : Implementation for the LJZjStream class
4 Copyright (c) 1996 - 2009, Hewlett-Packard Co.
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions
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.
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.
30 Author: Naga Samrat Chowdary Narla,
31 \*****************************************************************************/
33 #include "CommonDefinitions.h"
35 #include "Encapsulator.h"
36 #include "ColorMatcher.h"
37 #include "Halftoner.h"
39 #include "resources.h"
40 #include "ColorMaps.h"
41 #include "PrinterCommands.h"
42 #include "LJZjStream.h"
44 #include "hpjbig_wrapper.h"
46 #define ZJC_BAND_HEIGHT 100
48 LJZjStream::LJZjStream () : Encapsulator ()
50 memset(&m_PM, 0, sizeof(m_PM));
51 strcpy(m_szLanguage, "ZJS");
56 LJZjStream::~LJZjStream()
60 DRIVER_ERROR LJZjStream::addJobSettings()
62 BYTE cItems[3] = {ZJI_DMCOLLATE, ZJI_PAGECOUNT, ZJI_DMDUPLEX};
64 addToHeader("%s", "@PJL ENTER LANGUAGE=ZJS\x0AJZJZ");
65 BYTE *p = cur_pcl_buffer_ptr;
67 if (m_pJA->e_duplex_mode == DUPLEXMODE_NONE)
87 for (int j = 0; j < nItems; j++)
91 p[i + 6] = ZJIT_UINT32;
95 cur_pcl_buffer_ptr += i;
96 DRIVER_ERROR err = Cleanup();
100 DRIVER_ERROR LJZjStream::Configure(Pipeline **pipeline)
106 ColorMatcher *pColorMatcher;
107 Halftoner *pHalftoner;
108 int iRows[MAXCOLORPLANES];
109 unsigned int uiResBoost;
113 * I need a flag in the printmode structure to whether create a CMYGraymap
114 * and set the ulMap1 to it.
117 m_PM.BaseResX = m_pQA->horizontal_resolution;
118 m_PM.BaseResY = m_pQA->vertical_resolution;
120 m_PM.MixedRes = false;
121 m_PM.BlackFEDTable = HTBinary_open;
122 if (m_pJA->color_mode == 0)
124 m_PM.cmap.ulMap1 = NULL;
125 m_PM.cmap.ulMap2 = NULL;
126 m_PM.cmap.ulMap3 = ucMapDJ4100_KCMY_Photo_BestA_12x12x1;
128 m_PM.ColorFEDTable = HT1200x1200x1PhotoBest_open;
132 m_PM.cmap.ulMap1 = ulMapDJ600_CCM_K;
134 m_PM.ColorFEDTable = HTBinary_open;
137 for (int i = 0; i < MAXCOLORPLANES; i++)
139 m_PM.ColorDepth[i] = 1;
140 m_PM.ResolutionX[i] = m_pQA->horizontal_resolution;
141 m_PM.ResolutionY[i] = m_pQA->vertical_resolution;
142 iRows[i] = m_PM.ResolutionX[i] / m_PM.BaseResX;
145 uiResBoost = m_PM.BaseResX / m_PM.BaseResY;
149 width = m_pMA->printable_width;
151 pColorMatcher = new ColorMatcher(m_PM.cmap, m_PM.dyeCount, width);
152 head = new Pipeline(pColorMatcher);
153 pHalftoner = new Halftoner (&m_PM, width, iRows, uiResBoost, m_PM.eHT == MATRIX);
154 p = new Pipeline(pHalftoner);
156 m_pModeJbig = new ModeJbig(width);
157 p = new Pipeline(m_pModeJbig);
159 m_pModeJbig->myplane = COLORTYPE_COLOR;
163 int height = m_pMA->printable_height;
164 ZJPLATFORM ezj_platform = ZJSTREAM;
165 if (!strcmp(m_pJA->printer_platform, "ljzjscolor"))
168 ezj_platform = ZJCOLOR;
169 if (m_pJA->color_mode == 0)
173 height = ZJC_BAND_HEIGHT;
175 if(m_pJA->printer_platform_version == 2)
177 height = m_pMA->printable_height;
178 ezj_platform = ZJCOLOR2;
181 err = m_pModeJbig->Init(height, m_iPlanes, m_iBpp, ezj_platform);
187 DRIVER_ERROR LJZjStream::StartPage_ljzjcolor2 (JobAttributes *pJA)
189 DWORD dwNumItems = 13;
190 BYTE szStr[16 + 12 * 13];
193 i = SendChunkHeader (szStr, 16 + dwNumItems * 12, ZJT_START_PAGE, dwNumItems);
194 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE, m_iPlanes);
195 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMPAPER, m_pMA->pcl_id);
196 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMCOPIES, 1);
197 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMDEFAULTSOURCE, m_pJA->media_source);
198 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMMEDIATYPE, m_pQA->media_type);
199 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_NBIE, m_iPlanes);
200 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RESOLUTION_X, m_pQA->horizontal_resolution);
201 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RESOLUTION_Y, m_pQA->vertical_resolution);
202 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RASTER_X, (((m_pMA->printable_width + 31) / 32) * 32) * m_iBpp);
203 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RASTER_Y, m_pMA->printable_height);
204 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_BPP, m_iBpp);
205 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_X, (((m_pMA->printable_width + 31) / 32) * 32));
206 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_Y, m_pMA->printable_height);
207 return Send ((const BYTE *) szStr, i);
210 DRIVER_ERROR LJZjStream::StartPage (JobAttributes *pJA)
212 DRIVER_ERROR err = NO_ERROR;
213 DWORD dwNumItems = 15;
214 BYTE szStr[16 + 16 * 12];
220 if((strcmp(m_pJA->printer_platform, "ljzjscolor") == 0) && (m_pJA->printer_platform_version == 2))
222 return StartPage_ljzjcolor2(pJA);
226 if (m_pJA->e_duplex_mode == DUPLEXMODE_NONE)
235 width = ((m_pMA->printable_width + 31) / 32) * 32;
236 if (m_pJA->color_mode == 0)
240 i += SendChunkHeader (szStr, 16 + dwNumItems * 12, ZJT_START_PAGE, dwNumItems);
241 if (m_pJA->color_mode == 0)
243 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE, m_iPlanes);
246 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMCOPIES, 1);
249 if (m_pJA->e_duplex_mode != DUPLEXMODE_NONE)
252 if (m_pJA->e_duplex_mode == DUPLEXMODE_BOOK)
254 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMDUPLEX, 2);
259 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMDUPLEX, 3);
263 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMMEDIATYPE, m_pQA->media_type);
264 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMPAPER, m_pMA->pcl_id);
265 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_DMDEFAULTSOURCE, m_pJA->media_source);
266 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_NBIE, m_iPlanes);
267 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RESOLUTION_X, m_pQA->horizontal_resolution);
268 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RESOLUTION_Y, m_pQA->vertical_resolution);
269 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RASTER_X, width * m_iBpp);
270 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RASTER_Y, m_pMA->printable_height);
271 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_BPP, m_iBpp);
272 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_X, width);
273 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_Y, m_pMA->printable_height);
274 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_RET, RET_ON);
275 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_TONER_SAVE, (m_pQA->print_quality == -1) ? 1 : 0);
277 err = sendBuffer ((const BYTE *) szStr, i);
281 DRIVER_ERROR LJZjStream::sendBlankBands()
283 if (strcmp(m_pJA->printer_platform, "ljzjscolor"))
287 if(m_pJA->printer_platform_version == 2)
291 DRIVER_ERROR err = NO_ERROR;
292 int remaining_rasters = m_pMA->printable_height - m_iCurRaster;
293 int num_planes = (m_pJA->color_mode == 0) ? 4 : 1;
294 if (remaining_rasters <= 0)
299 RASTERDATA raster_data;
300 if (remaining_rasters < ZJC_BAND_HEIGHT)
302 memset(&raster_data, 0, sizeof(raster_data));
303 m_pModeJbig->SetBandHeight(remaining_rasters);
304 for (int k = 0; k < num_planes; k++)
306 m_pModeJbig->Flush();
307 m_pModeJbig->NextOutputRaster(raster_data);
308 err = Encapsulate(&raster_data, true);
312 m_pModeJbig->SetBandHeight(ZJC_BAND_HEIGHT);
316 memset(&raster_data, 0, sizeof(raster_data));
317 m_pModeJbig->Process(&raster_data);
318 m_pModeJbig->Flush();
319 m_pModeJbig->NextOutputRaster(raster_data);
320 while (remaining_rasters > 0)
322 for (int k = 0; k < num_planes; k++)
324 err = Encapsulate(&raster_data, true);
330 remaining_rasters -= ZJC_BAND_HEIGHT;
332 if (remaining_rasters <= 0)
337 memset(&raster_data, 0, sizeof(raster_data));
338 m_pModeJbig->SetBandHeight(remaining_rasters);
339 m_pModeJbig->Process(&raster_data);
340 m_pModeJbig->Flush();
341 m_pModeJbig->NextOutputRaster(raster_data);
342 for (int k = 0; k < num_planes; k++)
344 err = Encapsulate(&raster_data, true);
346 m_pModeJbig->SetBandHeight(ZJC_BAND_HEIGHT);
351 DRIVER_ERROR LJZjStream::FormFeed ()
353 DRIVER_ERROR err = NO_ERROR;
357 err = sendBlankBands();
361 if(((strcmp(m_pJA->printer_platform, "ljzjscolor") == 0) && (m_pJA->printer_platform_version == 2)) == 0)
363 SendChunkHeader (szStr, 16, ZJT_END_PAGE, 0);
366 if (!strcmp(m_pJA->printer_platform, "ljzjscolor"))
369 int iCol = (m_pJA->color_mode == 0) ? 1 : 0;
371 memset(szStr, 0, sizeof(szStr));
372 i = SendChunkHeader (szStr, 112, ZJT_END_PAGE, 8);
373 for (int j = 0; j < 8; j++)
375 i += SendItem (szStr+i, ZJIT_UINT32, 0x8200+j, (j % 4 == 3) ? 1 : iCol);
378 if(m_pJA->printer_platform_version == 2)
380 return Send ((const BYTE *) szStr, size);
384 err = sendBuffer ((const BYTE *) szStr, size);
389 DRIVER_ERROR LJZjStream::EndJob()
392 memset(szStr, 0, sizeof(szStr));
394 szStr[7] = ZJT_END_DOC;
397 return this->sendBuffer((const BYTE *) szStr, 16);
400 DRIVER_ERROR LJZjStream::Encapsulate (RASTERDATA *raster, bool bLastPlane)
402 if (raster->rasterdata[COLORTYPE_COLOR] == NULL || raster->rastersize[COLORTYPE_COLOR] == 0)
406 if (!strcmp(m_pJA->printer_platform, "ljzjscolor"))
408 return encapsulateColor(raster);
411 DRIVER_ERROR err = NO_ERROR;
414 int iTotalSize = raster->rastersize[COLORTYPE_COLOR];
416 /* Send JBIG header info */
418 i = SendChunkHeader (szStr, 36, ZJT_JBIG_BIH, 0);
420 memcpy (szStr + 16, raster->rasterdata[COLORTYPE_COLOR], 20);
421 err = sendBuffer ((const BYTE *) szStr, 36);
428 iPadCount = ((iTotalSize / 16 + 1) * 16) - iTotalSize;
430 int dwTotal = iTotalSize;
431 BYTE *p = raster->rasterdata[COLORTYPE_COLOR] + 20;
434 for (int j = 0; j < i; j++)
436 SendChunkHeader (szStr, 16 + 65536, ZJT_JBIG_HID, 0);
437 err = sendBuffer ((const BYTE *) szStr, 16);
439 err = sendBuffer ((const BYTE *) p, 65536);
444 i = SendChunkHeader (szStr, 16 + dwTotal + iPadCount, ZJT_JBIG_HID, 0);
445 err = sendBuffer ((const BYTE *) szStr, 16);
447 err = sendBuffer ((const BYTE *) p, dwTotal);
451 memset (szStr, 0, iPadCount);
452 err = sendBuffer ((const BYTE *) szStr, iPadCount);
454 i = SendChunkHeader (szStr, 16, ZJT_END_JBIG, 0);
456 err = sendBuffer ((const BYTE *) szStr, 16);
461 DRIVER_ERROR LJZjStream::encapsulateColor2 (RASTERDATA *raster)
463 DRIVER_ERROR err = NO_ERROR;
466 int plane[] = {3, 2, 1, 4};
468 if (m_pJA->color_mode == 0)
470 i = SendChunkHeader (szStr, 28, ZJT_START_PLANE, 1);
471 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE, plane[m_iPlaneNumber]);
472 err = Send ((const BYTE *) szStr, i);
476 i += SendChunkHeader (szStr+i, 36, ZJT_JBIG_BIH, 0);
477 err = Send ((const BYTE *) szStr, i);
478 err = Send ((const BYTE *) raster->rasterdata[COLORTYPE_COLOR], 20);
480 BYTE *p = raster->rasterdata[COLORTYPE_COLOR] + 20;
482 DWORD dwTotalSize = raster->rastersize[COLORTYPE_COLOR];
489 iPadCount = ((dwTotalSize / 4 + 1) * 4) - dwTotalSize;
492 DWORD dwMaxChunkSize = 0x10000;
493 DWORD dwCurrentChunkSize = 0;
494 bool bLastChunk = false;
496 for(DWORD dwLoopCount = 0; dwLoopCount < dwTotalSize ; dwLoopCount +=dwMaxChunkSize)
498 memset (szStr, 0, sizeof(szStr));
499 dwCurrentChunkSize = dwMaxChunkSize;
501 if(dwLoopCount + dwCurrentChunkSize > dwTotalSize)
503 dwCurrentChunkSize = dwTotalSize - (dwLoopCount);
508 i = SendChunkHeader (szStr, dwCurrentChunkSize + 16, ZJT_JBIG_HID, 0);
512 i = SendChunkHeader (szStr, dwCurrentChunkSize + 16 + iPadCount, ZJT_JBIG_HID, 0);
514 err = Send ((const BYTE *) szStr, i);
515 err = Send ((const BYTE *) p, dwCurrentChunkSize);
516 p += dwCurrentChunkSize;
520 memset (szStr, 0, iPadCount);
521 err = Send ((const BYTE *) szStr, iPadCount);
525 memset (szStr, 0, sizeof(szStr));
526 i = SendChunkHeader (szStr, 16, ZJT_END_JBIG, 0);
527 if (m_pJA->color_mode == 0)
529 i += SendChunkHeader (szStr+i, 28, ZJT_END_PLANE, 1);
530 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE, plane[m_iPlaneNumber]);
532 err = Send ((const BYTE *) szStr, i);
534 if (m_pJA->color_mode == 0)
537 if (m_iPlaneNumber == 4) m_iPlaneNumber = 0;
542 DRIVER_ERROR LJZjStream::encapsulateColor (RASTERDATA *raster)
544 bool bLastStride = true;
546 DRIVER_ERROR err = NO_ERROR;
550 if (m_pJA->printer_platform_version == 2)
552 return encapsulateColor2(raster);
555 HPLJZjsJbgEncSt *se = (HPLJZjsJbgEncSt *) (raster->rasterdata[COLORTYPE_COLOR] + raster->rastersize[COLORTYPE_COLOR]);
557 if (m_pJA->color_mode == 0)
561 if (m_iPlaneNumber == 0 || m_pJA->color_mode != 0)
562 m_iCurRaster += se->yd;
563 if (m_iCurRaster < m_pMA->printable_height)
570 * Send JBIG header info
573 // Send out the JBIG header if first plane and it hasn't already been sent out yet.
574 if (m_iPlaneNumber == 0 && m_bNotSent)
578 for (int k = 1; k < kEnd; k++)
580 i = SendChunkHeader (szStr, 132, ZJT_BITMAP, 8);
582 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_TYPE, 1);
583 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_PIXELS, se->xd);
584 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_STRIDE, se->xd);
585 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_LINES, se->yd);
586 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_BPP, 1);
587 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_VIDEO_BPP, m_iBpp);
588 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE,
589 (m_pJA->color_mode == 0) ? k : 4);
590 i += SendItemExtra (szStr+i, ZJIT_BYTELUT, ZJI_ENCODING_DATA, 20, 20);
593 szStr[i++] = se->planes;
595 for (int j = 3; j >= 0; j--)
597 szStr[i] = (BYTE) ((se->xd >> (8 * j)) & 0xFF);
598 szStr[4+i] = (BYTE) ((se->yd >> (8 * j)) & 0xFF);
599 szStr[8+i] = (BYTE) ((se->l0 >> (8 * j)) & 0xFF);
606 szStr[i++] = se->order;
607 szStr[i++] = se->options;
608 err = sendBuffer ((const BYTE *) szStr, 132);
613 BYTE *p = raster->rasterdata[COLORTYPE_COLOR] + 20;
617 DWORD dwTotalSize = raster->rastersize[COLORTYPE_COLOR];
624 iPadCount = ((dwTotalSize / 4 + 1) * 4) - dwTotalSize;
627 dwSize = 16 + dwTotalSize + iPadCount;
634 dwSize += (dwNumItems * 12);
635 i = SendChunkHeader (szStr, dwSize, ZJT_BITMAP, dwNumItems);
636 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_PLANE, (kEnd == 5) ? m_iPlaneNumber+1 : 4);
639 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_BITMAP_LINES, se->yd);
640 i += SendItem (szStr+i, ZJIT_UINT32, ZJI_END_PLANE, bLastStride);
642 err = sendBuffer ((const BYTE *) szStr, i);
645 err = sendBuffer ((const BYTE *) p, dwTotalSize);
649 memset (szStr, 0, iPadCount);
650 err = sendBuffer ((const BYTE *) szStr, iPadCount);
653 if (m_pJA->color_mode == 0)
656 if (m_iPlaneNumber == 4)