uiacceltk/hitchcock/coretoolkit/src/HuiMatrixStack.cpp
changeset 0 15bf7259bb7c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiMatrixStack.cpp	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,194 @@
+/*
+* 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:   Implementation of CHuiMatrixStack. CHuiMatrixStack is a stack 
+*                of 2D transformation matrices.
+*
+*/
+
+
+
+#include "HuiMatrixStack.h"
+#include "uiacceltk/HuiPanic.h"
+
+
+EXPORT_C CHuiMatrixStack::TMatrix::TMatrix()
+        : iIsIdentity(ETrue)
+    {
+    // First column.
+    iMatrix[0] = 1;
+    iMatrix[1] = 0;
+    iMatrix[2] = 0;
+
+    // Second column.
+    iMatrix[3] = 0;
+    iMatrix[4] = 1;
+    iMatrix[5] = 0;
+
+    // Third column.
+    iMatrix[6] = 0;
+    iMatrix[7] = 0;
+    iMatrix[8] = 1;
+    }
+
+#define HUI_MATRIX_INDEX(aRow, aColumn) (aColumn*3 + aRow)
+
+void CHuiMatrixStack::TMatrix::Multiply(const TMatrix& aOther)
+    {
+    TMatrix result;
+
+    // Clear the result.
+    Mem::FillZ(result.iMatrix, sizeof(result.iMatrix));
+
+    // It could still be an identity matrix, but probably not.
+    result.iIsIdentity = EFalse;
+
+    for(TInt i = 0; i < 3; ++i) // Row.
+        {
+        for(TInt j = 0; j < 3; ++j) // Column.
+            {
+            for(TInt k = 0; k < 3; ++k)
+                {
+                result.iMatrix[ HUI_MATRIX_INDEX(i, j) ] +=
+                    iMatrix[ HUI_MATRIX_INDEX(i, k) ] * aOther.iMatrix[ HUI_MATRIX_INDEX(k, j) ];
+
+                }
+            }
+        }
+
+    *this = result;
+    }
+
+
+EXPORT_C void CHuiMatrixStack::TMatrix::Multiply(THuiRealPoint& aPoint) const
+    {
+    if(iIsIdentity)
+        {
+        // No need to do anything.
+        return;
+        }
+
+    TReal32 wPoint[3] =
+        {
+        aPoint.iX,
+        aPoint.iY,
+        1.0f
+        };
+    TReal32 result[3] =
+        {
+        0, 0, 0
+        };
+
+    for(TInt i = 0; i < 3; ++i)
+        {
+        for(TInt j = 0; j < 3; ++j)
+            {
+            result[i] += wPoint[j] * iMatrix[ HUI_MATRIX_INDEX(i, j) ];
+            }
+        }
+
+    if(result[2] != 0)
+        {
+        // Normalize.
+        result[0] /= result[2];
+        result[1] /= result[2];
+        }
+    else
+        {
+        // Completely zero.
+        result[0] = 0;
+        result[1] = 0;
+        }
+
+    aPoint.iX = result[0];
+    aPoint.iY = result[1];
+    }
+
+
+EXPORT_C CHuiMatrixStack* CHuiMatrixStack::NewL()
+    {
+    CHuiMatrixStack* self = CHuiMatrixStack::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+    
+CHuiMatrixStack* CHuiMatrixStack::NewLC()
+    {
+    CHuiMatrixStack* self = new (ELeave) CHuiMatrixStack();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+    
+    
+CHuiMatrixStack::~CHuiMatrixStack()
+    {
+    iStack.Close();    
+    }
+    
+
+CHuiMatrixStack::CHuiMatrixStack()
+    {
+    }
+    
+    
+void CHuiMatrixStack::ConstructL()
+    {
+    // Append one identity matrix as the default contents of the stack.
+    User::LeaveIfError( iStack.Append(TMatrix()) );
+    }
+
+
+EXPORT_C TInt CHuiMatrixStack::Count() const
+    {
+    return iStack.Count();
+    }
+
+
+EXPORT_C CHuiMatrixStack::TMatrix& CHuiMatrixStack::Current()
+    {
+    // There is always at least one matrix in the stack.
+    return iStack[iStack.Count() - 1];
+    }
+
+
+EXPORT_C TInt CHuiMatrixStack::Push()
+    {
+    // Make a copy of the topmost item.
+    return iStack.Append(Current());
+    }
+
+
+EXPORT_C void CHuiMatrixStack::Pop()
+    {
+    if(iStack.Count() <= 1)
+        {
+        // Invalid operation.
+        THuiPanic::Panic(THuiPanic::EMatrixStackPopFromEmpty);
+        }
+
+    iStack.Remove(iStack.Count() - 1);
+    }
+      
+
+EXPORT_C void CHuiMatrixStack::LoadIdentity()
+    {
+    Current() = TMatrix();
+    }    
+
+
+EXPORT_C void CHuiMatrixStack::Multiply(const TMatrix& aMatrix)
+    {
+    Current().Multiply(aMatrix);
+    }