diff -r f5050f1da672 -r 04becd199f91 javauis/lcdui_akn/javalcdui/src.nokialcdui/CMIDNativeConverter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/lcdui_akn/javalcdui/src.nokialcdui/CMIDNativeConverter.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,203 @@ +/* +* Copyright (c) 2006-2007 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: Wrapper for converter used for drawing to Canvas or Image. +* +*/ + + +// INCLUDE FILES +#include "CMIDNativeConverter.h" +#include "CMIDConvertFactory.h" + +const TInt KAlphaShift = 8; + +CMIDNativeConverter::CMIDNativeConverter() +{ + iDefaultConverter = TMID8888Format(); + iAlphaMode = ENone; +} + +CMIDNativeConverter::~CMIDNativeConverter() +{ + delete iNativeFormat; +} + +CMIDNativeConverter* CMIDNativeConverter::NewL(const TMIDBitmapParameters& aParameters) +{ + CMIDNativeConverter* self = new(ELeave)CMIDNativeConverter; + CleanupStack::PushL(self); + self->ConstructL(aParameters); + CleanupStack::Pop(self); + return self; +} + +void CMIDNativeConverter::ConstructL(const TMIDBitmapParameters& aParameters) +{ + iAlphaBitmap = aParameters.iAlpha; + iAlphaMode = aParameters.iAlphaMode; + iScanlength = aParameters.iScanLength; + + iNativeFormat = CMIDConvertFactory::NewConverterL(aParameters.iFormat); + iNativeFormat->InitializeL(aParameters); +} + +void CMIDNativeConverter::Convert(TMIDInternalARGB& aResult, TUint32 aColor) const +{ + iDefaultConverter.Convert(aResult, aColor); +} + +void CMIDNativeConverter::GetPixel(TMIDInternalARGB& aResult) const +{ + if (iNativeFormat->IsAlpha()) + { + iNativeFormat->GetPixelWithAlpha(aResult); + } + iNativeFormat->GetPixel(aResult); +} + +void CMIDNativeConverter::PlotPixel(const TMIDInternalARGB& aInternal) +{ + iNativeFormat->PlotPixel(aInternal); +} + +void CMIDNativeConverter::PlotPixelWithAlpha(const TMIDInternalARGB& aInternal) +{ + if (aInternal.iA == KAlphaFullTransparent) + { + // totally transparent, no need to do anything + return; + } + + if (aInternal.iA == KAlphaFullOpaque) + { + iNativeFormat->PlotPixel(aInternal); + } + else + { + // calculating partial transparency + TMIDInternalARGB alphaPixel = aInternal; + TMIDInternalARGB belowPixel; + iNativeFormat->GetPixel(belowPixel); + CalculateAlpha(alphaPixel, belowPixel); + iNativeFormat->PlotPixel(alphaPixel); + } +} + +void CMIDNativeConverter::PlotPixelWithAlphaBitmap(const TMIDInternalARGB& aInternal) +{ + if (aInternal.iA == KAlphaFullTransparent) + { + // totally transparent, no need to do anything + return; + } + if (aInternal.iA == KAlphaFullOpaque) + { + iNativeFormat->PlotPixelWithAlpha(aInternal); + } + else + { + // calculating partial transparency + TMIDInternalARGB alphaPixel = aInternal; + TMIDInternalARGB belowPixel; + iNativeFormat->GetPixel(belowPixel); + CalculateAlpha(alphaPixel, belowPixel); + iNativeFormat->PlotPixelWithAlpha(alphaPixel); + } +} + +void CMIDNativeConverter::SetBitmaps(TUint32* aBitmap) +{ + iNativeFormat->SetBitmap(aBitmap); +} + +void CMIDNativeConverter::SetDrawRect(TRect aDrawRect) +{ + iDrawRect = aDrawRect; + iPosition = aDrawRect.iTl; + iNativeFormat->iOffset = iDrawRect.iTl.iX + iDrawRect.iTl.iY * iScanlength; +} + +void CMIDNativeConverter::PlotPixel(const TPoint& aPos, + const TMIDInternalARGB& aInternal, const TRect& aClip) +{ + // is in clip rect + if (aClip.Contains(aPos)) + { + iNativeFormat->iOffset = aPos.iX + aPos.iY * iScanlength; + PlotPixelWithAlphaBitmap(aInternal); + } +} + +void CMIDNativeConverter::DrawScanLine(TPoint aPos, TInt aLength, + const TMIDInternalARGB& aInternal, const TRect& aClip) +{ + + if ((aPos.iY < aClip.iTl.iY) || + (aPos.iY >= aClip.iBr.iY)|| + (aPos.iX > aClip.iBr.iX)) + { + return; + } + if (aPos.iX > aClip.iBr.iX) + { + return; + } + if (aPos.iX < aClip.iTl.iX) + { + aLength -= aClip.iTl.iX - aPos.iX; + aPos.iX = aClip.iTl.iX; + } + if (aPos.iX + aLength > aClip.iBr.iX) + { + aLength = aClip.iBr.iX - aPos.iX; + } + + iNativeFormat->iOffset = aPos.iX + aPos.iY * iScanlength; + for (TInt i = 0; i < aLength; i++) + { + PlotPixelWithAlphaBitmap(aInternal); + ++(iNativeFormat->iOffset); + } +} + +void CMIDNativeConverter::CalculateAlpha(TMIDInternalARGB& aTargetColor, + const TMIDInternalARGB& aBelowColor) +{ + TInt alphaBelow(KAlphaFullOpaque - aTargetColor.iA + 1); + TInt alpha(aTargetColor.iA); + + if (aBelowColor.iA + aTargetColor.iA > KAlphaFullOpaque) + { + aTargetColor.iA = KAlphaFullOpaque; + } + else + { + aTargetColor.iA = (TUint8)(aBelowColor.iA + aTargetColor.iA); + } + + aTargetColor.iR = (TUint8)((aBelowColor.iR * alphaBelow + + aTargetColor.iR * alpha) >> KAlphaShift); + + aTargetColor.iG = (TUint8)((aBelowColor.iG * alphaBelow + + aTargetColor.iG * alpha) >> KAlphaShift); + + aTargetColor.iB = (TUint8)((aBelowColor.iB * alphaBelow + + aTargetColor.iB * alpha) >> KAlphaShift); + +} + +TBool CMIDNativeConverter::HasAlphaBitmap() +{ + return iNativeFormat->IsAlpha(); +}