mmplugins/imagingplugins/codecs/TIFFCodec/TIFFCodec.h
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmplugins/imagingplugins/codecs/TIFFCodec/TIFFCodec.h	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,212 @@
+// 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 __TIFFCODEC_H__
+#define __TIFFCODEC_H__
+
+#include <bitdev.h>
+#include <icl/imageprocessor.h>
+#include <icl/imagecodec.h>
+#include <icl/imagecodecdata.h>
+
+#include "TIFFConvert.h"
+#include "../recordtable.h"
+
+// Constants.
+const TInt KTiffIfdEntryTagOffset = 0;
+const TInt KTiffIfdEntryTypeOffset = 2;
+const TInt KTiffIfdEntryCountOffset = 4;
+const TInt KTiffIfdEntryValueOffset = 8;
+const TInt KTiffIfdEntryLength = 12;
+
+// Helper classes.
+// TTiffImageStrip
+class TTiffImageStrip
+	{
+public:
+	TInt	iOffset;
+	TInt	iLength;
+	};
+
+// Tiff Image File Directory (IFD) class
+class TTiffIfdEntry
+	{
+public:
+	enum TId
+		{
+		ENewSubfileType = 0xFE,
+		ESubfileType = 0xFF,
+		EImageWidth = 0x100,
+		EImageLength = 0x101,
+		EBitsPerSample = 0x102,
+		ECompression = 0x103,
+		EPhotometricInterpretation = 0x106,
+		EFillOrder = 0x10A,
+		EStripOffsets = 0x111,
+		ESamplesPerPixel = 0x115,
+		ERowsPerStrip = 0x116,
+		EStripByteCounts = 0x117,
+		EXResolution = 0x11a,
+		EYResolution = 0x11b,
+		ET4Options = 0x124,
+		ET6Options = 0x125,
+		EResolutionUnit = 0x128,
+		};
+	enum TType
+		{
+		EByte = 1,
+		EAscii = 2,
+		EShort = 3,
+		ELong = 4,
+		ERational = 5,
+		ESbyte = 6,
+		EUndefined = 7,
+		ESshort = 8,
+		ESlong = 9,
+		ESrational = 10,
+		EFloat = 11,
+		EDouble = 12,
+		};
+	enum TT4Options
+		{
+		ET4TwoDimentionalCoding = 0x1,
+		ET4ContainsUncompressedData = 0x2,
+		ET4ContainsPaddedEols = 0x4
+		};
+	enum TT6Options
+		{
+		ET6ContainsUncompressedData = 0x2,
+		};
+	enum TCompression
+		{
+		EUncompressed = 1,
+		ECcitt1dCompression = 2,
+		EGroup3FaxCompression = 3,
+		EGroup4FaxCompression = 4,
+		ELzwCompression = 5,
+		EJpegCompression = 6,
+		EPackBitsCompression = 32773,
+		};
+	enum TPhotometricInterpretation
+		{
+		EWhiteIsZero = 0,
+		EBlackIsZero = 1,
+		ERgb = 2,
+		ERgbPalette = 3,
+		ETransparencyMask = 4,
+		ECmyk = 5,
+		EYCbCr = 6,
+		ECieLab = 8,
+		};
+public:
+	TInt	TypeSize() const;
+public:
+	TId		iId;
+	TType	iType;
+	TInt	iCount;
+	TUint32	iValue;
+	TUint8*	iValuePtr;
+	};
+
+
+// Read codec.
+class CTiffDecoder;
+class CTiffReadSubCodec : public CBase
+	{
+public:
+	virtual void	DoNewFrameL(CFbsBitmap& aBitmap, TBool aDisableErrorDiffusion, TInt aReductionFactor) = 0;
+	virtual void	NewStripL(TInt aNumBytes) = 0;
+	virtual TBool	ProcessStripL(TBufPtr8* aSrc) = 0;
+	};
+
+class CTiffReadCodec : public CImageReadCodec
+	{
+public:
+	
+	static CTiffReadCodec* NewL(TTiffFormatInfo aFormatInfo, CTiffDecoder& aPlugin);
+	
+	// from CImageReadCodec
+	virtual void InitFrameL(TFrameInfo& aFrameInfo, CFrameImageData& aFrameImageData, TBool aDisableErrorDiffusion, CFbsBitmap& aDestination, CFbsBitmap* aDestinationMask);
+	virtual void InitFrameHeader(TFrameInfo& aFrameSettings, CFrameImageData& aFrameImageData);
+
+	TFrameState ProcessFrameHeaderL(TBufPtr8& aData);
+	TFrameState ProcessFrameL(TBufPtr8& aSrc);
+	void GetNewDataPosition(TInt& aPosition, TInt& aLength);
+
+protected:
+	~CTiffReadCodec();
+
+private:
+	CTiffReadCodec(TTiffFormatInfo aFormatInfo, CTiffDecoder& aPlugin);
+
+
+private:
+	TInt	ReadIfdL(const TUint8*& aPtr,const TUint8* aPtrLimit, TInt& aIfdLengthInBytes);
+	void	ReadIfdEntryL(TTiffIfdEntry& aEntry,const TUint8*const aPtr);
+	TInt	ReadLongValuesL(const TUint8*& aPtr, const TUint8*const aPtrLimit);
+	void	ProcessIfdL();
+	void	ProcessIfdEntryL(const TTiffIfdEntry& aEntry);
+	TInt	IntegerIfdEntryValueL(const TTiffIfdEntry& aEntry) const;
+	TInt	IntegerIfdEntryValueL(const TTiffIfdEntry& aEntry,TInt aIndex) const;
+	TReal	RationalIfdEntryValueL(const TTiffIfdEntry& aEntry) const;
+	void	NewStripL();
+private:
+	enum TProcessHeaderState
+		{
+		EReadIfd,
+		EReadLongValues,
+		EProcessIfd,
+		EFinish
+		};
+private:
+	// Local frame settings.
+	TFrameInfo *iImageInfo;
+	CFrameImageData *iImageData;
+
+	TTiffImageData* iFrameImageData;
+	TTiffImageData* iTiffImageData;
+	TTiffImageStrip* iStripInfo;
+
+	TInt				iNewPosition;
+
+	TTiffFormatInfo		iFormatInfo;
+	TTiffValueReader	iValueReader;
+	TInt				iNextIfdOffset;
+
+	TProcessHeaderState	iProcessHeaderState;
+
+	HBufC8*				iIfdBuffer;
+	TTiffIfdEntry*		iIfdEntries;
+	TInt				iNumIfdEntries;
+
+	HBufC8*				iLongValuesBuffer;
+	TUint8*				iLongValues;
+	TInt				iLongValuesSize;
+	TInt				iLoadedLongValuesSize;
+	TInt				iLongValuesStartOffset;
+	TInt				iLongValuesEndOffset;
+
+	TBool				iNewStrip;
+	TInt				iCurrentStrip;
+
+	CTiffReadSubCodec*	iDecoder;
+	CTiffDecoder& 		iPlugin;
+	TInt				iIfdOffset;
+	TInt				iIfdSize;
+	CRecordTable*		iRecordTable;
+	};
+
+#endif // __TIFFCODEC_H__
+