uiacceltk/hitchcock/coretoolkit/src/huicanvaswsbitgc.cpp
changeset 0 15bf7259bb7c
child 6 10534483575f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/coretoolkit/src/huicanvaswsbitgc.cpp	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,207 @@
+/*
+* Copyright (c) 2008-2009 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:   Definition of CHuiCanvasWsBitGc.
+*
+*/
+
+
+
+#include "huicanvaswsbitgc.h"
+#include "uiacceltk/HuiCanvasVisual.h"
+#include <graphics/wsgraphicscontext.h>
+#include <e32cmn.h>
+#include <AknLayoutFont.h>
+#include <gdi.h>
+
+
+
+CHuiCanvasWsBitGc* CHuiCanvasWsBitGc::NewL()
+	{
+	CHuiCanvasWsBitGc* self    = new ( ELeave ) CHuiCanvasWsBitGc;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+
+CHuiCanvasWsBitGc::CHuiCanvasWsBitGc()
+    {
+    
+    }
+
+void CHuiCanvasWsBitGc::ConstructL()
+	{
+	CHuiCanvasWsSwGc::ConstructL();
+	}
+
+CHuiCanvasWsBitGc::~CHuiCanvasWsBitGc()
+    {
+    }
+    
+
+void CHuiCanvasWsBitGc::BeginActionL(TInt aAction, TRect /*aDisplayRect*/, const CHuiCanvasVisual& aUser, TBool aIsCachePrepared, const TRegion& aUpdateRegion)
+	{
+	iAction = aAction;
+	iVisual = &aUser;
+
+    if (!iVisual)
+        {
+        return;    
+        }        
+
+    // Update area is in screen coordinates so we must convert it 
+    iDefaultClipRegion.Clear();
+    for (TInt i=0; i < aUpdateRegion.Count(); i++)
+        {
+        iDefaultClipRegion.AddRect(AdjustCoordinates(aUpdateRegion[i]));   
+        }
+    
+    TSize size = RoundedDisplayRect().Size();	
+
+    // We create buffer only in drawing phase to reduce memory consumption.
+    TBool recreateBackbuffer = 
+        ( iAction == EDrawBuffer ) && 
+        ( !iBitGc || ( iBitBitmap && iBitBitmap->SizeInPixels() != size ) );
+    
+    // If this is first draw or size has changed, re-create backbuffer
+	if (recreateBackbuffer)
+		{				    	
+		iBitmapInitialized = EFalse;
+		
+		if (!iBitBitmap)
+            {
+            iBitBitmap = new (ELeave) CFbsBitmap;
+            iBitBitmap->Create(size, SelectDisplayMode());  
+            }
+        else
+            {
+            iBitBitmap->Resize(size);    
+            }    
+	    
+        if (!iBitDevice)
+            {
+            iBitDevice = CFbsBitmapDevice::NewL(iBitBitmap);        
+            }
+        else
+            {
+            iBitDevice->Resize(size);    
+            }    
+
+	    delete iBitGc;
+	    iBitGc = NULL;
+	    User::LeaveIfError(iBitDevice->CreateContext(iBitGc));
+        
+        TRgb clearColor = KRgbWhite;
+	    clearColor.SetAlpha(0x0);
+        
+	    iBitGc->SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha);
+        iBitGc->SetPenColor(clearColor);
+        iBitGc->SetBrushColor(clearColor);
+        iBitGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+  	    iBitGc->Clear();
+  	    iBitGc->Reset();    	  
+  	    
+  	    iIsReallyDirty = EFalse;
+		}
+	
+    if (iBitGc)
+        {
+        iBitGc->Reset();
+        }
+    
+    iBitmapPrepared = aIsCachePrepared && iBitmapInitialized;
+	}
+
+// Note that for perfomance reasons we keep iBitBitmap alive in this method   
+void CHuiCanvasWsBitGc::EndActionL(const TRegion& aUpdateRegion, TBool aUpdateDisplay)
+	{
+    if (!iBitBitmap || !iVisual)
+        {
+        return;    
+        }        
+
+    // Update internal state - drawing finished
+    if ( iAction == EDrawBuffer )
+        {
+        iBitmapInitialized = ETrue;
+        iBitmapPrepared = ETrue;
+        }
+
+    // If capturing is used, then copy content from bitmap.
+    if (iCapturingBitGc && aUpdateDisplay && iIsReallyDirty && iAction == EDrawBuffer)
+        {
+        iCapturingBitGc->Reset();
+        
+        // blend only transparent windows
+        if (iVisual->Flags() & EHuiVisualFlagOpaqueHint)
+            {
+            iCapturingBitGc->SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha);
+            }
+        else
+            {
+            iCapturingBitGc->SetDrawMode(CGraphicsContext::EDrawModePEN);
+            }
+        
+        iCapturingBitGc->SetClippingRegion(aUpdateRegion);
+        
+        TSize visualSize = iVisual->DisplayRect().Size().Round();        
+        if (iCapturingBitBitmap->SizeInPixels() != visualSize)
+            {       
+            iCapturingBitGc->BitBlt(iVisual->DisplayRect().iTl.Round(), iBitBitmap);
+            }
+        else
+            {
+            // Old capturing functionality, althoug not really used we support that as well
+            iCapturingBitGc->BitBlt(TPoint(0,0), iBitBitmap);
+            }
+        
+        iCapturingBitGc->CancelClippingRegion();
+        }
+
+    // Content is not drawn anywhere (except to to capturing bitgc)
+	}
+
+	
+THuiCanvasWsGcType CHuiCanvasWsBitGc::Type() const
+    {
+    return EHuiCanvasWsBit;
+    }
+
+
+void CHuiCanvasWsBitGc::ClearCache()
+    {
+    // ClearCache is called when we can release,
+    // e.g. when window is hidden by another opaque window.
+    // So now we must release bitmaps in order to free
+    // memory.
+    iBitmapPrepared = EFalse; 
+    iBitmapInitialized = EFalse;
+
+    delete iBitGc;
+    iBitGc = NULL;
+    
+    delete iBitDevice;
+    iBitDevice = NULL;
+    
+    delete iBitBitmap;
+    iBitBitmap = NULL;
+    }
+
+
+TBool CHuiCanvasWsBitGc::IsRenderBufferEnabled() const
+    {
+    return ETrue;
+    }