diff options
Diffstat (limited to 'src/image/SkImageShader.cpp')
-rw-r--r-- | src/image/SkImageShader.cpp | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/src/image/SkImageShader.cpp b/src/image/SkImageShader.cpp index 7e3874891c..64a09dd2dc 100644 --- a/src/image/SkImageShader.cpp +++ b/src/image/SkImageShader.cpp @@ -97,12 +97,23 @@ static bool bitmap_is_too_big(int w, int h) { } sk_sp<SkShader> SkImageShader::Make(sk_sp<SkImage> image, TileMode tx, TileMode ty, - const SkMatrix* localMatrix) { + const SkMatrix* localMatrix, + SkTBlitterAllocator* allocator) { + SkShader* shader; if (!image || bitmap_is_too_big(image->width(), image->height())) { - return sk_make_sp<SkEmptyShader>(); + if (nullptr == allocator) { + shader = new SkEmptyShader; + } else { + shader = allocator->createT<SkEmptyShader>(); + } } else { - return sk_make_sp<SkImageShader>(image, tx, ty, localMatrix); + if (nullptr == allocator) { + shader = new SkImageShader(image, tx, ty, localMatrix); + } else { + shader = allocator->createT<SkImageShader>(image, tx, ty, localMatrix); + } } + return sk_sp<SkShader>(shader); } #ifndef SK_IGNORE_TO_STRING @@ -186,9 +197,15 @@ sk_sp<GrFragmentProcessor> SkImageShader::asFragmentProcessor(const AsFPArgs& ar sk_sp<SkShader> SkMakeBitmapShader(const SkBitmap& src, SkShader::TileMode tmx, SkShader::TileMode tmy, const SkMatrix* localMatrix, - SkCopyPixelsMode cpm) { - return SkImageShader::Make(SkMakeImageFromRasterBitmap(src, cpm), - tmx, tmy, localMatrix); + SkCopyPixelsMode cpm, SkTBlitterAllocator* allocator) { + // Until we learn otherwise, it seems that any caller that is passing an allocator must be + // assuming that the returned shader will have a stack-frame lifetime, so we assert that + // they are also asking for kNever_SkCopyPixelsMode. If that proves otherwise, we can remove + // or modify this assert. + SkASSERT(!allocator || (kNever_SkCopyPixelsMode == cpm)); + + return SkImageShader::Make(SkMakeImageFromRasterBitmap(src, cpm, allocator), + tmx, tmy, localMatrix, allocator); } static sk_sp<SkFlattenable> SkBitmapProcShader_CreateProc(SkReadBuffer& buffer) { |