163227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed/* 263227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed * Copyright 2018 Google Inc. 363227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed * 463227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed * Use of this source code is governed by a BSD-style license that can be 563227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed * found in the LICENSE file. 663227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed */ 763227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed 863227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed#ifndef sk_pixel_iter_DEFINED 963227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed#define sk_pixel_iter_DEFINED 1063227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed 1163227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed#include "SkPixmap.h" 1263227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed#include "SkSurface.h" 1363227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed 1463227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reednamespace sk_tool_utils { 1563227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed 1663227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed class PixelIter { 1763227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed public: 1863227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed PixelIter(); 1963227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed PixelIter(SkSurface* surf) { 2063227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed SkPixmap pm; 2163227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed if (!surf->peekPixels(&pm)) { 2263227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed pm.reset(); 2363227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed } 2463227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed this->reset(pm); 2563227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed } 2663227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed 2763227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed void reset(const SkPixmap& pm) { 2863227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed fPM = pm; 2963227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed fLoc = { -1, 0 }; 3063227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed } 3163227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed 3263227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed void* next(SkIPoint* loc = nullptr) { 3363227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed if (!fPM.addr()) { 3463227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed return nullptr; 3563227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed } 3663227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed fLoc.fX += 1; 3763227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed if (fLoc.fX >= fPM.width()) { 3863227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed fLoc.fX = 0; 3963227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed if (++fLoc.fY >= fPM.height()) { 4063227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed this->setDone(); 4163227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed return nullptr; 4263227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed } 4363227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed } 4463227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed if (loc) { 4563227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed *loc = fLoc; 4663227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed } 4763227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed return fPM.writable_addr(fLoc.fX, fLoc.fY); 4863227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed } 4963227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed 5063227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed void setDone() { 5163227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed fPM.reset(); 5263227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed } 5363227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed 5463227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed private: 5563227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed SkPixmap fPM; 5663227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed SkIPoint fLoc; 5763227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed }; 5863227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed 5963227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed} // namespace sk_tool_utils 6063227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed 6163227ca63b09ad534b52b1b1957202ab18aa53f7Mike Reed#endif // sk_tool_utils_DEFINED 62