graphicsdeviceinterface/directgdiadaptation/hwsrc/clippingregionmanager.h
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/directgdiadaptation/hwsrc/clippingregionmanager.h	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,86 @@
+// 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 CLIPPINGREGIONMANAGER_H_
+#define CLIPPINGREGIONMANAGER_H_
+
+#include <VG/openvg.h>
+#include <e32std.h>
+
+/** 
+Defines a rectangle of VGint coordinates for use when passing clipping rectangles to OpenVG.
+*/
+struct TVgClippingRect
+	{
+	VGint iX;
+	VGint iY;
+	VGint iWidth;
+	VGint iHeight;
+	};
+
+/**
+Helper for managing clipping (OpenVG: scissoring) regions within CVGEngine.
+
+OpenVG supports only a fixed number of clipping rects (actual number is defined by 
+the OpenVG implementation, though guaranteed to be at least 32), whereas 
+Symbian OS stipulates no upper bound on the number of clipping rects in the
+clipping region.   
+
+This class keeps the entire clipping region in OpenVG coordinates, and may
+be used to iterate over the clipping region, passing a set number of
+clipping rectangles to OpenVG on each iteration.
+
+A typical use case would be as follows:
+@code
+	for (iRegionManager.Begin(); iRegionManager.ApplyClipRegion(); iRegionManager.Next())
+		vgDrawImage(openVgImage);
+@endcode
+
+@internalComponent
+*/
+NONSHARABLE_CLASS(RClippingRegionManager)
+	{
+	public:
+		RClippingRegionManager ();
+		void  Close ();
+		void  Reset ();
+		void  Initialize (TUint aItemsPerStep, TSize aVgEngineTargetSize);
+		TInt  SetClippingRegion(const TRegion& aRegion);
+		const RRegion& ClippingRegion () const;
+		void  ClipTo(const TRect& aClipRect);
+		void  Begin();
+		TBool Next();
+		TBool ApplyClipRegion();
+		TBool Intersects(const TRect& aClipRect) const;
+		
+	private:
+		void ResetIterator ();
+		TUint RemainingItems() const;
+		TUint ItemsInThisIteration() const;
+		TInt  Append(const TPoint& aVgPosition, VGint width, VGint height);
+		const TPoint ConvertToVgCoords(const TRect& aRect) const;
+		TInt ConvertClippingRegion(const TRegion& aRegion);
+		
+	private:
+		RArray<TVgClippingRect> iClippingRects; 	/**< Array of clipping rectangles stored in OpenVG coordinates.*/
+		RRegion iClippingRegion;					/**< The full clipping region.*/
+		TSize iVgEngineTargetSize;
+		TUint iItemsPerStep;
+		TUint iCurrentRect;
+		TUint iBegun;
+	};
+
+#endif