sk_sp<SkImage> SkImage_Gpu::onMakeSubset(const SkIRect& subset) const { GrContext* ctx = fTexture->getContext(); GrSurfaceDesc desc = fTexture->desc(); desc.fWidth = subset.width(); desc.fHeight = subset.height(); sk_sp<GrTexture> subTx(ctx->textureProvider()->createTexture(desc, fBudgeted)); if (!subTx) { return nullptr; } ctx->copySurface(subTx.get(), fTexture.get(), subset, SkIPoint::Make(0, 0)); return sk_make_sp<SkImage_Gpu>(desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, fAlphaType, std::move(subTx), fColorSpace, fBudgeted); }
sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override { if (0 == subset.fLeft && 0 == subset.fTop && fTexture->width() == subset.width() && fTexture->height() == subset.height()) { // The existing GrTexture is already tight so reuse it in the SkImage return sk_make_sp<SkImage_Gpu>(fTexture->width(), fTexture->height(), kNeedNewImageUniqueID, fAlphaType, fTexture, SkBudgeted::kYes); } GrContext* ctx = fTexture->getContext(); GrSurfaceDesc desc = fTexture->desc(); desc.fWidth = subset.width(); desc.fHeight = subset.height(); SkAutoTUnref<GrTexture> subTx(ctx->textureProvider()->createTexture(desc, SkBudgeted::kYes)); if (!subTx) { return nullptr; } ctx->copySurface(subTx, fTexture, subset, SkIPoint::Make(0, 0)); return sk_make_sp<SkImage_Gpu>(desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, fAlphaType, subTx, SkBudgeted::kYes); }