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