diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/coretoolkit/src/HuiMatrixStack.cpp --- /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); + }