File indexing completed on 2024-05-19 04:26:40

0001 /*
0002  *  SPDX-FileCopyrightText: 2013 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_wrapped_random_accessor.h"
0008 
0009 #include "kis_wrapped_rect.h"
0010 
0011 
0012 KisWrappedRandomAccessor::KisWrappedRandomAccessor(KisTiledDataManager *ktm,
0013                                                    qint32 offsetX, qint32 offsetY,
0014                                                    bool writable,
0015                                                    KisIteratorCompleteListener *completeListener,
0016                                                    const QRect &wrapRect,
0017                                                    const WrapAroundAxis wrapAroundModeAxis)
0018     : KisRandomAccessor2(ktm, offsetX, offsetY, writable, completeListener),
0019       m_wrapRect(wrapRect),
0020       m_currentPos(QPoint()),
0021       m_wrapAxis(wrapAroundModeAxis)
0022 {
0023 }
0024 
0025 void KisWrappedRandomAccessor::moveTo(qint32 x, qint32 y)
0026 {
0027     m_currentPos = QPoint(x, y);
0028 
0029     x = KisWrappedRect::xToWrappedX(x, m_wrapRect, m_wrapAxis);
0030     y = KisWrappedRect::yToWrappedY(y, m_wrapRect, m_wrapAxis);
0031 
0032     KisRandomAccessor2::moveTo(x, y);
0033 }
0034 
0035 qint32 KisWrappedRandomAccessor::numContiguousColumns(qint32 x) const
0036 {
0037     if (m_wrapAxis == WRAPAROUND_VERTICAL) {
0038         return KisRandomAccessor2::numContiguousColumns(x);
0039     }
0040     x = KisWrappedRect::xToWrappedX(x, m_wrapRect, m_wrapAxis);
0041     qint32 distanceToBorder = m_wrapRect.x() + m_wrapRect.width() - x;
0042 
0043     return qMin(distanceToBorder, KisRandomAccessor2::numContiguousColumns(x));
0044 }
0045 
0046 qint32 KisWrappedRandomAccessor::numContiguousRows(qint32 y) const
0047 {
0048     if (m_wrapAxis == WRAPAROUND_HORIZONTAL) {
0049         return KisRandomAccessor2::numContiguousRows(y);
0050     }
0051     y = KisWrappedRect::yToWrappedY(y, m_wrapRect, m_wrapAxis);
0052     qint32 distanceToBorder = m_wrapRect.y() + m_wrapRect.height() - y;
0053 
0054     return qMin(distanceToBorder, KisRandomAccessor2::numContiguousRows(y));
0055 }
0056 
0057 qint32 KisWrappedRandomAccessor::rowStride(qint32 x, qint32 y) const
0058 {
0059     x = KisWrappedRect::xToWrappedX(x, m_wrapRect, m_wrapAxis);
0060     y = KisWrappedRect::yToWrappedY(y, m_wrapRect, m_wrapAxis);
0061     return KisRandomAccessor2::rowStride(x, y);
0062 }
0063 
0064 qint32 KisWrappedRandomAccessor::x() const
0065 {
0066     return m_currentPos.x();
0067 }
0068 
0069 qint32 KisWrappedRandomAccessor::y() const
0070 {
0071     return m_currentPos.y();
0072 }