uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiFxVg10BevelFilter.cpp
changeset 0 15bf7259bb7c
child 13 3a60ebea00d0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiFxVg10BevelFilter.cpp	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,139 @@
+/*
+* 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 "HuiFxVg10BevelFilter.h"
+#include "HuiFxVg10RenderbufferBase.h"
+#include "HuiFxConstants.h"
+
+CHuiFxVg10BevelFilter* CHuiFxVg10BevelFilter::NewL()
+    {
+    CHuiFxVg10BevelFilter* self = new (ELeave) CHuiFxVg10BevelFilter();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+void CHuiFxVg10BevelFilter::ConstructL()
+    {
+    CHuiFxFilter::ConstructL();
+    iOutlineX = 1.0;
+    iOutlineY = 1.0;
+    iSteepness = 20.0;
+/*    iRed = 0.0f;
+    iGreen = 0.0f;
+    iBlue = 0.0f;*/
+    RegisterParameterL(KLitOutlineX, &iOutlineX);
+    RegisterParameterL(KLitOutlineY, &iOutlineY);
+    RegisterParameterL(KLitSteepness, &iSteepness);
+/*    RegisterParameterL(KLitRed, &iRed);
+    RegisterParameterL(KLitGreen, &iGreen);
+    RegisterParameterL(KLitBlue, &iBlue);*/
+    }
+CHuiFxVg10BevelFilter *CHuiFxVg10BevelFilter::CloneL() const
+    {
+    CHuiFxVg10BevelFilter *filter = new(ELeave)CHuiFxVg10BevelFilter;
+    filter->CHuiFxFilter::CopyFromL(this);
+    filter->iOutlineX = iOutlineX;
+    filter->iOutlineY = iOutlineY;
+    filter->iSteepness = iSteepness;
+    filter->CopyParameterL(KLitOutlineX, &filter->iOutlineX, this);
+    filter->CopyParameterL(KLitOutlineY, &filter->iOutlineY, this);
+    filter->CopyParameterL(KLitSteepness, &filter->iSteepness, this);
+    return filter;
+    }
+
+void CHuiFxVg10BevelFilter::DrawEffect(CHuiFxEngine& aEngine, VGImage aTargetImage, VGImage aSourceImage, TInt aWidth, TInt aHeight)
+    {
+    VGfloat outline_x = clamp(iOutlineX, EPSILON, 128.0f);
+    VGfloat outline_y = clamp(iOutlineY, EPSILON, 128.0f);
+    VGubyte steepness = (VGubyte)clamp(iSteepness, 0.0f, 255.0f);
+//    VGint width = vgGetParameteri(aSourceImage, VG_IMAGE_WIDTH);
+//    VGint height = vgGetParameteri(aSourceImage, VG_IMAGE_HEIGHT);
+    VGint width = aWidth;
+    VGint height = aHeight;
+
+    if((outline_x > EPSILON && outline_y > EPSILON) || steepness == 0) 
+        {
+        // get an aux buffer
+        CHuiFxRenderbuffer* aux1Buffer = aEngine.AcquireRenderbuffer(TSize(width, height));
+        CHuiFxRenderbuffer* aux2Buffer = aEngine.AcquireRenderbuffer(TSize(width, height));
+        if (!aux1Buffer || !aux2Buffer) // can't render the effect
+            {
+            return;
+            }
+        aux1Buffer->BindAsTexture(ERenderbufferUsageReadWrite);
+        aux2Buffer->BindAsTexture(ERenderbufferUsageReadWrite);
+        
+        VGImage aux1Image = (reinterpret_cast<CHuiFxVg10RenderbufferBase*>(aux1Buffer)->Image());
+        VGImage aux2Image = (reinterpret_cast<CHuiFxVg10RenderbufferBase*>(aux2Buffer)->Image());
+
+        VGuint lut[256];
+        int threshold = 1;
+        // generate ramp for alpha channel. the bigger the steepness the more solid the outline. 
+        for(int i = 0; i < threshold; i++) 
+            {
+            lut[i] = 0x00000000; // | i;
+            }
+        for(int i = threshold; i < 256; i++)
+            {
+            lut[i] = 0xffffffff; // | i;
+            }
+        vgLookupSingle(aux1Image, aSourceImage, lut, VG_ALPHA, VG_TRUE, VG_FALSE);
+        
+        // TODO: pixel relative parameters
+        // the variables are commented out because they are not used yet
+/*        
+        VGint shiftX = 0;
+        VGint shiftY = 0;
+//        VGshort kernel[9] = {0, -1, -2, 1, 0, -1, 2, 1, 0}; 
+        VGshort kernel[9] = {1, 0, -1, 2, 0, -2, 1, 0, -1};
+        VGfloat scale = 0.5f;
+        VGfloat bias = 0.5f;
+*/        
+
+//        vgConvolve(aux2Image, aux1Image, 3, 3, shiftX, shiftY, kernel, scale, bias, VG_TILE_PAD);
+
+/*        for(int i = 0; i < 126; i++)
+            {
+            lut[i] = 0x000000ff | i << 24 | i << 16 | i << 8 | i;
+            }
+*/        for(int i = 0; i < 10; i++)
+            {
+            lut[i] = 0x00000000  | i << 24 | i << 16 | i << 8 | 255 - i * 3;
+            }
+        for(int i = 20; i < 255; i++)
+            {
+            lut[i] = 0x00000000; // | i << 24 | i << 16 | i << 8 | i;
+            }
+
+//        vgLookupSingle(aux1Image, aux2Image, lut, VG_ALPHA, VG_TRUE, VG_FALSE);
+
+//        vgGaussianBlur(aTargetImage, aux1Image, outline_x, outline_y, VG_TILE_PAD);        
+        
+        aux1Buffer->UnbindAsTexture();
+        aux2Buffer->UnbindAsTexture();
+        aEngine.ReleaseRenderbuffer(aux1Buffer);
+        aEngine.ReleaseRenderbuffer(aux2Buffer);
+        }
+    else    // fast path --- just copy
+        {
+        vgCopyImage(aTargetImage, 0, 0, aSourceImage, 0, 0, width, height, VG_FALSE);   
+        }
+    }