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