From f507c410e3a2a7ef7dab84152d836da5e5a8a5e9 Mon Sep 17 00:00:00 2001 From: "junov@chromium.org" Date: Fri, 8 Feb 2013 21:03:30 +0000 Subject: Adding option to SkTileGrid for specifying border pixels. The purpose of this patch is to make it possible for the chromium compositor to generate a TileGrid structure that is better suited for scaled playback. Review URL: https://codereview.appspot.com/7300072 git-svn-id: http://skia.googlecode.com/svn/trunk@7680 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/core/SkTileGrid.cpp | 17 ++++++++++------- src/core/SkTileGrid.h | 4 ++-- src/core/SkTileGridPicture.cpp | 7 +++++-- 3 files changed, 17 insertions(+), 11 deletions(-) (limited to 'src/core') diff --git a/src/core/SkTileGrid.cpp b/src/core/SkTileGrid.cpp index 2b885c9f1f..51c40cc0af 100644 --- a/src/core/SkTileGrid.cpp +++ b/src/core/SkTileGrid.cpp @@ -8,12 +8,16 @@ #include "SkTileGrid.h" -SkTileGrid::SkTileGrid(int tileWidth, int tileHeight, int xTileCount, int yTileCount, SkTileGridNextDatumFunctionPtr nextDatumFunction) +SkTileGrid::SkTileGrid(int tileWidth, int tileHeight, int xTileCount, int yTileCount, + int borderPixels, SkTileGridNextDatumFunctionPtr nextDatumFunction) { fTileWidth = tileWidth; fTileHeight = tileHeight; fXTileCount = xTileCount; fYTileCount = yTileCount; + // Border padding is offset by 1 as a provision for AA and + // to cancel-out the outset applied by getClipDeviceBounds. + fBorderPixels = borderPixels + 1; fTileCount = fXTileCount * fYTileCount; fInsertionCount = 0; fGridBounds = SkIRect::MakeXYWH(0, 0, fTileWidth * fXTileCount, fTileHeight * fYTileCount); @@ -32,7 +36,7 @@ SkTDArray& SkTileGrid::tile(int x, int y) { void SkTileGrid::insert(void* data, const SkIRect& bounds, bool) { SkASSERT(!bounds.isEmpty()); SkIRect dilatedBounds = bounds; - dilatedBounds.outset(1,1); // Consideration for filtering and AA + dilatedBounds.outset(fBorderPixels, fBorderPixels); if (!SkIRect::Intersects(dilatedBounds, fGridBounds)) { return; @@ -52,11 +56,10 @@ void SkTileGrid::insert(void* data, const SkIRect& bounds, bool) { } void SkTileGrid::search(const SkIRect& query, SkTDArray* results) { - // The +1/-1 is to compensate for the outset in applied SkCanvas::getClipBounds - int tileStartX = (query.left() + 1) / fTileWidth; - int tileEndX = (query.right() + fTileWidth - 1) / fTileWidth; - int tileStartY = (query.top() + 1) / fTileHeight; - int tileEndY = (query.bottom() + fTileHeight - 1) / fTileHeight; + int tileStartX = (query.left() + fBorderPixels) / fTileWidth; + int tileEndX = (query.right() + fTileWidth - fBorderPixels) / fTileWidth; + int tileStartY = (query.top() + fBorderPixels) / fTileHeight; + int tileEndY = (query.bottom() + fTileHeight - fBorderPixels) / fTileHeight; if (tileStartX >= fXTileCount || tileStartY >= fYTileCount || tileEndX <= 0 || tileEndY <= 0) { return; // query does not intersect the grid } diff --git a/src/core/SkTileGrid.h b/src/core/SkTileGrid.h index 8ae3f2c1cc..3f69f073b7 100644 --- a/src/core/SkTileGrid.h +++ b/src/core/SkTileGrid.h @@ -26,7 +26,7 @@ class SkTileGrid : public SkBBoxHierarchy { public: typedef void* (*SkTileGridNextDatumFunctionPtr)(SkTDArray** tileData, SkTDArray& tileIndices); - SkTileGrid(int tileWidth, int tileHeight, int xTileCount, int yTileCount, + SkTileGrid(int tileWidth, int tileHeight, int xTileCount, int yTileCount, int borderPixels, SkTileGridNextDatumFunctionPtr nextDatumFunction); virtual ~SkTileGrid(); @@ -61,7 +61,7 @@ public: private: SkTDArray& tile(int x, int y); - int fTileWidth, fTileHeight, fXTileCount, fYTileCount, fTileCount; + int fTileWidth, fTileHeight, fXTileCount, fYTileCount, fTileCount, fBorderPixels; SkTDArray* fTileData; int fInsertionCount; SkIRect fGridBounds; diff --git a/src/core/SkTileGridPicture.cpp b/src/core/SkTileGridPicture.cpp index 212e3b6243..8a39d4949b 100644 --- a/src/core/SkTileGridPicture.cpp +++ b/src/core/SkTileGridPicture.cpp @@ -11,14 +11,17 @@ #include "SkTileGrid.h" -SkTileGridPicture::SkTileGridPicture(int tileWidth, int tileHeight, int width, int height) { +SkTileGridPicture::SkTileGridPicture(int tileWidth, int tileHeight, int width, int height, + int borderPixels) { + SkASSERT(borderPixels >= 0); fTileWidth = tileWidth; fTileHeight = tileHeight; fXTileCount = (width + tileWidth - 1) / tileWidth; fYTileCount = (height + tileHeight - 1) / tileHeight; + fBorderPixels = borderPixels; } SkBBoxHierarchy* SkTileGridPicture::createBBoxHierarchy() const { return SkNEW_ARGS(SkTileGrid, (fTileWidth, fTileHeight, fXTileCount, fYTileCount, - SkTileGridNextDatum)); + fBorderPixels, SkTileGridNextDatum)); } -- cgit v1.2.3