| /* |
| * 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 |