root/headers/libs/print/libprint/GraphicsDriver.h
/*
 * 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 */