javauis/lcdui_akn/javalcdui/src.nokialcdui/CMIDNativeConverter.cpp
branchRCL_3
changeset 14 04becd199f91
--- /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();
+}