graphicsresourceservices/graphicsresource/src/sgimagecollection.cpp
author hgs
Fri, 24 Sep 2010 16:14:28 +0300
changeset 187 9f66f99ee56f
parent 0 5d03bc08d59c
permissions -rw-r--r--
201026

// 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 "sgdriver.h"
#include "sgimagecollectionadapter.h"


/**
@internalComponent
*/
const TSurfaceId KNullSurfaceId = {0, 0, 0, 0};


/**
@publishedPartner
@prototype
@deprecated

Default constructor.

@pre None.
@post This RSgImageCollection handle is null.
*/
EXPORT_C RSgImageCollection::RSgImageCollection()
	: iImpl(NULL)
	{}


/**
@publishedPartner
@prototype
@deprecated

Creates an image collection with the specified attributes. The number of images in
the collection cannot be changed after creation. The images in the collection have
identical attributes. The initial contents of all the images are undefined.

@param aInfo The image attributes of the collection to be created.
@param aImageCount The number of images in the collection to be created.
@pre The Graphics Resource driver is initialised for use in the context of the
     calling process.
@pre This RSgImageCollection handle is null.
@pre aInfo is supported and specifies mutable images.
@pre aImageCount is greater than zero.
@post This RSgImageCollection handle references a newly created image collection with
      the specified attributes. The initial reference count for the image collection
      is one.
@return KErrNone if successful.
@return KErrInUse if this RSgImageCollection handle was not null.
@return KErrArgument if aInfo is invalid or if aImageCount is negative or zero.
@return KErrTooBig if the size specified in aInfo is too large.
@return KErrNotSupported if aInfo is not supported or does not specify mutable images.
@return KErrNoMemory if there is not enough system memory.
@return KErrNoSpecializedMemory if there is not enough specialised graphics memory.
@panic SGRES 5 in debug builds if the Graphics Resource driver is not initialised
       for use in the context of the calling process.
*/
EXPORT_C TInt RSgImageCollection::Create(const TSgImageInfo& aInfo, TInt aImageCount)
	{
#ifdef _DEBUG
	gPls.iMutex.Wait();
	__ASSERT_DEBUG(gPls.iDriver, Panic(ESgPanicNoDriver));
#endif
	TInt err = gPls.iDriver->CreateImageCollection(aInfo, aImageCount, iImpl);
#ifdef _DEBUG
	gPls.iMutex.Signal();
#endif
	return err;
	}


/**
@publishedPartner
@prototype
@deprecated

Creates a set of image collections that share a single memory chunk. The number of
images in each collection is the same and cannot be changed after creation. The images
in each collection have identical attributes. The initial contents of all the images
are undefined.

Care must be taken when using image collections created in this way. In particular,
writing to the Nth image of one collection may invalidate the contents of the Nth image
of all other collections, but will not affect any other images.

@param aInfos An array of aCollectionCount elements with the image attributes of each
       of the collections to be created.
@param aImageCount The number of images in each of the collections to be created.
@param aCollections On return, an array of RSgImageCollection handles that reference
       newly created image collections with the specified attributes.
@param aCollectionCount The number of image collections to be created.
@pre The Graphics Resource driver is initialised for use in the context of the
     calling process.
@pre All the elements of aInfos are supported and specify mutable images.
@pre aImageCount is greater than zero.
@pre All the RSgImageCollection handles in aCollections are null.
@pre aCollectionCount is greater than zero.
@post The initial reference count for each of the newly created image collections is one.
@return KErrNone if successful.
@return KErrInUse if any of the RSgImageCollection handles in aCollections was not null.
@return KErrArgument if any element of aInfos is invalid, if aImageCount is negative
        or zero, or if aCollectionCount is negative or zero.
@return KErrTooBig if any of the sizes specified in aInfos is too large.
@return KErrNotSupported if any element of aInfos is not supported or does not specify
        mutable images.
@return KErrNoMemory if there is not enough system memory.
@return KErrNoSpecializedMemory if there is not enough specialised graphics memory.
@panic SGRES 5 in debug builds if the Graphics Resource driver is not initialised
       for use in the context of the calling process.
*/
EXPORT_C TInt RSgImageCollection::Create(const TSgImageInfo aInfos[], TInt aImageCount,
                                         RSgImageCollection aCollections[], TInt aCollectionCount)
	{
#ifdef _DEBUG
	gPls.iMutex.Wait();
	__ASSERT_DEBUG(gPls.iDriver, Panic(ESgPanicNoDriver));
#endif
	TInt err = gPls.iDriver->CreateImageCollections(aInfos, aImageCount,
	                                                reinterpret_cast<MSgImageCollectionAdapter**>(aCollections), aCollectionCount);
#ifdef _DEBUG
	gPls.iMutex.Signal();
#endif
	return err;
	}


