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 { |