imaging/imagingplugins/codecs/MBMCodec/MBMCodec.h
changeset 0 5752a19fdefe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imaging/imagingplugins/codecs/MBMCodec/MBMCodec.h	Wed Aug 25 12:29:52 2010 +0300
@@ -0,0 +1,318 @@
+// Copyright (c) 1999-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 __MBMCODEC_H__
+#define __MBMCODEC_H__
+
+#include <bitdev.h>
+#include <icl/imageprocessor.h>
+#include <icl/imagecodec.h>
+#include <icl/imagecodecdata.h>
+
+#include "MBMConvert.h"
+
+
+// Constants.
+const TInt KMbmRootStreamOffsetPosition = 16;
+const TInt KMbmFirstBitmapOffset = KMbmRootStreamOffsetPosition + 4;
+const TInt KMbmInfoHeaderSize = 40;
+
+// Helper classes.
+class TMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit) = 0;
+	void AddPixelRun(TRgb aColor,TInt aNumberOfPixels);
+public:
+	CImageProcessor* iImageProc;
+	};
+
+class T1BppMbmReadCodec : public TMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit);
+	void AddPixelValue(TUint8 aValue);
+	};
+
+class T1BppCompressedMbmReadCodec : public T1BppMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit);
+	void AddPixelRun(TUint8 aValue,TInt aNumberOfValues);
+	};
+
+class T2BppMbmReadCodec : public TMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit);
+	void AddPixelValue(TUint8 aValue);
+	};
+
+class T2BppCompressedMbmReadCodec : public T2BppMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit);
+	void AddPixelRun(TUint8 aValue,TInt aNumberOfQuads);
+	};
+
+class T4BppMbmReadCodec : public TMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit);
+	virtual TRgb ColorFromIndex(TInt aIndex) = 0;
+	};
+
+class T4BppCompressedMbmReadCodec : public T4BppMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit);
+	void AddPixelRun(TRgb aColor1,TRgb aColor2,TInt aNumberOfPairs);
+	};
+
+class T4BppMonoMbmReadCodec : public T4BppMbmReadCodec
+	{
+public:
+	virtual TRgb ColorFromIndex(TInt aIndex) { return TRgb::Gray16(aIndex); }
+	};
+
+class T4BppMonoCompressedMbmReadCodec : public T4BppCompressedMbmReadCodec
+	{
+public:
+	virtual TRgb ColorFromIndex(TInt aIndex) { return TRgb::Gray16(aIndex); }
+	};
+
+class T4BppColorMbmReadCodec : public T4BppMbmReadCodec
+	{
+public:
+	virtual TRgb ColorFromIndex(TInt aIndex) { return TRgb::Color16(aIndex); }
+	};
+
+class T4BppColorCompressedMbmReadCodec : public T4BppCompressedMbmReadCodec
+	{
+public:
+	virtual TRgb ColorFromIndex(TInt aIndex) { return TRgb::Color16(aIndex); }
+	};
+
+class T8BppMbmReadCodec : public TMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit);
+	virtual TRgb ColorFromIndex(TInt aIndex) = 0;
+	};
+
+class T8BppCompressedMbmReadCodec : public T8BppMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit);
+	};
+
+class T8BppMonoMbmReadCodec : public T8BppMbmReadCodec
+	{
+public:
+	virtual TRgb ColorFromIndex(TInt aIndex) { return TRgb::Gray256(aIndex); }
+	};
+
+class T8BppMonoCompressedMbmReadCodec : public T8BppCompressedMbmReadCodec
+	{
+public:
+	virtual TRgb ColorFromIndex(TInt aIndex) { return TRgb::Gray256(aIndex); }
+	};
+
+class T8BppColorMbmReadCodec : public T8BppMbmReadCodec
+	{
+public:
+	virtual TRgb ColorFromIndex(TInt aIndex) { return TRgb::Color256(aIndex); }
+	};
+
+class T8BppColorCompressedMbmReadCodec : public T8BppCompressedMbmReadCodec
+	{
+public:
+	virtual TRgb ColorFromIndex(TInt aIndex) { return TRgb::Color256(aIndex); }
+	};
+
+class T12BppMbmReadCodec : public TMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit);
+	};
+
+class T12BppCompressedMbmReadCodec : public TMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit);
+	};
+
+class T16BppMbmReadCodec : public TMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit);
+	};
+
+class T16BppCompressedMbmReadCodec : public TMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit);
+	};
+
+class T24BppMbmReadCodec : public TMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit);
+	};
+
+class T24BppCompressedMbmReadCodec : public T24BppMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit);
+	};
+
+class T32BppMbmReadCodec : public TMbmReadCodec
+	{
+public:
+	virtual void DoProcessL(TUint8*& aDataPtr,TUint8* aDataPtrLimit);
+	};
+
+// MBM Read codec.
+class CMbmReadCodec : public CImageProcessorReadCodec
+	{
+public:
+	virtual void InitFrameL(TFrameInfo& aFrameInfo, CFrameImageData& aFrameImageData, TBool aDisableErrorDiffusion, CFbsBitmap& aFrame, CFbsBitmap* aFrameMask);
+
+	static CMbmReadCodec* NewL(TUint32 aMbmRootStreamOffset);
+
+protected:
+	virtual ~CMbmReadCodec();
+
+	virtual void InitFrameHeader(TFrameInfo& aFrameSettings, CFrameImageData& aFrameImageData);
+	virtual TFrameState ProcessFrameHeaderL(TBufPtr8& aData);
+	virtual TFrameState ProcessFrameL(TBufPtr8& aSrc);
+
+private:
+	CMbmReadCodec(TUint32 aMbmRootStreamOffset);
+
+	TBool ProcessInfoL(TBufPtr8* aSrc);
+	TInt ScanLinePixels(TInt aWidth);
+	void SetCodecProcessorL();
+	
+	static TDisplayMode DisplayModeL(TInt aBitsPerPixel, TUint32 aFlags);
+	
+protected:
+	TFrameInfo* iFrameInfo;
+	CFrameImageData *iImageData;
+
+	TMbmDecodeData* iFrameData;
+	TBool iCompressed;
+	TInt iByteLength;
+	TUint8* iDataPtr;
+	TUint8* iStartDataPtr;
+	TUint8* iDataPtrLimit;
+	TMbmReadCodec* iCodecProc;
+	TInt32 iMbmRootStreamOffset;
+	TInt iNumberOfFrames;
+	TInt iFrameDataRemaining;
+	};
+
+
+// Write codec classes.
+class TWriteCodecProcessor
+	{
+public:
+	virtual TInt PixelsToBytes(TInt aPixels) = 0;
+	virtual TInt BytesToPixels(TInt aBytes) = 0;
+	};
+
+class T1BppWriteCodecProcessor : public TWriteCodecProcessor
+	{
+public:
+	virtual TInt PixelsToBytes(TInt aPixels) { return (aPixels + 7) >> 3; }
+	virtual TInt BytesToPixels(TInt aBytes) { return aBytes << 3; }
+	};
+
+class T2BppWriteCodecProcessor : public TWriteCodecProcessor
+	{
+public:
+	virtual TInt PixelsToBytes(TInt aPixels) { return (aPixels + 3) >> 2; }
+	virtual TInt BytesToPixels(TInt aBytes) { return aBytes << 2; }
+	};
+
+class T4BppWriteCodecProcessor : public TWriteCodecProcessor
+	{
+public:
+	virtual TInt PixelsToBytes(TInt aPixels) { return (aPixels + 1) >> 1; }
+	virtual TInt BytesToPixels(TInt aBytes) { return aBytes << 1; }
+	};
+
+class T8BppWriteCodecProcessor : public TWriteCodecProcessor
+	{
+public:
+	virtual TInt PixelsToBytes(TInt aPixels) { return aPixels; }
+	virtual TInt BytesToPixels(TInt aBytes) { return aBytes; }
+	};
+
+class T16BppWriteCodecProcessor : public TWriteCodecProcessor
+	{
+public:
+	virtual TInt PixelsToBytes(TInt aPixels) { return aPixels << 1; }
+	virtual TInt BytesToPixels(TInt aBytes) { return aBytes >> 1; }
+	};
+
+class T24BppWriteCodecProcessor : public TWriteCodecProcessor
+	{
+public:
+	virtual TInt PixelsToBytes(TInt aPixels) { return aPixels * 3; }
+	virtual TInt BytesToPixels(TInt aBytes) { return aBytes / 3; }
+	};
+
+class T32BppWriteCodecProcessor : public TWriteCodecProcessor
+	{
+public:
+	virtual TInt PixelsToBytes(TInt aPixels) { return aPixels * 4; }
+	virtual TInt BytesToPixels(TInt aBytes) { return aBytes / 4; }
+	};
+
+class CMbmWriteCodec : public CImageWriteCodec
+	{
+public:
+	virtual ~CMbmWriteCodec();
+
+	static CMbmWriteCodec* NewL(TDisplayMode aDisplayMode);
+
+protected:
+	virtual TFrameState ProcessFrameL(TBufPtr8& aDst);
+	virtual void InitFrameL(TBufPtr8& aDst, const CFbsBitmap& aFrame);
+
+	// New functions
+	void DoProcessL(const CFbsBitmap& aFrame);
+	TInt ScanLinePixels(TInt aWidth);
+
+private:
+	CMbmWriteCodec(TDisplayMode aDisplayMode);
+
+
+protected:
+	TRect iSourceRect;
+	TPoint iPos;
+	TDisplayMode iDisplayMode;
+	TWriteCodecProcessor* iCodecProc;
+	TUint8* iDataPtr;
+	TUint8* iDataPtrLimit;
+	TInt iPaddingBytes;
+	TInt iBytesToWrite;
+	TBool iStreamTablePending;
+	};
+
+
+#endif // __MBMCODEC_H__
+