webengine/widgetengine/src/Renderer.cpp
changeset 0 dd21522fd290
child 58 220a17280356
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/widgetengine/src/Renderer.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,272 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:  This class represents the Widget Extension object
+*
+*/
+
+// INCLUDE FILES
+#include "config.h"
+#include <eikmenub.h>
+#include <eikenv.h>
+#include <gdi.h>
+#include <bitdev.h>
+#include "Renderer.h"
+#include "WebView.h"
+
+//#include "WebSurface.h"
+//#include "StaticObjectsContainer.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+const TUint8 KMaxTransitionCount = 30;
+const TInt KMediumResolutionDpi = 200;
+//NOTE: 5 transitions is plenty for Tube, but mileage may vary 
+//      on future high-res devices. 
+const TUint8 KMinTransitionCount = 5;
+// LOCAL FUNCTION PROTOTYPES
+
+
+// ----------------------------------------------------------------------------
+// TransitionCb
+//
+//
+//
+// ----------------------------------------------------------------------------
+TInt transitionCb( TAny* aPtr )
+{
+    static_cast<WidgetRenderer*>(aPtr)->transitionCb();
+    return ETrue;
+}
+
+
+// ----------------------------------------------------------------------------
+// WidgetRenderer::WidgetRenderer
+//
+//
+//
+// ----------------------------------------------------------------------------
+WidgetRenderer::WidgetRenderer(MWidgetEngineCallbacks& aWidgetEngineCallback) : 
+m_transitionbitmap(0),
+m_fademask(0),
+m_transitiontimer(0),
+m_transitioncount(0), 
+m_maxtransitions(KMaxTransitionCount),
+m_widgetenginecallback( &aWidgetEngineCallback )
+{
+   // If a high-res device, use fewer transitions
+   CEikonEnv* eikEnv = CEikonEnv::Static();
+   if ( eikEnv )   {
+       CWsScreenDevice& screenDev = *eikEnv->ScreenDevice();
+       TUint dpi = screenDev.VerticalTwipsToPixels( KTwipsPerInch );
+       if ( dpi > KMediumResolutionDpi ) {  //high resolution
+           m_maxtransitions = KMinTransitionCount;
+       }
+   }
+}
+
+// ----------------------------------------------------------------------------
+// WidgetRenderer::~WidgetRenderer
+//
+//
+//
+// ----------------------------------------------------------------------------
+WidgetRenderer::~WidgetRenderer()
+{
+    if (m_transitiontimer) {
+        m_transitiontimer->Cancel();        
+        delete m_transitiontimer;
+    }
+    
+    if (m_fademask) {
+        delete m_fademask;
+    }
+
+    if (m_transitionbitmap) {
+        delete m_transitionbitmap;
+    }
+
+}
+
+// ----------------------------------------------------------------------------
+// WidgetRenderer::prepareForTransition
+//
+//
+//
+// ----------------------------------------------------------------------------
+void WidgetRenderer::prepareForTransitionL(const TDesC& /*aTransition*/)
+{
+    m_transitioncount = 0;   
+    destroyTransitionBitmap();
+    createTransitionBitmapL();
+    destroyFadeMask();
+    createFadeMaskL();
+    drawFadeMaskL();
+}
+
+// ----------------------------------------------------------------------------
+// WidgetRenderer::PerformTransitionL
+//
+//
+//
+// ----------------------------------------------------------------------------
+void WidgetRenderer::performTransitionL()
+{
+    delete m_transitiontimer;
+    m_transitiontimer = 0;
+    TRAP_IGNORE(m_transitiontimer = CPeriodic::NewL( CActive::EPriorityLow ));
+    m_transitioncount = 0;
+    m_transitiontimer->Start( 20, 20, TCallBack( &::transitionCb, this ) );
+}
+
+// ----------------------------------------------------------------------------
+// WidgetRenderer::transitionCb
+//
+//
+//
+// ----------------------------------------------------------------------------
+void WidgetRenderer::transitionCb()
+{
+    m_transitioncount++;
+
+    if (m_transitioncount==m_maxtransitions) {
+        destroyTransitionBitmap();
+        m_transitiontimer->Cancel();
+        destroyFadeMask();
+    }
+
+    TRAP_IGNORE(drawFadeMaskL());
+    
+    m_widgetenginecallback->drawWidgetTransition();
+    
+}
+
+// ----------------------------------------------------------------------------
+// WidgetRenderer::createTransitionBitmapL
+//
+//
+//
+// ----------------------------------------------------------------------------
+void WidgetRenderer::createTransitionBitmapL()
+{
+
+    if (m_widgetenginecallback->offscreenBitmap()) {
+        m_transitionbitmap = new (ELeave) CFbsBitmap();
+        User::LeaveIfError(m_transitionbitmap->Create( m_widgetenginecallback->offscreenBitmap()->SizeInPixels(), EColor16MU));
+        CFbsBitmapDevice* dev = CFbsBitmapDevice::NewL(m_transitionbitmap);
+        CleanupStack::PushL(dev);
+        CFbsBitGc* gc;
+        User::LeaveIfError(dev->CreateContext(gc));
+        gc->BitBlt(TPoint(0,0),m_widgetenginecallback->offscreenBitmap());
+        delete gc;
+        CleanupStack::PopAndDestroy();        
+    }
+    
+}
+
+// ----------------------------------------------------------------------------
+// WidgetRenderer::destroyTransitionBitmap
+//
+//
+//
+// ----------------------------------------------------------------------------
+void WidgetRenderer::destroyTransitionBitmap()
+{
+    delete m_transitionbitmap;
+    m_transitionbitmap = 0;
+}
+
+// ----------------------------------------------------------------------------
+// WidgetRenderer::createFadeMaskL
+//
+//
+//
+// ----------------------------------------------------------------------------
+void WidgetRenderer::createFadeMaskL()
+{
+    m_fademask = new (ELeave) CFbsBitmap();
+    m_fademask->Create(m_transitionbitmap->SizeInPixels(),EGray256);
+}
+
+// ----------------------------------------------------------------------------
+// WidgetRenderer::destroyFadeMask
+//
+//
+//
+// ----------------------------------------------------------------------------
+void WidgetRenderer::destroyFadeMask()
+{
+    delete m_fademask;
+    m_fademask = 0;
+}
+
+
+// ----------------------------------------------------------------------------
+// WidgetRenderer::drawFadeMaskL
+//
+//
+//
+// ----------------------------------------------------------------------------
+void WidgetRenderer::drawFadeMaskL()
+{
+    if (m_fademask) {
+        
+        CFbsBitmapDevice* dev = CFbsBitmapDevice::NewL(m_fademask);
+        CleanupStack::PushL(dev);
+        
+        CFbsBitGc* gc;
+        User::LeaveIfError(dev->CreateContext(gc));
+        m_fademask->LockHeap();
+        
+        TSize s = m_fademask->SizeInPixels();
+        TUint8* data = (TUint8*)m_fademask->DataAddress();
+        TUint8* end = data + s.iWidth*s.iHeight;
+
+        while ( data<end ) {
+            *(data++) = (255*m_transitioncount/m_maxtransitions);
+        }
+        
+        m_fademask->UnlockHeap();
+        delete gc;
+        CleanupStack::PopAndDestroy();
+    }
+    
+}
+
+
+// ----------------------------------------------------------------------------
+// WidgetRenderer::drawTransition
+//
+//
+//
+// ----------------------------------------------------------------------------
+void WidgetRenderer::drawTransition(CWindowGc& gc, CFbsBitmap* aCurrentBitmap)
+{
+
+    if (transitionInProgress()) {
+        
+        if (!m_transitionbitmap || !aCurrentBitmap || !m_fademask)
+            return;
+
+        TSize s = m_transitionbitmap->SizeInPixels();
+        gc.BitBlt(TPoint(0,0),m_transitionbitmap);
+        gc.BitBltMasked(TPoint(0,0),aCurrentBitmap, TRect(s), m_fademask, EFalse);
+    }
+}
+
+
+
+