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>
This commit is contained in:
Brian Osman 2017-08-16 16:35:54 -04:00 committed by Skia Commit-Bot
parent 8ac36a577f
commit 7314093bf2

View File

@ -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 = SkImageInfo::MakeN32(subset.width(), subset.height(), fBitmap.alphaType());
auto surface(SkSurface::MakeRaster(info));
if (!surface) {
SkImageInfo info = fBitmap.info().makeWH(subset.width(), subset.height());
SkBitmap bitmap;
if (!bitmap.tryAllocPixels(info)) {
return nullptr;
}
surface->getCanvas()->clear(0);
surface->getCanvas()->drawImage(this, SkIntToScalar(-subset.x()), SkIntToScalar(-subset.y()),
nullptr);
return surface->makeImageSnapshot();
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;
}
SkRectMemcpy(dst, bitmap.rowBytes(), src, fBitmap.rowBytes(), bitmap.rowBytes(),
subset.height());
bitmap.setImmutable();
return MakeFromBitmap(bitmap);
}
///////////////////////////////////////////////////////////////////////////////