/*
 * Copyright 2018 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef sk_pixel_iter_DEFINED
#define sk_pixel_iter_DEFINED

#include "SkPixmap.h"
#include "SkSurface.h"

namespace sk_tool_utils {

    class PixelIter {
    public:
        PixelIter();
        PixelIter(SkSurface* surf) {
            SkPixmap pm;
            if (!surf->peekPixels(&pm)) {
                pm.reset();
            }
            this->reset(pm);
        }

        void reset(const SkPixmap& pm) {
            fPM = pm;
            fLoc = { -1, 0 };
        }

        void* next(SkIPoint* loc = nullptr) {
            if (!fPM.addr()) {
                return nullptr;
            }
            fLoc.fX += 1;
            if (fLoc.fX >= fPM.width()) {
                fLoc.fX = 0;
                if (++fLoc.fY >= fPM.height()) {
                    this->setDone();
                    return nullptr;
                }
            }
            if (loc) {
                *loc = fLoc;
            }
            return fPM.writable_addr(fLoc.fX, fLoc.fY);
        }

        void setDone() {
            fPM.reset();
        }

    private:
        SkPixmap    fPM;
        SkIPoint    fLoc;
    };

}  // namespace sk_tool_utils

#endif  // sk_tool_utils_DEFINED
