aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/image/SkImage_Raster.cpp
diff options
context:
space:
mode:
authorGravatar Brian Osman <brianosman@google.com>2017-08-16 16:35:54 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-08-17 11:50:56 +0000
commit7314093bf2ca99c7b13ff85926f3583bd58d1e31 (patch)
tree5416f85bf7be16d8c618ea1b0a3e03f09d6432c6 /src/image/SkImage_Raster.cpp
parent8ac36a577f14158c820bbc673f477a7ce20702e5 (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.cpp24
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);
}
///////////////////////////////////////////////////////////////////////////////