#include "geometry.h" QMap Geometry::geometryIdNameMap; QMap Geometry::geometryNameIdMap; const Geometry::InitStatics initStatics; Geometry::InitStatics::InitStatics() { Geometry::geometryIdNameMap[Geometry::FormatUnknown] = "unknown"; Geometry::geometryIdNameMap[Geometry::FormatNone] = "none"; Geometry::geometryIdNameMap[Geometry::CenterDimensions] = "center-dimensions"; Geometry::geometryIdNameMap[Geometry::CornerDimensions] = "corner-dimensions"; Geometry::geometryIdNameMap[Geometry::Corners] = "corners"; Geometry::geometryIdNameMap[Geometry::FormatCustom] = "custom"; for (int i = Geometry::FormatNone; i < Geometry::FormatMax; i++) Geometry::geometryNameIdMap[Geometry::geometryIdNameMap[static_cast(i)]] = static_cast(i); } const QString &Geometry::formatName(Geometry::Format id) { if (id < Geometry::FormatNone || id >= Geometry::FormatMax) id = Geometry::FormatUnknown; return geometryIdNameMap[id]; } Geometry::Format Geometry::formatId(const QString &name) { if (geometryNameIdMap.find(name) == geometryNameIdMap.end()) return Geometry::FormatUnknown; else return geometryNameIdMap[name]; } Geometry::Format Geometry::set(QString str) { qDebug()<<"Trying to detect format of "<x[<+|-xoffset><+|-yoffset>]"; if(match.lastCapturedIndex() ==2){ qDebug() << "format is CenterDimensions with center =0,0"; center[0] = 0; center[1] = 0; dimension[0] = match.captured(1).toInt(); dimension[1] = match.captured(2).toInt(); computeCorner0(); computeCorner1(); if (adjustCorners()) { // Order is important here! computeDimensions(); computeCenter(); } format = Geometry::CenterDimensions; } else if(match.lastCapturedIndex() ==4){ qDebug() << "format is CornerDimensions"; corner[0][0] = match.captured(3).toInt(); corner[0][1] = match.captured(4).toInt(); dimension[0] = match.captured(1).toInt(); dimension[1] = match.captured(2).toInt(); computeCenter(); computeCorner1(); if (adjustCorners()) { // Order is important here! computeDimensions(); computeCenter(); } format = Geometry::CornerDimensions; } else format = Geometry::FormatCustom; } else { qDebug()<<"Warning: Could not parse format of string: "< 32767) { corner[j][i] = 32767; adjusted = true; } } } return adjusted; } void Geometry::setCenterDimensions(int cx, int cy, int dx, int dy) { center[0] = cx; center[1] = cy; dimension[0] = dx; dimension[1] = dy; computeCorner0(); computeCorner1(); } void Geometry::setCornerDimensions(int cx, int cy, int dx, int dy) { corner[0][0] = cx; corner[0][1] = cy; dimension[0] = dx; dimension[1] = dy; computeCenter(); computeCorner1(); } void Geometry::setCorners(int c0x, int c0y, int c1x, int c1y) { corner[0][0] = c0x; corner[0][1] = c0y; corner[1][0] = c1x; corner[1][1] = c1y; computeDimensions(); computeCenter(); } QString Geometry::getString(Geometry::Format format) { if(format == FormatKeep) format = this->format; // Use the preferred format switch (format) { case CenterDimensions: if(center[0]==0 && center[1] ==0) return QString("%1x%2") .arg(dimension[0]) .arg(dimension[1]); return QString("%1,%2:%3x%4") .arg(center[0]) .arg(center[1]) .arg(dimension[0]) .arg(dimension[1]); break; case CornerDimensions: return QString("%1,%2+%3+%4") .arg(corner[0][0]) .arg(corner[0][1]) .arg(dimension[0]) .arg(dimension[1]); break; case Corners: default: return QString("%1,%2:%3,%4") .arg(corner[0][0]) .arg(corner[0][1]) .arg(corner[1][0]) .arg(corner[1][1]); break; } } void Geometry::computeCorner0(void) { for (int i = 0; i < 2; i++) { if (dimension[i] < 0) corner[0][i] = center[i] + (-dimension[i]) / 2; else corner[0][i] = center[i] - dimension[i] / 2; } } void Geometry::computeCorner1(void) { for (int i = 0; i < 2; i++) { if (dimension[i] < 0) corner[1][i] = corner[0][i] + dimension[i] + 1; else corner[1][i] = corner[0][i] + dimension[i] - 1; } } void Geometry::computeCenter(void) { for (int i = 0; i < 2; i++) { if (corner[0][i] > corner[1][i]) center[i] = corner[0][i] - (-dimension[i]) / 2; else center[i] = corner[0][i] + dimension[i] / 2; } } void Geometry::computeDimensions(void) { for (int i = 0; i < 2; i++) { if (corner[0][i] > corner[1][i]) dimension[i] = corner[1][i] - corner[0][i] - 1; else dimension[i] = corner[1][i] - corner[0][i] + 1; } }