imaging/imagingplugins/codecs/WMFCodec/WMFCodec.h
changeset 0 5752a19fdefe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imaging/imagingplugins/codecs/WMFCodec/WMFCodec.h	Wed Aug 25 12:29:52 2010 +0300
@@ -0,0 +1,366 @@
+// 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 __WMFCODEC_H__
+#define __WMFCODEC_H__
+
+#include <bitdev.h>
+#include <icl/imageprocessor.h>
+#include <icl/imagecodec.h>
+#include <icl/imagecodecdata.h>
+
+#include "WMFConvert.h"
+
+// Constants.
+// Record size (2 16-bit WORDS); Record identifier (1 16-bit WORD)
+const TInt KWmfMinRecordSizeInWords = 3;
+//Size of polyline, polygon and polypolygon records. Should be KWmfMinRecordSizeInWords + 1 
+//word for number of points in polyline or number of points in polygon or number of polygons in polypolygon.
+const TInt KWmfPolyRecordSizeInWords = 4; 
+
+const TInt KWmfMaxGraphicsObjectCount = 256;
+const TInt KWmfTerminateFunction = 0;
+//KWmfMinRecordSizeInWords + 1 word each for string-length, Y-Position, X-Position
+const TInt KMinTextoutRecordSizeInWords = KWmfMinRecordSizeInWords + 3;
+
+const TInt KWmfGraphicsObjectPen = 0;
+const TInt KWmfGraphicsObjectBrush = 1;
+const TInt KWmfGraphicsObjectPatternBrush = 2;
+const TInt KWmfGraphicsObjectFont = 3;
+const TInt KWmfGraphicsObjectRegion = 4;
+const TInt KWmfGraphicsObjectPalette = 5;
+const TInt KWmfGraphicsObjectDummyBrush = 6;
+
+
+// Helper classes.
+class CPen;
+class CBrush;
+class CPatternBrush;
+class CFbsBitGcWrapper : public CBase
+	{
+public:
+	static CFbsBitGcWrapper* NewL(CFbsDevice& aDevice, CFbsBitGcWrapper* aGc = NULL);
+	~CFbsBitGcWrapper();
+
+	const CFbsFont* CurrentFont();
+
+	virtual void SetPen(const CPen& aPen);
+	virtual void SetBrush(CBrush& aBrush);
+	virtual void RestorePenAndBrush();
+	virtual void DrawPolygonL(const TPoint* aPointList,TInt aNumPoints,CGraphicsContext::TFillRule aFillRule);
+
+	virtual void Clear();
+	virtual void SetUnderlineStyle(TFontUnderline aUnderlineStyle);
+	virtual void SetStrikethroughStyle(TFontStrikethrough aStrikethroughStyle);
+	virtual void UseFont(const CFbsFont* aFont);
+	virtual void SetClippingRegion(const TRegion* aRect);
+	virtual void SetCharJustification(TInt aExcessWidth, TInt aNumGaps);
+	virtual void SetWordJustification(TInt aExcessWidth, TInt aNumChars);
+	virtual void DrawLineTo(const TPoint& aPoint);
+	virtual void MoveTo(const TPoint& aPoint);
+	virtual void DrawPolyLine(const TPoint* aPointList, TInt aNumPoints);
+	virtual void DrawEllipse(const TRect& aRect);
+	virtual void DrawRect(const TRect& aRect);
+	virtual void DrawRoundRect(const TRect& aRect, const TSize& aEllipse);
+	virtual void SetPenStyle(CGraphicsContext::TPenStyle aPenStyle);
+	virtual void SetBrushStyle(CGraphicsContext::TBrushStyle aBrushStyle);
+	virtual void SetBrushColor(const TRgb& aColor);
+	virtual void SetDrawMode(CGraphicsContext::TDrawMode aDrawMode);
+	virtual void SetPenColor(const TRgb& aColor);
+	virtual void SetTextPenColor();
+	virtual void Plot(const TPoint& aPoint);
+	virtual void SetPenSize(const TSize& aSize);
+	virtual void DrawArc(const TRect& aRect, const TPoint& aStart, const TPoint& aEnd);
+	virtual void DrawPie(const TRect& aRect, const TPoint& aStart, const TPoint& aEnd);
+	virtual void DrawBitmap(const TRect& aDestRect, const CFbsBitmap* aSource, const TRect& aSourceRect);
+	virtual void DrawText(const TDesC& aText,const TPoint& aPosition);
+
+	virtual void UseBrushPattern(const CFbsBitmap* aPatternBitmap);
+	virtual void SetTextColor(TRgb aTextColor);
+	virtual void SetBackgroundColor(TRgb aBackgroundColor);
+	virtual void RealizeBrush();
+
+protected:
+	CFbsBitGcWrapper();
+	void ConstructL(CFbsDevice& aDevice, CFbsBitGcWrapper* aGc);
+
+protected:
+	TRgb iBrushColor;
+	CGraphicsContext::TBrushStyle iBrushStyle;
+
+	TRgb iPenColor;
+	CGraphicsContext::TPenStyle iPenStyle;
+	TSize iPenSize;
+
+	TRgb iTextColor;
+	TRgb iBackgroundColor;
+	CPatternBrush* iPatternBrush;
+
+private:
+	CFbsBitGc* iGc;
+	CFbsBitGc* iPolygonGc;
+
+	const CFbsFont* iCurrentFont; // Not owned.	
+	};
+
+class CFbsBitGcMaskWrapper : public CFbsBitGcWrapper
+	{
+public:
+	static CFbsBitGcMaskWrapper* NewL(CFbsDevice& aDevice, CFbsDevice& aMaskDevice, CFbsBitGcMaskWrapper* aGc = NULL);
+	~CFbsBitGcMaskWrapper();
+
+	// From CFbsBitGcWrapper
+	void SetPen(const CPen& aPen);
+	void SetBrush(CBrush& aBrush);
+	void DrawPolygonL(const TPoint* aPointList,TInt aNumPoints,CGraphicsContext::TFillRule aFillRule);
+
+	void Clear();
+	void SetUnderlineStyle(TFontUnderline aUnderlineStyle);
+	void SetStrikethroughStyle(TFontStrikethrough aStrikethroughStyle);
+	void UseFont(const CFbsFont* aFont);
+	void SetClippingRegion(const TRegion* aRect);
+	void SetCharJustification(TInt aExcessWidth, TInt aNumGaps);
+	void SetWordJustification(TInt aExcessWidth, TInt aNumChars);
+	void DrawLineTo(const TPoint& aPoint);
+	void MoveTo(const TPoint& aPoint);
+	void DrawPolyLine(const TPoint* aPointList, TInt aNumPoints);
+	void DrawEllipse(const TRect& aRect);
+	void DrawRect(const TRect& aRect);
+	void DrawRoundRect(const TRect& aRect, const TSize& aEllipse);
+	void SetPenStyle(CGraphicsContext::TPenStyle aPenStyle);
+	void SetBrushStyle(CGraphicsContext::TBrushStyle aBrushStyle);
+	void SetDrawMode(CGraphicsContext::TDrawMode aDrawMode);
+	void Plot(const TPoint& aPoint);
+	void SetPenSize(const TSize& aSize);
+	void DrawArc(const TRect& aRect, const TPoint& aStart, const TPoint& aEnd);
+	void DrawPie(const TRect& aRect, const TPoint& aStart, const TPoint& aEnd);
+	void DrawBitmap(const TRect& aDestRect, const CFbsBitmap* aSource, const TRect& aSourceRect);
+	void DrawText(const TDesC& aText,const TPoint& aPosition);
+	void UseBrushPattern(const CFbsBitmap* aPatternBitmap, TBool aHatchedBrush);
+
+private:
+	CFbsBitGcMaskWrapper();
+	void ConstructL(CFbsDevice& aDevice, CFbsDevice& aMaskDevice, CFbsBitGcMaskWrapper* aGc);
+
+	CFbsBitGc* iMaskGc;
+	CFbsBitGc* iPolygonMaskGc;
+	};
+
+
+class CGraphicsObject : public CBase
+	{
+public:
+	virtual void Apply(CFbsBitGcWrapper* aGc) = 0;
+	virtual TInt Type() const = 0;
+	};
+
+class CPen : public CGraphicsObject
+	{
+public:
+	virtual void Apply(CFbsBitGcWrapper* aGc);
+	virtual TInt Type() const;
+public:
+	CGraphicsContext::TPenStyle iStyle;
+	TSize iSize;
+	TRgb iColor;
+	};
+
+class CDummyBrush : public CGraphicsObject
+	{
+public:
+	virtual void Apply(CFbsBitGcWrapper* aGc);
+	virtual TInt Type() const;
+	};
+
+class CBrush : public CGraphicsObject
+	{
+public:
+	virtual void Apply(CFbsBitGcWrapper* aGc);
+	virtual TInt Type() const;
+public:
+	CGraphicsContext::TBrushStyle iStyle;
+	TRgb iColor;
+	};
+
+class CPatternBrush : public CBrush
+	{
+public:
+	static CPatternBrush* NewL();
+	~CPatternBrush();
+
+	virtual void Apply(CFbsBitGcWrapper* aGc);
+	virtual TInt Type() const;
+
+	void SetBitmapBits(TUint8* aBitmapBits);
+	void RealizeBrush(TRgb aTextColor, TRgb aBackgroundColor);
+
+	CFbsBitmap* Bitmap();
+
+private:
+	CPatternBrush();
+	void ConstructL();
+
+private:
+	CFbsBitmap* iBitmap;
+	TUint8* iBitmapBits;
+
+	TRgb iTextColor;
+	TRgb iBackgroundColor;
+	};
+
+class CFontObject : public CGraphicsObject
+	{
+public:
+	CFontObject(CFbsDevice& aDevice,CFbsFont& aFont,TBool aUnderline,TBool aStrikeOut);
+	~CFontObject();
+	virtual void Apply(CFbsBitGcWrapper* aGc);
+	virtual TInt Type() const;
+private:
+	CFbsDevice& iDevice;
+	CFbsFont& iFont;
+	TFontUnderline iUnderline;
+	TFontStrikethrough iStrikeOut;
+	};
+
+class CRectRegion : public CGraphicsObject
+	{
+public:
+	CRectRegion(CFbsDevice& aDevice, TRegion& aClipRegion, TInt aLeft, TInt aTop, TInt aRight, TInt aBottom);
+	virtual void Apply(CFbsBitGcWrapper* aGc);
+	virtual TInt Type() const;
+public:
+	TRect iRect;
+
+private:
+	CFbsDevice& iDevice;
+	TRegion& iClipRegion;
+	};
+
+class CPaletteObject : public CGraphicsObject
+	{
+public:
+	virtual void Apply(CFbsBitGcWrapper* aGc);
+	virtual TInt Type() const;
+	};
+
+
+// Read codec.
+class CWmfDecoder;
+class CWmfReadCodec : public CImageReadCodec
+	{
+public:
+	//From CImageReadCodec
+	virtual void InitFrameL(TFrameInfo& aFrameInfo, CFrameImageData& aFrameImageData, TBool aDisableErrorDiffusion, CFbsBitmap& aBitmap, CFbsBitmap* aDestinationMask);
+ 
+	static CWmfReadCodec* NewL(TInt aWordsExpected);
+	TFrameState ProcessFrameL(TBufPtr8& aSrc);
+	TInt ReducedSize(const TSize& aOriginalSize,TInt aReductionFactor, TSize& aReducedSize) const;
+	TInt ReductionFactor(const TSize& aOriginalSize, const TSize& aReducedSize) const;
+	void SetIgnoreViewportMetaData(TBool aIgnoreViewportMetaData);
+protected:
+	~CWmfReadCodec();
+	virtual void DoProcessL(TUint16*& aDataPtr,const TUint16* aDataPtrLimit);
+	void DoProcess00L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess01L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess10L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess11L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess0000L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess0001L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess0010L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess0011L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess0100L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess0101L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess0110L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess0111L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess1000L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess1001L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess1010L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess1011L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess1100L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess1101L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess1110L(TInt aFunction,TUint16* aArgPtr);
+	void DoProcess1111L(TInt aFunction,TUint16* aArgPtr);
+	void DrawTextL(const TDesC8& aText, const TPoint& aPos, CFbsBitGcWrapper* aGc);
+	void AddGraphicsObject(CGraphicsObject* aObject);
+	CGraphicsObject* GraphicsObject(TInt aHandle);
+	void RemoveGraphicsObject(TInt aHandle);
+	CFbsBitGcWrapper* CloneGcL();
+	TInt LogicalCoordToDeviceCoord(TInt aLogicalCoord,TBool aHorizontal);
+	TInt LogicalSizeToDeviceSize(TInt aLogicalSize,TBool aHorizontal);
+	void SetROP(CFbsBitGcWrapper* aGc, TInt aROP);
+	void SetROP3(CFbsBitGcWrapper* aGc, TInt aROP);
+	TRgb ExtractColor(const TUint16* aArgPtr);
+	TPoint ExtractPoint(const TUint16* aArgPtr,TBool aXYOrder);
+	TRect ExtractRect(const TUint16* aArgPtr);
+	TInt ExtractDib(const TUint16* aArgPtr, CFbsBitmap* aBitmap);
+	TInt ExtractDib(const TUint16* aArgPtr, CPatternBrush* aPatternBrush);
+protected:
+	enum TMapMode
+		{
+		EMapModeTEXT		= 1,
+		EMapModeLOMETRIC	= 2,
+		EMapModeHIMETRIC	= 3,
+		EMapModeLOENGLISH	= 4,
+		EMapModeHIENGLISH	= 5,
+		EMapModeTWIPS		= 6,
+		EMapModeISOTROPIC	= 7,
+		EMapModeANISOTROPIC	= 8
+		};
+private:
+	CWmfReadCodec(TInt aWordsExpected);
+	void ConstructL();
+
+private:
+	TInt iWordsProcessed;
+	TInt iWordsExpected;
+	TBool iIgnoreViewportMetaData;
+
+	CFbsBitmapDevice* iDevice;
+	CFbsBitmapDevice* iMaskDevice;
+	CFbsBitGcWrapper* iGc;
+
+	RPointerArray<CFbsBitGcWrapper> iSavedGcStack;
+	TBool iBkModeOpaque;
+	TMapMode iMapMode;
+	TPoint iWindowOrg;
+	TSize iWindowExt;
+	TPoint iViewportOrg;
+	TSize iViewportExt;
+	CGraphicsObject* iGraphicsObject[KWmfMaxGraphicsObjectCount];
+
+	CPen* iDefaultPen;
+	CBrush* iDefaultBrush;
+	TRegionFix<1> iClipRegion;
+	TRegionFix<1> iIntersectRegion;
+	
+	CGraphicsContext::TFillRule iFillRule;
+	TPoint* iPointArray;
+	TInt iPointArrayEntries;
+	TUint32 iTextAlignFlags;
+
+	// Record related information
+	TUint16* iAccumulator;
+	TUint16* iAccumulatorPtr;
+	TInt iAccumulatorSizeInWords;
+	TBool iLookingForRecord;
+	TInt iRecordSizeInWords;
+	TInt iFunction;
+	TInt iWordsToRead;
+	TBool iFinished;
+	};
+
+
+#endif // __WMFCODEC_H__
+