diff options
author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-05-29 18:46:38 +0000 |
---|---|---|
committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-05-29 18:46:38 +0000 |
commit | ad854bf9c0d2029cf0730e50ac7f7ddbe32d1c97 (patch) | |
tree | a361fd03d14a6ce289c36b5c5d276f63f554461f /src/gpu/GrRectanizer_skyline.h | |
parent | d3c6b3f1c89ad1336830957a1e9b235dd86910f2 (diff) |
Add testing for Rectanizer-derived classes
This in preparation for expanding the Rectanizer API for removing rects and adding a new derived class
R=jvanverth@google.com
Author: robertphillips@google.com
Review URL: https://codereview.chromium.org/304313002
git-svn-id: http://skia.googlecode.com/svn/trunk@14972 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/gpu/GrRectanizer_skyline.h')
-rw-r--r-- | src/gpu/GrRectanizer_skyline.h | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/gpu/GrRectanizer_skyline.h b/src/gpu/GrRectanizer_skyline.h new file mode 100644 index 0000000000..d2dfe577f1 --- /dev/null +++ b/src/gpu/GrRectanizer_skyline.h @@ -0,0 +1,56 @@ +/* +* Copyright 2014 Google Inc. +* +* Use of this source code is governed by a BSD-style license that can be +* found in the LICENSE file. +*/ + +#ifndef GrRectanizer_skyline_DEFINED +#define GrRectanizer_skyline_DEFINED + +#include "GrRectanizer.h" +#include "SkTDArray.h" + +// Pack rectangles and track the current silhouette +// Based in part on Jukka Jylänki's work at http://clb.demon.fi +class GrRectanizerSkyline : public GrRectanizer { +public: + GrRectanizerSkyline(int w, int h) : INHERITED(w, h) { + this->reset(); + } + + virtual ~GrRectanizerSkyline() { } + + virtual void reset() SK_OVERRIDE{ + fAreaSoFar = 0; + fSkyline.reset(); + SkylineSegment* seg = fSkyline.append(1); + seg->fX = 0; + seg->fY = 0; + seg->fWidth = this->width(); + } + + virtual bool addRect(int w, int h, GrIPoint16* loc) SK_OVERRIDE; + + virtual float percentFull() const SK_OVERRIDE{ + return fAreaSoFar / ((float)this->width() * this->height()); + } + +private: + struct SkylineSegment { + int fX; + int fY; + int fWidth; + }; + + SkTDArray<SkylineSegment> fSkyline; + + int32_t fAreaSoFar; + + bool rectangleFits(int skylineIndex, int width, int height, int* y) const; + void addSkylineLevel(int skylineIndex, int x, int y, int width, int height); + + typedef GrRectanizer INHERITED; +}; + +#endif |