diff options
author | 2015-07-07 06:11:19 -0700 | |
---|---|---|
committer | 2015-07-07 06:11:20 -0700 | |
commit | 5617900063f69754de62b8b12d32f6e36df14104 (patch) | |
tree | 07064e2e25565b7b6e4ee2b953ea9b2cde804091 /src/image/SkImage_Gpu.cpp | |
parent | 6f29a3c92c976017608a626d0449dda8b603277a (diff) |
add SkImage::NewFromBitmap
BUG=skia:
Review URL: https://codereview.chromium.org/1217053003
Diffstat (limited to 'src/image/SkImage_Gpu.cpp')
-rw-r--r-- | src/image/SkImage_Gpu.cpp | 51 |
1 files changed, 28 insertions, 23 deletions
diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp index 4003631c8a..d9ae619e5f 100644 --- a/src/image/SkImage_Gpu.cpp +++ b/src/image/SkImage_Gpu.cpp @@ -144,42 +144,27 @@ SkImage* SkImage::NewFromAdoptedTexture(GrContext* ctx, const GrBackendTextureDe return new_wrapped_texture_common(ctx, desc, at, kAdopt_GrWrapOwnership, NULL, NULL); } -SkImage* SkImage::NewFromTextureCopy(GrContext* ctx, const GrBackendTextureDesc& srcDesc, +SkImage* SkImage::NewFromTextureCopy(GrContext* ctx, const GrBackendTextureDesc& desc, SkAlphaType at) { - const bool isBudgeted = true; - const SkSurface::Budgeted budgeted = SkSurface::kYes_Budgeted; - - if (srcDesc.fWidth <= 0 || srcDesc.fHeight <= 0) { + if (desc.fWidth <= 0 || desc.fHeight <= 0) { return NULL; } + SkAutoTUnref<GrTexture> src(ctx->textureProvider()->wrapBackendTexture( - srcDesc, kBorrow_GrWrapOwnership)); + desc, kBorrow_GrWrapOwnership)); if (!src) { return NULL; } - GrSurfaceDesc dstDesc; - // need to be a rendertarget for readpixels to work, instead of kNone_GrSurfaceFlags - dstDesc.fFlags = kRenderTarget_GrSurfaceFlag; - dstDesc.fOrigin = srcDesc.fOrigin; - dstDesc.fWidth = srcDesc.fWidth; - dstDesc.fHeight = srcDesc.fHeight; - dstDesc.fConfig = srcDesc.fConfig; - dstDesc.fSampleCnt = srcDesc.fSampleCnt; - - SkAutoTUnref<GrTexture> dst(ctx->textureProvider()->createTexture( - dstDesc, isBudgeted, NULL, 0)); + const bool isBudgeted = true; + SkAutoTUnref<GrTexture> dst(GrDeepCopyTexture(src, isBudgeted)); if (!dst) { return NULL; } - const SkIRect srcR = SkIRect::MakeWH(dstDesc.fWidth, dstDesc.fHeight); - const SkIPoint dstP = SkIPoint::Make(0, 0); - ctx->copySurface(dst, src, srcR, dstP, GrContext::kFlushWrites_PixelOp); - + const SkSurface::Budgeted budgeted = SkSurface::kYes_Budgeted; const int sampleCount = 0; // todo: make this an explicit parameter to newSurface()? - return SkNEW_ARGS(SkImage_Gpu, (dstDesc.fWidth, dstDesc.fHeight, at, dst, sampleCount, - budgeted)); + return SkNEW_ARGS(SkImage_Gpu, (desc.fWidth, desc.fHeight, at, dst, sampleCount, budgeted)); } SkImage* SkImage::NewFromYUVTexturesCopy(GrContext* ctx , SkYUVColorSpace colorSpace, @@ -256,3 +241,23 @@ SkImage* SkImage::NewFromYUVTexturesCopy(GrContext* ctx , SkYUVColorSpace colorS return SkNEW_ARGS(SkImage_Gpu, (dstDesc.fWidth, dstDesc.fHeight, kOpaque_SkAlphaType, dst, 0, budgeted)); } + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +GrTexture* GrDeepCopyTexture(GrTexture* src, bool budgeted) { + GrContext* ctx = src->getContext(); + + GrSurfaceDesc desc = src->desc(); + // need to be a rendertarget for readpixels to work, instead of kNone_GrSurfaceFlags + desc.fFlags = kRenderTarget_GrSurfaceFlag; + GrTexture* dst = ctx->textureProvider()->createTexture(desc, budgeted, NULL, 0); + if (!dst) { + return NULL; + } + + const SkIRect srcR = SkIRect::MakeWH(desc.fWidth, desc.fHeight); + const SkIPoint dstP = SkIPoint::Make(0, 0); + ctx->copySurface(dst, src, srcR, dstP, GrContext::kFlushWrites_PixelOp); + return dst; +} + |