diff options
author | Brian Osman <brianosman@google.com> | 2017-08-16 16:35:54 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-08-17 11:50:56 +0000 |
commit | 7314093bf2ca99c7b13ff85926f3583bd58d1e31 (patch) | |
tree | 5416f85bf7be16d8c618ea1b0a3e03f09d6432c6 /src/image/SkImage_Raster.cpp | |
parent | 8ac36a577f14158c820bbc673f477a7ce20702e5 (diff) |
Support color space and other color types in SkImage_Raster::onMakeSubset
Bug: skia:6858
Change-Id: I96bd8f6e918ad1f4aa7001d2343b3ae4951cdd4f
Reviewed-on: https://skia-review.googlesource.com/35560
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'src/image/SkImage_Raster.cpp')
-rw-r--r-- | src/image/SkImage_Raster.cpp | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp index 5b6ebf0ec8..5b7e83f3a7 100644 --- a/src/image/SkImage_Raster.cpp +++ b/src/image/SkImage_Raster.cpp @@ -13,6 +13,7 @@ #include "SkColorSpaceXformImageGenerator.h" #include "SkColorSpaceXformPriv.h" #include "SkColorTable.h" +#include "SkConvertPixels.h" #include "SkData.h" #include "SkImageInfoPriv.h" #include "SkImagePriv.h" @@ -239,17 +240,24 @@ void SkImage_Raster::onUnpinAsTexture(GrContext* ctx) const { #endif sk_sp<SkImage> SkImage_Raster::onMakeSubset(const SkIRect& subset) const { - // TODO : could consider heurist of sharing pixels, if subset is pretty close to complete + SkImageInfo info = fBitmap.info().makeWH(subset.width(), subset.height()); + SkBitmap bitmap; + if (!bitmap.tryAllocPixels(info)) { + return nullptr; + } - SkImageInfo info = SkImageInfo::MakeN32(subset.width(), subset.height(), fBitmap.alphaType()); - auto surface(SkSurface::MakeRaster(info)); - if (!surface) { + void* dst = bitmap.getPixels(); + void* src = fBitmap.getAddr(subset.x(), subset.y()); + if (!dst || !src) { + SkDEBUGFAIL("SkImage_Raster::onMakeSubset with nullptr src or dst"); return nullptr; } - surface->getCanvas()->clear(0); - surface->getCanvas()->drawImage(this, SkIntToScalar(-subset.x()), SkIntToScalar(-subset.y()), - nullptr); - return surface->makeImageSnapshot(); + + SkRectMemcpy(dst, bitmap.rowBytes(), src, fBitmap.rowBytes(), bitmap.rowBytes(), + subset.height()); + + bitmap.setImmutable(); + return MakeFromBitmap(bitmap); } /////////////////////////////////////////////////////////////////////////////// |