diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiFxVg10TransformFilter.cpp --- /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 +#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(&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(&aSource))->ReleaseSubImage(srcImage); + + aTarget.UnbindAsRenderTarget(); + aSource.UnbindAsTexture(); + + return ETrue; + }