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 }