| Index: src/gpu/GrRectanizer_pow2.h
|
| diff --git a/src/gpu/GrRectanizer_pow2.h b/src/gpu/GrRectanizer_pow2.h
|
| index c2e45655f102eb344eae179e742fcbad0dbbd8a2..e9d9d02b0ac0a32268e03736bd9c50c441667688 100644
|
| --- a/src/gpu/GrRectanizer_pow2.h
|
| +++ b/src/gpu/GrRectanizer_pow2.h
|
| @@ -10,6 +10,11 @@
|
|
|
| #include "GrRectanizer.h"
|
|
|
| +// This Rectanizer quantizes the incoming rects to powers of 2. Each power
|
| +// of two can have, at most, one active row/shelf. Once a row/shelf for
|
| +// a particular power of two gets full its fRows entry is recycled to point
|
| +// to a new row.
|
| +// The skyline algorithm almost always provides a better packing.
|
| class GrRectanizerPow2 : public GrRectanizer {
|
| public:
|
| GrRectanizerPow2(int w, int h) : INHERITED(w, h) {
|
| @@ -32,9 +37,12 @@ public:
|
|
|
| private:
|
| static const int kMIN_HEIGHT_POW2 = 2;
|
| + static const int kMaxExponent = 16;
|
|
|
| struct Row {
|
| GrIPoint16 fLoc;
|
| + // fRowHeight is actually known by this struct's position in fRows
|
| + // but it is used to signal if there exists an open row of this height
|
| int fRowHeight;
|
|
|
| bool canAddWidth(int width, int containerWidth) const {
|
| @@ -42,14 +50,16 @@ private:
|
| }
|
| };
|
|
|
| - Row fRows[16];
|
| + Row fRows[kMaxExponent]; // 0-th entry will be unused
|
|
|
| int fNextStripY;
|
| int32_t fAreaSoFar;
|
|
|
| static int HeightToRowIndex(int height) {
|
| SkASSERT(height >= kMIN_HEIGHT_POW2);
|
| - return 32 - SkCLZ(height - 1);
|
| + int index = 32 - SkCLZ(height - 1);
|
| + SkASSERT(index < kMaxExponent);
|
| + return index;
|
| }
|
|
|
| bool canAddStrip(int height) const {
|
|
|