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