haiku/headers/libs/print/libprint/GraphicsDriver.h
Adrien Destugues 1407e6d7b1 Complete implementation of printer serial transport
- Allow to configure the baudrate (it is set by the printer settings,
  but the transport didn't care)
- Implement reading from the serial port (some printers will need us to
  poll the status and the like, as there is usually no hardware flow
  control)

Change-Id: I70ba2566595d5dfa5eda3d518614db6514cb2398
2018-06-05 21:44:14 +00:00

165 lines
3.9 KiB
C++

/*
* GraphicsDriver.h
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
*/
#ifndef __GRAPHICSDRIVER_H
#define __GRAPHICSDRIVER_H
#include "JobData.h"
#include "PrinterData.h"
#include "PrintProcess.h"
#include "SpoolMetaData.h"
#include "Transport.h"
#include "StatusWindow.h"
class BView;
class BBitmap;
class BMessage;
class PrinterData;
class PrinterCap;
class GraphicsDriver {
public:
GraphicsDriver(BMessage* message, PrinterData* printerData,
const PrinterCap *printerCap);
virtual ~GraphicsDriver();
const JobData* GetJobData(BFile* spoolFile);
BMessage* TakeJob(BFile* spoolFile);
static BPoint GetScale(int32 nup, BRect physicalRect, float scaling);
static BPoint GetOffset(int32 nup, int index,
JobData::Orientation orientation, const BPoint* scale,
BRect scaledPhysicalRect, BRect scaledPrintableRect,
BRect physicalRect);
protected:
GraphicsDriver(const GraphicsDriver &);
GraphicsDriver& operator = (const GraphicsDriver &);
virtual bool StartDocument();
virtual bool StartPage(int page_number);
virtual bool NextBand(BBitmap* bitmap, BPoint* offset);
virtual bool EndPage(int page_number);
virtual bool EndDocument(bool success);
void WriteSpoolData(const void* buffer, size_t size)
throw (TransportException);
void WriteSpoolString(const char* buffer, ...)
throw (TransportException);
void WriteSpoolChar(char c)
throw (TransportException);
void ReadSpoolData(void* buffer, size_t size)
throw (TransportException);
int ReadSpoolChar()
throw (TransportException);
static void ConvertToRGB24(const void* src, void* dst, int width,
color_space cs);
static void ConvertToGray(const void* src, void* dst, int width,
color_space cs);
const JobData* GetJobData() const;
const PrinterData* GetPrinterData() const;
const PrinterCap* GetPrinterCap() const;
const SpoolMetaData* GetSpoolMetaData() const;
int GetProtocolClass() const;
int GetPageHeight() const;
private:
bool _SetupData(BFile* file);
void _SetupBitmap();
void _CleanupData();
void _CleanupBitmap();
bool _PrintPage(PageDataList* pages);
bool _PrintBand(BBitmap* band, BPoint* offset);
void _RotateInto(BBitmap* target, const BBitmap* source);
bool _CollectPages(SpoolData* spoolData, PageDataList* pages);
bool _SkipPages(SpoolData* spoolData);
bool _PrintDocument(SpoolData* spoolData);
bool _PrintJob(BFile* file);
bool _NeedRotateBitmapBand() const;
static void _ConvertRGB32ToRGB24(const void* src, void* dst, int width);
static void _ConvertCMAP8ToRGB24(const void* src, void* dst, int width);
static uint8 _ConvertToGray(uint8 r, uint8 g, uint8 b);
static void _ConvertRGB32ToGray(const void* src, void* dst, int width);
static void _ConvertCMAP8ToGray(const void* src, void* dst, int width);
BMessage* fMessage;
BView* fView;
BBitmap* fBitmap;
BBitmap* fRotatedBitmap;
Transport* fTransport;
JobData* fOrgJobData;
JobData* fRealJobData;
PrinterData* fPrinterData;
const PrinterCap* fPrinterCap;
SpoolMetaData* fSpoolMetaData;
int fPageWidth;
int fPageHeight;
int fBandWidth;
int fBandHeight;
int fPixelDepth;
int fBandCount;
int fInternalCopies;
uint32 fPageCount;
StatusWindow* fStatusWindow;
};
inline const JobData*
GraphicsDriver::GetJobData() const
{
return fRealJobData;
}
inline const PrinterData*
GraphicsDriver::GetPrinterData() const
{
return fPrinterData;
}
inline const PrinterCap*
GraphicsDriver::GetPrinterCap() const
{
return fPrinterCap;
}
inline const SpoolMetaData*
GraphicsDriver::GetSpoolMetaData() const
{
return fSpoolMetaData;
}
inline int
GraphicsDriver::GetProtocolClass() const
{
return fPrinterData->GetProtocolClass();
}
inline int
GraphicsDriver::GetPageHeight() const
{
if (!_NeedRotateBitmapBand())
return fPageHeight;
return fPageWidth;
}
#endif /* __GRAPHICSDRIVER_H */