File indexing completed on 2024-06-23 04:27:03

0001 /* This file is part of the KDE project
0002  * SPDX-FileCopyrightText: 2007 Jan Hambrecht <jaham@gmx.net>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 
0007 #include "EnhancedPathParameter.h"
0008 #include "EnhancedPathFormula.h"
0009 #include "EnhancedPathShape.h"
0010 #include <KoShapeBackground.h>
0011 #include <KoUnit.h>
0012 #include <math.h>
0013 
0014 QString identifierData[] = {
0015     "",          // IdentifierUnknown
0016     "pi",        // IdentifierPi
0017     "left",      // IdentifierLeft
0018     "top",       // IdentifierTop
0019     "right",     // IdentifierRight
0020     "bottom",    // IdentifierBottom
0021     "xstretch",  // IdentifierXstretch
0022     "ystretch",  // IdentifierYstretch
0023     "hasstroke", // IdentifierHasStroke
0024     "hasfill",   // IdentifierHasFill
0025     "width",     // IdentifierWidth
0026     "height",    // IdentifierHeight
0027     "logwidth",  // IdentifierLogwidth
0028     "logheight"  // IdentifierLogheight
0029 };
0030 
0031 EnhancedPathParameter::EnhancedPathParameter(EnhancedPathShape *parent)
0032     : m_parent(parent)
0033 {
0034     Q_ASSERT(m_parent);
0035 }
0036 
0037 EnhancedPathParameter::~EnhancedPathParameter()
0038 {
0039 }
0040 
0041 EnhancedPathShape *EnhancedPathParameter::parent()
0042 {
0043     return m_parent;
0044 }
0045 
0046 qreal EnhancedPathParameter::evaluate()
0047 {
0048     return 0.0;
0049 }
0050 
0051 void EnhancedPathParameter::modify(qreal value)
0052 {
0053     Q_UNUSED(value);
0054 }
0055 
0056 EnhancedPathConstantParameter::EnhancedPathConstantParameter(qreal value, EnhancedPathShape *parent)
0057     : EnhancedPathParameter(parent)
0058     , m_value(value)
0059 {
0060 }
0061 
0062 qreal EnhancedPathConstantParameter::evaluate()
0063 {
0064     return m_value;
0065 }
0066 
0067 QString EnhancedPathConstantParameter::toString() const
0068 {
0069     return QString::number(m_value);
0070 }
0071 
0072 EnhancedPathNamedParameter::EnhancedPathNamedParameter(Identifier identifier, EnhancedPathShape *parent)
0073     : EnhancedPathParameter(parent)
0074     , m_identifier(identifier)
0075 {
0076 }
0077 
0078 EnhancedPathNamedParameter::EnhancedPathNamedParameter(const QString &identifier, EnhancedPathShape *parent)
0079     : EnhancedPathParameter(parent)
0080 {
0081     m_identifier = identifierFromString(identifier);
0082 }
0083 
0084 qreal EnhancedPathNamedParameter::evaluate()
0085 {
0086     const QRect &viewBox = parent()->viewBox();
0087 
0088     switch (m_identifier) {
0089     case IdentifierPi:
0090         return M_PI;
0091         break;
0092     case IdentifierLeft:
0093         return viewBox.left();
0094         break;
0095     case IdentifierTop:
0096         return viewBox.top();
0097         break;
0098     case IdentifierRight:
0099         return viewBox.right();
0100         break;
0101     case IdentifierBottom:
0102         return viewBox.bottom();
0103         break;
0104     case IdentifierXstretch:
0105         break;
0106     case IdentifierYstretch:
0107         break;
0108     case IdentifierHasStroke:
0109         return parent()->stroke() ? 1.0 : 0.0;
0110         break;
0111     case IdentifierHasFill:
0112         return parent()->background() ? 0.0 : 1.0;
0113         break;
0114     case IdentifierWidth:
0115         return viewBox.width();
0116         break;
0117     case IdentifierHeight:
0118         return viewBox.height();
0119         break;
0120     case IdentifierLogwidth:
0121         // TODO: ? viewBox does not have any unit or const relation to mm
0122         return KoUnit(KoUnit::Millimeter).toUserValue(viewBox.width()) * 100;
0123         break;
0124     case IdentifierLogheight:
0125         // TODO: ? viewBox does not have any unit or const relation to mm
0126         return KoUnit(KoUnit::Millimeter).toUserValue(viewBox.height()) * 100;
0127         break;
0128     default:
0129         break;
0130     }
0131     return 0.0;
0132 }
0133 
0134 Identifier EnhancedPathNamedParameter::identifierFromString(const QString &text)
0135 {
0136     if (text.isEmpty()) {
0137         return IdentifierUnknown;
0138     } else if (text == "pi") {
0139         return IdentifierPi;
0140     } else if (text == "left") {
0141         return IdentifierLeft;
0142     } else if (text == "top") {
0143         return IdentifierTop;
0144     } else if (text == "right") {
0145         return IdentifierRight;
0146     } else if (text == "bottom") {
0147         return IdentifierBottom;
0148     } else if (text == "xstretch") {
0149         return IdentifierXstretch;
0150     } else if (text == "ystretch") {
0151         return IdentifierYstretch;
0152     } else if (text == "hasstroke") {
0153         return IdentifierHasStroke;
0154     } else if (text == "hasfill") {
0155         return IdentifierHasFill;
0156     } else if (text == "width") {
0157         return IdentifierWidth;
0158     } else if (text == "height") {
0159         return IdentifierHeight;
0160     } else if (text == "logwidth") {
0161         return IdentifierLogwidth;
0162     } else if (text == "logheight") {
0163         return IdentifierLogheight;
0164     } else {
0165         return IdentifierUnknown;
0166     }
0167 }
0168 
0169 QString EnhancedPathNamedParameter::toString() const
0170 {
0171     return identifierData[m_identifier];
0172 }
0173 
0174 EnhancedPathReferenceParameter::EnhancedPathReferenceParameter(const QString &reference, EnhancedPathShape *parent)
0175     : EnhancedPathParameter(parent)
0176     , m_reference(reference)
0177 {
0178 }
0179 
0180 qreal EnhancedPathReferenceParameter::evaluate()
0181 {
0182     return parent()->evaluateReference(m_reference);
0183 }
0184 
0185 void EnhancedPathReferenceParameter::modify(qreal value)
0186 {
0187     parent()->modifyReference(m_reference, value);
0188 }
0189 
0190 QString EnhancedPathReferenceParameter::toString() const
0191 {
0192     return m_reference;
0193 }
0194