xref: /haiku/src/add-ons/print/drivers/canon_lips/lips4/Lips4.cpp (revision fdc8b001a93d7a165a760089237b6d03c353c3fd)
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