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" 12a0b40280a49a8a43af7929ead3b3489951c58501commit-bot@chromium.org#include "SkTypes.h" 13ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 14e3beb6bd7de7fa211681abbb0be58e80b19885e0commit-bot@chromium.orgclass GrPlotMgr : SkNoncopyable { 15ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.compublic: 16ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrPlotMgr(int width, int height) { 17ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fDim.set(width, height); 18ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com size_t needed = width * height; 19ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com if (needed <= sizeof(fStorage)) { 20ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fBusy = fStorage; 21ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } else { 22c377baf406996aed18d82d328029c82dbc3b8ddatomhudson@google.com fBusy = SkNEW_ARRAY(char, needed); 23ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 24ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com this->reset(); 25ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 26ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 27ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com ~GrPlotMgr() { 28ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com if (fBusy != fStorage) { 29ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com delete[] fBusy; 30ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 31ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 32d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 33ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void reset() { 34939ca7ce860c5e80a4fdccc0dba5f7bfa29fef22reed@google.com sk_bzero(fBusy, fDim.fX * fDim.fY); 35ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 36ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 37d537341e16524d1e22ac5e6c8b9c8f274ba1833crobertphillips bool newPlot(SkIPoint16* loc) { 38ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com char* busy = fBusy; 39ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com for (int y = 0; y < fDim.fY; y++) { 40ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com for (int x = 0; x < fDim.fX; x++) { 41ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com if (!*busy) { 42ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com *busy = true; 43ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com loc->set(x, y); 44ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return true; 45ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 46ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com busy++; 47ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 48ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 49ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return false; 50ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 51ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 52ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com bool isBusy(int x, int y) const { 53f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT((unsigned)x < (unsigned)fDim.fX); 54f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT((unsigned)y < (unsigned)fDim.fY); 55ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return fBusy[y * fDim.fX + x] != 0; 56ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 57ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 58ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void freePlot(int x, int y) { 59f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT((unsigned)x < (unsigned)fDim.fX); 60f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT((unsigned)y < (unsigned)fDim.fY); 61ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fBusy[y * fDim.fX + x] = false; 62ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 63ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 64ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comprivate: 65ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com enum { 66ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com STORAGE = 64 67ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 68ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com char fStorage[STORAGE]; 69ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com char* fBusy; 70d537341e16524d1e22ac5e6c8b9c8f274ba1833crobertphillips SkIPoint16 fDim; 71ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}; 72ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 73ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif 74