diff -r ae942d28ec0e -r 2455ef1f5bbc javauis/lcdui_akn/lcdgr/src/LcdImage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/lcdui_akn/lcdgr/src/LcdImage.cpp Wed Sep 01 12:33:18 2010 +0100 @@ -0,0 +1,312 @@ +/* +* Copyright (c) 2005 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 "LcdImage.h" +#include +#include "fbslcdgraphics.h" +#include "LcdFbsImage.h" + +/** + * Copy bitmap data from (aColorBitmap,aAlphaBitmap) to aFbsImage. + */ +extern void CopyBitmapsL +( + CLcdGraphicsDriver& aDriver, + CLcdFbsImage& aFbsImage, + CFbsBitmap* aColorBitmap, + CFbsBitmap* aAlphaBitmap, + TBool aInvertMask +); + +CLcdImage::CLcdImage(CLcdGraphicsDriver& aDriver, TBool aMutable) + : iDriver(aDriver) + , iFbsImage(NULL) + , iMutable(aMutable) +{ +} + +CLcdImage::~CLcdImage() +{ + if (iFbsImage) + { + iFbsImage->RemoveRef(); + } +} + +void CLcdImage::ConstructL(const TSize& aSize, const TImageType& aImageType) +{ + ASSERT(NULL == iFbsImage); + ASSERT(aSize.iWidth > 0); + ASSERT(aSize.iHeight > 0); + + iFbsImage = CLcdFbsImage::NewL(aSize, aImageType.iColorMode, aImageType.iAlphaMode); + iFbsImage->AddRef(); + iTransparency = aImageType.iTransparency; +} + +/** + * 2nd phase constructor from bitmap(s) + * + * Where possible, make a shallow copy (Duplicate) of aColorBitmap and optional aAlphaBitmap, + * if that is not possible because the bitmaps do not match the desired image type, make a + * deep copy. + */ +void CLcdImage::ConstructL(CFbsBitmap* aColorBitmap, CFbsBitmap* aAlphaBitmap, const TImageType& aImageType) +{ + ASSERT(NULL == iFbsImage); + + TDisplayMode colorMode = aColorBitmap->DisplayMode(); + TDisplayMode alphaMode = aAlphaBitmap ? aAlphaBitmap->DisplayMode() : ENone; + + if ((colorMode == aImageType.iColorMode) && (alphaMode == aImageType.iAlphaMode)) + { + // modes match - just duplicate. + iFbsImage = CLcdFbsImage::NewL(aColorBitmap, aAlphaBitmap); + iFbsImage->AddRef(); + } + else + { + iFbsImage = CLcdFbsImage::NewL(aColorBitmap->SizeInPixels(), aImageType.iColorMode, aImageType.iAlphaMode); + iFbsImage->AddRef(); + CopyBitmapsL(iDriver, *iFbsImage, aColorBitmap, aAlphaBitmap, EFalse); + } + + iTransparency = aImageType.iTransparency; +} + +TTransparency CLcdImage::Transparency() const +{ + return iTransparency; +} + +TSize CLcdImage::Size() const +{ + return iFbsImage->Size(); +} + +void CLcdImage::CopyRegion(CLcdImage& aSource, const TDrawRegion& aRegion, const TRect& aClipRect) +{ + TTransparency dstTransparency = Transparency(); + TTransparency srcTransparency = aSource.Transparency(); + + TInt error = TFbsLcdGraphics::CopyRegion + ( + iDriver, + iFbsImage->ColorBitmap(), + iFbsImage->AlphaBitmap(), + dstTransparency, + aSource.iFbsImage->ColorBitmap(), + aSource.iFbsImage->AlphaBitmap(), + srcTransparency, + aRegion, + aClipRect + ); + + ASSERT(error==KErrNone); +} + +void CLcdImage::SetPixels +( + const TRect& aRect, + const TUint32* aPixels, + TInt aLength, + TInt aOffset, + TInt aScanLength, + const TSize& aSize, + TBool aProcessAlpha +) +{ + TInt error = TFbsLcdGraphics::SetPixels + ( + iDriver, + iFbsImage->ColorBitmap(), + iFbsImage->AlphaBitmap(), + iTransparency, + aRect, + aPixels, + aLength, + aOffset, + aScanLength, + aSize, + aProcessAlpha + ); + + ASSERT(error == KErrNone); +} + +void CLcdImage::GetPixels +( + const TRect& aRect, + TUint32* aPixels, + TInt aLength, + TInt aOffset, + TInt aScanLength, + const TSize& aSize +) +{ + TInt error = TFbsLcdGraphics::GetPixels + ( + iDriver, + iFbsImage->ColorBitmap(), + iFbsImage->AlphaBitmap(), + iTransparency, + aRect, + aPixels, + aLength, + aOffset, + aScanLength, + aSize + ); + + ASSERT(error == KErrNone); +} + +TBool CLcdImage::DetectCollision +( + const TRect& aRect1, + TInt aTransform1, + const TPoint& aPoint1, + const CLcdImage& aImage2, + const TRect& aRect2, + TInt aTransform2, + const TPoint& aPoint2 +) +{ + TTransparency transparency1 = iTransparency; + CFbsBitmap* alphaBitmap1 = iFbsImage->AlphaBitmap(); + if (transparency1 == ETransparencyAlphaChannel || transparency1 == ETransparencyMaskChannel) + { + alphaBitmap1 = iFbsImage->ColorBitmap(); + } + + TTransparency transparency2 = aImage2.iTransparency; + CFbsBitmap* alphaBitmap2 = aImage2.iFbsImage->AlphaBitmap(); + if (transparency2 == ETransparencyAlphaChannel || transparency2 == ETransparencyMaskChannel) + { + alphaBitmap2 = aImage2.iFbsImage->ColorBitmap(); + } + + return TFbsLcdGraphics::DetectCollision + ( + iDriver, + alphaBitmap1, + iTransparency, + Size(), + aRect1, + aTransform1, + aPoint1, + alphaBitmap2, + aImage2.Transparency(), + aImage2.Size(), + aRect2, + aTransform2, + aPoint2 + ); +} + + +void CLcdImage::Lock(TBitmapLockCount& aCount, TAcceleratedBitmapInfo& aColorBitmap, TAcceleratedBitmapInfo& aAlphaBitmap) const +{ + CFbsBitmap* colorBitmap = iFbsImage->ColorBitmap(); + CFbsBitmap* alphaBitmap = iFbsImage->AlphaBitmap(); + + TAcceleratedBitmapSpec color(colorBitmap); + TAcceleratedBitmapSpec alpha; + if (alphaBitmap) + { + alpha = TAcceleratedBitmapSpec(alphaBitmap); + } + + color.Lock(aCount); + color.GetInfo(aColorBitmap); + if (alphaBitmap) + { + alpha.Lock(aCount); + alpha.GetInfo(aAlphaBitmap); + } + else + { + Mem::FillZ(&aAlphaBitmap, sizeof(TAcceleratedBitmapInfo)); + } +} + +void CLcdImage::Unlock(TBitmapLockCount& aCount) const +{ + CFbsBitmap* colorBitmap = iFbsImage->ColorBitmap(); + CFbsBitmap* alphaBitmap = iFbsImage->AlphaBitmap(); + + if (alphaBitmap) + { + TAcceleratedBitmapSpec alpha(alphaBitmap); + alpha.Unlock(aCount); + } + + TAcceleratedBitmapSpec color(colorBitmap); + color.Unlock(aCount); +} + +TBool CLcdImage::Mutable() +{ + return iMutable; +} + +/** + * Temporary + */ +CLcdFbsImage* CLcdImage::FbsImage() +{ + return iFbsImage; +} + +TInt CLcdImage::SetImageType(const TImageType& aType) +{ + // + // We only support changing from no-transparency images. + // + if (iTransparency != ETransparencyNone) + { + return KErrNotSupported; + } + + ASSERT(NULL == iFbsImage->AlphaBitmap()); + + CFbsBitmap* colorBitmap = iFbsImage->ColorBitmap(); + TDisplayMode colorMode = colorBitmap->DisplayMode(); + + TInt err = KErrNotSupported; + if ((colorMode == aType.iColorMode) && (aType.iTransparency == ETransparencyAlphaBitmap)) + { + // + // We are just adding an alpha bitmap. + // + TRAP(err, iFbsImage->CreateAlphaBitmapL()); + } + else if ((colorMode == EColor16MU) && (aType.iColorMode == EColor16MA) && (aType.iTransparency == ETransparencyAlphaChannel)) + { + // + // Switch from EColor16MU to EColor16MA mode. + // + err = colorBitmap->SetDisplayMode(EColor16MA); + } + + if (0 == err) + { + iTransparency = aType.iTransparency; + } + + return err; +}