graphicsdeviceinterface/directgdiadaptation/swsrc/swdirectgdipolygon.h
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/directgdiadaptation/swsrc/swdirectgdipolygon.h	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,142 @@
+// Copyright (c) 2007-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 SWDIRECTGDIPOLYGON_H
+#define SWDIRECTGDIPOLYGON_H
+
+/**
+@file
+@internalComponent
+*/
+
+#include "directgdiadapter.h"
+#include <gdi.h>
+#include <e32base.h>
+
+/**
+A utility class to efficiently fill polygons.
+@see CSwDirectGdiEngine::PolyFill
+@see CSwDirectGdiEngine::PolyFillLarge
+*/
+NONSHARABLE_CLASS(CSwDirectGdiPolygonFiller) : public CBase
+	{
+public:
+
+	/**
+	Describes how pixels are to be displayed in the polygon. aUsage should be set to
+	one of these values before CSwDirectGdiPolygonFiller::Construct is used.
+	*/
+	enum TUsage
+		{
+		/**
+		A request for all pixel runs in sequential order.
+		*/
+		EGetAllPixelRunsSequentially,
+		/**
+		A request for all pixel runs in sequential order but only for specified lines.
+		*/
+		EGetPixelRunsSequentiallyForSpecifiedScanLines
+		};
+public:
+	CSwDirectGdiPolygonFiller();
+	~CSwDirectGdiPolygonFiller();
+	void Construct(const TArray<TPoint>* aPointArray, DirectGdi::TFillRule aFillRule,TUsage aUsage=EGetAllPixelRunsSequentially); // N.B. this cannot fail
+	void Construct(const TPoint* aPointList,TInt aNumPoints, DirectGdi::TFillRule aFillRule, TUsage aUsage=EGetAllPixelRunsSequentially); // N.B. this cannot fail
+	void Reset();
+	void GetNextPixelRun(TBool& aExists, TInt& aScanLine, TInt& aStart, TInt& aEnd);
+	void GetNextPixelRunOnSpecifiedScanLine(TBool& aExists, TInt aScanLine, TInt& aStart, TInt& aEnd);
+private: // data-types for the fast algorithm
+	struct SFastEdge
+		{
+		TInt upperVertex;
+		TInt lowerVertex;
+		TInt firstVertex;
+		};
+	struct SFastScanLineIntersection;
+	struct SFastActiveEdge
+		{
+		SFastEdge* edgePtr;
+		TLinearDDA lineGenerator;
+		SFastScanLineIntersection* scanLineIntersectionPtr;
+		};
+	struct SFastScanLineIntersection
+		{
+		TInt firstPixel;
+		TInt lastPixel;
+		SFastActiveEdge* activeEdgePtr;
+		};
+private: // data-types for the slow algorithm
+	struct SSlowScanLineIntersection
+		{
+		TInt firstPixel;
+		TInt lastPixel;
+		TInt firstVertexOfEdge;
+		};
+private: // data-types for both algorithms
+	struct SFastData
+		{
+		TPoint* vertexList;
+		SFastEdge* edgeList;
+		SFastActiveEdge* activeEdgeList;
+		SFastScanLineIntersection* scanLineIntersectionList;
+		TInt numActiveEdges;
+		TInt numScanLineIntersections;
+		TInt nextEdgeToActivate;
+		};
+	struct SSlowData
+		{
+		enum {EStoreSize=8};
+		TLinearDDA lineGenerator;
+		SSlowScanLineIntersection scanLineIntersectionList[EStoreSize];
+		TInt numIntersectionsWithSameFirstPixelPreviouslyMet;
+		TInt numIntersectionsWithSameFirstPixelMetThisTime;
+		TInt numScanLineIntersections;
+		TBool scanLineComplete;
+		TInt firstPixelOfLastIntersectionInPrevBuffer;
+		};
+private:
+	void Construct(DirectGdi::TFillRule aFillRule, TUsage aUsage);
+	void FastHandleVertexIntersection(TInt& aCurrentActiveEdge, TBool aIsLowerVertex);
+	void SetFastIntersection(SFastActiveEdge& aActiveEdge, SFastScanLineIntersection& aScanLineIntersection);
+	void SlowHandleVertexIntersection(SSlowScanLineIntersection& aScanLineIntersection, TInt& aVertexStartingCurrentEdge,TBool aIsLowerVertex);
+	void JumpToCurrentScanLine(TLinearDDA& aLineGenerator, const TPoint& aUpper, const TPoint& aLower,TPoint& aStartPos, TPoint& aEndPos) const;
+	const TPoint& Point(TInt aIndex);
+private:
+	const TArray<TPoint>* iPointArray; // not owned by the class
+	DirectGdi::TFillRule iFillRule;
+	TBool iUseFastAlgorithm;
+	TInt iNumVertexes;
+	TBool iToggler; // used by EAlternate fill-rule
+	TInt iNestingLevel; // used by EWinding fill-rule
+	TInt iScanLineIntersection;
+	TInt iRightMostPixelOnScanLine;
+	TInt iFirstVertex;
+	TBool iPolygonIsAllHorizontal;
+	TInt iFirstScanLine;
+	TInt iLastScanLine;
+	TInt iCurrentScanLine;
+	SFastData iFastData;
+	SSlowData iSlowData;
+private:
+	friend class TCompareEdgesUpperY;
+	friend class TCompareActiveEdgesFirstVertex;
+	friend class TCompareScanLineIntersectionsFirstPixel;
+	friend class TSwapEdges;
+	friend class TSwapActiveEdges;
+	friend class TSwapScanLineIntersections;
+	};
+
+#endif /*SWDIRECTGDIPOLYGON_H*/
+