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:
parent
8ac36a577f
commit
7314093bf2
@ -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);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
Loading…
Reference in New Issue
Block a user