skins/AknSkins/polysrc/AknsAlPolyBase.cpp
changeset 0 05e9090e2422
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/skins/AknSkins/polysrc/AknsAlPolyBase.cpp	Thu Dec 17 09:14:12 2009 +0200
@@ -0,0 +1,175 @@
+/*
+* Copyright (c) 2004-2008 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:  Base class for PolyLine and PolySpline classes.
+*
+*/
+
+
+#include "AknsAlPolyBase.h"
+
+#include <e32debug.h>
+
+// -----------------------------------------------------------------------------
+// Constructor.
+// -----------------------------------------------------------------------------
+//
+CAknsAlPolyBase::CAknsAlPolyBase()
+    {
+    iPoints = NULL; // not needed, but just in case
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CAknsAlPolyBase::~CAknsAlPolyBase()
+    {
+    delete iPoints;
+    iPoints = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// Sets scaled area.
+// -----------------------------------------------------------------------------
+//
+void CAknsAlPolyBase::SetScaledArea( const TSize aAreaSize )
+    {
+    iAreaSize = aAreaSize;
+    }
+
+// -----------------------------------------------------------------------------
+// Sets poly points.
+// -----------------------------------------------------------------------------
+//
+void CAknsAlPolyBase::SetPolyPointsL( const TDesC16& aPointString )
+    {
+    TInt coordCount = aPointString.Length();
+
+    if ((coordCount & 0x1) || coordCount < 4) // odd number or too few point coordinates
+        {
+        RDebug::Printf("%s, line %d, ERROR: Illegal coordinate count", __FILE__, __LINE__);
+        User::Leave(KErrArgument);
+        }
+
+    iPointCount = coordCount >> 1;
+    iPoints = new (ELeave) TPolyPoint[iPointCount];
+
+    iPoints[0].iX = aPointString[0];
+    iPoints[0].iY = aPointString[1];
+
+    TUint16 oldX = iPoints[0].iX;
+    TUint16 oldY = iPoints[0].iY;
+
+    // parse numbers from the descriptor
+    for (TInt i = 1; i < iPointCount; i++) // first point already set
+        {
+        iPoints[i].iX = aPointString[i*2];
+        iPoints[i].iY = aPointString[i*2+1];
+
+        if (oldX == iPoints[i].iX && oldY == iPoints[i].iY)
+            {
+            RDebug::Printf("%s, line %d, ERROR: subsequent coordinates cannot be equal", __FILE__, __LINE__);
+            User::Leave(KErrArgument);
+            }
+
+        oldX = iPoints[i].iX;
+        oldY = iPoints[i].iY;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// Sets poly1D points.
+// -----------------------------------------------------------------------------
+//
+void CAknsAlPolyBase::SetPolyPoints1DL( const TDesC16& aPointString )
+    {
+    TInt coordCount = aPointString.Length();
+
+    if ((coordCount & 0x1) || coordCount < 4) // odd number or too few point coordinates
+        User::Leave(KErrArgument);
+
+    iPointCount = coordCount >> 1;
+    iPoints = new (ELeave) TPolyPoint[iPointCount];
+
+    iPoints[0].iX = aPointString[0];
+    iPoints[0].iY = aPointString[1];
+
+    TUint16 oldX = iPoints[0].iX;
+
+    // parse numbers from the descriptor
+    for (TInt i = 1; i < iPointCount; i++) // first point already set
+        {
+        iPoints[i].iX = aPointString[i*2];
+        iPoints[i].iY = aPointString[i*2+1];
+
+        if (iPoints[i].iX < oldX) // points must be in ascending order
+            User::Leave(KErrArgument);
+
+        oldX = iPoints[i].iX;
+        }
+    }
+
+// Some helper methods for child classes
+// -----------------------------------------------------------------------------
+// Squareroot.
+// -----------------------------------------------------------------------------
+//
+TUint CAknsAlPolyBase::Sqrt( TUint aParam )
+    {
+    TUint t,b,c=0;
+
+    for (b=0x40000000;b!=0;b>>=2)
+        {
+        t = c + b;
+        c >>= 1;
+        if (t <= aParam)
+            {
+            aParam -= t;
+            c += b;
+            }
+        }
+    return(c);
+    }
+
+// -----------------------------------------------------------------------------
+// Calculates scaled point.
+// -----------------------------------------------------------------------------
+//
+TPoint CAknsAlPolyBase::CalculateScaledPoint( const TPoint aPoint )
+    {
+    TPoint ret(0,0);
+    if (iAreaSize.iWidth == 0)
+        {
+        ret.iX = aPoint.iX;
+        }
+    else
+        {
+        ret.iX = (aPoint.iX * iAreaSize.iWidth) >> 16;
+        }
+
+    if (iAreaSize.iHeight == 0)
+        {
+        ret.iY = aPoint.iY;
+        }
+    else
+        {
+        ret.iY = (aPoint.iY * iAreaSize.iHeight) >> 16;
+        }
+
+    return ret;
+    }
+
+// End of file
+