sl@0: // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // Graphics Resource - image implementation sl@0: // sl@0: sl@0: #include "sgdriver.h" sl@0: sl@0: EXPORT_C TInt RSgImage::Create(const TSgImageInfo& aInfo, const TAny* aDataAddress, TInt aDataStride, const TSgAttributeArrayBase* aAttributes) sl@0: { sl@0: if (iImpl) sl@0: { sl@0: return KErrInUse; sl@0: } sl@0: __ASSERT_ALWAYS(gPls.iDriver, Panic(ESgPanicNoDriver)); sl@0: return gPls.iDriver->CreateImage(aInfo, aDataAddress, aDataStride, aAttributes, iImpl); sl@0: } sl@0: sl@0: EXPORT_C TInt RSgImage::Create(const TSgImageInfo& aInfo, const RSgImage& aImage, const TSgAttributeArrayBase* aAttributes) sl@0: { sl@0: if (iImpl) sl@0: { sl@0: return KErrInUse; sl@0: } sl@0: __ASSERT_ALWAYS(gPls.iDriver, Panic(ESgPanicNoDriver)); sl@0: return gPls.iDriver->CreateImage(aInfo, static_cast<XSgImage*>(aImage.iImpl), aAttributes, iImpl); sl@0: } sl@0: sl@0: EXPORT_C TInt RSgImage::GetInfo(TSgImageInfo& aInfo) const sl@0: { sl@0: if (!iImpl) sl@0: { sl@0: return KErrBadHandle; sl@0: } sl@0: __ASSERT_ALWAYS(gPls.iDriver, Panic(ESgPanicNoDriver)); sl@0: __ASSERT_ALWAYS(gPls.iDriver->CheckImage(iImpl), Panic(ESgPanicBadDrawableHandle)); sl@0: static_cast<XSgImage*>(iImpl)->GetInfo(aInfo); sl@0: return KErrNone; sl@0: } sl@0: sl@0: EXPORT_C TInt RSgImage::GetAttribute(TUid aUid, TInt& aValue) const sl@0: { sl@0: if (!iImpl) sl@0: { sl@0: return KErrBadHandle; sl@0: } sl@0: __ASSERT_ALWAYS(gPls.iDriver, Panic(ESgPanicNoDriver)); sl@0: __ASSERT_ALWAYS(gPls.iDriver->CheckImage(iImpl), Panic(ESgPanicBadDrawableHandle)); sl@0: return static_cast<XSgImage*>(iImpl)->GetAttribute(aUid, aValue); sl@0: } sl@0: sl@0: EXPORT_C TInt RSgImage::GetPixelFormats(TUint32 aUsage, RArray<TInt>& aPixelFormats, const TSgAttributeArrayBase* aAttributes) sl@0: { sl@0: static const TInt KSupportedPixelFormats[] = sl@0: { sl@0: ESgPixelFormatA_8, sl@0: ESgPixelFormatRGB_565, sl@0: ESgPixelFormatXRGB_8888, sl@0: ESgPixelFormatARGB_8888, sl@0: ESgPixelFormatARGB_8888_PRE sl@0: }; sl@0: static const TInt KNumSupportedPixelFormats = sizeof(KSupportedPixelFormats) / sizeof(TInt); sl@0: if (aUsage == 0 || aPixelFormats.Count() != 0) sl@0: { sl@0: return KErrArgument; sl@0: } sl@0: if (aAttributes) sl@0: { sl@0: return KErrNotSupported; sl@0: } sl@0: if (aUsage & ~KSgUsageAll) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: _LIT(KLibOpenVg, "libOpenVG.dll"); sl@0: _LIT(KLibOpenGles, "libGLESv1_CM.dll"); sl@0: _LIT(KLibOpenGles2, "libGLESv2.dll"); sl@0: RLibrary lib; sl@0: if (aUsage & (ESgUsageBitOpenVgImage | ESgUsageBitOpenVgSurface)) sl@0: { sl@0: if (lib.Load(KLibOpenVg) != KErrNone) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: lib.Close(); sl@0: } sl@0: if (aUsage & (ESgUsageBitOpenGlesTexture2D | ESgUsageBitOpenGlesSurface)) sl@0: { sl@0: if (lib.Load(KLibOpenGles) != KErrNone) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: lib.Close(); sl@0: } sl@0: if (aUsage & (ESgUsageBitOpenGles2Texture2D | ESgUsageBitOpenGles2Surface)) sl@0: { sl@0: if (lib.Load(KLibOpenGles2) != KErrNone) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: lib.Close(); sl@0: } sl@0: TInt err = KErrNone; sl@0: for (TInt i = 0; i < KNumSupportedPixelFormats; ++i) sl@0: { sl@0: if (KSupportedPixelFormats[i] == ESgPixelFormatA_8 && (aUsage & KSgUsageAllSurfaceTypes)) sl@0: { sl@0: continue; sl@0: } sl@0: err = aPixelFormats.Append(KSupportedPixelFormats[i]); sl@0: if (err != KErrNone) sl@0: { sl@0: break; sl@0: } sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: XSgImage::XSgImage(TSgDrawableId aId, TUint32 aAttribs, const TSgImageMetaData& aMetaData, TAny* aDataAddress, TInt aDataStride) sl@0: : iRefCount(1), iId(aId), iInfo(aMetaData.iSizeInPixels, aMetaData.iPixelFormat, aAttribs & KSgUsageBitMask), sl@0: iDataAddress(aDataAddress), iDataStride(aDataStride) sl@0: { sl@0: } sl@0: sl@0: XSgImage::~XSgImage() sl@0: { sl@0: __ASSERT_DEBUG(iRefCount == 0, Panic(ESgPanicBadRefCount)); sl@0: } sl@0: sl@0: TInt XSgImage::Open() sl@0: { sl@0: if (User::SafeInc(iRefCount) == 0) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: void XSgImage::Close() sl@0: { sl@0: if (User::SafeDec(iRefCount) == 1) sl@0: { sl@0: gPls.iDriver->DeleteImage(this); sl@0: } sl@0: } sl@0: sl@0: TInt XSgImage::RefCount() const sl@0: { sl@0: return iRefCount; sl@0: } sl@0: sl@0: TSgDrawableId XSgImage::Id() const sl@0: { sl@0: return iId; sl@0: } sl@0: sl@0: TUid XSgImage::DrawableType() const sl@0: { sl@0: return KSgImageTypeUid; sl@0: } sl@0: sl@0: TInt XSgImage::GetInterface(TUid aInterfaceUid, TAny*& aInterfacePtr) sl@0: { sl@0: if (aInterfaceUid == KNullUid) sl@0: { sl@0: return KErrArgument; sl@0: } sl@0: if (aInterfaceUid.iUid == MSgImage_Sw::EInterfaceUid) sl@0: { sl@0: aInterfacePtr = static_cast<MSgImage_Sw*>(this); sl@0: return KErrNone; sl@0: } sl@0: return KErrExtensionNotSupported; sl@0: } sl@0: sl@0: void XSgImage::GetInfo(TSgImageInfo& aInfo) const sl@0: { sl@0: aInfo = iInfo; sl@0: } sl@0: sl@0: TInt XSgImage::GetAttribute(TUid aUid, TInt& /*aValue*/) const sl@0: { sl@0: if (aUid == KNullUid) sl@0: { sl@0: return KErrArgument; sl@0: } sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: TInt XSgImage::Compare(const XSgImage& aImage1, const XSgImage& aImage2) sl@0: { sl@0: return Compare(&aImage1.iId, aImage2); sl@0: } sl@0: sl@0: TInt XSgImage::Compare(const TSgDrawableId* aId, const XSgImage& aImage) sl@0: { sl@0: if (aId->iId > aImage.iId.iId) sl@0: { sl@0: return 1; sl@0: } sl@0: if (aId->iId < aImage.iId.iId) sl@0: { sl@0: return -1; sl@0: } sl@0: return 0; sl@0: } sl@0: sl@0: TAny* XSgImage::DataAddress() const sl@0: { sl@0: return iDataAddress; sl@0: } sl@0: sl@0: TInt XSgImage::DataStride() const sl@0: { sl@0: return iDataStride; sl@0: }