GrPlotMgr.h revision 939ca7ce860c5e80a4fdccc0dba5f7bfa29fef22
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2010 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 7ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 8ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#ifndef GrPlotMgr_DEFINED 9ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#define GrPlotMgr_DEFINED 10ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 11ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrTypes.h" 12ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrPoint.h" 13a0b40280a49a8a43af7929ead3b3489951c58501commit-bot@chromium.org#include "SkTypes.h" 14ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 15a0b40280a49a8a43af7929ead3b3489951c58501commit-bot@chromium.orgclass GrPlotMgr : public SkNoncopyable { 16ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.compublic: 17ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrPlotMgr(int width, int height) { 18ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fDim.set(width, height); 19ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com size_t needed = width * height; 20ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com if (needed <= sizeof(fStorage)) { 21ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fBusy = fStorage; 22ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } else { 23c377baf406996aed18d82d328029c82dbc3b8ddatomhudson@google.com fBusy = SkNEW_ARRAY(char, needed); 24ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 25ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com this->reset(); 26ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 27ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 28ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com ~GrPlotMgr() { 29ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com if (fBusy != fStorage) { 30ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com delete[] fBusy; 31ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 32ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 33d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 34ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void reset() { 35939ca7ce860c5e80a4fdccc0dba5f7bfa29fef22reed@google.com sk_bzero(fBusy, fDim.fX * fDim.fY); 36ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 37ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 38ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com bool newPlot(GrIPoint16* loc) { 39ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com char* busy = fBusy; 40ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com for (int y = 0; y < fDim.fY; y++) { 41ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com for (int x = 0; x < fDim.fX; x++) { 42ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com if (!*busy) { 43ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com *busy = true; 44ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com loc->set(x, y); 45ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return true; 46ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 47ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com busy++; 48ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 49ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 50ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return false; 51ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 52ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 53ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com bool isBusy(int x, int y) const { 54f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT((unsigned)x < (unsigned)fDim.fX); 55f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT((unsigned)y < (unsigned)fDim.fY); 56ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return fBusy[y * fDim.fX + x] != 0; 57ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 58ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 59ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void freePlot(int x, int y) { 60f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT((unsigned)x < (unsigned)fDim.fX); 61f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT((unsigned)y < (unsigned)fDim.fY); 62ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fBusy[y * fDim.fX + x] = false; 63ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 64ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 65ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comprivate: 66ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com enum { 67ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com STORAGE = 64 68ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 69ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com char fStorage[STORAGE]; 70ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com char* fBusy; 71ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrIPoint16 fDim; 72ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}; 73ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 74ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif 75