diff options
author | krajcevski <krajcevski@google.com> | 2014-08-06 11:12:14 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-08-06 11:12:14 -0700 |
commit | 53f0959fc024c56dc55fe6bf86380127b59abec9 (patch) | |
tree | 75a74ae0371ad6dcbf9c353d750d667f010abfd6 | |
parent | b6c8cc31dd05b3d6781a0e4f0275f2702e06deef (diff) |
Allow custom blitters to be passed to SkDraw::drawPath
R=reed@google.com
Author: krajcevski@google.com
Review URL: https://codereview.chromium.org/444003004
-rw-r--r-- | include/core/SkDraw.h | 14 | ||||
-rw-r--r-- | src/core/SkDraw.cpp | 20 |
2 files changed, 23 insertions, 11 deletions
diff --git a/include/core/SkDraw.h b/include/core/SkDraw.h index 918f2335ea..21d421004a 100644 --- a/include/core/SkDraw.h +++ b/include/core/SkDraw.h @@ -17,6 +17,7 @@ class SkBitmap; class SkClipStack; class SkBaseDevice; +class SkBlitter; class SkMatrix; class SkPath; class SkRegion; @@ -49,8 +50,9 @@ public: this->drawPath(path, paint, prePathMatrix, pathIsMutable, false); } - void drawPath(const SkPath& path, const SkPaint& paint) const { - this->drawPath(path, paint, NULL, false, false); + void drawPath(const SkPath& path, const SkPaint& paint, + SkBlitter* customBlitter = NULL) const { + this->drawPath(path, paint, NULL, false, false, customBlitter); } void drawBitmap(const SkBitmap&, const SkMatrix&, const SkPaint&) const; @@ -74,8 +76,9 @@ public: * * Only device A8 is supported right now. */ - void drawPathCoverage(const SkPath& src, const SkPaint& paint) const { - this->drawPath(src, paint, NULL, false, true); + void drawPathCoverage(const SkPath& src, const SkPaint& paint, + SkBlitter* customBlitter = NULL) const { + this->drawPath(src, paint, NULL, false, true, customBlitter); } /** Helper function that creates a mask from a path and an optional maskfilter. @@ -118,7 +121,8 @@ private: void drawBitmapAsMask(const SkBitmap&, const SkPaint&) const; void drawPath(const SkPath&, const SkPaint&, const SkMatrix* preMatrix, - bool pathIsMutable, bool drawCoverage) const; + bool pathIsMutable, bool drawCoverage, + SkBlitter* customBlitter = NULL) const; /** * Return the current clip bounds, in local coordinates, with slop to account diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp index b77eb430c7..9bc29b333a 100644 --- a/src/core/SkDraw.cpp +++ b/src/core/SkDraw.cpp @@ -54,9 +54,10 @@ public: SkBlitter* get() const { return fBlitter; } void choose(const SkBitmap& device, const SkMatrix& matrix, - const SkPaint& paint) { + const SkPaint& paint, bool drawCoverage = false) { SkASSERT(!fBlitter); - fBlitter = SkBlitter::Choose(device, matrix, paint, &fAllocator); + fBlitter = SkBlitter::Choose(device, matrix, paint, &fAllocator, + drawCoverage); } private: @@ -992,7 +993,7 @@ DRAW_PATH: void SkDraw::drawPath(const SkPath& origSrcPath, const SkPaint& origPaint, const SkMatrix* prePathMatrix, bool pathIsMutable, - bool drawCoverage) const { + bool drawCoverage, SkBlitter* customBlitter) const { SkDEBUGCODE(this->validate();) // nothing to draw @@ -1078,12 +1079,19 @@ void SkDraw::drawPath(const SkPath& origSrcPath, const SkPaint& origPaint, // transform the path into device space pathPtr->transform(*matrix, devPathPtr); - SkAutoBlitterChoose blitter(*fBitmap, *fMatrix, *paint, drawCoverage); + SkBlitter* blitter = NULL; + SkAutoBlitterChoose blitterStorage; + if (NULL == customBlitter) { + blitterStorage.choose(*fBitmap, *fMatrix, *paint, drawCoverage); + blitter = blitterStorage.get(); + } else { + blitter = customBlitter; + } if (paint->getMaskFilter()) { SkPaint::Style style = doFill ? SkPaint::kFill_Style : SkPaint::kStroke_Style; - if (paint->getMaskFilter()->filterPath(*devPathPtr, *fMatrix, *fRC, blitter.get(), style)) { + if (paint->getMaskFilter()->filterPath(*devPathPtr, *fMatrix, *fRC, blitter, style)) { return; // filterPath() called the blitter, so we're done } } @@ -1102,7 +1110,7 @@ void SkDraw::drawPath(const SkPath& origSrcPath, const SkPaint& origPaint, proc = SkScan::HairPath; } } - proc(*devPathPtr, *fRC, blitter.get()); + proc(*devPathPtr, *fRC, blitter); } /** For the purposes of drawing bitmaps, if a matrix is "almost" translate |