/**
@publishedPartner
@prototype
@deprecated

Closes a handle to an image collection. If there are no remaining handles to
the image collection, then it can be destroyed by the Graphics Resource driver.
Calling Close() on a null handle is allowed but has no effect.

@pre If this RSgImageCollection handle is not null then the Graphics Resource
     driver is initialised for use in the context of the calling process.
@pre This RSgImageCollection handle is valid.
@post This RSgImageCollection handle is null. The reference count for the
      previously referenced image collection, if any, is decremented by one.
@panic SGRES 4 in debug builds if this RSgImageCollection handle is invalid.
@panic SGRES 5 in debug builds if this RSgImageCollection handle is not null
       and the Graphics Resource driver is not initialised for use in the
       context of the calling process.
*/
EXPORT_C void RSgImageCollection::Close()
	{
	if (iImpl)
		{
#ifdef _DEBUG
		gPls.iMutex.Wait();
		__ASSERT_DEBUG(gPls.iDriver, Panic(ESgPanicNoDriver));
		__ASSERT_DEBUG(gPls.iDriver->CheckImageCollection(*iImpl), Panic(ESgPanicBadImageCollectionHandle));
#endif
		iImpl->Close();
		iImpl = NULL;
#ifdef _DEBUG
		gPls.iMutex.Signal();
#endif
		}
	}


/**
@publishedPartner
@prototype
@deprecated

Retrieves the surface identifier of an image collection.

@pre The Graphics Resource driver is initialised for use in the context of the
     calling process.
@pre This RSgImageCollection handle is valid.
@post None.
@return The surface identifier of the image collection or the null surface identifier
        if this RSgImageCollection handle is null.
@panic SGRES 4 in debug builds if this RSgImageCollection handle is invalid.
@panic SGRES 5 in debug builds if the Graphics Resource driver is not initialised
       for use in the context of the calling process.
*/
EXPORT_C const TSurfaceId& RSgImageCollection::SurfaceId() const
	{
	if (!iImpl)
		{
		return KNullSurfaceId;
		}
#ifdef _DEBUG
	gPls.iMutex.Wait();
	__ASSERT_DEBUG(gPls.iDriver, Panic(ESgPanicNoDriver));
	__ASSERT_DEBUG(gPls.iDriver->CheckImageCollection(*iImpl), Panic(ESgPanicBadImageCollectionHandle));
#endif
	const TSurfaceId& id = iImpl->SurfaceId();
#ifdef _DEBUG
	gPls.iMutex.Signal();
#endif
	return id;
	}


/**
@publishedPartner
@prototype
@deprecated

Tests whether this RSgImageCollection handle is null.

@pre None.
@post None.
@return ETrue, if this RSgImageCollection handle is null, EFalse otherwise.
*/
EXPORT_C TBool RSgImageCollection::IsNull() const
	{
	return iImpl == NULL;
	}


