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