diff -r 000000000000 -r bde4ae8d615e os/graphics/graphicsresourceservices/graphicsresourceadaptation/src/sgimagecollectionimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/graphics/graphicsresourceservices/graphicsresourceadaptation/src/sgimagecollectionimpl.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,192 @@ +// 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 "sgimagecollectionimpl.h" +#include "sgimageimpl.h" + + +TInt XSgImageCollectionImpl::New(XSgImageCollectionImpl*& aPtr, XSgDriverImpl& aDriverImpl, + const TSgImageInfo& aInfo, TInt aImageCount, TBool aIsCached, + TInt aStride, TInt aOffsetToFirstBuffer, TInt aOffsetBetweenBuffers, + TInt aMetaDataIndex, const XSgImageCollectionImpl* aCollection) + { + aPtr = static_cast(aDriverImpl.Alloc(sizeof(XSgImageCollectionImpl))); + if (!aPtr) + { + return KErrNoMemory; + } + new(aPtr) XSgImageCollectionImpl(aDriverImpl); + TInt err = aPtr->Construct(aInfo, aImageCount, aIsCached, aStride, aOffsetToFirstBuffer, aOffsetBetweenBuffers, aMetaDataIndex, aCollection); + if (err != KErrNone) + { + aPtr->Delete(); + aPtr = NULL; + } + return err; + } + + +TInt XSgImageCollectionImpl::Construct(const TSgImageInfo& aInfo, TInt aImageCount, TBool aIsCached, + TInt aStride, TInt aOffsetToFirstBuffer, TInt aOffsetBetweenBuffers, + TInt aMetaDataIndex, const XSgImageCollectionImpl* aCollection) + { + TInt maxNumberOfHints; + TInt err; + err=iDriverImpl.GetSurfaceManagerAttrib(RSurfaceManager::EMaxNumberOfHints,maxNumberOfHints); + if (err != KErrNone) + { + return err; + } + + if (aInfo.iUserAttributeCount > maxNumberOfHints) + { + return KErrOverflow; + } + RSurfaceManager::THintPair* hints = new RSurfaceManager::THintPair[aInfo.iUserAttributeCount]; + if(!hints) + { + return KErrNoMemory; + } + + RSurfaceManager::TSurfaceCreationAttributesBuf reqs; + reqs().iSize = aInfo.iSizeInPixels; + reqs().iBuffers = aImageCount; + reqs().iPixelFormat = aInfo.iPixelFormat; + reqs().iStride = aStride; + reqs().iOffsetToFirstBuffer = aOffsetToFirstBuffer; + reqs().iAlignment = 4; + reqs().iContiguous = EFalse; + reqs().iCacheAttrib = aIsCached ? RSurfaceManager::ECached : RSurfaceManager::ENotCached; + reqs().iMappable = ETrue; + reqs().iOffsetBetweenBuffers = aOffsetBetweenBuffers; + reqs().iSurfaceHints = hints; + reqs().iHintCount = aInfo.iUserAttributeCount; + for (TInt i = 0; i < aInfo.iUserAttributeCount; ++i) + { + reqs().iSurfaceHints[i].iKey = aInfo.iUserAttributes[i].iUid; + reqs().iSurfaceHints[i].iValue = aInfo.iUserAttributes[i].iValue; + reqs().iSurfaceHints[i].iMutable = EFalse; + } + TSurfaceId surfaceId; + if (!aCollection) + { + err = iDriverImpl.CreateSurface(reqs, surfaceId); + } + else + { + err = iDriverImpl.CreateSurface(reqs, surfaceId, aCollection->iDataChunk); + } + delete[] hints; + hints = NULL; + reqs().iSurfaceHints = NULL; + if (err != KErrNone) + { + return err; + } + iSurfaceId = surfaceId; + iCount = aImageCount; + RChunk chunk; + if (!aCollection) + { + err = iDriverImpl.MapSurface(surfaceId, chunk); + } + else + { + chunk = aCollection->iDataChunk; + err = chunk.Duplicate(RThread()); // Get a process-wide handle + } + if (err != KErrNone) + { + return err; + } + iDataChunk = chunk; + iMetaDataIndex = aMetaDataIndex; + new(chunk.Base() + aMetaDataIndex * sizeof(TSgImageMetaData)) TSgImageMetaData(aInfo, iDriverImpl.PixelFormatTable(), aIsCached); + return KErrNone; + } + + +XSgImageCollectionImpl::~XSgImageCollectionImpl() + { + if (!iSurfaceId.IsNull()) + { + iDriverImpl.CloseSurface(iSurfaceId); + iDataChunk.Close(); + } + } + + +void XSgImageCollectionImpl::Close() + { + XSgDriverImpl& driverImpl = iDriverImpl; + driverImpl.Wait(); + if (DecRefCount() == 0) + { + driverImpl.DeleteImageCollection(this); + } + driverImpl.Signal(); + } + + +const TSurfaceId& XSgImageCollectionImpl::SurfaceId() const + { + return iSurfaceId; + } + + +TInt XSgImageCollectionImpl::GetInfo(TSgImageInfo& aInfo) const + { + reinterpret_cast(iDataChunk.Base() + iMetaDataIndex * sizeof(TSgImageMetaData))->GetInfo(aInfo); + for (TInt i = 0; i < aInfo.iUserAttributeCount; ++i) + { + RSurfaceManager::THintPair hint; + hint.iKey = aInfo.iUserAttributes[i].iUid; + TInt err = iDriverImpl.GetSurfaceHint(iSurfaceId, hint); + if (err != KErrNone) + { + return err; + } + aInfo.iUserAttributes[i].iValue = hint.iValue; + } + return KErrNone; + } + + +TInt XSgImageCollectionImpl::Count() const + { + return iCount; + } + + +TInt XSgImageCollectionImpl::OpenImage(TInt aIndex, MSgDrawableAdapter*& aResult) + { + if (aIndex < 0 || aIndex >= iCount) + { + return KErrArgument; + } + union + { + TSgDrawableId id; + TSgImageId_SurfaceManager id_SurfaceManager; + }; + id_SurfaceManager.iSurfaceId = iSurfaceId; + id_SurfaceManager.iBufferIndex = aIndex; + id_SurfaceManager.iMetaDataIndex = iMetaDataIndex; + id_SurfaceManager.iFlags = 0; + iDriverImpl.Wait(); + TInt err = iDriverImpl.OpenImage(id, KSgDefaultOpenMode, aResult); + iDriverImpl.Signal(); + return err; + }