⛏️ index : haiku.git

/* 
** 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