1 /*****************************************************************************\
2   LJColor.cpp : Implementation of LJColor class
3 
4   Copyright (c) 1996 - 2015, HP 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 HP 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 #include "CommonDefinitions.h"
32 #include "LJColor.h"
33 #include "ColorMatcher.h"
34 #include "Halftoner.h"
35 #include "Mode2.h"
36 #include "Mode3.h"
37 #include "resources.h"
38 #include "ColorMaps.h"
39 #include "PrinterCommands.h"
40 
LJColor()41 LJColor::LJColor() : Encapsulator()
42 {
43     memset(&m_PM, 0, sizeof(m_PM));
44     strcpy(m_szLanguage, "PCL");
45 }
46 
~LJColor()47 LJColor::~LJColor()
48 {
49 }
50 
addJobSettings()51 DRIVER_ERROR LJColor::addJobSettings()
52 {
53     cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
54         "@PJL SET PAGEPROTECT=AUTO\012@PJL SET RESOLUTION=%d\012@PJL SET DENSITY=5\012", m_pQA->horizontal_resolution);
55     if (m_pQA->print_quality == -1)
56     {
57         cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
58         "@PJL SET RET=OFF\012@PJL SET ECONOMODE=ON\012");
59     }
60     if (m_pJA->e_duplex_mode != DUPLEXMODE_NONE)
61     {
62         cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
63             "@PJL SET DUPLEX=ON\012@PJL SET BINDING=%s\012",
64             (m_pJA->e_duplex_mode == DUPLEXMODE_BOOK) ? "LONGEDGE" :
65                                                         "SHORTEDGE");
66     }
67     else
68     {
69         addToHeader("@PJL SET DUPLEX=OFF\012", 19);
70     }
71     cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr, "@PJL ENTER LANGUAGE=PCL\012");
72     sendJobHeader();
73     DRIVER_ERROR err = Cleanup();
74     return err;
75 }
76 
Configure(Pipeline ** pipeline)77 DRIVER_ERROR LJColor::Configure(Pipeline **pipeline)
78 {
79     Pipeline    *p = NULL;
80     Pipeline    *head;
81     unsigned int width;
82     head = *pipeline;
83     width = m_pMA->printable_width;
84 
85 /*
86  *  I need a flag in the printmode structure to whether create a CMYGraymap
87  *  and set the ulMap1 to it.
88  */
89 
90 
91 //  color_mode: 0 - color, 1 - grey_cmy, 2 - grey_k
92 
93     m_PM.BaseResX = m_pQA->horizontal_resolution;
94     m_PM.BaseResY = m_pQA->vertical_resolution;
95     if (m_pJA->color_mode != 0)
96     {
97         ColorMatcher *pColorMatcher;
98         Mode2        *pMode2;
99         int          iRows[MAXCOLORPLANES];
100         unsigned int uiResBoost;
101         m_PM.dyeCount = 1;
102         m_PM.ColorDepth[0] = 1;
103         m_PM.cmap.ulMap1 = ulMapDJ600_CCM_K;
104         m_PM.eHT = FED;
105         m_PM.BlackFEDTable = HTBinary_open;
106         m_PM.ColorFEDTable = HTBinary_open;
107         m_PM.MixedRes = false;
108 
109         for (int i = 0; i < MAXCOLORPLANES; i++)
110         {
111             m_PM.ResolutionX[i] = m_pQA->horizontal_resolution;
112             m_PM.ResolutionY[i] = m_pQA->vertical_resolution;
113             iRows[i] = m_PM.ResolutionX[i] / m_PM.BaseResX;
114         }
115         uiResBoost = m_PM.BaseResX / m_PM.BaseResY;
116         if (uiResBoost == 0)
117             uiResBoost = 1;
118 
119         pColorMatcher = new ColorMatcher(m_PM.cmap, m_PM.dyeCount, width);
120         head = new Pipeline(pColorMatcher);
121         m_pHalftoner = new Halftoner (&m_PM, width, iRows, uiResBoost, m_PM.eHT == MATRIX);
122         p = new Pipeline(m_pHalftoner);
123         head->AddPhase(p);
124         pMode2 = new Mode2(width);
125         p = new Pipeline(pMode2);
126         head->AddPhase(p);
127         pMode2->myplane = COLORTYPE_COLOR;
128     }
129     else
130     {
131         m_pMode3 = new Mode3(width * 3);
132         head = new Pipeline(m_pMode3);
133         m_pMode3->myplane = COLORTYPE_COLOR;
134     }
135 
136     *pipeline = head;
137     return NO_ERROR;
138 }
139 
StartPage(JobAttributes * pJA)140 DRIVER_ERROR LJColor::StartPage(JobAttributes *pJA)
141 {
142     m_pJA = pJA;
143     m_pMA = &pJA->media_attributes;
144     m_pQA = &pJA->quality_attributes;
145     page_number++;
146     return NO_ERROR;
147 }
148 
FormFeed()149 DRIVER_ERROR LJColor::FormFeed()
150 {
151     DRIVER_ERROR    err;
152     err = Cleanup();
153     err = m_pSystemServices->Send((const BYTE *) "\x0C", 1);
154     return err;
155 }
156 
EndJob()157 DRIVER_ERROR LJColor::EndJob()
158 {
159     DRIVER_ERROR    err = NO_ERROR;
160     err = Cleanup();
161     err = m_pSystemServices->Send((const BYTE *) "\x1B*rC", 4);
162     err = m_pSystemServices->Send(Reset, sizeof(Reset));
163     if (err == NO_ERROR)
164         err = m_pSystemServices->Send(UEL, sizeof(UEL));
165     return err;
166 }
167 
Encapsulate(RASTERDATA * InputRaster,bool bLastPlane)168 DRIVER_ERROR LJColor::Encapsulate(RASTERDATA *InputRaster, bool bLastPlane)
169 {
170     DRIVER_ERROR    err = NO_ERROR;
171     char            tmpStr[16];
172     int             iLen;
173     m_iYPos++;
174     iLen = sprintf (tmpStr, "\x1b*b%uW", InputRaster->rastersize[COLORTYPE_COLOR]);
175     err = this->Send((const BYTE *) tmpStr, iLen);
176     if (err == NO_ERROR && InputRaster->rastersize[COLORTYPE_COLOR] > 0)
177     {
178         err = this->Send(InputRaster->rasterdata[COLORTYPE_COLOR],
179                          InputRaster->rastersize[COLORTYPE_COLOR]);
180     }
181 
182 /*
183  *  Printers with low memory (64 MB or less) can run out of memory during decompressing
184  *  the image data and will abort the job. To prevent this, restart raster command.
185  *  Raghu
186  */
187 
188     if (m_pJA->color_mode == 0 &&
189         m_pQA->horizontal_resolution >= 600 &&
190         m_iYPos % 1200 == 0)
191     {
192         // Reset seed our seed row
193         m_pMode3->Flush();
194         err = this->Send ((const BYTE *) "\033*rC\033*r1A\033*b3M", 14);
195     }
196 
197     return err;
198 }
199 
configureRasterData()200 void LJColor::configureRasterData()
201 {
202 
203 /*
204  *  Configure image data - ESC*v#W - # = 6 bytes
205  *  02 - RGB colorspace (00 - Device RGB)
206  *  03 - Direct pixel
207  *  08 - bits per index - ignored for direct pixel
208  *  08, 08, 08 - bits per primary each
209  */
210 
211     addToHeader ((const BYTE *) "\033*v6W\00\03\010\010\010\010", 11);
212 
213 //  Continues tone dither
214 //  Logical operation - 0
215 
216     addToHeader ((const BYTE *) "\033*t18J", 6);
217 
218 /*
219  *  Driver Configuration Command - ESC*#W - # = 3 bytes
220  *  device id - 6 = color HP LaserJet Printer
221  *  func index - 4 = Select Colormap
222  *  argument - 2   = Vivid Graphics
223  */
224 
225     addToHeader ((const BYTE *) "\033*o3W\06\04\06", 8);
226 
227 /*
228  *  Program color palette entries
229  */
230     addToHeader ((const BYTE *) "\033*v255A\033*v255B\033*v255C\033*v0I", 26);
231     addToHeader ((const BYTE *) "\033*v255A\033*v0B\033*v0C\033*v6I", 22);
232     addToHeader ((const BYTE *) "\033*v0A\033*v255B\033*v0C\033*v5I", 22);
233     addToHeader ((const BYTE *) "\033*v0A\033*v0B\033*v255C\033*v3I", 22);
234     addToHeader ((const BYTE *) "\033*v255A\033*v255B\033*v0C\033*v4I", 24);
235     addToHeader ((const BYTE *) "\033*v255A\033*v0B\033*v255C\033*v2I", 24);
236     addToHeader ((const BYTE *) "\033*v0A\033*v255B\033*v255C\033*v1I", 24);
237     addToHeader ((const BYTE *) "\033*v0A\033*v0B\033*v0C\033*v7I", 20);
238 
239 //  Foreground color
240 
241     addToHeader ((const BYTE *) "\033*v7S", 5);
242 }
243 
244