graphicsdeviceinterface/directgdiadaptation/hwsrc/directgdidriverimpl.h
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/directgdiadaptation/hwsrc/directgdidriverimpl.h	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,155 @@
+// 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:
+// Declaration of a Direct Graphics Device Interface (GDI) Driver implementation,
+// this class actually implements the HAI.
+// 
+//
+
+
+#ifndef __DIRECTGDIDRIVERIMPL_H__
+#define __DIRECTGDIDRIVERIMPL_H__
+
+/**
+@file
+@internalComponent Reference implementation of Open VG hardware accelerated DirectGDI adaptation.
+*/
+#include "vgimagecache.h"
+#include "directgdidrawableref.h"
+#include "directgdiimageref.h"
+#include "directgdidriverprocessstate.h"
+#include "glyphimagecache.h"
+#include <graphics/directgdidriverinternal.h>
+#include <graphics/directgdiextensioninterfaces.h>
+#include <e32hashtab.h>
+#include <e32cmn.h>
+#include <pls.h>
+
+
+// Forward declarations.
+//
+class CDirectGdiImageTargetImpl;
+class CDirectGdiImageSourceImpl;
+class CVgEngine;
+class CDirectGdiDrawableRef;
+class RDirectGdiImageTarget;
+
+/**
+Represents the body part of CDirectGdiDriver that actually implements the HAI. Derives from the CDirectGdiDriverInternal class and implements all the 
+interfaces to provide the functionality required by the generic layer.
+*/
+NONSHARABLE_CLASS(CDirectGdiDriverImpl): public CDirectGdiDriverInternal, public MDirectGdiDriverCacheSize
+	{
+public:
+	static TInt New(CDirectGdiDriverInternal*& aInternal, RLibrary aLibrary);
+	~CDirectGdiDriverImpl();
+
+	// From CDirectGdiDriverInternal	
+	void Flush();
+	void Finish();	
+	TInt GetError();
+	void SetError(TInt aErr);
+	TInt CreateDrawableSource(TInt& aHandleRet, const RSgDrawable& aSgDrawable);
+	void CloseDrawableSource(TInt& aHandle) ;	
+	TInt CreateImageTarget(TInt& aHandleRet, const RSgImage& aImageDestination);
+	void CloseImageTarget(TInt& aHandle);
+	TInt CreateEngine(MDirectGdiEngine*& aDirectGdiEngine);
+	void DestroyEngine(MDirectGdiEngine* aDirectGdiEngine);
+	TInt GetInterface(TUid aInterfaceId, TAny*& aInterface);
+	
+	// From MDirectGdiDriverCacheSize
+	TInt SetMaxImageCacheSize(TInt aSize);	
+	TInt MaxImageCacheSize() const;
+	TInt SetMaxGlyphCacheSize(TInt aSize);
+	TInt MaxGlyphCacheSize() const;
+	
+	void SetCurrentEngine(CVgEngine* aCurrentEngine);
+	void SetCurrentTarget(CDirectGdiImageTargetImpl* aCurrentTarget);
+	TBool IsCurrentEngine(const CVgEngine* aCurrentEngine) const;
+	TBool IsCurrentTarget(const CDirectGdiImageTargetImpl* aCurrentTarget) const;
+	void Activate(CDirectGdiImageTargetImpl* aRenderingTarget);
+	void Reactivate(CDirectGdiImageTargetImpl* aRenderingTarget);
+	void Deactivate(CDirectGdiImageTargetImpl* aRenderingTarget);
+	CDirectGdiImageSourceImpl* GetImageSourceFromHandle(TInt aHandle) const;	
+	CDirectGdiImageTargetImpl* GetImageTargetFromHandle(TInt aHandle) const;
+	TBool IsImageSource(TInt aHandle) const;
+	
+	CFontGlyphImageStorage* FontGlyphImageStorage() const;
+	TInt PreAllocateFontGlyphImages(); //images will be used to draw glyphs if the system runs out of memory
+	CVgImageCache* VgImageCache() const;
+
+	// VGImage cache commands
+	VGImage GetVgImageFromCache(const CFbsBitmap& aBitmap, const TPoint& aOrigin) const;
+	TBool AddVgImageToCache(const CFbsBitmap& aBitmap, VGImage& aImage, const TPoint& aOrigin);
+	
+	TInt RegisterSourceImage(const CDirectGdiImageSourceImpl& aImage);
+	TInt RegisterTargetImage(const CDirectGdiImageTargetImpl& aImage);
+	TInt UnregisterSourceImage(const CDirectGdiImageSourceImpl& aImage);
+	TInt UnregisterTargetImage(const CDirectGdiImageTargetImpl& aImage);
+	
+	inline EGLDisplay EglDisplay() const;
+	inline XDirectGdiDriverProcessState& ProcessState() const;
+	
+	static TInt GetVgError();
+
+private:
+	CDirectGdiDriverImpl(RLibrary aLibrary);
+	TInt Construct();
+	TInt InitializeEglConfigs(EGLDisplay display);
+		
+#ifdef _DEBUG
+	void CheckSourceIsValid(TInt aHandle) const;
+	void CheckTargetIsValid(TInt aHandle) const;
+#endif // _DEBUG
+
+private:
+	TInt iErrorCode; 	/**< The first error code to occur in any CVgEngine instance.*/
+	RHashMap<TInt, EGLContext> iPixelContextMap;
+	RHashMap<TInt, EGLConfig> iPixelConfigMap;
+	CVgEngine* iCurrentEngine;
+	CDirectGdiImageTargetImpl* iCurrentTarget;
+	EGLContext iSharedContext;
+	EGLDisplay iDisplay;
+	RPointerArray<CDirectGdiImageRef> iSourceArray;	/**< An array of pointers to all sources created and currently held open by this driver.*/
+	RPointerArray<CDirectGdiImageRef> iTargetArray;	/**< An array of pointers to all targets created and currently held open by this driver.*/
+	
+	CFontGlyphImageStorage* iGlyphImageStorage;
+	CVgImageCache* iVgImageCache;
+
+#ifndef __WINS__
+	static XDirectGdiDriverProcessState gProcessState;
+#endif
+	};
+
+/**
+@return A reference to the process state object.
+*/
+inline XDirectGdiDriverProcessState& CDirectGdiDriverImpl::ProcessState() const
+	{
+#ifdef __WINS__
+	const TUid KDirectGdiAdapterUid = {0x102858E9};
+	return *Pls<XDirectGdiDriverProcessState>(KDirectGdiAdapterUid);
+#else
+	return gProcessState;
+#endif
+	}
+
+/**
+@return A handle to the EGLDisplay associated with this driver.
+*/
+inline EGLDisplay CDirectGdiDriverImpl::EglDisplay() const 
+	{
+	return iDisplay; 
+	}
+
+#endif //__DIRECTGDIDRIVERIMPL_H__