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