uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiFxVg10TransformFilter.cpp
changeset 0 15bf7259bb7c
child 29 ac3859d43844
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiFxVg10TransformFilter.cpp	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,233 @@
+/*
+* 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: 
+*
+*/
+
+#include "HuiFxVg10TransformFilter.h"
+#include <math.h>
+#include "HuiFxConstants.h"
+
+
+CHuiFxVg10TransformFilter* CHuiFxVg10TransformFilter::NewL()
+    {
+    CHuiFxVg10TransformFilter* self = new (ELeave) CHuiFxVg10TransformFilter();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+void CHuiFxVg10TransformFilter::ConstructL()
+    {
+    CHuiFxFilter::ConstructL();
+    iTranslationX = 0.0f;
+    iTranslationY = 0.0f;
+    iTranslationZ = 0.0f;
+    
+    iScaleX = 1.0f;
+    iScaleY = 1.0f;
+    iScaleZ = 1.0f;
+    iScaleOriginX = 0.0f;
+    iScaleOriginY = 0.0f;
+    iScaleOriginZ = 0.0f;
+    
+    iRotationOriginX = 0.0f;
+    iRotationOriginY = 0.0f;
+    iRotationOriginZ = 0.0f;
+    iRotationAngle = 0.0f;
+    iRotationAxisX = 0.0f;
+    iRotationAxisY = 0.0f;
+    iRotationAxisZ = 1.0f;
+    
+    iSkewAngleX = 0.0f;
+    iSkewAngleY = 0.0f;
+    iSkewAngleZ = 0.0f;
+    iSkewOriginX = 0.0f;
+    iSkewOriginY = 0.0f;
+    iSkewOriginZ = 0.0f;
+    
+    RegisterParameterL(KLitTranslationX, &iTranslationX);
+    RegisterParameterL(KLitTranslationY, &iTranslationY);
+    RegisterParameterL(KLitTranslationZ, &iTranslationZ);
+    
+    RegisterParameterL(KLitScaleX, &iScaleX);
+    RegisterParameterL(KLitScaleY, &iScaleY);
+    RegisterParameterL(KLitScaleZ, &iScaleZ);
+    RegisterParameterL(KLitScaleOriginX, &iScaleOriginX);
+    RegisterParameterL(KLitScaleOriginY, &iScaleOriginY);
+    RegisterParameterL(KLitScaleOriginZ, &iScaleOriginZ);
+    
+    RegisterParameterL(KLitRotationOriginX, &iRotationOriginX);
+    RegisterParameterL(KLitRotationOriginY, &iRotationOriginY);
+    RegisterParameterL(KLitRotationOriginZ, &iRotationOriginZ);
+    RegisterParameterL(KLitRotationAngle, &iRotationAngle);
+    RegisterParameterL(KLitRotationAxisX, &iRotationAxisX);
+    RegisterParameterL(KLitRotationAxisY, &iRotationAxisY);
+    RegisterParameterL(KLitRotationAxisZ, &iRotationAxisZ);
+    
+    RegisterParameterL(KLitSkewAngleX, &iSkewAngleX);
+    RegisterParameterL(KLitSkewAngleY, &iSkewAngleY);
+    RegisterParameterL(KLitSkewAngleZ, &iSkewAngleZ);
+    RegisterParameterL(KLitSkewOriginX, &iSkewOriginX);
+    RegisterParameterL(KLitSkewOriginY, &iSkewOriginY);
+    RegisterParameterL(KLitSkewOriginZ, &iSkewOriginZ);
+    }
+
+CHuiFxVg10TransformFilter *CHuiFxVg10TransformFilter::CloneL() const
+    {
+    CHuiFxVg10TransformFilter *filter = new(ELeave)CHuiFxVg10TransformFilter;
+    filter->CHuiFxFilter::CopyFromL(this);
+    filter->iTranslationX = iTranslationX;
+    filter->iTranslationY = iTranslationY;
+    filter->iTranslationZ = iTranslationZ;
+    
+    filter->iScaleX = iScaleX;
+    filter->iScaleY = iScaleY;
+    filter->iScaleZ = iScaleZ;
+    filter->iScaleOriginX = iScaleOriginX;
+    filter->iScaleOriginY = iScaleOriginY;
+    filter->iScaleOriginZ = iScaleOriginZ;
+    
+    filter->iRotationOriginX = iRotationOriginX;
+    filter->iRotationOriginY = iRotationOriginY;
+    filter->iRotationOriginZ = iRotationOriginZ;
+    filter->iRotationAngle = iRotationAngle;
+    filter->iRotationAxisX = iRotationAxisX;
+    filter->iRotationAxisY = iRotationAxisY;
+    filter->iRotationAxisZ = iRotationAxisZ;
+    
+    filter->iSkewAngleX = iSkewAngleX;
+    filter->iSkewAngleY = iSkewAngleY;
+    filter->iSkewAngleZ = iSkewAngleZ;
+    filter->iSkewOriginX = iSkewOriginX;
+    filter->iSkewOriginY = iSkewOriginY;
+    filter->iSkewOriginZ = iSkewOriginZ;
+    
+    filter->CopyParameterL(KLitTranslationX, &filter->iTranslationX, this);
+    filter->CopyParameterL(KLitTranslationY, &filter->iTranslationY, this);
+    filter->CopyParameterL(KLitTranslationZ, &filter->iTranslationZ, this);
+    
+    filter->CopyParameterL(KLitScaleX, &filter->iScaleX, this);
+    filter->CopyParameterL(KLitScaleY, &filter->iScaleY, this);
+    filter->CopyParameterL(KLitScaleZ, &filter->iScaleZ, this);
+    filter->CopyParameterL(KLitScaleOriginX, &filter->iScaleOriginX, this);
+    filter->CopyParameterL(KLitScaleOriginY, &filter->iScaleOriginY, this);
+    filter->CopyParameterL(KLitScaleOriginZ, &filter->iScaleOriginZ, this);
+    
+    filter->CopyParameterL(KLitRotationOriginX, &filter->iRotationOriginX, this);
+    filter->CopyParameterL(KLitRotationOriginY, &filter->iRotationOriginY, this);
+    filter->CopyParameterL(KLitRotationOriginZ, &filter->iRotationOriginZ, this);
+    filter->CopyParameterL(KLitRotationAngle, &filter->iRotationAngle, this);
+    filter->CopyParameterL(KLitRotationAxisX, &filter->iRotationAxisX, this);
+    filter->CopyParameterL(KLitRotationAxisY, &filter->iRotationAxisY, this);
+    filter->CopyParameterL(KLitRotationAxisZ, &filter->iRotationAxisZ, this);
+    
+    filter->CopyParameterL(KLitSkewAngleX, &filter->iSkewAngleX, this);
+    filter->CopyParameterL(KLitSkewAngleY, &filter->iSkewAngleY, this);
+    filter->CopyParameterL(KLitSkewAngleZ, &filter->iSkewAngleZ, this);
+    filter->CopyParameterL(KLitSkewOriginX, &filter->iSkewOriginX, this);
+    filter->CopyParameterL(KLitSkewOriginY, &filter->iSkewOriginY, this);
+    filter->CopyParameterL(KLitSkewOriginZ, &filter->iSkewOriginZ, this);
+    return filter;
+    }
+
+
+void CHuiFxVg10TransformFilter::CalculateMargin(TMargins &aMargin) const
+{
+    aMargin.iLeft = iTranslationX < 0.0 ? -iTranslationX : 0.0;
+    aMargin.iRight = iTranslationX > 0.0 ? iTranslationX : 0.0;
+    aMargin.iTop = iTranslationY < 0.0 ? -iTranslationY : 0.0;
+    aMargin.iBottom = iTranslationY > 0.0 ? iTranslationY : 0.0;
+    // TODO, how to deal with translationZ/ scale / rotation / skew?
+}
+
+TBool CHuiFxVg10TransformFilter::Draw(CHuiFxEngine& /*aEngine*/, CHuiGc& /*aGc*/,
+        CHuiFxRenderbuffer& aTarget, CHuiFxRenderbuffer& aSource,
+        const TRect& /*aTargetRect*/, const TRect& aSourceRect)
+    {
+    aSource.BindAsTexture(ERenderbufferUsageReadOnly);
+    aTarget.BindAsRenderTarget();
+
+    VGImage srcImage  = (reinterpret_cast<CHuiFxVg10RenderbufferBase*>(&aSource))->AcquireSubImage(aSourceRect);
+
+    vgLoadIdentity();
+    vgScale(iScaleX, iScaleY);
+    vgSeti(VG_BLEND_MODE, VG_BLEND_SRC);
+    vgSeti(VG_IMAGE_MODE, VG_DRAW_IMAGE_NORMAL);
+    
+    identity();
+    
+    // Matrix multiplication is generally not commutative.
+    // Therefore the order of the transformations matters.
+    // In order to prevent the scaling ang skewing from affecting the translation,
+    // if seems wiser to do the translation first, otherwise the results seem to be unpredictable.
+    
+    // Translation
+    if (iTranslationX != 0.0f || iTranslationY != 0.0f || iTranslationZ != 0.0f)
+        {
+        translate(iTranslationX, iTranslationY, iTranslationZ);
+        }    
+
+    // Scaling
+    if (iScaleX != 1.0f || iScaleY != 1.0f || iScaleZ != 1.0f)
+        {
+        translate(iScaleOriginX, iScaleOriginY, iScaleOriginZ);
+        scale(iScaleX, iScaleY, iScaleZ); 
+        translate(-iScaleOriginX, -iScaleOriginY, -iScaleOriginZ);
+        }
+    
+    // Skewing
+    if (iSkewAngleX != 0.0f || iSkewAngleY != 0.0f || iSkewAngleZ != 0.0f)
+        {
+        const TReal32 radsPerDeg = 2.0f * (float)M_PI / 360.0f;
+        TReal32 skewX = tan(iSkewAngleX * radsPerDeg);
+        TReal32 skewY = tan(iSkewAngleY * radsPerDeg);
+        TReal32 skewZ = tan(iSkewAngleZ * radsPerDeg);
+        translate(iSkewOriginX, iSkewOriginY, iSkewOriginZ);
+        shear(skewX, skewY, skewZ); 
+        translate(-iSkewOriginX, -iSkewOriginY, -iSkewOriginZ);
+        }
+
+    // Rotation
+    if (iRotationAngle != 0.0f)
+        {
+        translate(iRotationOriginX, iRotationOriginY, iRotationOriginZ);
+        rotate(iRotationAngle, iRotationAxisX, iRotationAxisY, iRotationAxisZ); 
+        translate(-iRotationOriginX, -iRotationOriginY, -iRotationOriginZ);
+        }
+
+/*
+    // Translation
+    if (iTranslationX != 0.0f || iTranslationY != 0.0f || iTranslationZ != 0.0f)
+        {
+        translate(iTranslationX, iTranslationY, iTranslationZ);
+        }    
+*/
+        
+   ASSERT(!"TODO: implement the following:");
+    // TODO: project vertices
+    // TODO: create warp quad matrix from projected vertices,
+    // see http://torus.untergrund.net/misc/projective_image_warping.pdf
+    // TODO load matrix
+    vgDrawImage(srcImage);
+    
+    // TODO: pixel relative parameters
+    HUIFX_VG_INVARIANT();
+    (reinterpret_cast<CHuiFxVg10RenderbufferBase*>(&aSource))->ReleaseSubImage(srcImage);
+
+    aTarget.UnbindAsRenderTarget();
+    aSource.UnbindAsTexture();
+    
+    return ETrue;
+    }