diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/Client/src/alfgc.cpp --- /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 +#include +#include +#include +#include +#include +#include "alflogger.h" + +//#include + + +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 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 +HBufC8* AlfGcExternalizeL( const RArray& 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 paramsPckg( params ); + AppendCommand( EAlfCanvasDrawImage, paramsPckg ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAlfGc::DrawText(const TDesC& aText, const TAlfRealRect& aDestinationRect) + { + TPtrC8 ptr(reinterpret_cast(aText.Ptr()), aText.Length()*2); + AppendCommand( EAlfCanvasPrepareDrawText, ptr ); + + const TAlfCanvasDrawTextParams params = { + aDestinationRect.iTl.iX, + aDestinationRect.iTl.iY, + aDestinationRect.iBr.iX, + aDestinationRect.iBr.iY + }; + TPckgC paramsPckg( params ); + AppendCommand( EAlfCanvasDrawText, paramsPckg ); + } + +void CAlfGc::DrawLines(const RArray & 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 paramsPckg( params ); + AppendCommand( EAlfCanvasDrawEllipse, paramsPckg ); + } + +void CAlfGc::DrawPoints(const RArray & aPointsCords) + { + HBufC8* buffer = NULL; + TRAP_IGNORE(buffer = AlfGcExternalizeL(aPointsCords)) + if (buffer) + { + AppendCommand( EAlfCanvasDrawPoints, *buffer ); + delete buffer; + buffer = NULL; + } + } + +void CAlfGc::DrawPolygon(const RArray & aPolygonPointCords) + { + HBufC8* buffer = NULL; + TRAP_IGNORE(buffer = AlfGcExternalizeL(aPolygonPointCords)) + if (buffer) + { + AppendCommand( EAlfCanvasDrawPolygon, *buffer ); + delete buffer; + buffer = NULL; + } + } + +void CAlfGc::DrawRects(const RArray & 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 paramsPckg( params ); + AppendCommand( EAlfCanvasSetTextStyle, paramsPckg ); + } + + +void CAlfGc::SetPenColor(const TRgb& aColor) + { + TAlfCanvasSetPenColorParams params = {aColor}; + TPckgC paramsPckg( params ); + AppendCommand( EAlfCanvasSetPenColor, paramsPckg ); + } + +void CAlfGc::SetPenWidth(const TReal32& aWidth) + { + TAlfCanvasSetPenWidthParams params = {aWidth}; + TPckgC paramsPckg( params ); + AppendCommand( EAlfCanvasSetPenWidth, paramsPckg ); + } + +void CAlfGc::SetOpacity(const TReal32& aOpacity) + { + TAlfCanvasSetOpacityParams params = {aOpacity}; + TPckgC paramsPckg( params ); + AppendCommand( EAlfCanvasSetOpacity, paramsPckg ); + } + + +void CAlfGc::SetPolygonDrawMode(TAlfPolygonDrawMode aPolygonDrawMode) + { + TAlfCanvasSetPolygonDrawModeParams params = {aPolygonDrawMode}; + TPckgC paramsPckg( params ); + AppendCommand( EAlfCanvasSetPolygonDrawMode, paramsPckg ); + } +void CAlfGc::SetTextAlign(TAlfAlignHorizontal aAlignHorizontal, TAlfAlignVertical aAlignVertical) + { + TAlfCanvasSetTextAlignParams params = {aAlignHorizontal, aAlignVertical}; + TPckgC paramsPckg( params ); + AppendCommand( EAlfCanvasSetTextAlign, paramsPckg ); + } + + // Transformations +void CAlfGc::LoadIdentity() + { + TAlfCanvasLoadIdentityParams params = {0}; + TPckgC paramsPckg( params ); + AppendCommand( EAlfCanvasLoadIdentity, paramsPckg ); + } + +void CAlfGc::Translate(const TReal32& aX, const TReal32& aY, const TReal32& aZ) + { + TAlfCanvasTranslateParams params = {aX, aY, aZ}; + TPckgC paramsPckg( params ); + AppendCommand( EAlfCanvasTranslate, paramsPckg ); + } + +void CAlfGc::Scale(const TReal32& aX, const TReal32& aY, const TReal32& aZ) + { + TAlfCanvasScaleParams params = {aX, aY, aZ}; + TPckgC 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 paramsPckg( params ); + AppendCommand( EAlfCanvasRotate, paramsPckg ); + }