• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2014 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 GrRectanizerSkyline_DEFINED
9 #define GrRectanizerSkyline_DEFINED
10 
11 #include "include/private/SkTDArray.h"
12 #include "src/gpu/GrRectanizer.h"
13 
14 // Pack rectangles and track the current silhouette
15 // Based, in part, on Jukka Jylanki's work at http://clb.demon.fi
16 //
17 // Mark this class final in an effort to avoid the vtable when this subclass is used explicitly.
18 class GrRectanizerSkyline final : public GrRectanizer {
19 public:
GrRectanizerSkyline(int w,int h)20     GrRectanizerSkyline(int w, int h) : INHERITED(w, h) {
21         this->reset();
22     }
23 
~GrRectanizerSkyline()24     ~GrRectanizerSkyline() final { }
25 
reset()26     void reset() final {
27         fAreaSoFar = 0;
28         fSkyline.reset();
29         SkylineSegment* seg = fSkyline.append(1);
30         seg->fX = 0;
31         seg->fY = 0;
32         seg->fWidth = this->width();
33     }
34 
35     bool addRect(int w, int h, SkIPoint16* loc) final;
36 
percentFull()37     float percentFull() const final {
38         return fAreaSoFar / ((float)this->width() * this->height());
39     }
40 
41 private:
42     struct SkylineSegment {
43         int  fX;
44         int  fY;
45         int  fWidth;
46     };
47 
48     SkTDArray<SkylineSegment> fSkyline;
49 
50     int32_t fAreaSoFar;
51 
52     // Can a width x height rectangle fit in the free space represented by
53     // the skyline segments >= 'skylineIndex'? If so, return true and fill in
54     // 'y' with the y-location at which it fits (the x location is pulled from
55     // 'skylineIndex's segment.
56     bool rectangleFits(int skylineIndex, int width, int height, int* y) const;
57     // Update the skyline structure to include a width x height rect located
58     // at x,y.
59     void addSkylineLevel(int skylineIndex, int x, int y, int width, int height);
60 
61     using INHERITED = GrRectanizer;
62 };
63 
64 #endif
65