uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiFxVg10OnscreenRenderbuffer.cpp
changeset 0 15bf7259bb7c
child 9 3ac8bf5c5014
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiFxVg10OnscreenRenderbuffer.cpp	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,125 @@
+/*
+* 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 "HuiFxVg10OnscreenRenderbuffer.h"
+#include "HuiVg10RenderSurface.h"
+#include "HuiVg10RenderPlugin.h"
+
+CHuiFxVg10OnscreenRenderbuffer* CHuiFxVg10OnscreenRenderbuffer::NewL(CHuiVg10RenderPlugin& aPlugin, CHuiVg10RenderSurface& aSurface)
+    {
+    CHuiFxVg10OnscreenRenderbuffer* e = new (ELeave) CHuiFxVg10OnscreenRenderbuffer();
+    CleanupStack::PushL(e);
+    e->ConstructL(aPlugin, aSurface);
+    CleanupStack::Pop(e);
+    return e;
+    }
+
+void CHuiFxVg10OnscreenRenderbuffer::ConstructL(CHuiVg10RenderPlugin& aPlugin, CHuiVg10RenderSurface& aSurface)
+    {
+    CHuiFxRenderbuffer::ConstructL(aSurface.Size(), EBufferTypeOnscreen);
+    iPlugin = &aPlugin;
+    iSurface = &aSurface;
+    iTextureUsage = ERenderbufferUsageReadWrite;
+    
+#ifndef __WINS__ // Should possibly query the supported mode instead?
+    VGImageFormat imageInternalFormat = VG_sARGB_8888_PRE;
+#else
+    VGImageFormat imageInternalFormat = VG_sARGB_8888;
+#endif
+    
+    iImage = vgCreateImage(imageInternalFormat, Size().iWidth, Size().iHeight, VG_IMAGE_QUALITY_NONANTIALIASED);
+    HUIFX_VG_INVARIANT();
+    
+    // Initialize the context
+    iGc = iPlugin->CreateGcL();
+    BindAsRenderTarget();
+    iGc->InitState();
+    UnbindAsRenderTarget();
+    
+    // Let renderer know that we have been fiddlling with OpenVg state directly
+    // "iGc->InitState" confuses scissoring setting, so lets notify it.
+    CHuiVg10RenderPlugin& renderer = CHuiStatic::Vg10Renderer();
+    renderer.AddRestoreStateFlags(EHuiVg10GcStateFlagDirtyScissor);    
+    renderer.AddRestoreStateFlags(EHuiVg10GcStateFlagDirtyBlendMode);        
+    }
+
+CHuiFxVg10OnscreenRenderbuffer::~CHuiFxVg10OnscreenRenderbuffer()
+    {
+    vgDestroyImage(iImage);
+    HUIFX_VG_INVARIANT();
+    
+    delete iGc;
+    }
+
+CHuiGc& CHuiFxVg10OnscreenRenderbuffer::BindAsRenderTarget()
+    {
+    // Save current context and surfaces
+    iSavedContext = eglGetCurrentContext();
+    iSavedDrawSurface = eglGetCurrentSurface(EGL_DRAW);
+    iSavedReadSurface = eglGetCurrentSurface(EGL_READ);
+
+    // Bind our own surface
+    iSurface->MakeCurrent();
+    
+    return *iGc;
+    }
+
+void CHuiFxVg10OnscreenRenderbuffer::BindAsTexture(THuiFxRenderbufferUsage aUsage)
+    {
+    // Copy the contents of the framebuffer into our backbuffer image
+    // TODO: figure out a more efficient way of doing this
+    iTextureUsage = aUsage;
+    if (aUsage == ERenderbufferUsageReadWrite || aUsage == ERenderbufferUsageReadOnly)
+        {
+        BindAsRenderTarget();
+        vgGetPixels(iImage, 0, 0, 0, 0, Size().iWidth, Size().iHeight);
+        HUIFX_VG_INVARIANT();
+        UnbindAsRenderTarget();
+        }
+    }
+
+void CHuiFxVg10OnscreenRenderbuffer::UnbindAsTexture()
+    {
+    // Copy the contents from our backbuffer image to the framebuffer
+    if (iTextureUsage == ERenderbufferUsageReadWrite || iTextureUsage == ERenderbufferUsageWriteOnly)
+        {
+        BindAsRenderTarget();
+        vgSetPixels(0, 0, iImage, 0, 0, Size().iWidth, Size().iHeight);
+        HUIFX_VG_INVARIANT();
+        UnbindAsRenderTarget();
+        }
+    }
+
+void CHuiFxVg10OnscreenRenderbuffer::UnbindAsRenderTarget()
+    {
+    // Restore original surface & context
+    eglMakeCurrent(iPlugin->EglDisplay(), iSavedDrawSurface, iSavedReadSurface,
+                   iSavedContext);
+    }
+
+VGImage CHuiFxVg10OnscreenRenderbuffer::Image() const
+    {
+    return iImage;
+    }
+
+void CHuiFxVg10OnscreenRenderbuffer::PrepareForReuse(const TSize& /* aReusedRect */)
+    {
+    // this should never happen.
+    ASSERT(FALSE);
+    }