Home | History | Annotate | Download | only in tools
      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