aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkBitmapProvider.cpp
diff options
context:
space:
mode:
authorGravatar Florin Malita <fmalita@chromium.org>2016-11-16 14:45:34 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2016-11-16 20:24:48 +0000
commitca79535dcb36ab3691eadc8664b687f4cd8a56b5 (patch)
treebb3f354cff997f717ed27025897f7973b3a340fc /src/core/SkBitmapProvider.cpp
parentcb677668519d117c51a7ca78375fee577f8f2aa9 (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.cpp34
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;
+}