| /* |
| * Copyright 2010 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef GrPlotMgr_DEFINED |
| #define GrPlotMgr_DEFINED |
| |
| #include "GrTypes.h" |
| #include "GrPoint.h" |
| #include "SkTypes.h" |
| |
| class GrPlotMgr : public SkNoncopyable { |
| public: |
| GrPlotMgr(int width, int height) { |
| fDim.set(width, height); |
| size_t needed = width * height; |
| if (needed <= sizeof(fStorage)) { |
| fBusy = fStorage; |
| } else { |
| fBusy = SkNEW_ARRAY(char, needed); |
| } |
| this->reset(); |
| } |
| |
| ~GrPlotMgr() { |
| if (fBusy != fStorage) { |
| delete[] fBusy; |
| } |
| } |
| |
| void reset() { |
| sk_bzero(fBusy, fDim.fX * fDim.fY); |
| } |
| |
| bool newPlot(GrIPoint16* loc) { |
| char* busy = fBusy; |
| for (int y = 0; y < fDim.fY; y++) { |
| for (int x = 0; x < fDim.fX; x++) { |
| if (!*busy) { |
| *busy = true; |
| loc->set(x, y); |
| return true; |
| } |
| busy++; |
| } |
| } |
| return false; |
| } |
| |
| bool isBusy(int x, int y) const { |
| SkASSERT((unsigned)x < (unsigned)fDim.fX); |
| SkASSERT((unsigned)y < (unsigned)fDim.fY); |
| return fBusy[y * fDim.fX + x] != 0; |
| } |
| |
| void freePlot(int x, int y) { |
| SkASSERT((unsigned)x < (unsigned)fDim.fX); |
| SkASSERT((unsigned)y < (unsigned)fDim.fY); |
| fBusy[y * fDim.fX + x] = false; |
| } |
| |
| private: |
| enum { |
| STORAGE = 64 |
| }; |
| char fStorage[STORAGE]; |
| char* fBusy; |
| GrIPoint16 fDim; |
| }; |
| |
| #endif |