Home | History | Annotate | Download | only in gpu
      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
     75