diff -r e8c1ea2c6496 -r 8758140453c0 graphics/gdi/src/T_DataBitmapDevice.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graphics/gdi/src/T_DataBitmapDevice.cpp Thu Jan 21 12:53:44 2010 +0000 @@ -0,0 +1,641 @@ +/* +* 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 the License "Symbian Foundation License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +/** +@test +@internalComponent + +This contains CT_DataGraphicsDevice +*/ + +#include "T_DataBitmapDevice.h" +#include "T_GraphicsUtil.h" + +/*@{*/ +/// Commands +_LIT(KCmdAddFile, "AddFile"); +_LIT(KCmdCreateBitmapContext, "CreateBitmapContext"); +_LIT(KCmdFontHeightInPixels, "FontHeightInPixels"); +_LIT(KCmdGetNearestFontInPixels, "GetNearestFontInPixels"); +_LIT(KCmdGetNearestFontToDesignHeightInPixels, "GetNearestFontToDesignHeightInPixels"); +_LIT(KCmdGetNearestFontToMaxHeightInPixels, "GetNearestFontToMaxHeightInPixels"); +_LIT(KCmdGetPixel, "GetPixel"); +_LIT(KCmdGetScanLine, "GetScanLine"); +_LIT(KCmdRemoveFile, "RemoveFile"); + +/// Fields +_LIT(KFldBitmapContext, "bitmap_context"); +_LIT(KFldBuffLength, "buff_length"); +_LIT(KFldCheckScanLine, "checkScanLine"); +_LIT(KFldScanLineBufferLength, "scanLineBufferLength"); +_LIT(KFldDisplayMode, "displaymode"); +_LIT(KFldExpected, "expected"); +_LIT(KFldFile, "file"); +_LIT(KFldFont, "font"); +_LIT(KFldHeightIndex, "height_index"); +_LIT(KFldId, "id"); +_LIT(KFldLength, "length"); +_LIT(KFldMaxHeight, "maxheight"); +_LIT(KFldPoint, "point"); +_LIT(KFldSize, "size"); +_LIT(KFldTypefaceIndex, "typeface_index"); +_LIT(KFldPointNum, "checkPointNum"); +_LIT(KFldPointXN, "point%d_x"); +_LIT(KFldPointRGBN, "expected_point%d"); +_LIT(KFldScanlineY, "scanline_y"); + +/// Logging +_LIT(KLogColor, "Color Red=%d Green=%d Blue=%d Alpha=%d"); +_LIT(KLogError, "Error=%d"); +_LIT(KLogHeight, "Height=%d"); +_LIT(KLogMissingFilename, "File '%S' not found in array"); +_LIT(KLogMissingParameter, "Missing parameter '%S'"); +_LIT(KLogMissingWrapper, "Missing wrapper for '%S'"); +_LIT(KLogNotExpectedValue, "Not expected value"); +_LIT(KLogDoNotCheckScanLine, "Will not check scanline."); +_LIT(KLogDoCheckScanLine, "Will check scanline is correct."); +_LIT(KLogCheckScanLineResult, "ScanLine checked, expected length is %d, actual length is %d."); +_LIT(KLogColorExpected, "Expected Color Red=%d Green=%d Blue=%d Alpha=%d"); +_LIT(KLogColorActual, "Actual Color Red=%d Green=%d Blue=%d Alpha=%d"); +_LIT(KLogPoint, "Point X=%d Y=%d"); +/*@}*/ + + +/** +* Constructor. First phase construction +*/ +CT_DataBitmapDevice::CT_DataBitmapDevice() +: CT_DataGraphicsDevice() + { + } + +CT_DataBitmapDevice::~CT_DataBitmapDevice() + { + iFile.Reset(); + iFile.Close(); + iId.Reset(); + iId.Close(); + } + +/** +* Process a command read from the ini file +* +* @param aDataWrapper test step requiring command to be processed +* @param aCommand the command to process +* @param aSection the entry in the ini file requiring the command to be processed +* +* @return ETrue if the command is processed +*/ +TBool CT_DataBitmapDevice::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex) + { + TBool ret=ETrue; + if ( aCommand==KCmdAddFile ) + { + DoCmdAddFileL(aSection); + } + else if ( aCommand==KCmdCreateBitmapContext ) + { + DoCmdCreateBitmapContextL(aSection); + } + else if ( aCommand==KCmdFontHeightInPixels ) + { + DoCmdFontHeightInPixels(aSection); + } + else if ( aCommand==KCmdGetNearestFontInPixels ) + { + DoCmdGetNearestFontInPixelsL(aSection); + } + else if ( aCommand==KCmdGetNearestFontToDesignHeightInPixels ) + { + DoCmdGetNearestFontToDesignHeightInPixelsL(aSection); + } + else if ( aCommand==KCmdGetNearestFontToMaxHeightInPixels ) + { + DoCmdGetNearestFontToMaxHeightInPixelsL(aSection); + } + else if ( aCommand==KCmdGetPixel ) + { + DoCmdGetPixel(aSection); + } + else if ( aCommand==KCmdGetScanLine ) + { + DoCmdGetScanLineL(aSection); + } + else if ( aCommand==KCmdRemoveFile ) + { + DoCmdRemoveFile(aSection); + } + else + { + ret=CT_DataGraphicsDevice::DoCommandL(aCommand, aSection, aAsyncErrorIndex); + } + + /* Another work package will implement this */ + return ret; + } + +void CT_DataBitmapDevice::DoCmdAddFileL(const TDesC& aSection) + { + // get typeface index from parameters + TPtrC file; + if ( !GetStringFromConfig(aSection, KFldFile(), file) ) + { + ERR_PRINTF2(KLogMissingParameter, &KFldFile()); + SetBlockResult(EFail); + } + else + { + TInt id; + INFO_PRINTF1(_L("execute AddFile(const TDesC&, TInt&)")); + TInt err=GetBitmapDevice()->AddFile(file, id); + if ( err!=KErrNone ) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + } + else + { + // Append filename and id + iFile.AppendL(file); + iId.AppendL(id); + } + } + } + +void CT_DataBitmapDevice::DoCmdCreateBitmapContextL(const TDesC& aSection) + { + TPtrC wrapperName; + if ( !GetStringFromConfig(aSection, KFldBitmapContext, wrapperName) ) + { + ERR_PRINTF2(KLogMissingParameter, &KFldBitmapContext()); + SetBlockResult(EFail); + } + else + { + CDataWrapper* wrapper=GetDataWrapperL(wrapperName); + if ( wrapper==NULL ) + { + ERR_PRINTF2(KLogMissingWrapper, &wrapperName); + SetBlockResult(EFail); + } + else + { + CBitmapContext* bitmapContext=NULL; + INFO_PRINTF1(_L("execute CreateBitmapContext(CBitmapContext*&)")); + TInt err=GetBitmapDevice()->CreateBitmapContext(bitmapContext); + if ( err!=KErrNone ) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + } + else + { + wrapper->SetObjectL(bitmapContext); + } + } + } + } + +void CT_DataBitmapDevice::DoCmdFontHeightInPixels(const TDesC& aSection) + { + TBool dataOk=ETrue; + + // get typeface index from parameters + TInt typefaceIndex; + if ( !GetIntFromConfig(aSection, KFldTypefaceIndex(), typefaceIndex) ) + { + dataOk=EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldTypefaceIndex()); + SetBlockResult(EFail); + } + + // get height index from parameters + TInt heightIndex; + if ( !GetIntFromConfig(aSection, KFldHeightIndex(), heightIndex) ) + { + dataOk=EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldHeightIndex()); + SetBlockResult(EFail); + } + + if ( dataOk ) + { + INFO_PRINTF1(_L("execute FontHeightInPixels(TInt, TInt)")); + TInt height=GetBitmapDevice()->FontHeightInPixels(typefaceIndex, heightIndex); + INFO_PRINTF2(KLogHeight, height); + + TInt expected; + if ( GetIntFromConfig(aSection, KFldExpected, expected) ) + { + if ( expected!=height ) + { + ERR_PRINTF1(KLogNotExpectedValue); + SetBlockResult(EFail); + } + } + } + } + +void CT_DataBitmapDevice::DoCmdGetNearestFontInPixelsL(const TDesC& aSection) + { + TBool dataOk=ETrue; + + TFontSpec fontSpec; + if ( !GetFontSpecFromConfig(aSection, KFldFont, fontSpec) ) + { + dataOk=EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldFont()); + SetBlockResult(EFail); + } + + TPtrC wrapperName; + if ( !GetStringFromConfig(aSection, KFldFont, wrapperName) ) + { + dataOk=EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldFont()); + SetBlockResult(EFail); + } + + if ( dataOk ) + { + CDataWrapper* wrapper=GetDataWrapperL(wrapperName); + if ( wrapper==NULL ) + { + ERR_PRINTF2(KLogMissingWrapper, &wrapperName); + SetBlockResult(EFail); + } + else + { + CFont* font=NULL; + INFO_PRINTF1(_L("execute GetNearestFontInPixels(CFont*&, TFontSpec)")); + TInt err=GetBitmapDevice()->GetNearestFontInPixels(font, fontSpec); + if ( err!=KErrNone ) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + } + else + { + wrapper->SetObjectL(font); + } + } + } + } + +void CT_DataBitmapDevice::DoCmdGetNearestFontToDesignHeightInPixelsL(const TDesC& aSection) + { + TBool dataOk=ETrue; + + TFontSpec fontSpec; + if ( !GetFontSpecFromConfig(aSection, KFldFont, fontSpec) ) + { + dataOk=EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldFont()); + SetBlockResult(EFail); + } + + TPtrC wrapperName; + // get BitmapUtilData object from parameters + if ( !GetStringFromConfig(aSection, KFldFont, wrapperName) ) + { + dataOk=EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldFont()); + SetBlockResult(EFail); + } + + if ( dataOk ) + { + CDataWrapper* wrapper=GetDataWrapperL(wrapperName); + if ( wrapper==NULL ) + { + ERR_PRINTF2(KLogMissingWrapper, &wrapperName); + SetBlockResult(EFail); + } + else + { + CFont* font=NULL; + INFO_PRINTF1(_L("execute GetNearestFontToDesignHeightInPixels(CFont*&, TFontSpec)")); + TInt err=GetBitmapDevice()->GetNearestFontToDesignHeightInPixels(font, fontSpec); + if ( err!=KErrNone ) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + } + else + { + wrapper->SetObjectL(font); + } + } + } + } + +void CT_DataBitmapDevice::DoCmdGetNearestFontToMaxHeightInPixelsL(const TDesC& aSection) + { + TBool dataOk=ETrue; + + TFontSpec fontSpec; + if ( !GetFontSpecFromConfig(aSection, KFldFont, fontSpec) ) + { + dataOk=EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldFont()); + SetBlockResult(EFail); + } + + TInt maxHeight; + if ( !GetIntFromConfig(aSection, KFldMaxHeight, maxHeight) ) + { + dataOk=EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldMaxHeight()); + SetBlockResult(EFail); + } + + TPtrC wrapperName; + // get BitmapUtilData object from parameters + if ( !GetStringFromConfig(aSection, KFldFont, wrapperName) ) + { + dataOk=EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldFont()); + SetBlockResult(EFail); + } + + if ( dataOk ) + { + CDataWrapper* wrapper=GetDataWrapperL(wrapperName); + if ( wrapper==NULL ) + { + ERR_PRINTF2(KLogMissingWrapper, &wrapperName); + SetBlockResult(EFail); + } + else + { + CFont* font=NULL; + INFO_PRINTF1(_L("execute GetNearestFontToMaxHeightInPixels(CFont*&, TFontSpec, TInt)")); + TInt err=GetBitmapDevice()->GetNearestFontToMaxHeightInPixels(font, fontSpec, maxHeight); + if ( err!=KErrNone ) + { + ERR_PRINTF2(KLogError, err); + SetError(err); + } + else + { + wrapper->SetObjectL(font); + } + } + } + } + +void CT_DataBitmapDevice::DoCmdGetPixel(const TDesC& aSection) + { + // get typeface index from parameters + TPoint point; + if ( !GetPointFromConfig(aSection, KFldPoint(), point) ) + { + ERR_PRINTF2(KLogMissingParameter, &KFldPoint()); + SetBlockResult(EFail); + } + else + { + TRgb color; + INFO_PRINTF1(_L("execute GetPixel(TRgb&, const TPoint&)")); + GetBitmapDevice()->GetPixel(color, point); + INFO_PRINTF5(KLogColor, color.Red(), color.Green(), color.Blue(), color.Alpha()); + + TRgb expected; + if ( GetRgbFromConfig(aSection, KFldExpected, expected) ) + { + if ( expected!=color ) + { + ERR_PRINTF1(KLogNotExpectedValue); + SetBlockResult(EFail); + } + } + } + } + +void CT_DataBitmapDevice::DoCmdGetScanLineL(const TDesC& aSection) + { + TBool dataOk=ETrue; + + // get point x coordinate from parameters + TPoint point; + if ( !GetPointFromConfig(aSection, KFldPoint(), point) ) + { + dataOk=EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldPoint()); + SetBlockResult(EFail); + } + + // get length from parameters + TInt length = 0; + if ( !GetIntFromConfig(aSection, KFldLength(), length) ) + { + dataOk=EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldLength()); + SetBlockResult(EFail); + } + + // get buffer length from parameters + TInt buffLength = 0; + if ( !GetIntFromConfig(aSection, KFldBuffLength(), buffLength) ) + { + dataOk=EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldBuffLength()); + SetBlockResult(EFail); + } + + // get display mode from parameters + TDisplayMode displayMode; + if ( !CT_GraphicsUtil::ReadDisplayMode(*this, aSection, KFldDisplayMode(), displayMode) ) + { + ERR_PRINTF2(KLogMissingParameter, &KFldDisplayMode()); + SetBlockResult(EFail); + dataOk=EFalse; + } + + if ( dataOk ) + { + // call GetScanLine() + TUint8* buffer = new (ELeave) TUint8[buffLength]; + TPtr8 scanline(buffer, buffLength, buffLength); + + INFO_PRINTF1(_L("execute GetScanLine(TDes8&, const TPoint&, TInt, TDisplayMode)")); + GetBitmapDevice()->GetScanLine(scanline, point, length, displayMode); + + // Check ScanLine. + TBool checkScanLine = EFalse; + if ( !GetBoolFromConfig(aSection, KFldCheckScanLine(), checkScanLine) ) + { + INFO_PRINTF1(KLogDoNotCheckScanLine); + } + else + { + if(!checkScanLine) + { + INFO_PRINTF1(KLogDoNotCheckScanLine); + } + else + { + INFO_PRINTF1(KLogDoCheckScanLine); + + // get length of returned scanline + TInt expectedscanLineBufferLength = 0; + if ( GetIntFromConfig(aSection, KFldScanLineBufferLength, expectedscanLineBufferLength) ) + { + TInt scanlineLen = scanline.Length(); + INFO_PRINTF3(KLogCheckScanLineResult,expectedscanLineBufferLength,scanlineLen); + if(expectedscanLineBufferLength != scanlineLen) + { + ERR_PRINTF3(KLogCheckScanLineResult,expectedscanLineBufferLength,scanlineLen); + SetBlockResult(EFail); + } + } + else + { + //check the scanline got correctlly. + CheckScanLine(aSection,scanline); + } + + } + } + delete [] buffer; + } + } + +void CT_DataBitmapDevice::DoCmdRemoveFile(const TDesC& aSection) + { + TBool dataOk = ETrue; + TInt id; + if ( !GetIntFromConfig(aSection, KFldId(), id) ) + { + TPtrC file; + if ( !GetStringFromConfig(aSection, KFldFile(), file) ) + { + dataOk=EFalse; + ERR_PRINTF2(KLogMissingParameter, &KFldId()); + ERR_PRINTF2(KLogMissingParameter, &KFldFile()); + SetBlockResult(EFail); + } + else + { + TBool found=EFalse; // Filename found in array + for ( TInt index=iFile.Count(); (index>0) && (!found); ) + { + if ( iFile[--index]==file ) + { + id=iId[index]; + iFile.Remove(index); + iId.Remove(index); + found=ETrue; + } + } + if ( !found ) + { + dataOk=EFalse; + ERR_PRINTF2(KLogMissingFilename, &file); + SetBlockResult(EFail); + } + } + } + + if ( dataOk ) + { + INFO_PRINTF1(_L("execute RemoveFile(TInt)")); + GetBitmapDevice()->RemoveFile(id); + } + } + +void CT_DataBitmapDevice::CheckScanLine(const TDesC& aSection,TDes8 &aBuf) + { + INFO_PRINTF1(KLogDoCheckScanLine); + + TBool appendCheckDataOK = ETrue; + TSize bitmapSize; + if ( !GetSizeFromConfig(aSection, KFldSize, bitmapSize) ) + { + ERR_PRINTF2(KLogMissingParameter, &KFldSize); + SetBlockResult(EFail); + appendCheckDataOK = EFalse; + } + + TDisplayMode displayMode; + if ( !CT_GraphicsUtil::ReadDisplayMode(*this, aSection, KFldDisplayMode(), displayMode) ) + { + ERR_PRINTF1(_L("No display mode")); + SetBlockResult(EFail); + appendCheckDataOK = EFalse; + } + + TInt pointNum; + if ( !GetIntFromConfig(aSection, KFldPointNum(), pointNum) ) + { + ERR_PRINTF1(_L("No check point num")); + SetBlockResult(EFail); + appendCheckDataOK = EFalse; + } + + TInt scanlineY; + if ( !GetIntFromConfig(aSection, KFldScanlineY, scanlineY) ) + { + ERR_PRINTF1(_L("No check scan line Y")); + SetBlockResult(EFail); + appendCheckDataOK = EFalse; + } + + if (appendCheckDataOK) + { + CFbsBitmap* fbsbitmap = new(ELeave) CFbsBitmap(); + fbsbitmap->Create(bitmapSize,displayMode); + fbsbitmap->SetScanLine(aBuf,scanlineY); + + TBuf tempStore; + + for (TInt i=1;i<=pointNum;i++) + { + TInt x; + tempStore.Format(KFldPointXN, i); + if ( !GetIntFromConfig(aSection, tempStore, x) ) + { + ERR_PRINTF2(KLogMissingParameter, &tempStore); + SetBlockResult(EFail); + appendCheckDataOK=EFalse; + } + TRgb expected; + tempStore.Format(KFldPointRGBN, i); + if ( !GetRgbFromConfig(aSection, tempStore, expected) ) + { + ERR_PRINTF2(KLogMissingParameter, &KFldExpected()); + SetBlockResult(EFail); + appendCheckDataOK=EFalse; + } + if(appendCheckDataOK) + { + TRgb actual; + TPoint pixelPoint(x,scanlineY); + fbsbitmap->GetPixel(actual,pixelPoint); + if(actual != expected) + { + ERR_PRINTF3(KLogPoint, x,scanlineY); + ERR_PRINTF5(KLogColorActual, actual.Red(), actual.Green(), actual.Blue(), actual.Alpha()); + ERR_PRINTF5(KLogColorExpected, expected.Red(), expected.Green(), expected.Blue(), expected.Alpha()); + SetBlockResult(EFail); + } + } + } + + delete fbsbitmap; + } + }