root/src/add-ons/print/drivers/pcl6/PCL6Rasterizer.h
/* 
** PCL6Rasterizer.h
** Copyright 2005, Michael Pfeiffer, laplace@users.sourceforge.net.
** All rights reserved.
** Distributed under the terms of the MIT License.
*/
#ifndef _PCL6_RASTERIZER_H
#define _PCL6_RASTERIZER_H


#include "Rasterizer.h"


class PCL6Rasterizer : public Rasterizer
{
public:
                                                PCL6Rasterizer(Halftone* halftone)
                                                :
                                                Rasterizer(halftone),
                                                fOutBuffer(NULL),
                                                fOutBufferSize(0)
                                                {}
        
                                                ~PCL6Rasterizer()
                                                {
                                                        delete[] fOutBuffer;
                                                        fOutBuffer = NULL;
                                                }
        
                        void            SetOutBufferSize(int size)
                                                {
                                                        fOutBufferSize = size;
                                                }
                        int                     GetOutBufferSize()
                                                {
                                                        return fOutBufferSize;
                                                }
                        uchar*          GetOutBuffer()
                                                {
                                                        return fOutBuffer;
                                                }

        virtual void            InitializeBuffer()
                                                {
                                                        fOutBuffer = new uchar[fOutBufferSize];
                                                }
        
        virtual int                     GetOutRowSize() = 0;
        
private:
                        uchar*          fOutBuffer;
                        int                     fOutBufferSize;
};


class MonochromeRasterizer : public PCL6Rasterizer 
{
public:
                                                MonochromeRasterizer(Halftone* halftone); 

                        void            InitializeBuffer();
                
                        int                     GetOutRowSize() 
                                                {
                                                        return fOutRowSize;
                                                }
        
                        const void*     RasterizeLine(int x, int y,
                                                        const ColorRGB32Little* source);

private:
                        int                     fWidthByte;
                        int                     fOutRowSize;
                        int                     fPadBytes;
                        int                     fOutSize;
                        uchar*          fOutBuffer;
                        uchar*          fCurrentLine;
};


// Output format RGB 8bit per channel
class ColorRGBRasterizer : public PCL6Rasterizer
{
public:
                                                ColorRGBRasterizer(Halftone* halftone);
        
                        void            InitializeBuffer();

                        int                     GetOutRowSize()
                                                {
                                                        return fOutRowSize;
                                                }
                
                        const void*     RasterizeLine(int x, int y,
                                                        const ColorRGB32Little* source);

private:
                        int                     fWidthByte;
                        int                     fOutRowSize;
                        int                     fPadBytes;
                        uchar*          fCurrentLine;
};


typedef uchar* PlaneBuffer;


// Output format: RGB 1bit per channel
// Class Halftone is used for dithering
class ColorRasterizer : public PCL6Rasterizer
{
public:
                                                ColorRasterizer(Halftone* halftone);
        
                                                ~ColorRasterizer();
        
                        void            InitializeBuffer();

                        int                     GetOutRowSize()
                                                {
                                                        return fOutRowSize;
                                                }
                
                        const void*     RasterizeLine(int x, int y,
                                                        const ColorRGB32Little* source);

private:
                        void            MergePlaneBuffersToCurrentLine();

                        int                     fWidthByte;
                        int                     fOutRowSize;
                        int                     fPadBytes;
                        uchar*          fCurrentLine;
        
                        int                     fPlaneBufferSize;
                        PlaneBuffer     fPlaneBuffers[3];
};

#endif // _PCL6_RASTERIZER_H