1 /*
2 * GraphicsDriver.h
3 * Copyright 1999-2000 Y.Takagi. All Rights Reserved.
4 */
5
6 #ifndef __GRAPHICSDRIVER_H
7 #define __GRAPHICSDRIVER_H
8
9
10 #include "JobData.h"
11 #include "PrinterData.h"
12 #include "PrintProcess.h"
13 #include "SpoolMetaData.h"
14 #include "Transport.h"
15 #include "StatusWindow.h"
16
17
18 class BView;
19 class BBitmap;
20 class BMessage;
21 class PrinterData;
22 class PrinterCap;
23
24
25 class GraphicsDriver {
26 public:
27 GraphicsDriver(BMessage* message, PrinterData* printerData,
28 const PrinterCap *printerCap);
29 virtual ~GraphicsDriver();
30
31 const JobData* GetJobData(BFile* spoolFile);
32 BMessage* TakeJob(BFile* spoolFile);
33 static BPoint GetScale(int32 nup, BRect physicalRect, float scaling);
34 static BPoint GetOffset(int32 nup, int index,
35 JobData::Orientation orientation, const BPoint* scale,
36 BRect scaledPhysicalRect, BRect scaledPrintableRect,
37 BRect physicalRect);
38
39 protected:
40 GraphicsDriver(const GraphicsDriver &);
41
42 GraphicsDriver& operator = (const GraphicsDriver &);
43
44 virtual bool StartDocument();
45 virtual bool StartPage(int page_number);
46 virtual bool NextBand(BBitmap* bitmap, BPoint* offset);
47 virtual bool EndPage(int page_number);
48 virtual bool EndDocument(bool success);
49
50 void WriteSpoolData(const void* buffer, size_t size)
51 /* throw (TransportException) */;
52 void WriteSpoolString(const char* buffer, ...)
53 /* throw (TransportException) */;
54 void WriteSpoolChar(char c)
55 /* throw (TransportException) */;
56
57 void ReadSpoolData(void* buffer, size_t size)
58 /* throw (TransportException) */;
59 int ReadSpoolChar()
60 /* throw (TransportException) */;
61
62 static void ConvertToRGB24(const void* src, void* dst, int width,
63 color_space cs);
64 static void ConvertToGray(const void* src, void* dst, int width,
65 color_space cs);
66
67 const JobData* GetJobData() const;
68 const PrinterData* GetPrinterData() const;
69 const PrinterCap* GetPrinterCap() const;
70 const SpoolMetaData* GetSpoolMetaData() const;
71 int GetProtocolClass() const;
72
73 int GetPageHeight() const;
74
75 private:
76 bool _SetupData(BFile* file);
77 void _SetupBitmap();
78 void _CleanupData();
79 void _CleanupBitmap();
80 bool _PrintPage(PageDataList* pages);
81 bool _PrintBand(BBitmap* band, BPoint* offset);
82 void _RotateInto(BBitmap* target, const BBitmap* source);
83 bool _CollectPages(SpoolData* spoolData, PageDataList* pages);
84 bool _SkipPages(SpoolData* spoolData);
85 bool _PrintDocument(SpoolData* spoolData);
86 bool _PrintJob(BFile* file);
87
88 bool _NeedRotateBitmapBand() const;
89
90 static void _ConvertRGB32ToRGB24(const void* src, void* dst, int width);
91 static void _ConvertCMAP8ToRGB24(const void* src, void* dst, int width);
92 static uint8 _ConvertToGray(uint8 r, uint8 g, uint8 b);
93 static void _ConvertRGB32ToGray(const void* src, void* dst, int width);
94 static void _ConvertCMAP8ToGray(const void* src, void* dst, int width);
95
96 BMessage* fMessage;
97 BView* fView;
98 BBitmap* fBitmap;
99 BBitmap* fRotatedBitmap;
100 Transport* fTransport;
101 JobData* fOrgJobData;
102 JobData* fRealJobData;
103 PrinterData* fPrinterData;
104 const PrinterCap* fPrinterCap;
105 SpoolMetaData* fSpoolMetaData;
106
107 int fPageWidth;
108 int fPageHeight;
109 int fBandWidth;
110 int fBandHeight;
111 int fPixelDepth;
112 int fBandCount;
113 int fInternalCopies;
114
115 uint32 fPageCount;
116
117 StatusWindow* fStatusWindow;
118 };
119
120
121 inline const JobData*
GetJobData()122 GraphicsDriver::GetJobData() const
123 {
124 return fRealJobData;
125 }
126
127
128 inline const PrinterData*
GetPrinterData()129 GraphicsDriver::GetPrinterData() const
130 {
131 return fPrinterData;
132 }
133
134
135 inline const PrinterCap*
GetPrinterCap()136 GraphicsDriver::GetPrinterCap() const
137 {
138 return fPrinterCap;
139 }
140
141
142 inline const SpoolMetaData*
GetSpoolMetaData()143 GraphicsDriver::GetSpoolMetaData() const
144 {
145 return fSpoolMetaData;
146 }
147
148
149 inline int
GetProtocolClass()150 GraphicsDriver::GetProtocolClass() const
151 {
152 return fPrinterData->GetProtocolClass();
153 }
154
155
156 inline int
GetPageHeight()157 GraphicsDriver::GetPageHeight() const
158 {
159 if (!_NeedRotateBitmapBand())
160 return fPageHeight;
161 return fPageWidth;
162 }
163
164 #endif /* __GRAPHICSDRIVER_H */
165