Merge 1. Pull in cpp files in the performance enhanced Khronos RI OVG files which are newly added. I've ignored platform-specific cpp files for linux, macosx, and null operating systems because this local solution has its own platform glue (i.e. facility to target Bitmaps but no full windowing support). I've ignored sfEGLInterface.cpp because this is used as a bridge to go from EGL to Nokia's Platsim which offers an EGL service. That's not relevant to this implementation because this is ARM side code, not Intel side. I just left a comment to sfEGLInterface.cpp in case we need to pick up this later on. The current code compiles on winscw. Prior to this fix, the code works on winscw, and can launch the SVG tiger (tiger.exe). That takes about 20 seconds to render. I hope to always be able to show this icon on each commit, and the plan is for the render time to reduce with this series of submissions. On this commit, the tiger renders ok in 20 seconds.
/*
* Copyright (c) 2005-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:
*
*/
#include "t_cfbsdrawdevicedata.h"
#include <hal.h>
#include <e32math.h>
_LIT(KDisplayMode, "displayMode");
_LIT(KDrawMode, "drawMode");
_LIT(KOrientationMode, "orientationMode");
_LIT(KShadowMode, "shadowMode");
_LIT(KBackColor, "backColor");
_LIT(KNumRect, "numRect");
_LIT(KRectangles, "rectangles");
_LIT(KRectangleSection, "RECTANGLES");
_LIT(KNumTestRect, "numTestRect");
_LIT(KAutoUpdate, "autoUpdate");
_LIT(KCmdNewScreenDeviceL, "NewScreenDeviceL");
_LIT(KCmdDestructor, "~");
_LIT(KCmdInitScreen, "InitScreen");
_LIT(KCmdSetDisplayMode, "SetDisplayMode");
_LIT(KCmdSetAutoUpdate, "SetAutoUpdate");
_LIT(KCmdOrientationsAvailable, "OrientationsAvailable");
_LIT(KCmdSetOrientation, "SetOrientation");
_LIT(KCmdWriteRgb, "WriteRgb");
_LIT(KCmdWriteLine, "WriteLine");
_LIT(KCmdWriteBinaryLine, "WriteBinaryLine");
_LIT(KCmdWriteRgbMulti, "WriteRgbMulti");
_LIT(KCmdReadLine, "ReadLine");
_LIT(KCmdWriteRGBAlphaLine, "WriteRGBAlphaLine");
_LIT(KCmdSetShadowMode, "SetShadowMode");
_LIT(KCmdShadowArea, "ShadowArea");
_LIT(KCmdWriteBinary, "WriteBinary");
_LIT(KCmdWriteBinaryLineVertical, "WriteBinaryLineVertical");
_LIT(KNoShadow, "ENoShadow");
_LIT(KShadow, "EShadow");
_LIT(KFade, "EFade");
_LIT(KShadowFade, "EShadowFade");
_LIT(KNone, "ENone");
_LIT(KGray2, "EGray2");
_LIT(KGray4, "EGray4");
_LIT(KGray16, "EGray16");
_LIT(KGray256, "EGray256");
_LIT(KColor16, "EColor16");
_LIT(KColor256, "EColor256");
_LIT(KColor64K, "EColor64K");
_LIT(KColor16M, "EColor16M");
_LIT(KRgb, "ERgb");
_LIT(KColor4K, "EColor4K");
_LIT(KColor16MU, "EColor16MU");
_LIT(KColor16MA, "EColor16MA");
_LIT(KColor16MAP, "EColor16MAP");
_LIT(KColorLast, "EColorLast");
_LIT(KDrawModePEN, "EDrawModePEN");
_LIT(KDrawModeAND, "EDrawModeAND");
_LIT(KDrawModeXOR, "EDrawModeXOR");
_LIT(KDrawModeOR, "EDrawModeOR");
_LIT(KDrawModeNOTSCREEN, "EDrawModeNOTSCREEN");
_LIT(KDrawModeNOTPEN, "EDrawModeNOTPEN");
_LIT(KDelay, "delay");
_LIT(KOrientationNormal, "EOrientationNormal");
_LIT(KOrientationRotated90, "EOrientationRotated90");
_LIT(KOrientationRotated180, "EOrientationRotated180");
_LIT(KOrientationRotated270, "EOrientationRotated270");
/**
* Shadow modes
*/
const CDataWrapperBase::TEnumEntryTable CT_CFbsDrawDeviceData::iEnumShadowModes[] =
{
KNoShadow, 1,
KShadow, 2,
KFade, 3,
KShadowFade, 4
};
/**
*Display Modes
*/
const CDataWrapperBase::TEnumEntryTable CT_CFbsDrawDeviceData::iEnumDisplayModes[] =
{
KNone, ENone,
KGray2, EGray2,
KGray4, EGray4,
KGray16, EGray16,
KGray256, EGray256,
KColor16, EColor16,
KColor256, EColor256,
KColor64K, EColor64K,
KColor16M, EColor16M,
KRgb, ERgb,
KColor4K, EColor4K,
KColor16MU, EColor16MU,
KColor16MA, EColor16MA,
KColor16MA, EColorLast,
KColor16MAP, EColor16MAP,
KColorLast, EColor64K
};
/**
* Draw modes
*/
const CDataWrapperBase::TEnumEntryTable CT_CFbsDrawDeviceData::iEnumDrawModes[] =
{
KDrawModePEN, CGraphicsContext::EDrawModePEN,
KDrawModeAND, CGraphicsContext::EDrawModeAND,
KDrawModeXOR, CGraphicsContext::EDrawModeXOR,
KDrawModeOR, CGraphicsContext::EDrawModeOR,
KDrawModeNOTSCREEN, CGraphicsContext::EDrawModeNOTSCREEN,
KDrawModeNOTPEN, CGraphicsContext::EDrawModeNOTPEN
};
const CDataWrapperBase::TEnumEntryTable CT_CFbsDrawDeviceData::iEnumOrientationModes[] =
{
KOrientationNormal, CFbsDrawDevice::EOrientationNormal,
KOrientationRotated90, CFbsDrawDevice::EOrientationRotated90,
KOrientationRotated180, CFbsDrawDevice::EOrientationRotated180,
KOrientationRotated270, CFbsDrawDevice::EOrientationRotated270
};
CT_CFbsDrawDeviceData* CT_CFbsDrawDeviceData::NewL()
{
CT_CFbsDrawDeviceData* ret = new (ELeave) CT_CFbsDrawDeviceData();
CleanupStack::PushL(ret);
ret->ConstructL();
CleanupStack::Pop(ret);
return ret;
}
CT_CFbsDrawDeviceData::CT_CFbsDrawDeviceData()
: iDrawDevice(NULL),
iDMode(CGraphicsContext::EDrawModePEN),
iDispMode(EColor64K),
iOrientation(0),
iSize(0,0),
iPostBlendShadow(ENoPostShadow),
iTestRect(),
iNumTestRects(0)
{
}
void CT_CFbsDrawDeviceData::ConstructL()
{
}
/**
* Public destructor
*/
CT_CFbsDrawDeviceData::~CT_CFbsDrawDeviceData()
{
DestroyData();
}
/**
* Return a pointer to the object that the data wraps
*
* @return pointer to the object that the data wraps
*/
TAny* CT_CFbsDrawDeviceData::GetObject()
{
return iDrawDevice;
}
/**
* Command for Destructor
*/
void CT_CFbsDrawDeviceData::DoCmdDestructor()
{
DestroyData();
}
/**
* Destroys used objects
*/
void CT_CFbsDrawDeviceData::DestroyData()
{
iTestRect.Reset();
iTestRect.Close();
iDispMode = ENone;
iSize.SetSize(0,0);
if(iDrawDevice)
{
delete iDrawDevice;
iDrawDevice = NULL;
}
}
/**
* Process a command read from the ini file
*
* @param aCommand The command to process
* @param aSection The section in the ini containing data for the command
* @param aAsyncErrorIndex Command index for async calls to return errors to
*
* @return ETrue if the command is processed
*
* @leave System wide error
*/
TBool CT_CFbsDrawDeviceData::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection,
const TInt/* aAsyncErrorIndex*/)
{
TBool ret = ETrue;
if ( aCommand==KCmdInitScreen )
{
DoCmdInitScreen();
}
else if ( aCommand==KCmdSetDisplayMode )
{
DoCmdSetDisplayMode();
}
else if ( aCommand==KCmdSetAutoUpdate )
{
DoCmdSetAutoUpdate(aSection);
}
else if ( aCommand==KCmdOrientationsAvailable )
{
DoCmdOrientationsAvailable();
}
else if ( aCommand==KCmdSetOrientation )
{
DoCmdSetOrientation(aSection);
}
else if ( aCommand==KCmdNewScreenDeviceL )
{
DoCmdNewScreenDeviceL(aSection);
}
else if ( aCommand==KCmdDestructor )
{
DoCmdDestructor();
}
else if ( aCommand==KCmdWriteLine )
{
DoCmdWriteLineL(aSection);
}
else if ( aCommand==KCmdWriteBinaryLine )
{
DoCmdWriteBinaryLineL(aSection);
}
else if ( aCommand==KCmdWriteRgb )
{
DoCmdWriteRgb(aSection);
}
else if( aCommand==KCmdWriteRgbMulti )
{
DoCmdWriteRgbMulti(aSection);
}
else if( aCommand==KCmdReadLine )
{
DoCmdReadLineL(aSection);
}
else if( aCommand==KCmdWriteRGBAlphaLine )
{
DoCmdWriteRGBAlphaLineL(aSection);
}
else if( aCommand==KCmdSetShadowMode )
{
DoCmdSetShadowMode(aSection);
}
else if( aCommand==KCmdShadowArea )
{
DoCmdShadowArea(aSection);
}
else if( aCommand==KCmdWriteBinary )
{
DoCmdWriteBinaryL(aSection);
}
else if( aCommand==KCmdWriteBinaryLineVertical )
{
DoCmdWriteBinaryLineVerticalL(aSection);
}
else
{
ret = EFalse;
}
return ret;
}
/**
* Tests WriteRgbMulti method from CFbsDrawDevice
* @param aSection The section in the ini containing data for the command
* @return KErrNone if no error found.
*/
void CT_CFbsDrawDeviceData::DoCmdWriteRgbMulti(const TTEFSectionName& aSection)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdWriteRgbMulti"));
TInt drawMode;
TInt delay=0;
TInt nRect = 0;
TBool dataOk=ETrue;
GETFROMCONFIGMANDATORY(Int, aSection, KNumRect(),nRect,_L("Error in getting parameter %S from INI file"),dataOk);
GETFROMCONFIGMANDATORY(Int, aSection, KDelay(),delay,_L("Error in getting parameter %S from INI file"),dataOk);
if ( !GetEnumFromConfig(aSection, KDrawMode(), iEnumDrawModes, drawMode) )
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDrawMode());
SetBlockResult(EFail);
dataOk = EFalse;
}
if(dataOk)
{
INFO_PRINTF2(_L("Change draw mode to: %d"), drawMode);
iDMode=CGraphicsContext::TDrawMode(drawMode);
for (TInt nBackColor = 0; nBackColor < KNumTestBackgrounds; nBackColor++)
{
TRgb backColor = TestColor[nBackColor];
Clear(backColor);
for (TInt nColor = 0; nColor < KNumTestColors; nColor++)
{
TInt shadowMode = EPostFade;
TRect rect = iTestRect[nRect];
TRgb color = TestColor[nColor];
SetShadowAndFadingMode(shadowMode,100, 200);
iDrawDevice->WriteRgbMulti(rect.iTl.iX,rect.iTl.iY,rect.Width(),rect.Height(),color,iDMode);
User::After(delay);
}
}
}
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::DoCmdWriteRgbMulti"));
}
/**
* Tests WriteRgb method from CFbsDrawDevice
*/
void CT_CFbsDrawDeviceData::DoCmdWriteRgb(const TTEFSectionName& aSection)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdWriteRgb"));
TInt drawMode;
TInt nRect = 0;
TInt delay;
TBool dataOk=ETrue;
if (!GetEnumFromConfig(aSection, KDrawMode(), iEnumDrawModes,drawMode))
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDrawMode());
SetBlockResult(EFail);
dataOk = EFalse;
}
GETFROMCONFIGMANDATORY(Int, aSection, KDelay(),delay,_L("Error in getting parameter %S from INI file"),dataOk);
GETFROMCONFIGMANDATORY(Int, aSection, KNumRect(),nRect,_L("Error in getting parameter %S from INI file"),dataOk);
if (dataOk)
{
iDMode=CGraphicsContext::TDrawMode(drawMode);
for (TInt nBackColor = 0; nBackColor < KNumTestBackgrounds; nBackColor++)
{
TRgb backColor = TestBackground[nBackColor];
Clear(backColor);
for (TInt nColor = 0; nColor < KNumTestColors; nColor++)
{
TInt shadowMode = ENoPostShadow;
TRect rect = iTestRect[nRect];
TRgb color = TestColor[nColor];
SetShadowAndFadingMode(shadowMode,100, 200);
iDrawDevice->WriteRgb(rect.iTl.iX,rect.iTl.iY,color,iDMode);
User::After(delay);
}
}
}
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::DoCmdWriteRgb"));
}
/**
* Validates the received parameters and handles errors returned from TestScreenDrawL
* @param aSection The section in the ini containing data for the command
* @return KErrNone if no error found.
*/
void CT_CFbsDrawDeviceData::DoCmdNewScreenDeviceL(const TTEFSectionName& aSection)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdNewScreenDeviceL"));
if(iDrawDevice)
{
delete iDrawDevice;
iDrawDevice=NULL;
}
TInt drawMode;
TBool dataOk = ETrue;
if (!GetEnumFromConfig(aSection, KDisplayMode(), iEnumDisplayModes, drawMode))
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDisplayMode());
SetBlockResult(EFail);
dataOk = EFalse;
}
if(dataOk)
{
TDisplayMode displayMode = TDisplayMode(drawMode);
iDispMode = displayMode;
TInt ScreenNo = 0;
User::LeaveIfError(HAL::Get(KDefaultScreenNo, HALData::EDisplayXPixels,iSize.iWidth));
User::LeaveIfError(HAL::Get(KDefaultScreenNo, HALData::EDisplayYPixels,iSize.iHeight));
INFO_PRINTF3(_L("WIDTH from HAL %i \nHEIGHT from HAL %i"),iSize.iWidth,iSize.iHeight);
ASSERT(iSize.iWidth > 0 && iSize.iHeight > 0);
TRAPD(ret,iDrawDevice = CFbsDrawDevice::NewScreenDeviceL(ScreenNo,displayMode));
// check error code
if(ret != KErrNone)
{
ERR_PRINTF2(_L("CFbsDrawDevice creation error: %d"), ret);
SetError(ret);
}
else
{
GETFROMCONFIGMANDATORY(Int, KRectangleSection(), KNumTestRect(),iNumTestRects,_L("Error in getting parameter %S from INI file"),dataOk);
if (!InitRectangles())
{
SetBlockResult(EFail);
ERR_PRINTF1(_L("Error: Test Rectangles NOT set!"));
}
else
{
INFO_PRINTF1(_L("Test Rectangles are now set!"));
}
}
INFO_PRINTF1(_L("** DoCmdNewScreenDeviceL succeded!"));
}
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::DoCmdNewScreenDeviceL"));
}
/**
* Inits Screen
*/
void CT_CFbsDrawDeviceData::DoCmdInitScreen()
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdInitScreen"));
TInt err = iDrawDevice->InitScreen();
if(err != KErrNone)
{
ERR_PRINTF2(_L("InitScreen error: %d"), err);
SetError(err);
}
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::DoCmdInitScreen"));
}
/**
* Sets Display Mode
* */
void CT_CFbsDrawDeviceData::DoCmdSetDisplayMode()
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdSetDisplayMode"));
iDrawDevice->SetDisplayMode(iDrawDevice);
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::DoCmdSetDisplayMode"));
}
/**
* Sets or unsets auto-update for the screen.
*/
void CT_CFbsDrawDeviceData::DoCmdSetAutoUpdate(const TTEFSectionName& aSection)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdSetAutoUpdate"));
TBool autoUpdate=ETrue;
GETFROMCONFIGOPTIONAL(Bool, aSection, KAutoUpdate(),autoUpdate,_L("Error in getting parameter %S from INI file"));
iDrawDevice->SetAutoUpdate(autoUpdate);
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::DoCmdSetAutoUpdate"));
}
/**
* checks for Available Orientations
*/
void CT_CFbsDrawDeviceData::DoCmdOrientationsAvailable()
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdOrientationsAvailable"));
TBool orientation[4];
iDrawDevice->OrientationsAvailable(orientation);
INFO_PRINTF2(_L("Orientation Normal : %i"),orientation[CFbsDrawDevice::EOrientationNormal]);
INFO_PRINTF2(_L("Orientation Rotated 90 : %i"),orientation[CFbsDrawDevice::EOrientationRotated90]);
INFO_PRINTF2(_L("Orientation Rotated 180 : %i"),orientation[CFbsDrawDevice::EOrientationRotated180]);
INFO_PRINTF2(_L("Orientation Rotated 270 : %i"),orientation[CFbsDrawDevice::EOrientationRotated270]);
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::DoCmdOrientationsAvailable"));
}
/**
* Sets orientation
*/
void CT_CFbsDrawDeviceData::DoCmdSetOrientation(const TTEFSectionName& aSection)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdSetOrientation"));
TBool dataOk = ETrue;
if ( !GetEnumFromConfig(aSection, KOrientationMode(), iEnumOrientationModes, iOrientation) )
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KOrientationMode());
SetBlockResult(EFail);
dataOk = EFalse;
}
if(dataOk)
{
TBool orientationSupported = iDrawDevice->SetOrientation(CFbsDrawDevice::TOrientation(iOrientation));
if (orientationSupported)
{
INFO_PRINTF2(_L("Orientation was set to: %d"), iOrientation);
if (iOrientation & 1)
{
iSize.SetSize(iSize.iHeight, iSize.iWidth);
}
}
else
{
ERR_PRINTF1(_L("Orientation not Supported"));
}
}
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::DoCmdSetOrientation"));
}
/**
* Tests WriteLine method from CFbsDrawDevice
*/
void CT_CFbsDrawDeviceData::DoCmdWriteLineL(const TTEFSectionName& aSection)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdWriteLineL"));
TInt byteSize = (ByteSize() / iSize.iHeight);
TInt delay;
TBool dataOk = ETrue;
INFO_PRINTF2(_L("After setting bytesize %d"),byteSize);
TUint8* backBuffer = new(ELeave) TUint8[byteSize];
CleanupStack::PushL(backBuffer);
TUint8* writeBuffer = new(ELeave) TUint8[byteSize];
CleanupStack::PushL(writeBuffer);
TUint8* copyBuffer = new(ELeave) TUint8[byteSize];
CleanupStack::PushL(copyBuffer);
TUint8* readBuffer = new(ELeave) TUint8[byteSize];
CleanupStack::PushL(readBuffer);
INFO_PRINTF1(_L("after setting buffers"));
TInt drawMode;
if (!GetEnumFromConfig(aSection, KDrawMode(), iEnumDrawModes,drawMode))
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDrawMode());
SetBlockResult(EFail);
dataOk = EFalse;
}
GETFROMCONFIGMANDATORY(Int, aSection, KDelay(),delay,_L("Error in getting parameter %S from INI file"),dataOk);
INFO_PRINTF1(_L("Test Rectangles are now set!"));
TInt nRect = 0;
GETFROMCONFIGMANDATORY(Int, aSection, KNumRect(),nRect,_L("Error in getting parameter %S from INI file"),dataOk);
TRect rect = iTestRect[nRect];
TInt nBackColor = 0;
GETFROMCONFIGMANDATORY(Int, aSection, KBackColor(),nBackColor,_L("Error in getting parameter %S from INI file"),dataOk);
if(dataOk)
{
iDMode=CGraphicsContext::TDrawMode(drawMode);
TRgb b = TestBackground[nBackColor];
Clear(b);
for (TInt yy = rect.iTl.iY; yy < rect.iBr.iY; yy++)
{
FillBuffer(writeBuffer,byteSize,iDispMode);
Mem::Copy(copyBuffer,writeBuffer,byteSize);
iDrawDevice->WriteLine(rect.iTl.iX,yy,rect.Width(),(TUint32*)writeBuffer,iDMode);
Mem::FillZ(readBuffer,byteSize);
User::After(delay);
}
}
INFO_PRINTF1(_L("Deleting buffers"));
CleanupStack::PopAndDestroy(4);
INFO_PRINTF1(_L("Buffers deleted"));
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::DoCmdWriteLineL"));
}
/**
* Tests WriteBinaryLine from CFbsDrawDevice
*/
void CT_CFbsDrawDeviceData::DoCmdWriteBinaryLineL(const TTEFSectionName& aSection)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdWriteBinaryLineL"));
TInt drawMode;
TInt nRect = 0;
TInt delay;
TBool dataOk = ETrue;
if (!GetEnumFromConfig(aSection, KDrawMode(),iEnumDrawModes, drawMode))
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDrawMode());
SetBlockResult(EFail);
dataOk = EFalse;
}
GETFROMCONFIGMANDATORY(Int, aSection, KDelay(),delay,_L("Error in getting parameter %S from INI file"),dataOk);
if (!GetIntFromConfig(aSection, KNumRect(), nRect))
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KNumRect());
SetBlockResult(EFail);
dataOk = EFalse;
}
TInt nBackColor = 0;
if (!GetIntFromConfig(aSection, KBackColor(), nBackColor))
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KBackColor());
SetBlockResult(EFail);
dataOk = EFalse;
}
TInt shadowMode = ENoPostShadow;
if (!GetEnumFromConfig(aSection, KShadowMode(), iEnumShadowModes, shadowMode))
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KShadowMode());
SetBlockResult(EFail);
dataOk = EFalse;
}
if(dataOk)
{
iDMode=CGraphicsContext::TDrawMode(drawMode);
TInt byteSize = ByteSize() / iSize.iHeight;
TInt wordSize = (byteSize + 3) / 4;
TUint32* writeBuffer = new(ELeave) TUint32[wordSize];
CleanupStack::PushL(writeBuffer);
INFO_PRINTF1(_L("Test Rectangles are now set!"));
TRect rect = iTestRect[nRect];
for (TInt nColor = 0; nColor < KNumTestColors; nColor++)
{
if (rect.Width() > KRectWidth)
{
rect.iBr.iX = rect.iTl.iX + KRectWidth;
}
if (rect.Width() < 1)
{
rect.iBr.iX = rect.iTl.iX + 1;
}
TRgb backgroundColor = TestBackground[nBackColor];
Clear(backgroundColor);
TRgb testColor = TestColor[nColor];
iDrawDevice->SetShadowMode(CFbsDrawDevice::TShadowMode(shadowMode));
FillBuffer((TUint8*)writeBuffer,byteSize,iDispMode);
iDrawDevice->WriteBinaryLine(rect.iTl.iX,rect.iTl.iY,writeBuffer,rect.Width(),testColor,iDMode);
User::After(delay);
}
CleanupStack::PopAndDestroy();
writeBuffer = NULL;
}
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::DoCmdWriteBinaryLineL"));
}
/**
* Tests ReadLine from CFbsDrawDevice
* @param aSection The section in the ini containing data for the command
* @return KErrNone if no error found.
*/
void CT_CFbsDrawDeviceData::DoCmdReadLineL(const TTEFSectionName& aSection)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdReadLineL"));
TInt byteSize = ByteSize() / iSize.iHeight;
TUint8* writeBuffer = new(ELeave) TUint8[byteSize];
CleanupStack::PushL(writeBuffer);
TUint8* readBuffer = new(ELeave) TUint8[iSize.iWidth * sizeof(TRgb)];
CleanupStack::PushL(readBuffer);
FillBuffer((TUint8*)writeBuffer,byteSize,iDispMode);
FillBuffer((TUint8*)readBuffer,byteSize,iDispMode);
TInt nBackColor = 0;
if (!GetIntFromConfig(aSection, KBackColor(), nBackColor))
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KBackColor());
SetBlockResult(EFail);
}
TRgb b = TestColor[nBackColor];
Clear(b);
for (TInt nDispMode = 0; nDispMode < KNumDispModes; nDispMode++)
{
TDisplayMode dispMode = TestDisplayMode[nDispMode];
for (TInt cnt=0;cnt<2;cnt++)
{
if (cnt==0) //first time
{
iDrawDevice->SetUserDisplayMode(dispMode);
}
else
{
iDrawDevice->SetUserDisplayMode(iDispMode);
}
for (TInt nRect = 0; nRect < iNumTestRects; nRect++)
{
TRect rect = iTestRect[nRect];
for (TInt yy = rect.iTl.iY; yy < rect.iBr.iY; yy++)
{
FillBuffer(writeBuffer,byteSize,iDispMode);
Mem::FillZ(readBuffer,byteSize);
iDrawDevice->ReadLine(rect.iTl.iX,yy,rect.Width(),(TUint32*)readBuffer,dispMode);
Mem::FillZ(readBuffer,byteSize);
}
}
}
}
CleanupStack::PopAndDestroy(2);
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdReadLineL"));
}
/**
* Tests RGBAlphaLine from CFbsDrawDevice
* @param aSection The section in the ini containing data for the command
* @return KErrNone if no error found.
*/
void CT_CFbsDrawDeviceData::DoCmdWriteRGBAlphaLineL(const TTEFSectionName& aSection)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdWriteRGBAlphaLineL"));
TInt drawMode;
if (!GetEnumFromConfig(aSection, KDrawMode(), iEnumDrawModes,drawMode))
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDrawMode());
SetBlockResult(EFail);
}
iDMode=CGraphicsContext::TDrawMode(drawMode);
TInt byteSize = ByteSize() / iSize.iHeight;
INFO_PRINTF1(_L("In TestWriteRGBAlphaLine"));
TUint8* writeBuffer = new(ELeave) TUint8[iSize.iWidth * 4];
CleanupStack::PushL(writeBuffer);
TUint8* writeBuffer2 = new(ELeave) TUint8[iSize.iWidth * 4];
CleanupStack::PushL(writeBuffer2);
TUint8* maskBuffer = new(ELeave) TUint8[iSize.iWidth * 4];
CleanupStack::PushL(maskBuffer);
FillBuffer(writeBuffer,byteSize,iDispMode);
FillBuffer(writeBuffer2,byteSize,iDispMode);
FillBuffer(maskBuffer,byteSize,iDispMode);
TInt nRect;
for (TInt maskFillCount=0; maskFillCount<KMaskFill;maskFillCount++)
{
for (nRect = 0; nRect < iNumTestRects; nRect++)
{
for (TInt nBackColor = 0; nBackColor < KNumTestBackgrounds; nBackColor++)
{
TRgb testColor = TestColor[nBackColor];
Clear(testColor);
for (TInt nColor = 0; nColor < KNumTestColors; nColor++)
{
//ensure the colour has the 0xff mask value
TRgb checkColor;
TRgb c = TestColor[nColor];
TUint32 internal = c.Internal();
TInt yy;
TRect rect = iTestRect[nRect];
TInt shadowMode =ENoPostShadow;
//use a combined alpha for the check colour
TUint32 combinedAlpha = MaskFill[maskFillCount]*((internal&0xff000000)>>24);
combinedAlpha = ((combinedAlpha <<16) & 0xff000000);
checkColor.SetInternal((internal&0x00ffffff)|combinedAlpha);
SetShadowAndFadingMode(shadowMode,100, 200);
for (yy = rect.iTl.iY; yy < rect.iBr.iY; yy++)
{
iDrawDevice->WriteRgbAlphaLine(rect.iTl.iX,yy,rect.Width(),
writeBuffer,
writeBuffer2,
maskBuffer,
iDMode);
}
//require to Shadow After the checkColor, no shadow with a zero mask
TBool shadowModeChanged = EFalse;
if (MaskFill[maskFillCount])
{
iPostBlendShadow = (TPostShadowMode) shadowMode;
shadowMode = 0;
shadowModeChanged = ETrue;
}
if(shadowModeChanged)
{
shadowMode = iPostBlendShadow;
}
iPostBlendShadow = ENoPostShadow;
}
}
}
}
INFO_PRINTF1(_L("** delete buffers"));
CleanupStack::PopAndDestroy(3);
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::DoCmdWriteRGBAlphaLineL"));
}
/**
* Tests ShadowArea from CFbsDrawDevice
* @return KErrNone if no error found.
*/
void CT_CFbsDrawDeviceData::DoCmdShadowArea(const TTEFSectionName& aSection)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdShadowArea"));
TInt delay=0;
TBool dataOk = ETrue;
GETFROMCONFIGMANDATORY(Int, aSection, KDelay(),delay,_L("Error in getting parameter %S from INI file"),dataOk);
if(dataOk)
{
INFO_PRINTF1(_L("In TestShadow()"));
TInt nBackColor = 1;
TRgb testColor = TestColor[nBackColor];
Clear(testColor);
for (TInt shadowMode = 0; shadowMode < KNumShadowModes; shadowMode++)
{
for (TInt nRect = 0; nRect < iNumTestRects; nRect++)
{
for (TInt nColor = 0; nColor < KNumTestColors; nColor++)
{
TRect rect = iTestRect[nRect];
iDrawDevice->SetShadowMode(CFbsDrawDevice::TShadowMode(shadowMode));
iDrawDevice->ShadowArea(rect);
User::After(delay);
}
}
}
}
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::DoCmdShadowArea"));
}
/**
* Tests WriteBinaryLineVertical from CFbsDrawDevice
* @return KErrNone if no error found.
*/
void CT_CFbsDrawDeviceData::DoCmdWriteBinaryLineVerticalL(const TTEFSectionName& aSection)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdWriteBinaryLineVerticalL"));
TInt drawMode;
TInt delay;
TBool dataOk = ETrue;
if (!GetEnumFromConfig(aSection, KDrawMode(), iEnumDrawModes,drawMode))
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDrawMode());
SetBlockResult(EFail);
dataOk = EFalse;
}
GETFROMCONFIGMANDATORY(Int, aSection, KDelay(),delay,_L("Error in getting parameter %S from INI file"),dataOk);
TInt nRect = 0;
if (!GetIntFromConfig(aSection, KNumRect(), nRect))
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KNumRect());
SetBlockResult(EFail);
dataOk = EFalse;
}
if(dataOk)
{
iDMode=CGraphicsContext::TDrawMode(drawMode);
TInt byteSize = ByteSize() / iSize.iHeight;
TInt wordSize = (byteSize + 3) / 4;
TUint32* writeBuffer = new(ELeave) TUint32[wordSize];
TInt nBackColor = 1;
TInt nColor = 4;
TRect rect = iTestRect[nRect];
if (rect.Width() > KRectWidth)
{
rect.iBr.iX = rect.iTl.iX + KRectWidth;
}
if (rect.Width() < 1)
{
rect.iBr.iX = rect.iTl.iX + 1;
}
TRgb b = TestBackground[nBackColor];
TRgb c = TestColor[nColor];
Clear(b);
//NOTE Call Command within script: SetShadowmode
FillBuffer((TUint8*)writeBuffer,byteSize,iDispMode);
iDrawDevice->WriteBinaryLineVertical(rect.iTl.iX,rect.iBr.iY - 1,writeBuffer,rect.Height(),c,iDMode,ETrue);
User::After(delay);
delete [] writeBuffer;
writeBuffer = NULL;
}
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::DoCmdWriteBinaryLineVerticalL"));
}
/**
* Sets the current shadowing mode
* @param aSection The section in the ini containing data for the command
*/
void CT_CFbsDrawDeviceData::DoCmdSetShadowMode(const TTEFSectionName& aSection)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdSetShadowMode"));
TInt shadowMode = ENoPostShadow;
if(!GetEnumFromConfig(aSection, KShadowMode(), iEnumShadowModes, shadowMode))
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KShadowMode());
SetBlockResult(EFail);
}
else
{
iDrawDevice->SetShadowMode(CFbsDrawDevice::TShadowMode(shadowMode));
}
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::DoCmdSetShadowMode"));
}
/**
* Tests WriteBinary method from CFbsDrawDevice
* @param aSection The section in the ini containing data for the command
* @return KErrNone if no error found.
*/
void CT_CFbsDrawDeviceData::DoCmdWriteBinaryL(const TTEFSectionName& aSection)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::DoCmdWriteBinaryL"));
TInt drawMode;
TInt delay;
TBool dataOk = ETrue;
if (!GetEnumFromConfig(aSection, KDrawMode(), iEnumDrawModes,drawMode))
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDrawMode());
SetBlockResult(EFail);
dataOk = EFalse;
}
GETFROMCONFIGMANDATORY(Int, aSection, KDelay(),delay,_L("Error in getting parameter %S from INI file"),dataOk);
TInt nRect = 0;
if (!GetIntFromConfig(aSection, KNumRect(), nRect))
{
ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KNumRect());
SetBlockResult(EFail);
dataOk = EFalse;
}
if(dataOk)
{
iDMode=CGraphicsContext::TDrawMode(drawMode);
TInt byteSize = ByteSize() / iSize.iHeight;
TInt wordSize = (byteSize + 3) / 4;
TUint32* writeBuffer = new (ELeave)TUint32[wordSize];
TRect rect = iTestRect[nRect];
TInt nBackColor = 0;
TInt nColor = 4;
if (rect.Width() > KRectWidth)
{
rect.iBr.iX = rect.iTl.iX + KRectWidth;
}
if (rect.Width() < 1)
{
rect.iBr.iX = rect.iTl.iX + 1;
}
TRgb b = TestBackground[nBackColor];
Clear(b);
TRgb c = TestColor[nColor];
//NOTE Call Command within script: SetShadowmode
FillBuffer((TUint8*)writeBuffer,byteSize,iDispMode);
iDrawDevice->WriteBinary(rect.iTl.iX,rect.iTl.iY,writeBuffer,rect.Width(),rect.Height(),c,iDMode);
User::After(delay);
delete [] writeBuffer;
writeBuffer = NULL;
}
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::DoCmdWriteBinaryL"));
}
/**
* Clears screen with specified color
*/
void CT_CFbsDrawDeviceData::Clear(TRgb aColor)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::Clear"));
iDrawDevice->SetShadowMode(CFbsDrawDevice::ENoShadow);
iDrawDevice->WriteRgbMulti(0,0,iSize.iWidth,iSize.iHeight,aColor,CGraphicsContext::EDrawModeWriteAlpha);
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::Clear"));
}
/**
* Sets Shadow and fading modes
* @param one of the supported shadow modes ENoShadow,EShadow,EFade,EShadowFade
* @param a black point
* @param a white point
*/
void CT_CFbsDrawDeviceData::SetShadowAndFadingMode(TInt shadowMode,TInt blackPoint, TInt whitePoint)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::SetShadowAndFadingMode"));
iDrawDevice->SetFadingParameters(blackPoint,whitePoint);
iDrawDevice->SetShadowMode(CFbsDrawDevice::TShadowMode(shadowMode));
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::SetShadowAndFadingMode"));
}
/**
* Fills a buffer to be displayed on screen
*
* @param aBuffer
* @param aByteSize
* @param aDispMode
*/
void CT_CFbsDrawDeviceData::FillBuffer(TUint8* aBuffer,TInt aByteSize,TDisplayMode aDispMode)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::FillBuffer"));
TUint8* bufferLimit = aBuffer + aByteSize;
TInt64 seed = TInt64(TInt(aBuffer) * aByteSize * aDispMode * User::TickCount());
if (aDispMode != EColor4K)
{
while (aBuffer < bufferLimit)
{
*aBuffer++ = (TUint8)Math::Rand(seed);
}
}
else
{
while (aBuffer < bufferLimit)
{
if (TInt(aBuffer) & 3 == 3)
{
*aBuffer++ = 0;
}
else
{
*aBuffer++ = (TUint8)Math::Rand(seed);
}
}
}
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::FillBuffer"));
}
/**
* Sets the Byte Size based on screen Width and Height
*/
TInt CT_CFbsDrawDeviceData::ByteSize()
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::ByteSize"));
TInt wordSize = iSize.iWidth;
switch (iDispMode)
{
case EGray2:
wordSize = (wordSize + 31) / 32;
break;
case EGray4:
wordSize = (wordSize + 15) / 16;
break;
case EGray16:
case EColor16:
wordSize = (wordSize + 7) / 8;
break;
case EGray256:
case EColor256:
wordSize = (wordSize + 3) / 4;
break;
case EColor4K:
case EColor64K:
wordSize = (wordSize + 1) / 2;
break;
case EColor16M:
wordSize = (((wordSize * 3) + 11) / 12) * 3;
break;
case EColor16MU:
case EColor16MA:
//Should not be changed!
break;
default:
break;
};
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::ByteSize"));
return wordSize * iSize.iHeight * 4;
}
/**
* This method reads a string with this form: (a,,b,c,d) and splits it in an TInt array.
*
*/
void CT_CFbsDrawDeviceData::ReadRectL(HBufC& aString, RArray<TInt>& aResult)
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::ReadRectL"));
TChar chr;
TLex lex(aString);
TBuf<256> buf;
lex.Inc();
while(!lex.Eos())
{
chr = lex.Get();
// Check if there was a list separator
if (chr == ',')
{
HBufC* param = buf.AllocLC();
buf.Zero();
TInt x = 0;
TLex lexX(*param);
lexX.Val(x);
aResult.Append(x);
CleanupStack::Pop(param); // pointer to buf is stored in RPointerArray
}
// If not separator character we can store the character into array
else
{
if (chr != ')')
{
buf.Append(chr);
}
}
}
HBufC* param = buf.AllocLC();
TInt x = 0;
TLex lexX(*param);
lexX.Val(x);
aResult.Append(x);
CleanupStack::PopAndDestroy(param);
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::ReadRectL"));
}
/**
* This method reads a string with this form: (a,,b,c,d) and splits it in an TInt array.
*
*/
TBool CT_CFbsDrawDeviceData::InitRectangles()
{
INFO_PRINTF1(_L("*START* CT_CFbsDrawDeviceData::InitRectangles"));
TBool readResult = ETrue;
RPointerArray<HBufC> dimensions;
RArray<TInt> result;
TInt err = KErrNone;
if ( GetArrayRectFromConfig( KRectangleSection(), KRectangles(), dimensions))//its validated by the above call
{
for (TInt i = 0; i < iNumTestRects; i++)
{
TRAP(err , ReadRectL(*dimensions[i], result));
if (err != KErrNone)
{
readResult = EFalse;
break;
}
else
{
iTestRect.Append(TRect(result[0],result[1],result[2],result[3]));
result.Reset();
}
}
}
else
{
readResult = EFalse;
}
dimensions.ResetAndDestroy();
result.Reset();
result.Close();
INFO_PRINTF1(_L("*END* CT_CFbsDrawDeviceData::InitRectangles"));
return readResult;
}