mmplugins/imagingplugins/codecs/GifCodec/GIFcodec.h
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmplugins/imagingplugins/codecs/GifCodec/GIFcodec.h	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,234 @@
+// Copyright (c) 1997-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:
+// Licensed under US Patent No 4,558,302 and foreign counterparts
+// 
+//
+
+#ifndef GIFCODEC_H
+#define GIFCODEC_H
+
+#include <icl/imageprocessor.h>
+#include <icl/imagecodec.h>
+#include <icl/imagecodecdata.h>
+
+#include "GIFConvert.h"
+#include "GIFFormat.h"
+
+// Constants.
+const TInt KGifMaxBits = 12;
+const TInt KGifConversionTableSize = 1<<KGifMaxBits; // 4096
+const TInt KGifHashTableSize = KGifConversionTableSize + 907; // a bit extra for 80% occupancy
+
+const TUint8 KGifExtensionId = 0x21;
+const TUint8 KGifImageDescriptorId = 0x2c;
+const TUint8 KGifPlainTextExtensionId = 0x01;
+const TUint8 KGifGraphicControlExtensionId = 0xf9;
+const TUint8 KGifCommentExtensionId = 0xfe;
+const TUint8 KGifApplicationExtensionId = 0xff;
+const TInt KGifInitialCodeLengthSize = 1;
+const TUint8 KGifFrameTerminatorId = 0x00;
+const TUint8 KGifTerminatorId = 0x3b;
+const TInt KGifCentiSecondsToMicroSeconds = 10000;
+
+const TInt KMinGifGraphicControlBlkLen = 4;
+const TInt KGifExtBlkHeaderSize = 3;
+const TInt KPixelBufMaxSize = 2048;//to get proper optimization must not be less then 1024 
+// (basically each additional 1024 pixels for the buffer adds about 5% to decoding speed 
+// untill buffer size increases up to quarter a CPU cash size 
+
+_LIT8(KAppIdNetscape, "NETSCAPE");
+_LIT8(KAppAuthenticCode2_0, "2.0");
+
+const TInt KAppIdBlockLength = 11;
+const TInt KAppIdLength = 8;
+const TInt KAppAuthenticCodeLength = 3;
+const TInt KLoopIterationsOffset = 14;
+
+
+// Read codec
+class CGifReadCodec : public CImageMaskProcessorReadCodec
+	{
+public:
+	virtual ~CGifReadCodec();
+
+	static CGifReadCodec* NewL(TRgb* aGlobalPalette,TInt aBackgroundColorIndex, TSize aScreenSize, TBool aFastDecode);
+
+	// From CImageReadCodec
+	virtual void InitFrameHeader(TFrameInfo& aFrameSettings, CFrameImageData& aFrameImageData);
+	virtual void InitFrameL(TFrameInfo& aFrameInfo, CFrameImageData& aFrameImageData, TBool aDisableErrorDiffusion, CFbsBitmap& aDestination, CFbsBitmap* aDestinationMask);
+	virtual TFrameState ProcessFrameHeaderL(TBufPtr8& aData);
+	virtual TFrameState ProcessFrameL(TBufPtr8& aSrc);
+	void SetUseFrameSizeInPixels(TBool aUseFrameSizeInPixels);
+private:
+    typedef TUint32 TBitBuffer;
+	typedef TUint16 T64KPixel;
+	    
+	void ConstructL();
+	CGifReadCodec(TRgb* aGlobalPalette,TInt aBackgroundColorIndex, TSize aScreenSize, TBool aFastDecode);
+
+	void DoProcessInfoL(const TUint8*& aDataPtr,const TUint8* aDataPtrLimit);
+	void DoProcessExtensionL(const TUint8*& aDataPtr,const TUint8* aDataPtrLimit);
+	void DoProcessImageDescriptorL(const TUint8*& aDataPtr,const TUint8* aDataPtrLimit);
+	void DoProcessDataL();
+	void DoSaveCommentsL();
+	inline TInt ResetTableL();
+	inline TInt NextCode(TBitBuffer& aBitBuffer, TInt& aBitBufSize, TInt aCurCodeLen);
+	void WriteCodeL(TInt aCode);
+	void WriteStringWithoutTransparency(TUint8* aOutputString, TInt aPixSize, TInt aNumOfPixels);
+	void WriteStringWithTransparency(TUint8* aOutputString, TInt aPixSize, TUint32* aMaskString, TInt aNumOfPixels);
+	
+	inline void SetCurrentCodeLengthL(TInt aCodeLength);
+	inline void UpdateYPos();
+	void UpdateYPosInterlaced();
+	void FlushPixBuffer(TInt aPixSize);
+	
+    template <class TPalType, TInt aPtrDelta> 
+    inline TUint8* WriteGifBuffer(TUint8* aOutputStringPtr, TUint8* aOutputStringLimit);
+    
+private:
+	
+	T64KPixel* i64KPalette;
+	const TRgb* iPalette;
+	
+	TInt iBackgroundColorIndex;
+	TUint32 iOpaqueMask;
+	TUint16 iTranspColIdx;
+	TUint16 iBufMode;
+	TInt16* iPrefixIndex;
+	TUint8* iSuffixCode;
+	TUint8* iOutputString;
+		
+	TUint32* iPixelBuffer;
+	TInt     iPixBufCount;
+	TInt     iPixRead;
+	TInt     iPixBufferSize;
+	
+	TUint32* iMaskBuffer;
+
+// do not change data members layout without a reason
+// it is to have more efficient CPU caching	
+	TInt iNextFree;
+	TInt iBitBuffSize;
+	TInt iCurrentCodeLength;
+	TBitBuffer iBitBuffer;	
+	
+	const TUint8* iDataPtr;
+	const TUint8* iDataPtrLimit;
+	
+	CImageProcessor* iImgProc;  // not owned
+	CImageProcessor* iMaskProc; // not owned
+	TUint8  iFirstChar;
+	TUint8  iLatestPixSize;
+	TInt iPreviousCode;
+	TInt iClearCode;
+	TInt iEoiCode;
+    TPoint* iPPos;
+    
+	TBool iComplete;
+	TInt iPass;
+	TInt iYPosIncrement;
+
+	TPoint iPositionOffset;
+	TInt iReductionFactor;
+	const TSize iScreenSize;
+
+	TBool iTableReset;
+	TInt iBlockId;
+	TBool iReadingExtensionBlock;
+	TBool iReadingCommentExtensionBlock;
+	TBool iReadingOtherExtensionBlock;
+	TBool iReadingLoopIterationExtensionBlock;
+
+// Local frame settings.	
+	TFrameInfo *iFrameInfo;
+	CFrameImageData *iFrameData;	
+	TRgb* iGlobalPalette;
+	TUint8* iStartDataPtr;	//startDataPtr;
+
+	RPointerArray<HBufC8> iComment;
+	TInt iCommentIndex;
+
+	// Temporary ImageData pointers. (Not owned by the codec)
+	// These ones are used by convert only.
+	TGifImageControl *iGifImageControl;
+	TGifImageDescriptor *iGifImageDesc;
+	TGifColorTable *iGifColorTable;
+	TGifLZWInfo *iGifLZWInfo;
+
+	// These ones are used by header processing only.
+	TGifImageControl *iFrameImageControl;
+	TGifImageDescriptor *iFrameImageDesc;
+	TGifLZWInfo *iFrameLZWInfo;
+
+	TSize iFirstFrameSize;
+	TRect iFirstFrameCoords;
+
+	TSize iFrameSize;
+	TRect iFrameCoords;
+	TPoint iFrameOffset;
+	TBool iUseFrameSizeInPixels;
+	TBool iFast64kMode;
+	const TBool iFastDecode;
+	TBool iFastAccessMode;
+	};
+
+
+// Write codec.
+const TInt KGifBlockSize = 255;
+const TInt KGifBufferSize = KGifBlockSize + 9;
+class CGifEncoder;
+class CGifWriteCodec : public CImageWriteCodec
+	{
+public:
+	static CGifWriteCodec* NewL(const CGifEncoder& aEncoder);
+
+	//From CImageWriteCodec
+	virtual TFrameState ProcessFrameL(TBufPtr8& aDst);
+protected:
+	CGifWriteCodec(const CGifEncoder& aEncoder);
+
+private:
+	void InitFrameL(TBufPtr8& aDst, const CFbsBitmap& aSource);
+	void AddToTableL(TInt aIndex, TUint32 aHashValue);
+	TBool TableEntry(TInt16 aWaitingCode, TUint8 aNewCode, TInt& aIndex, TUint32& aHashValue);
+	void ResetTable();
+	void WriteData(TInt aIndex);
+	void FillBufferL(const CFbsBitmap& aFrame);
+	TBool WriteBuffer();
+	TBool WriteTerminator();
+private:
+	TRect iSourceRect;
+	TPoint iPos;
+	TInt16 iWaitingCode;
+	TInt16 iHashCode[KGifHashTableSize];   // must hold -1..(KGifConversionTableSize-1)
+	TUint32 iHashValue[KGifHashTableSize]; // must hold  0..(KGifConversionTableSize-1)<<8|TUint8
+	TUint8 iBuffer[KGifBufferSize];
+	TUint8* iBufferPtr;
+	TInt iBufferSize;
+	TBool iBufferFull;
+	TBool iImageComplete;
+	TInt iCodeLength;
+	TInt iNextLimit;
+	TInt iClearCode;
+	TInt iNextFree;
+	TInt iBitsPerPixel;
+	TInt iBitOffset;
+	TUint8* iDestStartPtr;
+	TUint8* iDestPtr;
+	TUint8* iDestPtrLimit;
+	const CGifEncoder& iEncoder;
+	};
+
+#endif // GIFCODEC_H
+