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 14 namespace 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