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 }