diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkPictureShader.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/core/SkPictureShader.cpp b/src/core/SkPictureShader.cpp index c803f7d878..82d6096be5 100644 --- a/src/core/SkPictureShader.cpp +++ b/src/core/SkPictureShader.cpp @@ -10,6 +10,7 @@ #include "SkBitmap.h" #include "SkBitmapProcShader.h" #include "SkCanvas.h" +#include "SkImage.h" #include "SkImageGenerator.h" #include "SkMatrixUtils.h" #include "SkPicture.h" @@ -217,18 +218,28 @@ SkShader* SkPictureShader::refBitmapShader(const SkMatrix& viewMatrix, const SkM if (!SkResourceCache::Find(key, BitmapShaderRec::Visitor, &tileShader)) { SkMatrix tileMatrix; tileMatrix.setRectToRect(fTile, SkRect::MakeIWH(tileSize.width(), tileSize.height()), - SkMatrix::kFill_ScaleToFit); - SkBitmap bm; - if (!SkDEPRECATED_InstallDiscardablePixelRef( - SkImageGenerator::NewFromPicture(tileSize, fPicture, &tileMatrix, nullptr), &bm)) { + SkMatrix::kFill_ScaleToFit); + + SkAutoTDelete<SkImageGenerator> tileGenerator( + SkImageGenerator::NewFromPicture(tileSize, fPicture, &tileMatrix, nullptr)); + if (!tileGenerator) { + return nullptr; + } + + // Grab this before the generator goes poof! + const SkImageInfo tileInfo = tileGenerator->getInfo(); + + SkAutoTUnref<SkImage> tileImage(SkImage::NewFromGenerator(tileGenerator.detach())); + if (!tileImage) { return nullptr; } SkMatrix shaderMatrix = this->getLocalMatrix(); shaderMatrix.preScale(1 / tileScale.width(), 1 / tileScale.height()); - tileShader.reset(CreateBitmapShader(bm, fTmx, fTmy, &shaderMatrix)); + tileShader.reset(tileImage->newShader(fTmx, fTmy, &shaderMatrix)); - SkResourceCache::Add(new BitmapShaderRec(key, tileShader.get(), bm.getSize())); + SkResourceCache::Add(new BitmapShaderRec(key, tileShader.get(), + tileInfo.getSafeSize(tileInfo.minRowBytes()))); } return tileShader.detach(); |