Index: src/image/SkImage_Gpu.cpp |
diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp |
index 163e62e02df540362952e9b55be47d3284d886a7..1a63a0d6ba3cf51af625d616d77cb27de4c459fb 100644 |
--- a/src/image/SkImage_Gpu.cpp |
+++ b/src/image/SkImage_Gpu.cpp |
@@ -15,10 +15,9 @@ |
#include "SkPixelRef.h" |
SkImage_Gpu::SkImage_Gpu(int w, int h, uint32_t uniqueID, SkAlphaType at, GrTexture* tex, |
- int sampleCountForNewSurfaces, SkSurface::Budgeted budgeted) |
+ SkSurface::Budgeted budgeted) |
: INHERITED(w, h, uniqueID, nullptr) |
, fTexture(SkRef(tex)) |
- , fSampleCountForNewSurfaces(sampleCountForNewSurfaces) |
, fAlphaType(at) |
, fBudgeted(budgeted) |
, fAddedRasterVersionToCache(false) |
@@ -30,19 +29,6 @@ SkImage_Gpu::~SkImage_Gpu() { |
} |
} |
-SkSurface* SkImage_Gpu::onNewSurface(const SkImageInfo& info, const SkSurfaceProps& props) const { |
- GrTexture* tex = this->getTexture(); |
- SkASSERT(tex); |
- GrContext* ctx = tex->getContext(); |
- if (!ctx) { |
- // the texture may have been abandoned, so we have to check |
- return nullptr; |
- } |
- // TODO: Change signature of onNewSurface to take a budgeted param. |
- const SkSurface::Budgeted budgeted = SkSurface::kNo_Budgeted; |
- return SkSurface::NewRenderTarget(ctx, budgeted, info, fSampleCountForNewSurfaces, &props); |
-} |
- |
extern void SkTextureImageApplyBudgetedDecision(SkImage* image) { |
if (as_IB(image)->getTexture()) { |
((SkImage_Gpu*)image)->applyBudgetDecision(); |
@@ -136,6 +122,22 @@ bool SkImage_Gpu::onReadPixels(const SkImageInfo& info, void* pixels, size_t row |
return true; |
} |
+SkImage* SkImage_Gpu::onNewSubset(const SkIRect& subset) const { |
+ GrContext* ctx = fTexture->getContext(); |
+ GrSurfaceDesc desc = fTexture->desc(); |
+ desc.fWidth = subset.width(); |
+ desc.fHeight = subset.height(); |
+ |
+ GrTexture* subTx = ctx->textureProvider()->createTexture(desc, |
+ SkSurface::kYes_Budgeted == fBudgeted); |
+ if (!subTx) { |
+ return nullptr; |
+ } |
+ ctx->copySurface(subTx, fTexture, subset, SkIPoint::Make(0, 0)); |
+ return new SkImage_Gpu(desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, fAlphaType, subTx, |
+ fBudgeted); |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
static SkImage* new_wrapped_texture_common(GrContext* ctx, const GrBackendTextureDesc& desc, |
@@ -154,7 +156,7 @@ static SkImage* new_wrapped_texture_common(GrContext* ctx, const GrBackendTextur |
} |
const SkSurface::Budgeted budgeted = SkSurface::kNo_Budgeted; |
- return new SkImage_Gpu(desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, at, tex, 0, budgeted); |
+ return new SkImage_Gpu(desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, at, tex, budgeted); |
} |
SkImage* SkImage::NewFromTexture(GrContext* ctx, const GrBackendTextureDesc& desc, SkAlphaType at, |
@@ -186,8 +188,7 @@ SkImage* SkImage::NewFromTextureCopy(GrContext* ctx, const GrBackendTextureDesc& |
} |
const SkSurface::Budgeted budgeted = SkSurface::kYes_Budgeted; |
- const int sampleCount = 0; // todo: make this an explicit parameter to newSurface()? |
- return new SkImage_Gpu(desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, at, dst, sampleCount, |
+ return new SkImage_Gpu(desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, at, dst, |
budgeted); |
} |
@@ -267,7 +268,7 @@ SkImage* SkImage::NewFromYUVTexturesCopy(GrContext* ctx , SkYUVColorSpace colorS |
drawContext->drawRect(dst->asRenderTarget(), GrClip::WideOpen(), paint, SkMatrix::I(), rect); |
ctx->flushSurfaceWrites(dst); |
return new SkImage_Gpu(dstDesc.fWidth, dstDesc.fHeight, kNeedNewImageUniqueID, |
- kOpaque_SkAlphaType, dst, 0, budgeted); |
+ kOpaque_SkAlphaType, dst, budgeted); |
} |
/////////////////////////////////////////////////////////////////////////////////////////////////// |