diff options
author | reed <reed@google.com> | 2015-08-18 11:16:09 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-18 11:16:09 -0700 |
commit | 935d6cfaa78b6be75c9fcc596805f0f9b8da972e (patch) | |
tree | 2e3eb27f6c0a2d538f2e4e4922627a7c9e1fb30d /src/core/SkPictureImageGenerator.cpp | |
parent | f272bb03df9b86e7ea2cf23fb4d5cc56624e0118 (diff) |
Add subsets to SkImageGenerator and SkImageCacherator
... to support subsets in SkImage!
BUG=skia:
Review URL: https://codereview.chromium.org/1301633002
Diffstat (limited to 'src/core/SkPictureImageGenerator.cpp')
-rw-r--r-- | src/core/SkPictureImageGenerator.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/core/SkPictureImageGenerator.cpp b/src/core/SkPictureImageGenerator.cpp index f92de3b986..acff84c1b4 100644 --- a/src/core/SkPictureImageGenerator.cpp +++ b/src/core/SkPictureImageGenerator.cpp @@ -22,7 +22,7 @@ protected: bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkPMColor ctable[], int* ctableCount) override; #if SK_SUPPORT_GPU - GrTexture* onGenerateTexture(GrContext*, SkImageUsageType) override; + GrTexture* onGenerateTexture(GrContext*, SkImageUsageType, const SkIRect*) override; #endif private: @@ -88,18 +88,27 @@ SkImageGenerator* SkImageGenerator::NewFromPicture(const SkISize& size, const Sk #if SK_SUPPORT_GPU #include "GrTexture.h" -GrTexture* SkPictureImageGenerator::onGenerateTexture(GrContext* ctx, SkImageUsageType usage) { +GrTexture* SkPictureImageGenerator::onGenerateTexture(GrContext* ctx, SkImageUsageType usage, + const SkIRect* subset) { + const SkImageInfo& info = this->getInfo(); + SkImageInfo surfaceInfo = subset ? info.makeWH(subset->width(), subset->height()) : info; + // // TODO: respect the usage, by possibly creating a different (pow2) surface // SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(ctx, SkSurface::kYes_Budgeted, - this->getInfo())); + surfaceInfo)); if (!surface.get()) { return nullptr; } + + SkMatrix matrix = fMatrix; + if (subset) { + matrix.postTranslate(-subset->x(), -subset->y()); + } surface->getCanvas()->clear(0); // does NewRenderTarget promise to do this for us? - surface->getCanvas()->drawPicture(fPicture, &fMatrix, fPaint.getMaybeNull()); + surface->getCanvas()->drawPicture(fPicture, &matrix, fPaint.getMaybeNull()); SkAutoTUnref<SkImage> image(surface->newImageSnapshot()); if (!image.get()) { return nullptr; |