152a38012Sejakowatz /*
252a38012Sejakowatz * Lips4.cpp
352a38012Sejakowatz * Copyright 1999-2000 Y.Takagi. All Rights Reserved.
452a38012Sejakowatz */
552a38012Sejakowatz
6a6cd1edfSWim van der Meer
7a6cd1edfSWim van der Meer #include "Lips4Cap.h"
8a6cd1edfSWim van der Meer
9*fdc8b001SNiels Sascha Reedijk #include <vector>
10a6cd1edfSWim van der Meer
1152a38012Sejakowatz #include <Alert.h>
1252a38012Sejakowatz #include <Bitmap.h>
1352a38012Sejakowatz #include <File.h>
14a6cd1edfSWim van der Meer
15a6cd1edfSWim van der Meer #include "DbgMsg.h"
16a6cd1edfSWim van der Meer #include "Halftone.h"
17a6cd1edfSWim van der Meer #include "JobData.h"
1852a38012Sejakowatz #include "Lips4.h"
1952a38012Sejakowatz #include "PackBits.h"
2052a38012Sejakowatz #include "PrinterData.h"
2152a38012Sejakowatz #include "ValidRect.h"
2252a38012Sejakowatz
2352a38012Sejakowatz
LIPS4Driver(BMessage * message,PrinterData * printerData,const PrinterCap * printerCap)24fefd3ba5SMichael Pfeiffer LIPS4Driver::LIPS4Driver(BMessage* message, PrinterData* printerData,
25fefd3ba5SMichael Pfeiffer const PrinterCap* printerCap)
26a6cd1edfSWim van der Meer :
27fefd3ba5SMichael Pfeiffer GraphicsDriver(message, printerData, printerCap),
28fefd3ba5SMichael Pfeiffer fHalftone(NULL)
2952a38012Sejakowatz {
3052a38012Sejakowatz }
3152a38012Sejakowatz
32a6cd1edfSWim van der Meer
33a6cd1edfSWim van der Meer bool
StartDocument()34fefd3ba5SMichael Pfeiffer LIPS4Driver::StartDocument()
3552a38012Sejakowatz {
3652a38012Sejakowatz try {
37fefd3ba5SMichael Pfeiffer _BeginTextMode();
38fefd3ba5SMichael Pfeiffer _JobStart();
39fefd3ba5SMichael Pfeiffer _ColorModeDeclaration();
40fefd3ba5SMichael Pfeiffer _SoftReset();
41fefd3ba5SMichael Pfeiffer _SizeUnitMode();
42fefd3ba5SMichael Pfeiffer _SelectSizeUnit();
43fefd3ba5SMichael Pfeiffer _PaperFeedMode();
44fefd3ba5SMichael Pfeiffer _SelectPageFormat();
45fefd3ba5SMichael Pfeiffer _DisableAutoFF();
46fefd3ba5SMichael Pfeiffer _SetNumberOfCopies();
47fefd3ba5SMichael Pfeiffer _SidePrintingControl();
48fefd3ba5SMichael Pfeiffer _SetBindingMargin();
494410ee12SMichael Pfeiffer fHalftone = new Halftone(GetJobData()->GetSurfaceType(),
504410ee12SMichael Pfeiffer GetJobData()->GetGamma(), GetJobData()->GetInkDensity(),
514410ee12SMichael Pfeiffer GetJobData()->GetDitherType());
5252a38012Sejakowatz return true;
5352a38012Sejakowatz }
5452a38012Sejakowatz catch (TransportException& err) {
5552a38012Sejakowatz return false;
5652a38012Sejakowatz }
5752a38012Sejakowatz }
5852a38012Sejakowatz
59a6cd1edfSWim van der Meer
60a6cd1edfSWim van der Meer bool
StartPage(int)61fefd3ba5SMichael Pfeiffer LIPS4Driver::StartPage(int)
6252a38012Sejakowatz {
6352a38012Sejakowatz try {
64d2c03b1bSMichael Pfeiffer fCurrentX = 0;
65d2c03b1bSMichael Pfeiffer fCurrentY = 0;
66fefd3ba5SMichael Pfeiffer _MemorizedPosition();
6752a38012Sejakowatz return true;
6852a38012Sejakowatz }
6952a38012Sejakowatz catch (TransportException& err) {
7052a38012Sejakowatz return false;
7152a38012Sejakowatz }
7252a38012Sejakowatz }
7352a38012Sejakowatz
74a6cd1edfSWim van der Meer
75a6cd1edfSWim van der Meer bool
EndPage(int)76fefd3ba5SMichael Pfeiffer LIPS4Driver::EndPage(int)
7752a38012Sejakowatz {
7852a38012Sejakowatz try {
79fefd3ba5SMichael Pfeiffer _FormFeed();
8052a38012Sejakowatz return true;
8152a38012Sejakowatz }
8252a38012Sejakowatz catch (TransportException& err) {
8352a38012Sejakowatz return false;
8452a38012Sejakowatz }
8552a38012Sejakowatz }
8652a38012Sejakowatz
87a6cd1edfSWim van der Meer
88a6cd1edfSWim van der Meer bool
EndDocument(bool)89fefd3ba5SMichael Pfeiffer LIPS4Driver::EndDocument(bool)
9052a38012Sejakowatz {
9152a38012Sejakowatz try {
92a6cd1edfSWim van der Meer if (fHalftone)
93d2c03b1bSMichael Pfeiffer delete fHalftone;
94a6cd1edfSWim van der Meer
95fefd3ba5SMichael Pfeiffer _JobEnd();
9652a38012Sejakowatz return true;
9752a38012Sejakowatz }
9852a38012Sejakowatz catch (TransportException& err) {
9952a38012Sejakowatz return false;
10052a38012Sejakowatz }
10152a38012Sejakowatz }
10252a38012Sejakowatz
103a6cd1edfSWim van der Meer
104a6cd1edfSWim van der Meer bool
NextBand(BBitmap * bitmap,BPoint * offset)105fefd3ba5SMichael Pfeiffer LIPS4Driver::NextBand(BBitmap* bitmap, BPoint* offset)
10652a38012Sejakowatz {
10752a38012Sejakowatz DBGMSG(("> nextBand\n"));
10852a38012Sejakowatz
10952a38012Sejakowatz try {
11052a38012Sejakowatz
11152a38012Sejakowatz if (bitmap == NULL) {
11252a38012Sejakowatz uchar dummy[1];
11352a38012Sejakowatz dummy[0] = '\0';
114fefd3ba5SMichael Pfeiffer _RasterGraphics(1, 1, 1, 0, dummy);
11552a38012Sejakowatz DBGMSG(("< next_band\n"));
11652a38012Sejakowatz return true;
11752a38012Sejakowatz }
11852a38012Sejakowatz
11952a38012Sejakowatz BRect bounds = bitmap->Bounds();
12052a38012Sejakowatz
12152a38012Sejakowatz RECT rc;
12252a38012Sejakowatz rc.left = (int)bounds.left;
12352a38012Sejakowatz rc.top = (int)bounds.top;
12452a38012Sejakowatz rc.right = (int)bounds.right;
12552a38012Sejakowatz rc.bottom = (int)bounds.bottom;
12652a38012Sejakowatz
12752a38012Sejakowatz int height = rc.bottom - rc.top + 1;
12852a38012Sejakowatz
12952a38012Sejakowatz int x = (int)offset->x;
13052a38012Sejakowatz int y = (int)offset->y;
13152a38012Sejakowatz
132fefd3ba5SMichael Pfeiffer int page_height = GetPageHeight();
13352a38012Sejakowatz
134a6cd1edfSWim van der Meer if (y + height > page_height)
13552a38012Sejakowatz height = page_height - y;
13652a38012Sejakowatz
13752a38012Sejakowatz rc.bottom = height - 1;
13852a38012Sejakowatz
13952a38012Sejakowatz DBGMSG(("height = %d\n", height));
14052a38012Sejakowatz DBGMSG(("x = %d\n", x));
14152a38012Sejakowatz DBGMSG(("y = %d\n", y));
14252a38012Sejakowatz
143d2c03b1bSMichael Pfeiffer if (get_valid_rect(bitmap, &rc)) {
14452a38012Sejakowatz
14552a38012Sejakowatz DBGMSG(("validate rect = %d, %d, %d, %d\n",
14652a38012Sejakowatz rc.left, rc.top, rc.right, rc.bottom));
14752a38012Sejakowatz
14852a38012Sejakowatz x = rc.left;
14952a38012Sejakowatz y += rc.top;
15052a38012Sejakowatz
15152a38012Sejakowatz int width = rc.right - rc.left + 1;
15252a38012Sejakowatz int widthByte = (width + 7) / 8;
15352a38012Sejakowatz int height = rc.bottom - rc.top + 1;
15452a38012Sejakowatz int in_size = widthByte * height;
15552a38012Sejakowatz int out_size = (in_size * 6 + 4) / 5;
15652a38012Sejakowatz int delta = bitmap->BytesPerRow();
15752a38012Sejakowatz
15852a38012Sejakowatz DBGMSG(("width = %d\n", width));
15952a38012Sejakowatz DBGMSG(("widthByte = %d\n", widthByte));
16052a38012Sejakowatz DBGMSG(("height = %d\n", height));
16152a38012Sejakowatz DBGMSG(("in_size = %d\n", in_size));
16252a38012Sejakowatz DBGMSG(("out_size = %d\n", out_size));
16352a38012Sejakowatz DBGMSG(("delta = %d\n", delta));
1644410ee12SMichael Pfeiffer DBGMSG(("fHalftone_engine->Get_pixel_depth() = %d\n",
1654410ee12SMichael Pfeiffer fHalftone->GetPixelDepth()));
16652a38012Sejakowatz
167a6cd1edfSWim van der Meer uchar* ptr = static_cast<uchar*>(bitmap->Bits())
16852a38012Sejakowatz + rc.top * delta
1694410ee12SMichael Pfeiffer + (rc.left * fHalftone->GetPixelDepth()) / 8;
17052a38012Sejakowatz
17152a38012Sejakowatz int compression_method;
17252a38012Sejakowatz int compressed_size;
17352a38012Sejakowatz const uchar* buffer;
17452a38012Sejakowatz
175*fdc8b001SNiels Sascha Reedijk std::vector<uchar> in_buffer(in_size);
176*fdc8b001SNiels Sascha Reedijk std::vector<uchar> out_buffer(out_size);
17752a38012Sejakowatz
178*fdc8b001SNiels Sascha Reedijk uchar* ptr2 = &in_buffer[0];
17952a38012Sejakowatz
18052a38012Sejakowatz DBGMSG(("move\n"));
18152a38012Sejakowatz
182fefd3ba5SMichael Pfeiffer _Move(x, y);
18352a38012Sejakowatz
18452a38012Sejakowatz for (int i = rc.top; i <= rc.bottom; i++) {
1854410ee12SMichael Pfeiffer fHalftone->Dither(ptr2, ptr, x, y, width);
18652a38012Sejakowatz ptr += delta;
18752a38012Sejakowatz ptr2 += widthByte;
18852a38012Sejakowatz y++;
18952a38012Sejakowatz }
19052a38012Sejakowatz
19152a38012Sejakowatz DBGMSG(("PackBits\n"));
19252a38012Sejakowatz
193*fdc8b001SNiels Sascha Reedijk compressed_size = pack_bits(&out_buffer[0], &in_buffer[0], in_size);
19452a38012Sejakowatz
19552a38012Sejakowatz if (compressed_size < in_size) {
19652a38012Sejakowatz compression_method = 11;
197*fdc8b001SNiels Sascha Reedijk buffer = &out_buffer[0];
19852a38012Sejakowatz } else if (compressed_size > out_size) {
19952a38012Sejakowatz BAlert* alert = new BAlert("memory overrun!!!", "warning", "OK");
200aed35104SHumdinger alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
20152a38012Sejakowatz alert->Go();
20252a38012Sejakowatz return false;
20352a38012Sejakowatz } else {
20452a38012Sejakowatz compression_method = 0;
205*fdc8b001SNiels Sascha Reedijk buffer = &in_buffer[0];
20652a38012Sejakowatz compressed_size = in_size;
20752a38012Sejakowatz }
20852a38012Sejakowatz
20952a38012Sejakowatz DBGMSG(("compressed_size = %d\n", compressed_size));
21052a38012Sejakowatz DBGMSG(("widthByte = %d\n", widthByte));
21152a38012Sejakowatz DBGMSG(("height = %d\n", height));
21252a38012Sejakowatz DBGMSG(("compression_method = %d\n", compression_method));
21352a38012Sejakowatz
214fefd3ba5SMichael Pfeiffer _RasterGraphics(
21552a38012Sejakowatz compressed_size, // size,
21652a38012Sejakowatz widthByte, // widthByte
21752a38012Sejakowatz height, // height,
21852a38012Sejakowatz compression_method,
21952a38012Sejakowatz buffer);
22052a38012Sejakowatz
221a6cd1edfSWim van der Meer } else
22252a38012Sejakowatz DBGMSG(("band bitmap is clean.\n"));
22352a38012Sejakowatz
22452a38012Sejakowatz if (y >= page_height) {
22552a38012Sejakowatz offset->x = -1.0;
22652a38012Sejakowatz offset->y = -1.0;
227a6cd1edfSWim van der Meer } else
22852a38012Sejakowatz offset->y += height;
22952a38012Sejakowatz
23052a38012Sejakowatz DBGMSG(("< nextBand\n"));
23152a38012Sejakowatz return true;
23252a38012Sejakowatz }
23352a38012Sejakowatz catch (TransportException& err) {
2344410ee12SMichael Pfeiffer BAlert* alert = new BAlert("", err.What(), "OK");
235aed35104SHumdinger alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
23652a38012Sejakowatz alert->Go();
23752a38012Sejakowatz return false;
23852a38012Sejakowatz }
23952a38012Sejakowatz }
24052a38012Sejakowatz
241a6cd1edfSWim van der Meer
242a6cd1edfSWim van der Meer void
_BeginTextMode()243fefd3ba5SMichael Pfeiffer LIPS4Driver::_BeginTextMode()
24452a38012Sejakowatz {
245fefd3ba5SMichael Pfeiffer WriteSpoolString("\033%%@");
24652a38012Sejakowatz }
24752a38012Sejakowatz
248a6cd1edfSWim van der Meer
249a6cd1edfSWim van der Meer void
_JobStart()250fefd3ba5SMichael Pfeiffer LIPS4Driver::_JobStart()
25152a38012Sejakowatz {
2524410ee12SMichael Pfeiffer WriteSpoolString("\033P41;%d;1J\033\\", GetJobData()->GetXres());
25352a38012Sejakowatz }
25452a38012Sejakowatz
255a6cd1edfSWim van der Meer
256a6cd1edfSWim van der Meer void
_ColorModeDeclaration()257fefd3ba5SMichael Pfeiffer LIPS4Driver::_ColorModeDeclaration()
25852a38012Sejakowatz {
25952a38012Sejakowatz // if (color)
260fefd3ba5SMichael Pfeiffer // WriteSpoolString("\033[1\"p");
26152a38012Sejakowatz // else
262fefd3ba5SMichael Pfeiffer WriteSpoolString("\033[0\"p");
26352a38012Sejakowatz }
26452a38012Sejakowatz
265a6cd1edfSWim van der Meer
266a6cd1edfSWim van der Meer void
_SoftReset()267fefd3ba5SMichael Pfeiffer LIPS4Driver::_SoftReset()
26852a38012Sejakowatz {
269fefd3ba5SMichael Pfeiffer WriteSpoolString("\033<");
27052a38012Sejakowatz }
27152a38012Sejakowatz
272a6cd1edfSWim van der Meer
273a6cd1edfSWim van der Meer void
_SizeUnitMode()274fefd3ba5SMichael Pfeiffer LIPS4Driver::_SizeUnitMode()
27552a38012Sejakowatz {
276fefd3ba5SMichael Pfeiffer WriteSpoolString("\033[11h");
27752a38012Sejakowatz }
27852a38012Sejakowatz
279a6cd1edfSWim van der Meer
280a6cd1edfSWim van der Meer void
_SelectSizeUnit()281fefd3ba5SMichael Pfeiffer LIPS4Driver::_SelectSizeUnit()
28252a38012Sejakowatz {
2834410ee12SMichael Pfeiffer WriteSpoolString("\033[?7;%d I", GetJobData()->GetXres());
28452a38012Sejakowatz }
28552a38012Sejakowatz
286a6cd1edfSWim van der Meer
287a6cd1edfSWim van der Meer void
_PaperFeedMode()288fefd3ba5SMichael Pfeiffer LIPS4Driver::_PaperFeedMode()
28952a38012Sejakowatz {
29052a38012Sejakowatz // 0 auto
29152a38012Sejakowatz // --------------
29252a38012Sejakowatz // 1 MP tray
29352a38012Sejakowatz // 2 lower
29452a38012Sejakowatz // 3 lupper
29552a38012Sejakowatz // --------------
29652a38012Sejakowatz // 10 MP tray
29752a38012Sejakowatz // 11 casette 1
29852a38012Sejakowatz // 12 casette 2
29952a38012Sejakowatz // 13 casette 3
30052a38012Sejakowatz // 14 casette 4
30152a38012Sejakowatz // 15 casette 5
30252a38012Sejakowatz // 16 casette 6
30352a38012Sejakowatz // 17 casette 7
30452a38012Sejakowatz
30552a38012Sejakowatz int i;
30652a38012Sejakowatz
3074410ee12SMichael Pfeiffer switch (GetJobData()->GetPaperSource()) {
308d2c03b1bSMichael Pfeiffer case JobData::kManual:
30952a38012Sejakowatz i = 10;
31052a38012Sejakowatz break;
311d2c03b1bSMichael Pfeiffer case JobData::kUpper:
31252a38012Sejakowatz i = 11;
31352a38012Sejakowatz break;
314d2c03b1bSMichael Pfeiffer case JobData::kMiddle:
31552a38012Sejakowatz i = 12;
31652a38012Sejakowatz break;
317d2c03b1bSMichael Pfeiffer case JobData::kLower:
31852a38012Sejakowatz i = 13;
31952a38012Sejakowatz break;
320d2c03b1bSMichael Pfeiffer case JobData::kAuto:
32152a38012Sejakowatz default:
32252a38012Sejakowatz i = 0;
32352a38012Sejakowatz break;
32452a38012Sejakowatz }
32552a38012Sejakowatz
326fefd3ba5SMichael Pfeiffer WriteSpoolString("\033[%dq", i);
32752a38012Sejakowatz }
32852a38012Sejakowatz
329a6cd1edfSWim van der Meer
330a6cd1edfSWim van der Meer void
_SelectPageFormat()331fefd3ba5SMichael Pfeiffer LIPS4Driver::_SelectPageFormat()
33252a38012Sejakowatz {
33352a38012Sejakowatz int i;
33452a38012Sejakowatz
3354410ee12SMichael Pfeiffer switch (GetJobData()->GetPaper()) {
336d2c03b1bSMichael Pfeiffer case JobData::kA3:
33752a38012Sejakowatz i = 12;
33852a38012Sejakowatz break;
33952a38012Sejakowatz
340d2c03b1bSMichael Pfeiffer case JobData::kA4:
34152a38012Sejakowatz i = 14;
34252a38012Sejakowatz break;
34352a38012Sejakowatz
344d2c03b1bSMichael Pfeiffer case JobData::kA5:
34552a38012Sejakowatz i = 16;
34652a38012Sejakowatz break;
34752a38012Sejakowatz
348d2c03b1bSMichael Pfeiffer case JobData::kJapanesePostcard:
34952a38012Sejakowatz i = 18;
35052a38012Sejakowatz break;
35152a38012Sejakowatz
352d2c03b1bSMichael Pfeiffer case JobData::kB4:
35352a38012Sejakowatz i = 24;
35452a38012Sejakowatz break;
35552a38012Sejakowatz
356d2c03b1bSMichael Pfeiffer case JobData::kB5:
35752a38012Sejakowatz i = 26;
35852a38012Sejakowatz break;
35952a38012Sejakowatz
360d2c03b1bSMichael Pfeiffer case JobData::kLetter:
36152a38012Sejakowatz i = 30;
36252a38012Sejakowatz break;
36352a38012Sejakowatz
364d2c03b1bSMichael Pfeiffer case JobData::kLegal:
36552a38012Sejakowatz i = 32;
36652a38012Sejakowatz break;
36752a38012Sejakowatz
368d2c03b1bSMichael Pfeiffer case JobData::kExecutive:
36952a38012Sejakowatz i = 40;
37052a38012Sejakowatz break;
37152a38012Sejakowatz
372d2c03b1bSMichael Pfeiffer case JobData::kJEnvYou4:
37352a38012Sejakowatz i = 50;
37452a38012Sejakowatz break;
37552a38012Sejakowatz
376d2c03b1bSMichael Pfeiffer case JobData::kUser:
37752a38012Sejakowatz i = 90;
37852a38012Sejakowatz break;
37952a38012Sejakowatz
38052a38012Sejakowatz default:
38152a38012Sejakowatz i = 0;
38252a38012Sejakowatz break;
38352a38012Sejakowatz }
38452a38012Sejakowatz
3854410ee12SMichael Pfeiffer if (JobData::kLandscape == GetJobData()->GetOrientation())
38652a38012Sejakowatz i++;
38752a38012Sejakowatz
388fefd3ba5SMichael Pfeiffer WriteSpoolString("\033[%d;;p", i);
38952a38012Sejakowatz }
39052a38012Sejakowatz
391a6cd1edfSWim van der Meer
392a6cd1edfSWim van der Meer void
_DisableAutoFF()393fefd3ba5SMichael Pfeiffer LIPS4Driver::_DisableAutoFF()
39452a38012Sejakowatz {
395fefd3ba5SMichael Pfeiffer WriteSpoolString("\033[?2h");
39652a38012Sejakowatz }
39752a38012Sejakowatz
398a6cd1edfSWim van der Meer
399a6cd1edfSWim van der Meer void
_SetNumberOfCopies()400fefd3ba5SMichael Pfeiffer LIPS4Driver::_SetNumberOfCopies()
40152a38012Sejakowatz {
4024410ee12SMichael Pfeiffer WriteSpoolString("\033[%ldv", GetJobData()->GetCopies());
40352a38012Sejakowatz }
40452a38012Sejakowatz
405a6cd1edfSWim van der Meer
406a6cd1edfSWim van der Meer void
_SidePrintingControl()407fefd3ba5SMichael Pfeiffer LIPS4Driver::_SidePrintingControl()
40852a38012Sejakowatz {
4094410ee12SMichael Pfeiffer if (GetJobData()->GetPrintStyle() == JobData::kSimplex)
410fefd3ba5SMichael Pfeiffer WriteSpoolString("\033[0#x");
41152a38012Sejakowatz else
412fefd3ba5SMichael Pfeiffer WriteSpoolString("\033[2;0#x");
41352a38012Sejakowatz }
41452a38012Sejakowatz
415a6cd1edfSWim van der Meer
416a6cd1edfSWim van der Meer void
_SetBindingMargin()417fefd3ba5SMichael Pfeiffer LIPS4Driver::_SetBindingMargin()
41852a38012Sejakowatz {
4194410ee12SMichael Pfeiffer if (GetJobData()->GetPrintStyle() == JobData::kDuplex) {
42052a38012Sejakowatz int i;
42152a38012Sejakowatz // switch (job_data()->binding_location()) {
422d2c03b1bSMichael Pfeiffer // case kLongEdgeLeft:
42352a38012Sejakowatz i = 0;
42452a38012Sejakowatz // break;
425d2c03b1bSMichael Pfeiffer // case kLongEdgeRight:
42652a38012Sejakowatz // i = 1;
42752a38012Sejakowatz // break;
428d2c03b1bSMichael Pfeiffer // case kShortEdgeTop:
42952a38012Sejakowatz // i = 2;
43052a38012Sejakowatz // break;
431d2c03b1bSMichael Pfeiffer // case kShortEdgeBottom:
43252a38012Sejakowatz // i = 3;
43352a38012Sejakowatz // break;
43452a38012Sejakowatz // }
435fefd3ba5SMichael Pfeiffer WriteSpoolString("\033[%d;0#w", i);
43652a38012Sejakowatz }
43752a38012Sejakowatz }
43852a38012Sejakowatz
439a6cd1edfSWim van der Meer
440a6cd1edfSWim van der Meer void
_MemorizedPosition()441fefd3ba5SMichael Pfeiffer LIPS4Driver::_MemorizedPosition()
44252a38012Sejakowatz {
443fefd3ba5SMichael Pfeiffer WriteSpoolString("\033[0;1;0x");
44452a38012Sejakowatz }
44552a38012Sejakowatz
446a6cd1edfSWim van der Meer
447a6cd1edfSWim van der Meer void
_MoveAbsoluteHorizontal(int x)448fefd3ba5SMichael Pfeiffer LIPS4Driver::_MoveAbsoluteHorizontal(int x)
44952a38012Sejakowatz {
450fefd3ba5SMichael Pfeiffer WriteSpoolString("\033[%ld`", x);
45152a38012Sejakowatz }
45252a38012Sejakowatz
453a6cd1edfSWim van der Meer
454a6cd1edfSWim van der Meer void
_CarriageReturn()455fefd3ba5SMichael Pfeiffer LIPS4Driver::_CarriageReturn()
45652a38012Sejakowatz {
457fefd3ba5SMichael Pfeiffer WriteSpoolChar('\x0d');
45852a38012Sejakowatz }
45952a38012Sejakowatz
460a6cd1edfSWim van der Meer
461a6cd1edfSWim van der Meer void
_MoveDown(int dy)462fefd3ba5SMichael Pfeiffer LIPS4Driver::_MoveDown(int dy)
46352a38012Sejakowatz {
464fefd3ba5SMichael Pfeiffer WriteSpoolString("\033[%lde", dy);
46552a38012Sejakowatz }
46652a38012Sejakowatz
467a6cd1edfSWim van der Meer
468a6cd1edfSWim van der Meer void
_RasterGraphics(int compression_size,int widthbyte,int height,int compression_method,const uchar * buffer)469fefd3ba5SMichael Pfeiffer LIPS4Driver::_RasterGraphics(int compression_size, int widthbyte, int height,
470a6cd1edfSWim van der Meer int compression_method, const uchar* buffer)
47152a38012Sejakowatz {
47252a38012Sejakowatz // 0 RAW
47352a38012Sejakowatz // 10 RLE
47452a38012Sejakowatz // 11 packbits
47552a38012Sejakowatz
476fefd3ba5SMichael Pfeiffer WriteSpoolString(
47752a38012Sejakowatz "\033[%ld;%ld;%d;%ld;%ld.r",
47852a38012Sejakowatz compression_size,
47952a38012Sejakowatz widthbyte,
4804410ee12SMichael Pfeiffer GetJobData()->GetXres(),
48152a38012Sejakowatz compression_method,
48252a38012Sejakowatz height);
48352a38012Sejakowatz
484fefd3ba5SMichael Pfeiffer WriteSpoolData(buffer, compression_size);
48552a38012Sejakowatz }
48652a38012Sejakowatz
487a6cd1edfSWim van der Meer
488a6cd1edfSWim van der Meer void
_FormFeed()489fefd3ba5SMichael Pfeiffer LIPS4Driver::_FormFeed()
49052a38012Sejakowatz {
491fefd3ba5SMichael Pfeiffer WriteSpoolChar('\014');
49252a38012Sejakowatz }
49352a38012Sejakowatz
494a6cd1edfSWim van der Meer
495a6cd1edfSWim van der Meer void
_JobEnd()496fefd3ba5SMichael Pfeiffer LIPS4Driver::_JobEnd()
49752a38012Sejakowatz {
498fefd3ba5SMichael Pfeiffer WriteSpoolString("\033P0J\033\\");
49952a38012Sejakowatz }
50052a38012Sejakowatz
501a6cd1edfSWim van der Meer
502a6cd1edfSWim van der Meer void
_Move(int x,int y)503fefd3ba5SMichael Pfeiffer LIPS4Driver::_Move(int x, int y)
50452a38012Sejakowatz {
505d2c03b1bSMichael Pfeiffer if (fCurrentX != x) {
50652a38012Sejakowatz if (x) {
507fefd3ba5SMichael Pfeiffer _MoveAbsoluteHorizontal(x);
50852a38012Sejakowatz } else {
509fefd3ba5SMichael Pfeiffer _CarriageReturn();
51052a38012Sejakowatz }
511d2c03b1bSMichael Pfeiffer fCurrentX = x;
51252a38012Sejakowatz }
513d2c03b1bSMichael Pfeiffer if (fCurrentY != y) {
514d2c03b1bSMichael Pfeiffer int dy = y - fCurrentY;
515fefd3ba5SMichael Pfeiffer _MoveDown(dy);
516d2c03b1bSMichael Pfeiffer fCurrentY = y;
51752a38012Sejakowatz }
51852a38012Sejakowatz }
519