graphicsdeviceinterface/directgdi/src/directgdiimagetarget.cpp
author Faisal Memon <faisal.memon@nokia.com>
Thu, 06 May 2010 15:31:43 +0100
branchNewGraphicsArchitecture
changeset 49 0ee978e37eb7
parent 0 5d03bc08d59c
permissions -rw-r--r--
Apply patch 3. Many of the fixes in patch 3 are obseleted by updates made to the FCL. So the FCL head is taken in preference. This leaves only the hack in the display channel implementation to do not do a screen rotation on syborg. That solution is a bit hacky, but actually revised in a later patch.

// 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:
//

#include "directgdidriver.h"
#include <graphics/directgdiimagetarget.h>
#include "directgdipaniccodes.h"

/**
Default constructor. 
Only for embedding instances of RDirectGdiImageTarget into other classes as data members. 
Before a RDirectGdiImageTarget can be used the other constructor must be called. 
*/
EXPORT_C RDirectGdiImageTarget::RDirectGdiImageTarget()
	: iDriver(NULL), iHandle(KNullHandle)
	{
	}

/**
Constructor.

@param 	aDriver The CDirectGdiDriver for this thread.

@pre 	CDirectGdiDriver object has been initialised from the calling thread.
@post 	This handle class has a pointer to the CDirectGdiDriver object for this
		thread, and is not associated with any DirectGDI adaptation specific resource.
*/
EXPORT_C RDirectGdiImageTarget::RDirectGdiImageTarget(CDirectGdiDriver& aDriver)
	: iDriver(&aDriver), iHandle(KNullHandle)
	{
	}

/**
Creates a DirectGDI adaptation-specific resource from the given image resource
so it can be used as a target of DirectGDI rendering.

@param 	aImage The image resource.

@pre 	The CDirectGdiDriver object has been set. The image resource has been
		fully constructed and created with the correct usage that allows it to
		be used as a DirectGDI target.
@post 	The DirectGDI adaptation-specific resource that is bound to the given
		image resource is created and this handle is now associated with it.
		The reference counter on the image resource is incremented.

@return KErrNone if successful, KErrArgument if the image resource is not valid,
		KErrAlreadyExists if this handle is already associated with a DirectGDI
		specific resource,  KErrNotSupported if the image resource is not created
		with the correct usage, otherwise one of the system-wide error codes.
*/
EXPORT_C TInt RDirectGdiImageTarget::Create(const RSgImage& aImage)
	{
	GRAPHICS_ASSERT_ALWAYS(iDriver, EDirectGdiPanicImageTargetWithoutDriver);
	return iDriver->CreateImageTarget(*this, aImage);
	}

/**
Destroys the DirectGDI adaptation-specific resource associated with this handle. 
Calling this method on a handle that is not associated with any DirectGDI 
adaptation-specific resource will do nothing. Once Close() is called, this handle can be reused.

@pre	The CDirectGdiDriver object for this handle has been set.
@post	The DirectGDI specific resource associated with this handle will be destroyed
		(at any time preferred by the adaptation). This handle is no longer associated
		with a DirectGDI specific resource. The reference counter of the underlying
		image resource is decremented. 
*/
EXPORT_C void RDirectGdiImageTarget::Close()
	{
	if (iHandle != KNullHandle)
		{
		GRAPHICS_ASSERT_ALWAYS(iDriver, EDirectGdiPanicImageTargetWithoutDriver);
		iDriver->CloseImageTarget(*this);
		}
	}