diff -r 000000000000 -r 40261b775718 mmplugins/imagingplugins/codecs/WMFCodec/WMFCodec.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmplugins/imagingplugins/codecs/WMFCodec/WMFCodec.h Tue Feb 02 01:56:55 2010 +0200 @@ -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 +#include +#include +#include + +#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 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__ +