diff options
| author | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-01-01 11:40:09 +0000 |
|---|---|---|
| committer | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-01-01 11:40:09 +0000 |
| commit | 7ed83b6c6666eb8b6b104c211ae7e52907350372 (patch) | |
| tree | 4430b556abac0ad660a0aacf1887d77f85d8be02 /scribus/units.cpp | |
| download | scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.gz scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.xz scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.zip | |
Branch 1.3.5 tree to 1.4.x tree, goodbye 1.3.x
git-svn-id: svn://scribus.net/branches/Version14x/Scribus@17163 11d20701-8431-0410-a711-e3c959e3b870
Diffstat (limited to 'scribus/units.cpp')
| -rw-r--r-- | scribus/units.cpp | 422 |
1 files changed, 422 insertions, 0 deletions
diff --git a/scribus/units.cpp b/scribus/units.cpp new file mode 100644 index 0000000..b7b4ff1 --- /dev/null +++ b/scribus/units.cpp @@ -0,0 +1,422 @@ +/* +For general Scribus (>=1.3.2) copyright and licensing information please refer +to the COPYING file provided with the program. Following this notice may exist +a copyright and/or license notice that predates the release of Scribus 1.3.2 +for which a new license (GPL+exception) is in place. +*/ +/*************************************************************************** + begin : Jan 2005 + copyright : (C) 2005 by Craig Bradney + email : cbradney@zip.com.au + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include <cmath> +#include <QDebug> +#include <QString> +#include <QObject> +#include "units.h" + +/*! + * @brief Returns the ratio to points for the selected unit of measure. Ratios are for: PT, MM, IN, P, CM, C. DEG and PCT return 1.0 as they will never convert + */ +double unitGetRatioFromIndex(const int index) +{ + //PT, MM, IN, P, CM, C (Cicero) + //NOTE: Calling functions that divide by this value will crash on divide by 0. They shouldnt be getting + // a zero value if they are accessing here with a correct index. + if (index<UNITMIN || index>UNITMAX) + return 0; + // PT, MM, IN, P, CM, C, °, % + double ratio[] = { 1.0, 25.4/72.0, 1.0/72.0, 1.0, 2.54/72.0, 25.4/72.0/4.512, 1.0, 1.0 }; +// double ratio[] = { 1.0, 25.4/72.0, 1.0/72.0, 1.0/12.0, 2.54/72.0, 25.4/72.0/4.512, 1.0, 1.0 }; + return ratio[index]; +} + +int SCRIBUS_API unitGetBaseFromIndex(const int index) +{ + if (index==SC_P) + return 12; + return 10; +} + +/*! + * @brief Strip the text from a value and return the double value for the unit + */ +double unitValueFromString(const QString& value) +{ + QString lowerValue = value.toLower(); + QString dbl = "0.0"; + if (lowerValue.indexOf("pt") != -1) + { + dbl = lowerValue.remove("pt"); + } + else if (lowerValue.indexOf("mm") != -1) + { + dbl = lowerValue.remove("mm"); + } + else if (lowerValue.indexOf("in") != -1) + { + dbl = lowerValue.remove("in"); + } + else if (lowerValue.indexOf("p") != -1) + { + dbl = lowerValue.remove("p"); + } + else if (lowerValue.indexOf("cm") != -1) + { + dbl = lowerValue.remove("cm"); + } + else if (lowerValue.indexOf("°") != -1) + { + dbl = lowerValue.remove("°"); + } + else if (lowerValue.indexOf("%") != -1) + { + dbl = lowerValue.remove("%"); + } + else + dbl = "0.0"; + + dbl = dbl.trimmed(); + return dbl.toDouble(); +} + +/*! + * @brief Strip the text from a value and return the Unit index for the value + */ +scUnit unitIndexFromString(const QString& value) +{ + QString lowerValue = value.toLower(); + scUnit retVal; + if (lowerValue.indexOf("pt") != -1) + { + retVal=SC_PT; + } + else if (lowerValue.indexOf("mm") != -1) + { + retVal=SC_MM; + } + else if (lowerValue.indexOf("in") != -1) + { + retVal=SC_IN; + } + else if (lowerValue.indexOf("p") != -1) + { + retVal=SC_P; + } + else if (lowerValue.indexOf("cm") != -1) + { + retVal=SC_CM; + } + else if (lowerValue.indexOf("c") != -1) + { + retVal=SC_C; + } + else if (lowerValue.indexOf("°") != -1) + { + retVal=SC_DEGREES; + } + else if (lowerValue.indexOf("%") != -1) + { + retVal=SC_PERCENT; + } + else + retVal=SC_PT; + return retVal; +} + +/*! + * @brief Returns the suffix used in GUI widgets + */ +const QString unitGetSuffixFromIndex(const int index) +{ + if (index==SC_P) + { + return ""; + } + return QString(" %1").arg(unitGetStrFromIndex(index)); +} + +/*! + * @brief Returns a general suffix for each of the units + */ +const QString unitGetStrFromIndex(const int index) +{ + if (index<UNITMIN || index>UNITMAX) + return ""; + QString suffix[] = { + QObject::tr("pt"), + QObject::tr("mm"), + QObject::tr("in"), + QObject::tr("p"), + QObject::tr("cm"), + QObject::tr("c"), + QObject::tr("\xB0", "degrees, unicode 0xB0"), //degree + QObject::tr("%") + }; + return suffix[index]; +} + +/*! + * @brief Returns a general untranslated suffix for each of the units + */ +const QString unitGetUntranslatedStrFromIndex(const int index) +{ + if (index<UNITMIN || index>UNITMAX) + return ""; + QString suffix[] = { "pt", "mm", "in", "p", "cm", "c", "\xB0", "%" }; + return suffix[index]; +} +/*! + * @brief Returns the decimals for the units + */ +int unitGetDecimalsFromIndex(const int index) +{ + if (index<UNITMIN || index>UNITMAX) + return 0; + // PT, MM, IN, P, CM, C, °, % + int decimalPoints[] = {100, 1000, 10000, 100, 10000, 10000, 100, 100}; + return decimalPoints[index]; +} + +/*! + * @brief Returns the precision for the units + */ +int unitGetPrecisionFromIndex(const int index) +{ + if (index<UNITMIN || index>UNITMAX) + return 0; + // PT,MM,IN, P,CM, C, °, % + int precision[] = {2, 3, 4, 2, 4, 4, 2, 2}; + return precision[index]; +} + +/*! + * @brief Returns a QStringList of the units for use in QComboBoxes etc + */ +const QStringList unitGetTextUnitList() +{ + QStringList suffixList; + suffixList.append( QObject::tr( "Points (pt)" ) ); + suffixList.append( QObject::tr( "Millimeters (mm)" ) ); + suffixList.append( QObject::tr( "Inches (in)" ) ); + suffixList.append( QObject::tr( "Picas (p)" ) ); + suffixList.append( QObject::tr( "Centimeters (cm)" ) ); + suffixList.append( QObject::tr( "Cicero (c)" ) ); + //Here for completeness, dont use! + //suffixList.append( QObject::tr( "°" ) ); + //suffixList.append( QObject::tr( "%" ) ); + return QStringList(suffixList); +} + +/*! + * @brief Returns the maximum index of the units we have now + */ +int unitGetMaxIndex() +{ + return UNITMAX; +} + +/*! + * @brief Returns the pts value from the mm value supplied + */ +double mm2pts(double mm) +{ + return mm / unitGetRatioFromIndex(SC_MM); +} + +/*! + * @brief Returns the pts value from the in value supplied + */ +double in2pts(double in) +{ + return in / unitGetRatioFromIndex(SC_IN); +} + +/*! + * @brief Returns the pts value from the pica value supplied + */ +double p2pts(double p) +{ + return p / unitGetRatioFromIndex(SC_P); +} + +/*! + * @brief Returns the pts value from the cm value supplied + */ +double cm2pts(double cm) +{ + return cm / unitGetRatioFromIndex(SC_CM); +} + +/*! + * @brief Returns the pts value from the cm value supplied + */ +double c2pts(double c) +{ + return c / unitGetRatioFromIndex(SC_C); +} + +/*! + * @brief Returns the mm value from the pt value supplied + */ +double pts2mm(double pts) +{ + return pts * unitGetRatioFromIndex(SC_MM); +} + +/*! + * @brief Returns the in value from the pt value supplied + */ +double pts2in(double pts) +{ + return pts * unitGetRatioFromIndex(SC_IN); +} + +/*! + * @brief Returns the pica value from the pt value supplied + */ +double pts2p(double pts) +{ + return pts * unitGetRatioFromIndex(SC_P); +} + +/*! + * @brief Returns the cm value from the pt value supplied + */ +double pts2cm(double pts) +{ + return pts * unitGetRatioFromIndex(SC_CM); +} + +/*! + * @brief Returns the c value from the pt value supplied + */ +double pts2c(double pts) +{ + return pts * unitGetRatioFromIndex(SC_C); +} + +/*! + * @brief Returns the value from the pt value supplied based on unit index + */ +double pts2value(double unitValue, int unit) +{ + double ret = 0.0; + switch (unit) + { + case 0: + case 3: + case 6: + case 7: + ret = unitValue; //dont multiply by 1 + break; + default: + ret = unitValue * unitGetRatioFromIndex(unit); + break; + } + return ret; +} + +/*! + * @brief Returns the pt value from the value supplied based on unit index + */ +double value2pts(double unitValue, int unit) +{ + double ret = 0.0; + switch (unit) + { + case 0: + case 3: + case 6: + case 7: + ret = unitValue; // dont divide by 1 + break; + default: + ret = unitValue / unitGetRatioFromIndex(unit); + break; + } + return ret; +} + +/*! + * @brief Returns the secondary unit value from the value supplied based on primary unit + */ +double value2value(double unitValue, int primaryUnit, int secondaryUnit) +{ + if (primaryUnit==secondaryUnit) + return unitValue; + + double pts = 0.0, ret = 0.0; + //Can make this not convert to points at a later stage, for now, the function exists and works. + pts= primaryUnit==0 ? unitValue : unitValue / unitGetRatioFromIndex(primaryUnit); + ret= secondaryUnit==0 ? pts : pts * unitGetRatioFromIndex(secondaryUnit); + return ret; +} + +QString value2String(double unitValue, int unitIndex, bool round2Precision, bool appendSuffix) +{ + QString s; + if (unitIndex==SC_PICAS) + { + int a=(static_cast<int>(unitValue))/12; + double b=fabs(fmod(unitValue, 12)); + QString prefix((a==0 && unitValue < 0.0) ? "-" : ""); + if (round2Precision) + s=QString("%1%2%3%4").arg(prefix).arg(a).arg(unitGetStrFromIndex(unitIndex)).arg(QString::number(b, 'f', unitGetPrecisionFromIndex(unitIndex))); + else + s=QString("%1%2%3%4").arg(prefix).arg(a).arg(unitGetStrFromIndex(unitIndex)).arg(b); + } + else + { + if (round2Precision) + s=QString::number(pts2value(unitValue, unitIndex), 'f', unitGetPrecisionFromIndex(unitIndex)); + else + s=QString::number(pts2value(unitValue, unitIndex)); + if (appendSuffix) + s += " "+unitGetStrFromIndex(unitIndex); + } + return s; +} + +/*! + * @brief Sets up iteration value 1 for vruler, hruler and tabruler + */ +double unitRulerGetIter1FromIndex(const int index) +{ + if (!unitValidForDocUnit(index)) + return 0; + // PT, MM, IN, P, CM, C °, % + double iter[] = {10.0, 720.0/25.4, 18.0, 12.0, 72.0/25.4, 72.0/25.4*4.512, 10.0, 10.0}; + return iter[index]; +} + +/*! + * @brief Sets up iteration value 2 for vruler, hruler and tabruler + */ +double unitRulerGetIter2FromIndex(const int index) +{ + if (!unitValidForDocUnit(index)) + return 0; + // PT, MM, IN, P, CM, C, °, % + double iter[] = {100.0, 7200.0/25.4, 72.0, 120.0, 720.0/25.4, 720.0/25.4*4.512, 100.0, 100.0}; + return iter[index]; +} + +bool unitValidForDocUnit(const int index) +{ + if (index<UNITMIN || index>UNITMAX) + return false; + if (index==6 || index==7) + return false; + return true; +} |
