163227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed/*
263227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed * Copyright 2018 Google Inc.
363227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed *
463227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed * Use of this source code is governed by a BSD-style license that can be
563227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed * found in the LICENSE file.
663227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed */
763227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed
863227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed#ifndef sk_pixel_iter_DEFINED
963227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed#define sk_pixel_iter_DEFINED
1063227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed
1163227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed#include "SkPixmap.h"
1263227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed#include "SkSurface.h"
1363227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed
1463227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reednamespace sk_tool_utils {
1563227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed
1663227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed    class PixelIter {
1763227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed    public:
1863227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed        PixelIter();
1963227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed        PixelIter(SkSurface* surf) {
2063227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed            SkPixmap pm;
2163227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed            if (!surf->peekPixels(&pm)) {
2263227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed                pm.reset();
2363227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed            }
2463227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed            this->reset(pm);
2563227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed        }
2663227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed
2763227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed        void reset(const SkPixmap& pm) {
2863227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed            fPM = pm;
2963227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed            fLoc = { -1, 0 };
3063227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed        }
3163227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed
3263227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed        void* next(SkIPoint* loc = nullptr) {
3363227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed            if (!fPM.addr()) {
3463227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed                return nullptr;
3563227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed            }
3663227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed            fLoc.fX += 1;
3763227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed            if (fLoc.fX >= fPM.width()) {
3863227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed                fLoc.fX = 0;
3963227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed                if (++fLoc.fY >= fPM.height()) {
4063227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed                    this->setDone();
4163227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed                    return nullptr;
4263227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed                }
4363227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed            }
4463227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed            if (loc) {
4563227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed                *loc = fLoc;
4663227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed            }
4763227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed            return fPM.writable_addr(fLoc.fX, fLoc.fY);
4863227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed        }
4963227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed
5063227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed        void setDone() {
5163227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed            fPM.reset();
5263227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed        }
5363227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed
5463227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed    private:
5563227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed        SkPixmap    fPM;
5663227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed        SkIPoint    fLoc;
5763227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed    };
5863227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed
5963227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed}  // namespace sk_tool_utils
6063227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed
6163227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed#endif  // sk_tool_utils_DEFINED
62