uiacceltk/hitchcock/Client/src/alfgc.cpp
changeset 0 15bf7259bb7c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/Client/src/alfgc.cpp	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,460 @@
+/*
+* Copyright (c) 2007 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:   Graphics context
+*
+*/
+
+
+
+#include <alf/alfgc.h>
+#include <alf/alfenv.h>
+#include <alf/alftexture.h>
+#include <alf/alftimedvalue.h>
+#include <alf/alftextstyle.h>
+#include <alf/alfrealline.h>
+#include "alflogger.h"
+
+//#include <uiacceltk/huicanvasconstants.h>
+
+
+enum TAlfCanvasCommands
+    {
+    EAlfCanvasDrawImage,
+    EAlfCanvasDrawText,
+    EAlfCanvasDrawLines,
+	EAlfCanvasDrawEllipse,
+	EAlfCanvasDrawPoints,
+	EAlfCanvasDrawPolygon,
+	EAlfCanvasDrawRects,
+
+	// Setters
+    EAlfCanvasSetTextStyle,
+	EAlfCanvasSetPenColor,
+	EAlfCanvasSetPenWidth,
+	EAlfCanvasSetOpacity,
+	EAlfCanvasSetPolygonDrawMode,
+	EAlfCanvasSetTextAlign,
+
+    // Transformations
+	EAlfCanvasLoadIdentity,
+	EAlfCanvasTranslate,
+	EAlfCanvasScale,
+	EAlfCanvasRotate,
+	
+	EAlfCanvasPrepareDrawText
+    };
+
+NONSHARABLE_STRUCT( TAlfCanvasEndDrawParams )
+    {
+    TInt    iDummy1;
+    TInt    iDummy2;
+    TInt    iDummy3;
+    TInt    iDummy4;
+    };
+    
+NONSHARABLE_STRUCT( TAlfCanvasDrawImageParams )
+    {
+    TInt    iTexture;
+    TReal32 iDestinationRectTopLeftX;
+    TReal32 iDestinationRectTopLeftY;
+    TReal32 iDestinationRectBottomRightX;
+    TReal32 iDestinationRectBottomRightY;
+    };
+
+NONSHARABLE_STRUCT( TAlfCanvasDrawTextParams )
+    {
+    TReal32 iDestinationRectTopLeftX;
+    TReal32 iDestinationRectTopLeftY;
+    TReal32 iDestinationRectBottomRightX;
+    TReal32 iDestinationRectBottomRightY;
+    };
+    
+NONSHARABLE_STRUCT( TAlfCanvasDrawLinesParams )
+    {
+    TInt iLineCount;
+	RArray<TReal32> iPointCords;
+	};    
+
+NONSHARABLE_STRUCT( TAlfCanvasDrawEllipseParams )
+	{
+    TReal32 iDestinationRectTopLeftX;
+    TReal32 iDestinationRectTopLeftY;
+    TReal32 iDestinationRectBottomRightX;
+    TReal32 iDestinationRectBottomRightY;
+    };
+    	
+	
+	// Setters
+NONSHARABLE_STRUCT( TAlfCanvasSetTextStyleParams )
+    {
+    TInt  iTextstyleId;
+    };
+
+NONSHARABLE_STRUCT( TAlfCanvasSetPenColorParams )
+	{
+    TRgb  iPenColor;
+    };
+NONSHARABLE_STRUCT( TAlfCanvasSetPenWidthParams )
+	{
+    TReal32  iPenWidth;
+    };
+NONSHARABLE_STRUCT( TAlfCanvasSetOpacityParams )
+	{
+    TReal32  iOpacity;
+    };
+NONSHARABLE_STRUCT( TAlfCanvasSetPolygonDrawModeParams )
+	{
+    TInt  iPolygonDrawMode;
+    };
+NONSHARABLE_STRUCT( TAlfCanvasSetTextAlignParams )
+	{
+    TInt  iTextAlignHorizontal;
+    TInt  iTextAlignVertical;
+    };
+
+
+   // Transformations
+NONSHARABLE_STRUCT( TAlfCanvasLoadIdentityParams )
+	{
+	TInt iDummy;
+	};
+	
+NONSHARABLE_STRUCT( TAlfCanvasTranslateParams )
+	{
+	TReal32 iX; 
+	TReal32 iY; 
+	TReal32 iZ;
+	};
+	
+NONSHARABLE_STRUCT( TAlfCanvasScaleParams )
+	{
+	TReal32 iX; 
+	TReal32 iY; 
+	TReal32 iZ;
+	};
+	
+NONSHARABLE_STRUCT( TAlfCanvasRotateParams )
+	{
+	TReal32 iAngle;
+	TReal32 iX; 
+	TReal32 iY; 
+	TReal32 iZ;
+	};
+
+    
+template <class T>
+HBufC8* AlfGcExternalizeL( const RArray<T>& aArray )
+    {
+    const TInt itemCount = aArray.Count();
+    if ( !itemCount)
+        {
+        return HBufC8::NewL(0);
+        }
+    
+    const T* firstItem = &aArray[0];    
+    TPtrC8 arrayPtr( (TUint8*)firstItem, itemCount*sizeof(T) );            
+    HBufC8* buffer = HBufC8::NewL( sizeof(TInt) + arrayPtr.Length() );
+    TPtr8 ptr = buffer->Des();     
+    
+    ptr.Append( (const TUint8*)&itemCount, sizeof(TInt) );
+    ptr.Append( arrayPtr );    
+    return buffer;
+    }
+
+
+const TInt KAlfGcBufferGranularity = 1024;
+
+struct CAlfGc::TAlfGcData
+    {
+    TAlfGcData() : iBuffer(NULL) {}
+    HBufC8* iBuffer;
+    };
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CAlfGc* CAlfGc::NewL()
+    {
+    CAlfGc* self = new (ELeave) CAlfGc;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+CAlfGc::CAlfGc()
+    {
+    }
+    
+void CAlfGc::ConstructL()
+    {
+    iData = new (ELeave) TAlfGcData;
+    }
+    
+CAlfGc::~CAlfGc()
+    {
+    if ( iData )
+        {
+        delete iData->iBuffer;
+        iData->iBuffer = NULL;
+        }
+    delete iData;
+    iData = NULL;
+    }
+    
+
+void CAlfGc::ActivateL()
+    {    
+    Deactivate(); // Just in case...
+    iData->iBuffer = HBufC8::NewL( KAlfGcBufferGranularity );
+    }
+
+HBufC8* CAlfGc::CommandBuffer()
+    {
+    return iData->iBuffer;      
+    }
+    
+void CAlfGc::Deactivate()
+    {        
+    delete iData->iBuffer;
+    iData->iBuffer = NULL;
+    }
+    
+void CAlfGc::AppendCommand( TInt aCommand, const TDesC8& aParams )
+    {
+    TRAP_IGNORE(AppendCommandL(aCommand,aParams));
+    }
+
+void CAlfGc::AppendCommandL( TInt aCommand, const TDesC8& aParams )
+    {
+    if (!iData->iBuffer)
+        {
+        return;    
+        }
+    
+    __ALFLOGSTRING1( "CAlfGc::AppendCommand - start, buffer length: %d", iData->iBuffer->Length() )
+    
+    // create a bigger buffer if needed
+    const TInt newSpaceNeeded = 4 + 4 + aParams.Length() + 4;
+    __ALFLOGSTRING1( "CAlfGc::AppendCommand - new space needed: %d", newSpaceNeeded)
+    if ( iData->iBuffer->Des().MaxLength() - iData->iBuffer->Length() < newSpaceNeeded )
+        {
+        __ALFLOGSTRING1( "CAlfGc::AppendCommand - allocating new buffer length: %d", iData->iBuffer->Length() + newSpaceNeeded * 2  )
+        iData->iBuffer = iData->iBuffer->ReAllocL( iData->iBuffer->Length() + newSpaceNeeded * 2 );
+        } 
+    
+    TPtr8 ptr = iData->iBuffer->Des();
+    TInt length = aParams.Length();
+    TInt command = aCommand;
+    
+    ptr.Append( (const TUint8*)&command, sizeof(TInt) );
+    ptr.Append( (const TUint8*)&length, sizeof(TInt) );
+    ptr.Append( aParams );
+    
+    TInt padding = 0;
+    if (length % 4)
+        {
+        padding = 4 - length % 4;    
+        }
+    
+    for ( TInt i = 0 ; i < padding ; i++ )
+        {
+        ptr.Append( 0xFF );        
+        }        
+    
+    for ( TInt i = 0 ; i < aParams.Length() ; i++ )
+        {
+        __ALFLOGSTRING2( "[%d]: %d", i, aParams[i] )
+        }
+    
+    __ALFLOGSTRING1( "CAlfGc::AppendCommand - end, buffer length: %d", iData->iBuffer->Length() )
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CAlfGc::DrawImage(const CAlfTexture& aTexture, const TAlfRealRect& aDestinationRect)   
+    {
+    TInt serversideTexture = aTexture.ServerHandle();
+    
+    const TAlfCanvasDrawImageParams params = {serversideTexture, 
+        aDestinationRect.iTl.iX,
+        aDestinationRect.iTl.iY,
+        aDestinationRect.iBr.iX,
+        aDestinationRect.iBr.iY
+     };
+    TPckgC<TAlfCanvasDrawImageParams> paramsPckg( params );
+    AppendCommand( EAlfCanvasDrawImage, paramsPckg );
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CAlfGc::DrawText(const TDesC& aText, const TAlfRealRect& aDestinationRect)
+    {
+        TPtrC8 ptr(reinterpret_cast<const TUint8 *>(aText.Ptr()), aText.Length()*2);                
+        AppendCommand( EAlfCanvasPrepareDrawText, ptr );
+        
+        const TAlfCanvasDrawTextParams params = { 
+            aDestinationRect.iTl.iX,
+            aDestinationRect.iTl.iY,
+            aDestinationRect.iBr.iX,
+            aDestinationRect.iBr.iY
+            };
+        TPckgC<TAlfCanvasDrawTextParams> paramsPckg( params );                    
+        AppendCommand( EAlfCanvasDrawText, paramsPckg );        
+    }
+
+void CAlfGc::DrawLines(const RArray<TReal32> & aLinesPointCords)
+	{
+	HBufC8* buffer = NULL;
+    TRAP_IGNORE(buffer = AlfGcExternalizeL(aLinesPointCords))
+    if (buffer)
+        {        
+    	AppendCommand( EAlfCanvasDrawLines, *buffer );
+    	delete buffer;
+    	buffer = NULL;
+        }
+	}
+	
+
+void CAlfGc::DrawEllipse(const TAlfRealRect& aDestinationRect)
+	{
+	const TAlfCanvasDrawEllipseParams params = {
+        aDestinationRect.iTl.iX,
+        aDestinationRect.iTl.iY,
+        aDestinationRect.iBr.iX,
+        aDestinationRect.iBr.iY
+     };
+    TPckgC<TAlfCanvasDrawEllipseParams> paramsPckg( params );
+    AppendCommand( EAlfCanvasDrawEllipse, paramsPckg );
+	}
+
+void CAlfGc::DrawPoints(const RArray<TReal32> & aPointsCords)
+	{
+	HBufC8* buffer = NULL;
+    TRAP_IGNORE(buffer = AlfGcExternalizeL(aPointsCords))
+    if (buffer)
+        {        
+    	AppendCommand( EAlfCanvasDrawPoints, *buffer );
+    	delete buffer;
+    	buffer = NULL;
+        }
+	}
+	
+void CAlfGc::DrawPolygon(const RArray<TReal32> & aPolygonPointCords)
+	{
+	HBufC8* buffer = NULL;
+    TRAP_IGNORE(buffer = AlfGcExternalizeL(aPolygonPointCords))
+    if (buffer)
+        {        
+    	AppendCommand( EAlfCanvasDrawPolygon, *buffer );
+    	delete buffer;
+    	buffer = NULL;
+        }
+	}
+
+void CAlfGc::DrawRects(const RArray<TReal32> & aRectPointCords)
+	{
+	HBufC8* buffer = NULL;
+    TRAP_IGNORE(buffer = AlfGcExternalizeL(aRectPointCords))
+    if (buffer)
+        {        
+    	AppendCommand( EAlfCanvasDrawRects, *buffer );
+    	delete buffer;
+    	buffer = NULL;
+        }
+	}
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CAlfGc::SetTextStyle(const CAlfTextStyle& aTextStyle)
+    {
+    TInt serverSideTextStyleId = aTextStyle.ServerHandle();    
+    TAlfCanvasSetTextStyleParams params = {serverSideTextStyleId};
+    TPckgC<TAlfCanvasSetTextStyleParams> paramsPckg( params );                    
+    AppendCommand( EAlfCanvasSetTextStyle, paramsPckg );        
+    }
+    
+
+void CAlfGc::SetPenColor(const TRgb& aColor)
+	{
+	TAlfCanvasSetPenColorParams params = {aColor};
+    TPckgC<TAlfCanvasSetPenColorParams> paramsPckg( params );                    
+    AppendCommand( EAlfCanvasSetPenColor, paramsPckg );        
+	}
+	
+void CAlfGc::SetPenWidth(const TReal32& aWidth)
+	{
+	TAlfCanvasSetPenWidthParams params = {aWidth};
+    TPckgC<TAlfCanvasSetPenWidthParams> paramsPckg( params );                    
+    AppendCommand( EAlfCanvasSetPenWidth, paramsPckg );        
+	}
+	
+void CAlfGc::SetOpacity(const TReal32& aOpacity)
+	{
+	TAlfCanvasSetOpacityParams params = {aOpacity};
+    TPckgC<TAlfCanvasSetOpacityParams> paramsPckg( params );                    
+    AppendCommand( EAlfCanvasSetOpacity, paramsPckg );        
+	}
+	
+
+void CAlfGc::SetPolygonDrawMode(TAlfPolygonDrawMode aPolygonDrawMode)
+	{
+	TAlfCanvasSetPolygonDrawModeParams params = {aPolygonDrawMode};
+    TPckgC<TAlfCanvasSetPolygonDrawModeParams> paramsPckg( params );                    
+    AppendCommand( EAlfCanvasSetPolygonDrawMode, paramsPckg );	
+	}
+void CAlfGc::SetTextAlign(TAlfAlignHorizontal aAlignHorizontal, TAlfAlignVertical aAlignVertical)
+	{
+	TAlfCanvasSetTextAlignParams params = {aAlignHorizontal, aAlignVertical};
+    TPckgC<TAlfCanvasSetTextAlignParams> paramsPckg( params );                    
+    AppendCommand( EAlfCanvasSetTextAlign, paramsPckg );	
+	}
+
+    // Transformations
+void CAlfGc::LoadIdentity()
+	{
+	TAlfCanvasLoadIdentityParams params = {0};
+    TPckgC<TAlfCanvasLoadIdentityParams> paramsPckg( params );                    
+    AppendCommand( EAlfCanvasLoadIdentity, paramsPckg );
+	}
+	
+void CAlfGc::Translate(const TReal32& aX, const TReal32& aY, const TReal32& aZ)
+	{
+	TAlfCanvasTranslateParams params = {aX, aY, aZ};
+    TPckgC<TAlfCanvasTranslateParams> paramsPckg( params );                    
+    AppendCommand( EAlfCanvasTranslate, paramsPckg );        
+	}
+	
+void CAlfGc::Scale(const TReal32& aX, const TReal32& aY, const TReal32& aZ)
+	{
+	TAlfCanvasScaleParams params = {aX, aY, aZ};
+    TPckgC<TAlfCanvasScaleParams> paramsPckg( params );                    
+    AppendCommand( EAlfCanvasScale, paramsPckg );        
+	}
+	
+void CAlfGc::Rotate(const TReal32& aAngle, const TReal32& aX, const TReal32& aY, const TReal32& aZ)
+	{
+	TAlfCanvasRotateParams params = {aAngle, aX, aY, aZ};
+    TPckgC<TAlfCanvasRotateParams> paramsPckg( params );                    
+    AppendCommand( EAlfCanvasRotate, paramsPckg );        
+	}