uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiFxVg10TransformFilter.h
changeset 0 15bf7259bb7c
child 13 3a60ebea00d0
--- /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