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_pow2.cpp | |
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_pow2.cpp')
-rw-r--r-- | src/gpu/GrRectanizer_pow2.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/gpu/GrRectanizer_pow2.cpp b/src/gpu/GrRectanizer_pow2.cpp new file mode 100644 index 0000000000..d92e80c2d5 --- /dev/null +++ b/src/gpu/GrRectanizer_pow2.cpp @@ -0,0 +1,66 @@ + +/* + * Copyright 2010 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "GrRectanizer_pow2.h" +#include "GrTBSearch.h" + +bool GrRectanizerPow2::addRect(int width, int height, GrIPoint16* loc) { + if ((unsigned)width > (unsigned)this->width() || + (unsigned)height > (unsigned)this->height()) { + return false; + } + + int32_t area = width * height; + + /* + We use bsearch, but there may be more than one row with the same height, + so we actually search for height-1, which can only be a pow2 itself if + height == 2. Thus we set a minimum height. + */ + height = GrNextPow2(height); + if (height < kMIN_HEIGHT_POW2) { + height = kMIN_HEIGHT_POW2; + } + + Row* row = &fRows[HeightToRowIndex(height)]; + SkASSERT(row->fRowHeight == 0 || row->fRowHeight == height); + + if (0 == row->fRowHeight) { + if (!this->canAddStrip(height)) { + return false; + } + this->initRow(row, height); + } else { + if (!row->canAddWidth(width, this->width())) { + if (!this->canAddStrip(height)) { + return false; + } + // that row is now "full", so retarget our Row record for + // another one + this->initRow(row, height); + } + } + + SkASSERT(row->fRowHeight == height); + SkASSERT(row->canAddWidth(width, this->width())); + *loc = row->fLoc; + row->fLoc.fX += width; + + SkASSERT(row->fLoc.fX <= this->width()); + SkASSERT(row->fLoc.fY <= this->height()); + SkASSERT(fNextStripY <= this->height()); + fAreaSoFar += area; + return true; +} + +/////////////////////////////////////////////////////////////////////////////// + +// factory is now in GrRectanizer_skyline.cpp +//GrRectanizer* GrRectanizer::Factory(int width, int height) { +// return SkNEW_ARGS(GrRectanizerPow2, (width, height)); +//} |