diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiFxVg10ColorizeFilter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiFxVg10ColorizeFilter.cpp Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,83 @@ +/* +* Copyright (c) 2008 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 "HuiFxVg10ColorizeFilter.h" +#include "HuiFxConstants.h" + +CHuiFxVg10ColorizeFilter* CHuiFxVg10ColorizeFilter::NewL() + { + CHuiFxVg10ColorizeFilter* e = new (ELeave) CHuiFxVg10ColorizeFilter(); + CleanupStack::PushL(e); + e->ConstructL(); + CleanupStack::Pop(e); + return e; + } + +void CHuiFxVg10ColorizeFilter::ConstructL() + { + CHuiFxVg10ColorMatrixFilterBase::ConstructL(); + iColor = TRgb(0xffffffff); + RegisterParameterL(KLitColor, &iColor); + } +CHuiFxVg10ColorizeFilter *CHuiFxVg10ColorizeFilter::CloneL() const + { + CHuiFxVg10ColorizeFilter *filter = new(ELeave)CHuiFxVg10ColorizeFilter; + filter->CHuiFxVg10ColorMatrixFilterBase::CopyFromL(this); + filter->iColor = iColor; + filter->CopyParameterL(KLitColor, &filter->iColor, this); + return filter; + } + +void CHuiFxVg10ColorizeFilter::UpdateColorMatrix(void) + { + const VGfloat o = clamp(iOpacity, 0.0f, 1.0f); + const VGfloat ao = 1 - o; + const VGfloat Rw = 0.3086f; + const VGfloat Gw = 0.6094f; + const VGfloat Bw = 0.0820f; + const VGfloat R = (o / 255.0f) * (VGfloat)iColor.Red(); + const VGfloat G = (o / 255.0f) * (VGfloat)iColor.Green(); + const VGfloat B = (o / 255.0f) * (VGfloat)iColor.Blue(); + + // this matrix is ((I * (1 - opacity)) + (I * opacity) * RGBMatrix * desaturateMatrix)T + // i.e. pixel is first converted to luminance, then multiplied by RGB, multiplied by opacity and finally the diagonal + // compensated with 1 - opacity. + // Precalculating abovementioned matrices to single matrix saves over a magnitude of multiplications and + // almost two magnitudes of additions. Also less memory is used and no unnecessary copying is involved. + iColorMatrix[0] = R*Rw + ao; + iColorMatrix[1] = G*Rw; + iColorMatrix[2] = B*Rw; + iColorMatrix[3] = 0.0f; + iColorMatrix[4] = R*Gw; + iColorMatrix[5] = G*Gw + ao; + iColorMatrix[6] = B*Gw; + iColorMatrix[7] = 0.0f; + iColorMatrix[8] = R*Bw; + iColorMatrix[9] = G*Bw; + iColorMatrix[10] = B*Bw + ao; + iColorMatrix[11] = 0.0f; + iColorMatrix[12] = 0.0f; + iColorMatrix[13] = 0.0f; + iColorMatrix[14] = 0.0f; + iColorMatrix[15] = 1.0f; + iColorMatrix[16] = 0.0f; + iColorMatrix[17] = 0.0f; + iColorMatrix[18] = 0.0f; + iColorMatrix[19] = 0.0f; + }