Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkImage_Gpu.h" | 8 #include "SkImage_Gpu.h" |
| 9 #include "GrContext.h" | 9 #include "GrContext.h" |
| 10 #include "GrDrawContext.h" | 10 #include "GrDrawContext.h" |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 137 SkImage* SkImage::NewFromTexture(GrContext* ctx, const GrBackendTextureDesc& des c, SkAlphaType at, | 137 SkImage* SkImage::NewFromTexture(GrContext* ctx, const GrBackendTextureDesc& des c, SkAlphaType at, |
| 138 TextureReleaseProc releaseP, ReleaseContext rel easeC) { | 138 TextureReleaseProc releaseP, ReleaseContext rel easeC) { |
| 139 return new_wrapped_texture_common(ctx, desc, at, kBorrow_GrWrapOwnership, re leaseP, releaseC); | 139 return new_wrapped_texture_common(ctx, desc, at, kBorrow_GrWrapOwnership, re leaseP, releaseC); |
| 140 } | 140 } |
| 141 | 141 |
| 142 SkImage* SkImage::NewFromAdoptedTexture(GrContext* ctx, const GrBackendTextureDe sc& desc, | 142 SkImage* SkImage::NewFromAdoptedTexture(GrContext* ctx, const GrBackendTextureDe sc& desc, |
| 143 SkAlphaType at) { | 143 SkAlphaType at) { |
| 144 return new_wrapped_texture_common(ctx, desc, at, kAdopt_GrWrapOwnership, NUL L, NULL); | 144 return new_wrapped_texture_common(ctx, desc, at, kAdopt_GrWrapOwnership, NUL L, NULL); |
| 145 } | 145 } |
| 146 | 146 |
| 147 SkImage* SkImage::NewFromTextureCopy(GrContext* ctx, const GrBackendTextureDesc& srcDesc, | 147 SkImage* SkImage::NewFromTextureCopy(GrContext* ctx, const GrBackendTextureDesc& desc, |
| 148 SkAlphaType at) { | 148 SkAlphaType at) { |
| 149 const bool isBudgeted = true; | 149 if (desc.fWidth <= 0 || desc.fHeight <= 0) { |
| 150 const SkSurface::Budgeted budgeted = SkSurface::kYes_Budgeted; | |
| 151 | |
| 152 if (srcDesc.fWidth <= 0 || srcDesc.fHeight <= 0) { | |
| 153 return NULL; | 150 return NULL; |
| 154 } | 151 } |
| 152 | |
| 155 SkAutoTUnref<GrTexture> src(ctx->textureProvider()->wrapBackendTexture( | 153 SkAutoTUnref<GrTexture> src(ctx->textureProvider()->wrapBackendTexture( |
| 156 srcDesc, kBorrow_GrWrapOwnership)); | 154 desc, kBorrow_GrWrapOwnership)); |
| 157 if (!src) { | 155 if (!src) { |
| 158 return NULL; | 156 return NULL; |
| 159 } | 157 } |
| 160 | 158 |
| 161 GrSurfaceDesc dstDesc; | 159 const bool isBudgeted = true; |
| 162 // need to be a rendertarget for readpixels to work, instead of kNone_GrSurf aceFlags | 160 SkAutoTUnref<GrTexture> dst(GrDeepCopyTexture(src, isBudgeted)); |
| 163 dstDesc.fFlags = kRenderTarget_GrSurfaceFlag; | |
| 164 dstDesc.fOrigin = srcDesc.fOrigin; | |
| 165 dstDesc.fWidth = srcDesc.fWidth; | |
| 166 dstDesc.fHeight = srcDesc.fHeight; | |
| 167 dstDesc.fConfig = srcDesc.fConfig; | |
| 168 dstDesc.fSampleCnt = srcDesc.fSampleCnt; | |
| 169 | |
| 170 SkAutoTUnref<GrTexture> dst(ctx->textureProvider()->createTexture( | |
| 171 dstDesc, isBud geted, NULL, 0)); | |
| 172 if (!dst) { | 161 if (!dst) { |
| 173 return NULL; | 162 return NULL; |
| 174 } | 163 } |
| 175 | 164 |
| 176 const SkIRect srcR = SkIRect::MakeWH(dstDesc.fWidth, dstDesc.fHeight); | 165 const SkSurface::Budgeted budgeted = SkSurface::kYes_Budgeted; |
| 177 const SkIPoint dstP = SkIPoint::Make(0, 0); | |
| 178 ctx->copySurface(dst, src, srcR, dstP, GrContext::kFlushWrites_PixelOp); | |
| 179 | |
| 180 const int sampleCount = 0; // todo: make this an explicit parameter to newS urface()? | 166 const int sampleCount = 0; // todo: make this an explicit parameter to newS urface()? |
| 181 return SkNEW_ARGS(SkImage_Gpu, (dstDesc.fWidth, dstDesc.fHeight, at, dst, sa mpleCount, | 167 return SkNEW_ARGS(SkImage_Gpu, (desc.fWidth, desc.fHeight, at, dst, sampleCo unt, budgeted)); |
| 182 budgeted)); | |
| 183 } | 168 } |
| 184 | 169 |
| 185 SkImage* SkImage::NewFromYUVTexturesCopy(GrContext* ctx , SkYUVColorSpace colorS pace, | 170 SkImage* SkImage::NewFromYUVTexturesCopy(GrContext* ctx , SkYUVColorSpace colorS pace, |
| 186 const GrBackendObject yuvTextureHandles [3], | 171 const GrBackendObject yuvTextureHandles [3], |
| 187 const SkISize yuvSizes[3], | 172 const SkISize yuvSizes[3], |
| 188 GrSurfaceOrigin origin) { | 173 GrSurfaceOrigin origin) { |
| 189 const SkSurface::Budgeted budgeted = SkSurface::kYes_Budgeted; | 174 const SkSurface::Budgeted budgeted = SkSurface::kYes_Budgeted; |
| 190 | 175 |
| 191 if (yuvSizes[0].fWidth <= 0 || yuvSizes[0].fHeight <= 0 || | 176 if (yuvSizes[0].fWidth <= 0 || yuvSizes[0].fHeight <= 0 || |
| 192 yuvSizes[1].fWidth <= 0 || yuvSizes[1].fHeight <= 0 || | 177 yuvSizes[1].fWidth <= 0 || yuvSizes[1].fHeight <= 0 || |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 249 colorSpace))->unref(); | 234 colorSpace))->unref(); |
| 250 | 235 |
| 251 const SkRect rect = SkRect::MakeWH(SkIntToScalar(dstDesc.fWidth), | 236 const SkRect rect = SkRect::MakeWH(SkIntToScalar(dstDesc.fWidth), |
| 252 SkIntToScalar(dstDesc.fHeight)); | 237 SkIntToScalar(dstDesc.fHeight)); |
| 253 GrDrawContext* drawContext = ctx->drawContext(); | 238 GrDrawContext* drawContext = ctx->drawContext(); |
| 254 drawContext->drawRect(dst->asRenderTarget(), GrClip::WideOpen(), paint, SkMa trix::I(), rect); | 239 drawContext->drawRect(dst->asRenderTarget(), GrClip::WideOpen(), paint, SkMa trix::I(), rect); |
| 255 ctx->flushSurfaceWrites(dst); | 240 ctx->flushSurfaceWrites(dst); |
| 256 return SkNEW_ARGS(SkImage_Gpu, (dstDesc.fWidth, dstDesc.fHeight, kOpaque_SkA lphaType, dst, 0, | 241 return SkNEW_ARGS(SkImage_Gpu, (dstDesc.fWidth, dstDesc.fHeight, kOpaque_SkA lphaType, dst, 0, |
| 257 budgeted)); | 242 budgeted)); |
| 258 } | 243 } |
| 244 | |
| 245 //////////////////////////////////////////////////////////////////////////////// /////////////////// | |
| 246 | |
| 247 GrTexture* GrDeepCopyTexture(GrTexture* src, bool budgeted) { | |
| 248 GrContext* ctx = src->getContext(); | |
| 249 | |
| 250 GrSurfaceDesc desc = src->desc(); | |
| 251 // need to be a rendertarget for readpixels to work, instead of kNone_GrSurf aceFlags | |
|
robertphillips
2015/07/06 20:43:47
Should the copied texture inherit the src's kCheck
reed2
2015/07/07 01:18:03
You tell me. I didn't know about that flag. What i
robertphillips
2015/07/07 12:23:59
Tracing through the code it looks like this should
| |
| 252 desc.fFlags = kRenderTarget_GrSurfaceFlag; | |
| 253 GrTexture* dst = ctx->textureProvider()->createTexture(desc, budgeted, NULL, 0); | |
| 254 if (!dst) { | |
| 255 return NULL; | |
| 256 } | |
| 257 | |
| 258 const SkIRect srcR = SkIRect::MakeWH(desc.fWidth, desc.fHeight); | |
| 259 const SkIPoint dstP = SkIPoint::Make(0, 0); | |
| 260 ctx->copySurface(dst, src, srcR, dstP, GrContext::kFlushWrites_PixelOp); | |
| 261 return dst; | |
| 262 } | |
| 263 | |
| OLD | NEW |