--- /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__
+