--- /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 <math.h>
+#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