diff -r 000000000000 -r f58d6ec98e88 aknlayoutcompiler/src/LayScale.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aknlayoutcompiler/src/LayScale.cpp Thu Dec 17 09:14:18 2009 +0200 @@ -0,0 +1,182 @@ +/* +* Copyright (c) 2002-2004 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: +* +*/ + + + +// disable "identifier was truncated to '255' characters in the browser information" warning +#pragma warning (disable:4786) + +#include "LayScale.h" +#include "LayoutParse.h" +#include "LayoutCompilerErr.h" +#include +#include +#include +#include +#include "LayoutWriter.h" + +typedef LayoutProcessArgsErr LayoutScaleArgsErr; + + +int LayoutScale::Process(const vector& args) + { + if (args.size() != 8) + throw LayoutScaleArgsErr(); + + auto_ptr sourceLayout(TLayParseLayout::Parse(args[2])); + int sourceWidth = CdlTkUtil::ParseInt(args[3]); + int sourceHeight = CdlTkUtil::ParseInt(args[4]); + + string destLayout = args[5]; + int destWidth = CdlTkUtil::ParseInt(args[6]); + int destHeight = CdlTkUtil::ParseInt(args[7]); + + LayoutScale scale(*sourceLayout, sourceWidth, sourceHeight, destLayout, destWidth, destHeight); + scale.Run(); + + return 0; + } + +void LayoutScale::ShowHelp(ostream& stream) + { + stream << "LayScale " << endl; + stream << " This performs an arithmetic scaling on all dimensional values in a layout." << endl; + stream << " This will not produce a pixel perfect scaling effect due to rounding errors," << endl; + stream << " however it may be sufficient for prototyping and demonstration purposes." << endl; + } + +LayoutScale::LayoutScale(TLayout& aSourceLayout, int aSourceWidth, int aSourceHeight, const string& aDestLayoutName, int aDestWidth, int aDestHeight) +: iLayout(aSourceLayout), + iSourceWidth(aSourceWidth), + iSourceHeight(aSourceHeight), + iDestLayoutName(aDestLayoutName), + iDestWidth(aDestWidth), + iDestHeight(aDestHeight) + { + } + +void LayoutScale::Run() + { + RescaleLayout(); + WriteLayout(); + } + +const string KHoriz = "lrW"; +const string KVert = "tbBH"; +const string KFont = "Font"; +const string KScaledSuffix = "_Scaled"; + +void LayoutScale::RescaleLayout() + { + for (TLayout::iterator pTab = iLayout.begin(); pTab != iLayout.end(); ++pTab) + { + TLayoutTable& table = **pTab; + for (TLayoutTable::iterator pLine = table.begin(); pLine != table.end(); ++pLine) + { + TLayoutLine& line = **pLine; + for (TLayoutLine::iterator pCell = line.begin(); pCell != line.end(); ++pCell) + { + const string& cellName = pCell->first; + TValues& values = pCell->second; + if ( cellName == KFont) + { + for (TValues::iterator pVal = values.begin(); pVal != values.end(); ++pVal) + { + TagScaledToken(*pVal); + } + } + else + { + TScale dir = EHoriz; + if (KVert.find(cellName) != string::npos) + dir = EVert; + else if (KHoriz.find(cellName) == string::npos) + continue; + + for (TValues::iterator pVal = values.begin(); pVal != values.end(); ++pVal) + { + RescaleValue(*pVal, dir); + } + } + } + } + } + } + +void LayoutScale::RescaleValue(string& aVal, TScale aDir) + { + // find all numbers in this value and rescale them, copy non-numeric text directly. + string result; + string num; + int count = aVal.size(); + for (int pos = 0; pos < count; pos++) + { + char c = aVal[pos]; + if (CdlTkUtil::IsNumeric(c)) + { + num += c; + } + else + { + result += RescaleNum(num, aDir); + num = ""; + result += c; + } + } + result += RescaleNum(num, aDir); + aVal = result; + } + +void LayoutScale::TagScaledToken(string& aToken) + { + string result(aToken); + result += KScaledSuffix; + aToken = result; + } + +string LayoutScale::RescaleNum(string& aNum, TScale aDir) + { + if (aNum.empty()) + return aNum; + + int num = CdlTkUtil::ParseInt(aNum); + if (aDir == EHoriz) + num = Scale(num, iDestWidth, iSourceWidth); + else + num = Scale(num, iDestHeight, iSourceHeight); + return CdlTkUtil::IntToString(num); + } + +void LayoutScale::WriteLayout() + { + TLayoutWriter writer(iLayout, iDestLayoutName); + writer.Write(""); + } + +int LayoutScale::Scale(int aNumber, int aNumerator, int aDenominator) + { + // round to nearest whole number, rounding up on .5 + int num = (aNumber * aNumerator) / aDenominator; // rounded down + int remainder = (aNumber * aNumerator) % aDenominator; // remainder + + if ((remainder*2) >= aDenominator) + num++; // round up if remainder >= half + + return num; + } + +