File indexing completed on 2025-02-23 04:08:59

0001 /*
0002  *  SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_grid_config.h"
0008 
0009 #include <QDomElement>
0010 
0011 #include "kis_config.h"
0012 #include "kis_dom_utils.h"
0013 #include "kis_algebra_2d.h"
0014 #include <KisStaticInitializer.h>
0015 
0016 KIS_DECLARE_STATIC_INITIALIZER {
0017     qRegisterMetaType<KisGridConfig>("KisGridConfig");
0018 }
0019 
0020 Q_GLOBAL_STATIC(KisGridConfig, staticDefaultObject)
0021 
0022 const KisGridConfig& KisGridConfig::defaultGrid()
0023 {
0024     staticDefaultObject->loadStaticData();
0025     return *staticDefaultObject;
0026 }
0027 
0028 void KisGridConfig::transform(const QTransform &transform)
0029 {
0030     if (transform.type() >= QTransform::TxShear) return;
0031 
0032     KisAlgebra2D::DecomposedMatrix m(transform);
0033 
0034     if (m_gridType == GRID_RECTANGULAR) {
0035         QTransform t = m.scaleTransform();
0036 
0037         const qreal eps = 1e-3;
0038         const qreal wrappedRotation = KisAlgebra2D::wrapValue(m.angle, 90.0);
0039         if (wrappedRotation <= eps || wrappedRotation >= 90.0 - eps) {
0040             t *= m.rotateTransform();
0041         }
0042 
0043         m_spacing = KisAlgebra2D::abs(t.map(m_spacing));
0044 
0045     } else {
0046         if (qFuzzyCompare(m.scaleX, m.scaleY)) {
0047             m_cellSpacing = qRound(qAbs(m_cellSpacing * m.scaleX));
0048         }
0049     }
0050     m_offset = KisAlgebra2D::wrapValue(transform.map(m_offset), m_spacing);
0051 }
0052 
0053 void KisGridConfig::loadStaticData()
0054 {
0055     KisConfig cfg(true);
0056 
0057     m_lineTypeMain = LineTypeInternal(cfg.getGridMainStyle());
0058     m_lineTypeSubdivision = LineTypeInternal(cfg.getGridSubdivisionStyle());
0059 
0060     m_colorMain = cfg.getGridMainColor();
0061     m_colorSubdivision = cfg.getGridSubdivisionColor();
0062 
0063     m_spacing = cfg.getDefaultGridSpacing();
0064 }
0065 
0066 void KisGridConfig::saveStaticData() const
0067 {
0068     KisConfig cfg(false);
0069     cfg.setGridMainStyle(m_lineTypeMain);
0070     cfg.setGridSubdivisionStyle(m_lineTypeSubdivision);
0071     cfg.setGridMainColor(m_colorMain);
0072     cfg.setGridSubdivisionColor(m_colorSubdivision);
0073 }
0074 
0075 QDomElement KisGridConfig::saveDynamicDataToXml(QDomDocument& doc, const QString &tag) const
0076 {
0077     QDomElement gridElement = doc.createElement(tag);
0078     KisDomUtils::saveValue(&gridElement, "showGrid", m_showGrid);
0079     KisDomUtils::saveValue(&gridElement, "snapToGrid", m_snapToGrid);
0080     KisDomUtils::saveValue(&gridElement, "offset", m_offset);
0081     KisDomUtils::saveValue(&gridElement, "spacing", m_spacing);
0082     KisDomUtils::saveValue(&gridElement, "offsetAspectLocked", m_offsetAspectLocked);
0083     KisDomUtils::saveValue(&gridElement, "spacingAspectLocked", m_spacingAspectLocked);
0084     KisDomUtils::saveValue(&gridElement, "subdivision", m_subdivision);
0085     KisDomUtils::saveValue(&gridElement, "angleLeft", m_angleLeft);
0086     KisDomUtils::saveValue(&gridElement, "angleRight", m_angleRight);
0087     KisDomUtils::saveValue(&gridElement, "cellSpacing", m_cellSpacing);
0088     KisDomUtils::saveValue(&gridElement, "gridType", m_gridType);
0089 
0090 
0091     return gridElement;
0092 }
0093 
0094 bool KisGridConfig::loadDynamicDataFromXml(const QDomElement &gridElement)
0095 {
0096     bool result = true;
0097 
0098     result &= KisDomUtils::loadValue(gridElement, "showGrid", &m_showGrid);
0099     result &= KisDomUtils::loadValue(gridElement, "snapToGrid", &m_snapToGrid);
0100     result &= KisDomUtils::loadValue(gridElement, "offset", &m_offset);
0101     result &= KisDomUtils::loadValue(gridElement, "spacing", &m_spacing);
0102     result &= KisDomUtils::loadValue(gridElement, "offsetAspectLocked", &m_offsetAspectLocked);
0103     result &= KisDomUtils::loadValue(gridElement, "spacingAspectLocked", &m_spacingAspectLocked);
0104     result &= KisDomUtils::loadValue(gridElement, "subdivision", &m_subdivision);
0105     result &= KisDomUtils::loadValue(gridElement, "angleLeft", &m_angleLeft);
0106     result &= KisDomUtils::loadValue(gridElement, "angleRight", &m_angleRight);
0107     result &= KisDomUtils::loadValue(gridElement, "cellSpacing", &m_cellSpacing);
0108     result &= KisDomUtils::loadValue(gridElement, "gridType", (int*)(&m_gridType));
0109 
0110     return result;
0111 }