62 lines
1.3 KiB
C
62 lines
1.3 KiB
C
|
/*
|
||
|
* 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
|