1/*
2 * Copyright 2018 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef sk_pixel_iter_DEFINED
9#define sk_pixel_iter_DEFINED
10
11#include "SkPixmap.h"
12#include "SkSurface.h"
13
14namespace sk_tool_utils {
15
16    class PixelIter {
17    public:
18        PixelIter();
19        PixelIter(SkSurface* surf) {
20            SkPixmap pm;
21            if (!surf->peekPixels(&pm)) {
22                pm.reset();
23            }
24            this->reset(pm);
25        }
26
27        void reset(const SkPixmap& pm) {
28            fPM = pm;
29            fLoc = { -1, 0 };
30        }
31
32        void* next(SkIPoint* loc = nullptr) {
33            if (!fPM.addr()) {
34                return nullptr;
35            }
36            fLoc.fX += 1;
37            if (fLoc.fX >= fPM.width()) {
38                fLoc.fX = 0;
39                if (++fLoc.fY >= fPM.height()) {
40                    this->setDone();
41                    return nullptr;
42                }
43            }
44            if (loc) {
45                *loc = fLoc;
46            }
47            return fPM.writable_addr(fLoc.fX, fLoc.fY);
48        }
49
50        void setDone() {
51            fPM.reset();
52        }
53
54    private:
55        SkPixmap    fPM;
56        SkIPoint    fLoc;
57    };
58
59}  // namespace sk_tool_utils
60
61#endif  // sk_tool_utils_DEFINED
62