diff options
author | Florin Malita <fmalita@chromium.org> | 2016-11-16 14:45:34 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2016-11-16 20:24:48 +0000 |
commit | ca79535dcb36ab3691eadc8664b687f4cd8a56b5 (patch) | |
tree | bb3f354cff997f717ed27025897f7973b3a340fc /src/core/SkBitmapProvider.cpp | |
parent | cb677668519d117c51a7ca78375fee577f8f2aa9 (diff) |
External SkImageGenerator API
Introduce an SkImageGenerator API to support the implementation of
externally-managed image decode and scale caches.
BUG=skia:5806
R=reed@google.com
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=4720
Change-Id: Ibfe37af5471f78f28f88f9d5e80938882be1a344
Reviewed-on: https://skia-review.googlesource.com/4720
Commit-Queue: Florin Malita <fmalita@chromium.org>
Reviewed-by: Mike Reed <reed@google.com>
Diffstat (limited to 'src/core/SkBitmapProvider.cpp')
-rw-r--r-- | src/core/SkBitmapProvider.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/core/SkBitmapProvider.cpp b/src/core/SkBitmapProvider.cpp index 8347d32d7f..11b1ac98d1 100644 --- a/src/core/SkBitmapProvider.cpp +++ b/src/core/SkBitmapProvider.cpp @@ -7,6 +7,7 @@ #include "SkBitmapProvider.h" #include "SkImage_Base.h" +#include "SkImageCacherator.h" #include "SkPixelRef.h" int SkBitmapProvider::width() const { @@ -46,3 +47,36 @@ void SkBitmapProvider::notifyAddedToCache() const { bool SkBitmapProvider::asBitmap(SkBitmap* bm) const { return as_IB(fImage)->getROPixels(bm, SkImage::kAllow_CachingHint); } + +bool SkBitmapProvider::accessScaledImage(const SkRect& srcRect, + const SkMatrix& invMatrix, + SkFilterQuality fq, + SkBitmap* scaledBitmap, + SkRect* adjustedSrcRect, + SkFilterQuality* adjustedFilterQuality) const { + if (!fImage) { + return false; + } + + SkImageCacherator* cacherator = as_IB(fImage)->peekCacherator(); + if (!cacherator) { + return false; + } + + // TODO: stash the matrix someplace to avoid invert()? + SkMatrix m; + if (!invMatrix.invert(&m)) { + return false; + } + + SkImageGenerator::ScaledImageRec rec; + if (!cacherator->directAccessScaledImage(srcRect, m, fq, &rec) || + !rec.fImage->asLegacyBitmap(scaledBitmap, SkImage::kRO_LegacyBitmapMode)) { + return false; + } + + *adjustedSrcRect = rec.fSrcRect; + *adjustedFilterQuality = rec.fQuality; + + return true; +} |