/**
@publishedPartner
@prototype
@deprecated

Retrieves the values of the attributes of the images in an image collection. This
function can also retrieve the values of selected user-defined attributes attached
to an image collection by passing in the globally unique identifiers of the
user-defined attributes to be retrieved.

@param aInfo On input, the globally unique identifiers of the user-defined attributes
       to be retrieved from the image collection, if any. On return, the values of
       the attributes of the images in the collection and the values of the selected
       user-defined attributes.
@pre The Graphics Resource driver is initialised for use in the context of the
     calling process.
@pre This RSgImageCollection handle is valid and not null.
@pre If aInfo.iUserAttributes is not null then it points to an array of
     aInfo.iUserAttributeCount elements with globally unique identifiers
     corresponding to user-defined attributes attached to the image collection.
@post None.
@return KErrNone if successful.
@return KErrBadHandle if this RSgImageCollection handle is null.
@return KErrNotFound if any of the user-defined attributes to be retrieved from the
        image collection cannot be found.
@panic SGRES 4 in debug builds if this RSgImageCollection handle is invalid.
@panic SGRES 5 in debug builds if the Graphics Resource driver is not initialised
       for use in the context of the calling process.
*/
EXPORT_C TInt RSgImageCollection::GetInfo(TSgImageInfo& aInfo) const
	{
	if (!iImpl)
		{
		return KErrBadHandle;
		}
#ifdef _DEBUG
	gPls.iMutex.Wait();
	__ASSERT_DEBUG(gPls.iDriver, Panic(ESgPanicNoDriver));
	__ASSERT_DEBUG(gPls.iDriver->CheckImageCollection(*iImpl), Panic(ESgPanicBadImageCollectionHandle));
#endif
	TInt err = iImpl->GetInfo(aInfo);
#ifdef _DEBUG
	gPls.iMutex.Signal();
#endif
	return err;
	}


/**
@publishedPartner
@prototype
@deprecated

Retrieves the number of images in an image collection.

@pre The Graphics Resource driver is initialised for use in the context of the
     calling process.
@pre This RSgImageCollection handle is valid.
@post None.
@return The number of images in the image collection or zero if this RSgImageCollection
        handle is null.
@panic SGRES 4 in debug builds if this RSgImageCollection handle is invalid.
@panic SGRES 5 in debug builds if the Graphics Resource driver is not initialised
       for use in the context of the calling process.
*/
EXPORT_C TInt RSgImageCollection::Count() const
	{
	if (!iImpl)
		{
		return 0;
		}
#ifdef _DEBUG
	gPls.iMutex.Wait();
	__ASSERT_DEBUG(gPls.iDriver, Panic(ESgPanicNoDriver));
	__ASSERT_DEBUG(gPls.iDriver->CheckImageCollection(*iImpl), Panic(ESgPanicBadImageCollectionHandle));
#endif
	TInt count = iImpl->Count();
#ifdef _DEBUG
	gPls.iMutex.Signal();
#endif
	return count;
	}


/**
@publishedPartner
@prototype
@deprecated

Opens a new handle to one of the images in an image collection.

@param aIndex The index of the image within the image collection.
@param aResult On return, an RSgImage handle that references the specified image in
       the collection.
@pre The Graphics Resource driver is initialised for use in the context of the
     calling process.
@pre This RSgImageCollection handle is valid and not null.
@pre aIndex is greater than or equal to zero and less than the number of images in
     the collection.
@pre aResult is a null handle.
@post The reference count for the image collection is incremented by one.
@return KErrNone if successful.
@return KErrBadHandle if this RSgImageCollection handle is null.
@return KErrInUse if aResult was not a null handle.
@return KErrArgument if aIndex is invalid.
@return KErrNoMemory if there is not enough system memory.
@panic SGRES 4 in debug builds if this RSgImageCollection handle is invalid.
@panic SGRES 5 in debug builds if the Graphics Resource driver is not initialised
       for use in the context of the calling process.
*/
EXPORT_C TInt RSgImageCollection::OpenImage(TInt aIndex, RSgImage& aResult)
	{
	if (!iImpl)
		{
		return KErrBadHandle;
		}
#ifdef _DEBUG
	gPls.iMutex.Wait();
	__ASSERT_DEBUG(gPls.iDriver, Panic(ESgPanicNoDriver));
	__ASSERT_DEBUG(gPls.iDriver->CheckImageCollection(*iImpl), Panic(ESgPanicBadImageCollectionHandle));
#endif
	TInt err = iImpl->OpenImage(aIndex, aResult.iImpl);
#ifdef _DEBUG
	gPls.iMutex.Signal();
#endif
	return err;
	}