File indexing completed on 2024-05-19 04:25:10
0001 /* 0002 * SPDX-FileCopyrightText: 2023 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 #include "KisSampleRectIterator.h" 0007 0008 #include <kis_algebra_2d.h> 0009 0010 struct KisSampleRectIterator::HaltonSampler : QSharedData { 0011 HaltonSampler() : x(2), y(3) {} 0012 HaltonSampler(const HaltonSampler &rhs) = default; 0013 HaltonSampler(HaltonSampler &&rhs) = default; 0014 0015 void step() { 0016 x.step(); 0017 y.step(); 0018 } 0019 0020 KisAlgebra2D::HaltonSequenceGenerator x; 0021 KisAlgebra2D::HaltonSequenceGenerator y; 0022 }; 0023 0024 KisSampleRectIterator::KisSampleRectIterator() = default; 0025 KisSampleRectIterator::~KisSampleRectIterator() = default; 0026 KisSampleRectIterator::KisSampleRectIterator(const KisSampleRectIterator &rhs) = default; 0027 KisSampleRectIterator::KisSampleRectIterator(KisSampleRectIterator &&rhs) = default; 0028 KisSampleRectIterator& KisSampleRectIterator::operator=(const KisSampleRectIterator &rhs) = default; 0029 KisSampleRectIterator& KisSampleRectIterator::operator=(KisSampleRectIterator &&rhs) = default; 0030 0031 KisSampleRectIterator::KisSampleRectIterator(const QRectF &rect) 0032 : m_rect(rect) 0033 { 0034 } 0035 0036 int KisSampleRectIterator::numSamples() const { 0037 return m_index + 1; 0038 } 0039 0040 void KisSampleRectIterator::increment() { 0041 m_index++; 0042 0043 if (m_index >= 9) { 0044 if (m_index == 9) { 0045 KIS_SAFE_ASSERT_RECOVER_RETURN(!m_sampler); 0046 m_sampler = new HaltonSampler(); 0047 } 0048 m_sampler->step(); 0049 } 0050 } 0051 0052 QPointF KisSampleRectIterator::dereference() const { 0053 switch (m_index) { 0054 case 0: 0055 return m_rect.topLeft(); 0056 case 1: 0057 return m_rect.topRight(); 0058 case 2: 0059 return m_rect.bottomRight(); 0060 case 3: 0061 return m_rect.bottomLeft(); 0062 case 4: 0063 return 0.5 * (m_rect.bottomLeft() + m_rect.topLeft()); 0064 case 5: 0065 return 0.5 * (m_rect.topRight() + m_rect.topLeft()); 0066 case 6: 0067 return 0.5 * (m_rect.topRight() + m_rect.bottomRight()); 0068 case 7: 0069 return 0.5 * (m_rect.bottomLeft() + m_rect.bottomRight()); 0070 case 8: 0071 return m_rect.center(); 0072 default: 0073 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(m_sampler, m_rect.center()); 0074 return KisAlgebra2D::relativeToAbsolute( 0075 QPointF(m_sampler->x.currentValue(), m_sampler->y.currentValue()), 0076 m_rect); 0077 } 0078 0079 Q_UNREACHABLE(); 0080 }