imaging/imagingfws/inc_pub/icl/imageprocessor.h
changeset 0 5752a19fdefe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imaging/imagingfws/inc_pub/icl/imageprocessor.h	Wed Aug 25 12:29:52 2010 +0300
@@ -0,0 +1,527 @@
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef ___IMAGEPROCESSOR_H__
+#define ___IMAGEPROCESSOR_H__
+
+#include <gdi.h>
+#include <fbs.h>
+
+/**
+@publishedAll
+*/
+enum TImageBitmapUtilPanic
+	{
+	ECorrupt
+	};
+
+/**
+@publishedAll
+@released
+
+Interface to colour conversion classes for various display modes.
+Manages the mapping between RGB/Greyscale values and the index
+into the color palette for the given display mode.
+*/
+class TColorConvertor
+	{
+public:
+	IMPORT_C static	TColorConvertor* NewL(TDisplayMode aDisplayMode);
+
+	/**
+	Returns the colour index corresponding to the supplied RGB value.
+	Operates in the context of the current display mode.
+
+	This is a virtual function that each derived class must implement.
+
+	@param  aColor
+	        The colour in RGB format.
+	
+	@return The colour index.
+	*/
+	virtual TInt ColorIndex(TRgb aColor) const = 0;
+
+	/**
+	Returns the RGB value corresponding to the supplied colour index.
+	Operates in the context of the current display mode.
+
+	This is a virtual function that each derived class must implement.
+
+	@param  aColorIndex
+	        The colour in RGB format.
+
+	@return The RGB value.
+	*/
+	virtual TRgb Color(TInt aColorIndex) const = 0;
+
+	/**
+	Gets an array of colour indices from a corresponding array of RGB values.
+	Operates in the context of the current display mode.
+
+	This is a virtual function that each derived class must implement.
+
+	@param  aIndexBuffer
+	        A pointer to the first element in destination array.
+	@param  aColorBuffer
+	        A pointer to the first element in the source array.
+	@param  aCount
+	        The number of elements to get.
+	*/
+	virtual void ColorToIndex(TInt* aIndexBuffer,TRgb* aColorBuffer,TInt aCount) const = 0;
+
+	inline static TInt RgbToMonochrome(TRgb aRgb);
+	};
+
+
+/**
+@publishedAll
+@released
+
+Bitmap utility class.
+*/
+class TImageBitmapUtil
+	{
+public:
+	IMPORT_C TImageBitmapUtil();
+	IMPORT_C void Begin();
+	IMPORT_C TBool Begin(const TPoint& aPosition);
+	IMPORT_C void End();
+	IMPORT_C void SetBitmapL(CFbsBitmap* aBitmap);
+	IMPORT_C void SetPixel(TUint32 aPixelIndex);
+	IMPORT_C void SetPixels(TUint32* aPixelIndex,TInt aNumberOfPixels);
+	IMPORT_C TBool SetPos(const TPoint& aPosition);
+	
+private:
+	union TDataPointer
+		{
+		TUint32* iWordPos;
+		TUint8* iBytePos;
+		};
+private:
+	CFbsBitmap* iBitmap;
+	TSize iSize;
+	TPoint iPosition;
+	TDataPointer iData;
+	TDataPointer iBase;
+	TInt iBpp;
+	TInt iBppShift;
+	TInt iPixelShift;
+	TInt iPixelsPerWord;
+	TInt iBitShift;
+	TInt iScanlineWordLength;
+	TUint32 iMask;
+	TBool iWordAccess;
+	};
+
+
+class CImageProcessor;
+class CImageProcessorExtension;
+
+/**
+@publishedAll
+@released
+
+Utility class providing static factory functions for creating instances of
+CImageProcessor derived classes.
+*/
+class ImageProcessorUtility
+	{
+public:
+	IMPORT_C static TInt ReductionFactor(const TSize& aOriginalSize,const TSize& aReducedSize);
+	IMPORT_C static CImageProcessor* NewImageProcessorL(const CFbsBitmap& aBitmap,const TSize& aImageSize,TDisplayMode aImageDisplayMode, TBool aDisableErrorDiffusion);
+	IMPORT_C static CImageProcessor* NewImageProcessorL(const CFbsBitmap& aBitmap,TInt aReductionFactor,TDisplayMode aImageDisplayMode, TBool aDisableErrorDiffusion);
+	IMPORT_C static CImageProcessorExtension* NewImageProcessorExtensionL(const CFbsBitmap& aBitmap,TInt aReductionFactor,TDisplayMode aImageDisplayMode, TBool aDisableErrorDiffusion);
+	
+private:
+	TBool static UseErrorDiffuser(const TDisplayMode& aBitmapDisplayMode, const TDisplayMode& aImageDisplayMode);
+	TBool static IsMonochrome(const TDisplayMode& aBitmapDisplayMode, const TDisplayMode& aImageDisplayMode);
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+Interface to image processing classes used by CImageDecoder plugins. This is not a application client API.
+*/
+class CImageProcessor : public CBase
+	{
+public:
+	// Setup
+
+	/**
+	Initialises internal data structures prior to conversion.
+
+	This is a virtual function that each derived class must implement.
+
+	@param  aBitmap
+	        A reference to a fully constucted bitmap with the required
+	        display mode and size.
+	@param  aImageRect
+	        The region of the image to convert.
+	*/
+	virtual void PrepareL(CFbsBitmap& aBitmap,const TRect& aImageRect) = 0;
+
+	/**
+	Initialises internal data structures prior to the manipulation of the specified pixel block.
+
+	This overloaded version allows specification of a block size
+	for those formats which support blocked pixel data eg. JPEG
+
+	This is a virtual function that each derived class must implement.
+
+	@param  aBitmap
+	        A reference to a fully constucted bitmap with the required
+	        display mode and size.
+	@param  aImageRect
+	        The region of the image to convert.
+	@param  aRgbBlockSize
+	        The size of the block to use.
+	*/
+	virtual void PrepareL(CFbsBitmap& aBitmap,const TRect& aImageRect,const TSize& aRgbBlockSize) = 0;
+
+	/**
+	Sets the number of pixels by which to increment the current position in
+	the Y-axis. This is used when rendering images supporting interlacing.
+	eg GIF
+
+	This is a virtual function that each derived class must implement.
+
+	@param  aYInc
+	        The number of pixels.
+	*/
+	virtual void SetYPosIncrement(TInt aYInc) = 0;
+
+	/**
+	Sets the number times the current line should be repeated. The lines
+	are repeated in the same direction as set by SetYPosIncrement(). This
+	is used to fill blank lines when rendering interlaced images. eg GIF.
+	@param aLineRepeat The number of times the current line should be repeated
+	*/
+	virtual void SetLineRepeat(TInt aLineRepeat) = 0;
+
+	/**
+	Sets the pixel padding to the value specified by aNumberOfPixels.
+
+	This is a virtual function that each derived class must implement.
+
+	@param  aNumberOfPixels
+	        The number of pixels to use for padding.
+	*/
+	virtual void SetPixelPadding(TInt aNumberOfPixels) = 0;
+
+	// Color pixel writing
+
+	/**
+	Sets the pixel at the current position to aColor.
+
+	This is a virtual function that each derived class must implement.
+	
+	@post    
+	The current position is updated.
+
+	@param  aColor
+	        The RGB value to set the current pixel to.
+
+	@return A boolean indicating if the operation was successful. ETrue if the operation succeeded, 
+            otherwise EFalse.
+    */
+	virtual TBool SetPixel(TRgb aColor) = 0;
+
+	/**
+	Sets aCount number of pixels to the value given by aColor, starting at
+	the current position.
+
+	This is a virtual function that each derived class must implement.
+
+	@post    
+	On success, the current position is updated.
+
+	@param  aColor
+	        The RGB value to set the pixels to.
+	@param  aCount
+	        The number of pixels to set.
+
+	@return A boolean indicating if the operation was successful. ETrue if the operation succeeded, 
+	        otherwise EFalse.
+	*/
+	virtual TBool SetPixelRun(TRgb aColor,TInt aCount) = 0;
+
+	/**
+	Updates the bitmap with colour information from the array of colour values.
+
+	Uses the array of colour values supplied by aColorBuffer, whose length
+	is specified by aBufferLength, to update successive pixels with values in the
+	buffer, starting at the current	position.
+
+	This is a virtual function that each derived class must implement.
+	
+	@post   
+	The current position is updated.
+
+	@param  aColorBuffer
+	        A pointer to the first element in the array.
+	@param  aBufferLength
+	        The number of elements in the array.
+
+	@return A boolean indicating if the operation was successful. ETrue if the operation succeeded, 
+	        otherwise EFalse.
+	*/
+	virtual TBool SetPixels(TRgb* aColorBuffer,TInt aBufferLength) = 0;
+
+    /**
+    Sets the current pixel block using the data supplied in aColorBuffer.
+
+	Note:
+	For use with image types that support blocking of pixels eg JPEG.
+
+	This is a virtual function that each derived class must implement.
+
+	@param  aColorBuffer
+	        A pointer to a buffer representing a block of pixel color values.
+
+	@return A boolean indicating if the operation was successful. ETrue if the operation succeeded, 
+	        otherwise EFalse.
+	*/
+	virtual TBool SetPixelBlock(TRgb* aColorBuffer) = 0;
+
+	// Monochrome pixel writing
+
+	/**
+	Sets the pixel at the current position to aGray256.
+
+	This is a virtual function that each derived class must implement.
+
+    @post   
+	The current position is updated.
+
+	@param  aGray256
+	        The greyscale value to set the current pixel to.
+
+	@return A boolean indicating if the operation was successful. ETrue if the operation succeeded, 
+	        otherwise EFalse.
+	*/
+	virtual TBool SetMonoPixel(TInt aGray256) = 0;
+
+	/**
+	Sets the number of pixels specified by aCount to the value given by aGray256, starting at
+	the current position.
+
+	This is a virtual function that each derived class must implement.
+	
+	@post   
+	The current position is updated.
+
+	@param  aGray256
+	        The greyscale value to set the pixels to.
+	@param  aCount
+	        The number of pixels to set.
+
+	@return A boolean indicating if the operation was successful. ETrue if the operation succeeded, 
+	        otherwise EFalse.
+	*/
+	virtual TBool SetMonoPixelRun(TInt aGray256,TInt aCount) = 0;
+
+	/**
+	Updates the bitmap with greyscale information from the array of greyscale values.
+
+	The array of values supplied by aGray256Buffer, whose length
+	is specified in aBufferLength, is used to update successive pixels with the
+	greyscales values.
+
+	This is a virtual function that each derived class must implement.
+
+	@post
+	The current position is updated.
+
+	@param  aGray256Buffer
+	        A pointer to the first element in the array of greyscale values.
+	@param  aBufferLength
+	        The number of elements in the array.
+
+	@return A boolean indicating if the operation was successful. ETrue if the operation succeeded, 
+	        otherwise EFalse.
+	*/
+	virtual TBool SetMonoPixels(TUint32* aGray256Buffer,TInt aBufferLength) = 0;
+
+    /**
+    Sets a specified number of pixels to the specified greyscale value.
+
+	For image types which support blocking of pixels eg JPEG, the current
+	pixel block is set using the data supplied in aGray256Buffer.
+
+	This is a virtual function that each derived class must implement.
+
+	@param  aGray256Buffer
+	        A pointer to a buffer representing a block of pixel color values.
+
+	@return A boolean indicating if the operation was successful. ETrue if the operation succeeded, 
+	        otherwise EFalse.
+	*/
+	virtual TBool SetMonoPixelBlock(TUint32* aGray256Buffer) = 0;
+
+	// Processor flow control
+
+	/**
+	Sets the current position in the bitmap to aPosition.
+
+	This is a virtual function that each derived class must implement.
+
+	@param  aPosition
+	        A reference to TPoint object defining the position to move to.
+
+	@return	A boolean indicating if the operation was successful. ETrue if the operation succeeded, 
+	        otherwise EFalse.
+	*/
+	virtual TBool SetPos(const TPoint& aPosition) = 0;
+
+	/**
+	Commits the changes made to the current bitmap by flushing the buffer.
+
+	This is a virtual function that each derived class must implement.
+
+	@post
+	The current position is updated.
+
+	@return	A boolean indicating if the operation was successful. ETrue if the operation succeeded, 
+	        otherwise EFalse.
+    */
+	virtual TBool FlushPixels() = 0;
+	
+private:
+	// Future proofing
+	IMPORT_C virtual void ReservedVirtual1();
+	IMPORT_C virtual void ReservedVirtual2();
+	IMPORT_C virtual void ReservedVirtual3();
+	IMPORT_C virtual void ReservedVirtual4();
+	};
+
+/**
+@publishedAll
+@released
+
+Flag used to determine the type of transformation which is the result of 
+single or multiple transformation operations requested via calls to
+COperationExtension::AddOperationL.
+
+8 unique orientations:
+
+@code
+normal  90      180     270
+00 10   01 00   11 01   10 11
+01 11   11 10   10 00   00 01
+
+V flip  90      180     270
+10 00   11 10   =Hflip  =Hflip+90
+11 01   01 00
+
+H flip  90      180     270
+01 11   00 01   =Vflip  =Vflip+90
+00 10   10 11
+@endcode
+
+@see COperationExtension::AddOperationL
+*/
+enum TTransformOptions
+	{
+	/** Normal Decode
+	*/
+	EDecodeNormal = 0x11011000,
+
+	/** Rotate 90 degrees.
+	*/
+	EDecodeRotate90	= 0x10110001,
+
+	/** Rotate 180 degrees.
+	*/
+	EDecodeRotate180 = 0x00100111,
+
+	/** Rotate 270 degrees.
+	*/
+	EDecodeRotate270 = 0x01001110,
+	
+	/** Horizontal flip.
+	*/
+	EDecodeHorizontalFlip = 0x10001101,
+	
+	/** Horizontal flip and rotate 90 degrees.
+	*/
+	EDecodeHorizontalFlipRotate90 = 0x11100100,
+
+	/** Vertical flip.
+	*/
+	EDecodeVerticalFlip	= 0x01110010,
+
+	/** Vertical flip and rotate 90 degrees.
+	*/
+	EDecodeVerticalFlipRotate90 = 0x00011011
+	};
+
+
+/**
+@publishedAll
+@released
+
+Class that provides support for Framework Extensions.
+
+@see CImageProcessor
+@see CImageReadCodec
+@see CImageDecoderPlugin
+*/
+class CImageProcessorExtension : public CImageProcessor
+	{
+public:
+	IMPORT_C virtual ~CImageProcessorExtension();
+	IMPORT_C void SetClippingRect(const TRect& aRect);
+	IMPORT_C void SetScaling(TInt aScalingCoeff);
+	IMPORT_C void SetScaling(const TSize& aDesiredSize);
+	IMPORT_C void SetOperation(TTransformOptions aOperation);
+	IMPORT_C void SetInitialScanlineSkipPadding(TInt aNumberOfScanlines);
+
+protected:
+	IMPORT_C CImageProcessorExtension();
+
+protected:
+	/** Clipping rectangle */
+	TRect iClippingRect;
+	/** Scaling coefficient */
+	TInt iScalingCoeff;
+	/** Desired size after scaling */
+	TSize iDesiredSize;
+	/** Operations to apply to image */
+	TTransformOptions iOperation;
+	/** Position in destination at which start rendering */
+	TPoint iStartPosition;
+	/** Position in destination at which rendering is complete */
+	TPoint iEndPosition;
+	/** An initial one-off number of scanlines to be skipped */
+	TInt iNumberOfScanlinesToSkip;
+	};
+   
+inline TInt TColorConvertor::RgbToMonochrome(TRgb aRgb)
+	{
+	TInt value = aRgb.Internal();
+	TInt r = value&0xFF0000;
+	TInt g = value&0xFF00;
+	value  = (value&0xFF)<<16;	// blue<<16
+	value += r<<1;     		// + (red<<16)*2
+	value += g<<(16+2-8);	// + (green<<16)*4
+	value += g<<(16+0-8);	// + (green<<16)
+	return value>>(16+3);	// total/8
+	}
+
+#endif //___IMAGEPROCESSOR_H__
+