diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiFxVg10OnscreenRenderbuffer.cpp --- /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); + }