diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiFxVg10TransformFilter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiFxVg10TransformFilter.h Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,197 @@ +/* +* Copyright (c) 2009 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: +* +*/ + +#ifndef HUIFXVG10TRANSFORMFILTER_H_ +#define HUIFXVG10TRANSFORMFILTER_H_ + +#include +#include "HuiFxVg10FilterBase.h" + +class CHuiFxVg10TransformFilter: public CHuiFxVg10FilterBase + { +public: // from CHuiFxFilter + virtual TBool Draw(CHuiFxEngine& aEngine, CHuiGc& aGc, + CHuiFxRenderbuffer& aTarget, CHuiFxRenderbuffer& aSource, + const TRect& aTargetRect, const TRect& aSourceRect); + static CHuiFxVg10TransformFilter* NewL(); + void DrawEffect(CHuiFxEngine& /*aEngine*/, VGImage /*aTargetImage*/, VGImage /*aSourceImage*/, TInt /*aWidth*/, TInt /*aHeight*/) {} + void CalculateMargin(TMargins &aMargin) const; + CHuiFxVg10TransformFilter *CloneL() const; +protected: + void ConstructL(); + + void identity() + { + iMatrix [0] = 1.f; iMatrix [1] = 0.f; iMatrix [2] = 0.f; iMatrix [3] = 0.f; + iMatrix [4] = 0.f; iMatrix [5] = 1.f; iMatrix [6] = 0.f; iMatrix [7] = 0.f; + iMatrix [8] = 0.f; iMatrix [9] = 0.f; iMatrix[10] = 1.f; iMatrix[11] = 0.f; + iMatrix[12] = 0.f; iMatrix[13] = 0.f; iMatrix[14] = 0.f; iMatrix[15] = 1.f; + } + + void translate(TReal32 tx, TReal32 ty, TReal32 tz) + { + const TReal32 tm[16] = + { + 1.f, 0.f, 0.f, 0.f, + 0.f, 1.f, 0.f, 0.f, + 0.f, 0.f, 1.f, 0.f, + tx, ty, tz, 1.f + }; + + multiply(tm); + } + + void scale (const TReal32 sx, const TReal32 sy, const TReal32 sz) + { + const TReal32 sm[16] = + { + sx, 0.f, 0.f, 0.f, + 0.f, sy, 0.f, 0.f, + 0.f, 0.f, sz, 0.f, + 0.f, 0.f, 0.f, 1.f + }; + + multiply(sm); + } + + void rotate (const TReal32 angle, const TReal32 x, const TReal32 y, const TReal32 z) + { + static const TReal32 deg_to_rad = 2.f * (TReal32)M_PI / 360.f; + // normalised vector components + TReal32 x_n; + TReal32 y_n; + TReal32 z_n; + TReal32 angle_rad = angle * deg_to_rad; + + // normalise if needed + const TReal32 length = (TReal32)sqrt(double(x * x) + + double(y * y) + + double(z * z)); + if(fabs(length - 1.0f) > EPSILON) { + // in fp calculations, division by zero -> (+/-)inf + // can't really help if it's the case. + const TReal32 inv_length = 1.f / length; + x_n = x * inv_length; + y_n = y * inv_length; + z_n = z * inv_length; + } else { + x_n = x; + y_n = y; + z_n = z; + } + + const TReal32 c = cos(angle_rad); + const TReal32 s = sin(angle_rad); + const TReal32 c_1 = 1.f - c; + + const TReal32 rm[16] = + { + x_n * x_n * c_1 + c, y_n * x_n * c_1 + z_n * s, x_n * z_n * c_1 - y_n * s, 0.f, + x_n * y_n * c_1 - z_n * s, y_n * y_n * c_1 + c, y_n * z_n * c_1 + x_n * s, 0.f, + x_n * z_n * c_1 + y_n * s, y_n * z_n * c_1 - x_n * s, z_n * z_n * c_1 + c, 0.f, + 0.f, 0.f, 0.f, 1.f + }; + + multiply(rm); + } + + void frustum (const TReal32 l, const TReal32 r, const TReal32 b, const TReal32 t, const TReal32 n, const TReal32 f) + { + const TReal32 rl = 1.f / (r - l); + const TReal32 tb = 1.f / (t - b); + const TReal32 fn = 1.f / (f - n); + + const TReal32 A = (r + l) * rl; + const TReal32 B = (t + b) * tb; + const TReal32 C = -(f + n) * fn; + const TReal32 D = -2.f * f * n * fn; + + const TReal32 fm[16] = + { + 2.f * n * rl, 0.f, 0.f, 0.f, + 0.f, 2.f * n * tb, 0.f, 0.f, + A, B, C, -1.f, + 0.f, 0.f, D, 0.f + }; + + multiply(fm); + } + + void multiply (const TReal32* b) + { + TReal32 dst[16]; + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 4; j++) + { + TReal32 sum = 0.f; + for (int k = 0; k < 4; k++) + sum += iMatrix[i + 4 * k] * b[k + 4 * j]; + + dst[i + 4 * j] = sum; + } + } + + for (int i = 0; i < 16; i++) + iMatrix[i] = dst[i]; + } + + void shear (const TReal32 aX, const TReal32 aY, const TReal32 aZ) + { + TReal32 shearMatrix[16] = + { + 1.0f, aX, aX, 0.0f, + aY, 1.0f, aY, 0.0f, + aZ, aZ, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + }; + + multiply(shearMatrix); + + } + +private: + TReal32 iTranslationX; + TReal32 iTranslationY; + TReal32 iTranslationZ; + + TReal32 iScaleX; + TReal32 iScaleY; + TReal32 iScaleZ; + TReal32 iScaleOriginX; + TReal32 iScaleOriginY; + TReal32 iScaleOriginZ; + + TReal32 iRotationOriginX; + TReal32 iRotationOriginY; + TReal32 iRotationOriginZ; + TReal32 iRotationAngle; + TReal32 iRotationAxisX; + TReal32 iRotationAxisY; + TReal32 iRotationAxisZ; + + TReal32 iSkewAngleX; + TReal32 iSkewAngleY; + TReal32 iSkewAngleZ; + TReal32 iSkewOriginX; + TReal32 iSkewOriginY; + TReal32 iSkewOriginZ; + + TReal32 iMatrix[16]; + }; + +#endif