use SkMakeBitmapShader to not force copies when possible
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2216403002
Review-Url: https://codereview.chromium.org/2216403002
diff --git a/src/core/SkBitmapDevice.cpp b/src/core/SkBitmapDevice.cpp
index 21601f4..79b62ab 100644
--- a/src/core/SkBitmapDevice.cpp
+++ b/src/core/SkBitmapDevice.cpp
@@ -322,16 +322,23 @@
}
USE_SHADER:
+
+ // Since the shader need only live for our stack-frame, pass in a custom allocator. This
+ // can save malloc calls, and signals to SkMakeBitmapShader to not try to copy the bitmap
+ // if its mutable, since that precaution is not needed (give the short lifetime of the shader).
+ SkTBlitterAllocator allocator;
// construct a shader, so we can call drawRect with the dst
- auto s = SkShader::MakeBitmapShader(*bitmapPtr, SkShader::kClamp_TileMode,
- SkShader::kClamp_TileMode, &matrix);
+ auto s = SkMakeBitmapShader(*bitmapPtr, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode,
+ &matrix, &allocator);
if (!s) {
return;
}
+ // we deliberately add a ref, since the allocator wants to be the last owner
+ s.get()->ref();
SkPaint paintWithShader(paint);
paintWithShader.setStyle(SkPaint::kFill_Style);
- paintWithShader.setShader(std::move(s));
+ paintWithShader.setShader(s);
// Call ourself, in case the subclass wanted to share this setup code
// but handle the drawRect code themselves.