From 3fe44544c93759e7791ee0df3e5d172cb0f268b6 Mon Sep 17 00:00:00 2001 From: Mike Reed Date: Tue, 27 Jun 2017 17:35:38 -0400 Subject: use blitMask for left/right edges in blur-nine Seems about same speed for legacy blitter, but much faster for raster-pipeline Bug: skia: Change-Id: I19be307c01a199e2477e045fb8c2cca7784564a5 Reviewed-on: https://skia-review.googlesource.com/20967 Commit-Queue: Mike Reed Reviewed-by: Mike Klein --- src/core/SkMaskFilter.cpp | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/core/SkMaskFilter.cpp b/src/core/SkMaskFilter.cpp index 382e24e9ed..56a1704737 100644 --- a/src/core/SkMaskFilter.cpp +++ b/src/core/SkMaskFilter.cpp @@ -164,15 +164,30 @@ static void draw_nine_clipped(const SkMask& mask, const SkIRect& outerR, blitter->blitAntiH(r.left(), outerR.bottom() - y - 1, alpha, runs); } } +#ifdef SK_SUPPORT_BLITV_FOR_BLUR_NINE + const bool useBlitV = true; +#else + const bool useBlitV = false; +#endif // left r.set(outerR.left(), innerR.top(), innerR.left(), innerR.bottom()); if (r.intersect(clipR)) { int startX = r.left() - outerR.left(); int stopX = startX + r.width(); int height = r.height(); - for (int x = startX; x < stopX; ++x) { - blitter->blitV(outerR.left() + x, r.top(), height, - *mask.getAddr8(mask.fBounds.left() + x, mask.fBounds.top() + cy)); + if (useBlitV) { + for (int x = startX; x < stopX; ++x) { + blitter->blitV(outerR.left() + x, r.top(), height, + *mask.getAddr8(mask.fBounds.left() + x, mask.fBounds.top() + cy)); + } + } else { + SkMask m; + m.fImage = mask.getAddr8(mask.fBounds.left() + r.left() - outerR.left(), + mask.fBounds.top() + cy); + m.fBounds = r; + m.fRowBytes = 0; // so we repeat the scanline for our height + m.fFormat = SkMask::kA8_Format; + blitter->blitMask(m, r); } } // right @@ -181,9 +196,19 @@ static void draw_nine_clipped(const SkMask& mask, const SkIRect& outerR, int startX = outerR.right() - r.right(); int stopX = startX + r.width(); int height = r.height(); - for (int x = startX; x < stopX; ++x) { - blitter->blitV(outerR.right() - x - 1, r.top(), height, - *mask.getAddr8(mask.fBounds.right() - x - 1, mask.fBounds.top() + cy)); + if (useBlitV) { + for (int x = startX; x < stopX; ++x) { + blitter->blitV(outerR.right() - x - 1, r.top(), height, + *mask.getAddr8(mask.fBounds.right() - x - 1, mask.fBounds.top() + cy)); + } + } else { + SkMask m; + m.fImage = mask.getAddr8(mask.fBounds.right() - outerR.right() + r.left(), + mask.fBounds.top() + cy); + m.fBounds = r; + m.fRowBytes = 0; // so we repeat the scanline for our height + m.fFormat = SkMask::kA8_Format; + blitter->blitMask(m, r); } } } -- cgit v1.2.3