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" |
11 #include "effects/GrYUVtoRGBEffect.h" | 11 #include "effects/GrYUVtoRGBEffect.h" |
12 #include "SkCanvas.h" | 12 #include "SkCanvas.h" |
13 #include "SkGpuDevice.h" | 13 #include "SkGpuDevice.h" |
14 | 14 |
15 | 15 |
16 SkImage_Gpu::SkImage_Gpu(int w, int h, SkAlphaType at, GrTexture* tex, | 16 SkImage_Gpu::SkImage_Gpu(int w, int h, uint32_t uniqueID, SkAlphaType at, GrText
ure* tex, |
17 int sampleCountForNewSurfaces, SkSurface::Budgeted budg
eted) | 17 int sampleCountForNewSurfaces, SkSurface::Budgeted budg
eted) |
18 : INHERITED(w, h, NULL) | 18 : INHERITED(w, h, uniqueID, NULL) |
19 , fTexture(SkRef(tex)) | 19 , fTexture(SkRef(tex)) |
20 , fSampleCountForNewSurfaces(sampleCountForNewSurfaces) | 20 , fSampleCountForNewSurfaces(sampleCountForNewSurfaces) |
21 , fAlphaType(at) | 21 , fAlphaType(at) |
22 , fBudgeted(budgeted) | 22 , fBudgeted(budgeted) |
23 {} | 23 {} |
24 | 24 |
25 SkSurface* SkImage_Gpu::onNewSurface(const SkImageInfo& info, const SkSurfacePro
ps& props) const { | 25 SkSurface* SkImage_Gpu::onNewSurface(const SkImageInfo& info, const SkSurfacePro
ps& props) const { |
26 GrTexture* tex = this->getTexture(); | 26 GrTexture* tex = this->getTexture(); |
27 SkASSERT(tex); | 27 SkASSERT(tex); |
28 GrContext* ctx = tex->getContext(); | 28 GrContext* ctx = tex->getContext(); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 } | 123 } |
124 SkAutoTUnref<GrTexture> tex(ctx->textureProvider()->wrapBackendTexture(desc,
ownership)); | 124 SkAutoTUnref<GrTexture> tex(ctx->textureProvider()->wrapBackendTexture(desc,
ownership)); |
125 if (!tex) { | 125 if (!tex) { |
126 return NULL; | 126 return NULL; |
127 } | 127 } |
128 if (releaseProc) { | 128 if (releaseProc) { |
129 tex->setRelease(releaseProc, releaseCtx); | 129 tex->setRelease(releaseProc, releaseCtx); |
130 } | 130 } |
131 | 131 |
132 const SkSurface::Budgeted budgeted = SkSurface::kNo_Budgeted; | 132 const SkSurface::Budgeted budgeted = SkSurface::kNo_Budgeted; |
133 return SkNEW_ARGS(SkImage_Gpu, (desc.fWidth, desc.fHeight, at, tex, 0, budge
ted)); | 133 return SkNEW_ARGS(SkImage_Gpu, |
| 134 (desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, at, tex
, 0, budgeted)); |
134 | 135 |
135 } | 136 } |
136 | 137 |
137 SkImage* SkImage::NewFromTexture(GrContext* ctx, const GrBackendTextureDesc& des
c, SkAlphaType at, | 138 SkImage* SkImage::NewFromTexture(GrContext* ctx, const GrBackendTextureDesc& des
c, SkAlphaType at, |
138 TextureReleaseProc releaseP, ReleaseContext rel
easeC) { | 139 TextureReleaseProc releaseP, ReleaseContext rel
easeC) { |
139 return new_wrapped_texture_common(ctx, desc, at, kBorrow_GrWrapOwnership, re
leaseP, releaseC); | 140 return new_wrapped_texture_common(ctx, desc, at, kBorrow_GrWrapOwnership, re
leaseP, releaseC); |
140 } | 141 } |
141 | 142 |
142 SkImage* SkImage::NewFromAdoptedTexture(GrContext* ctx, const GrBackendTextureDe
sc& desc, | 143 SkImage* SkImage::NewFromAdoptedTexture(GrContext* ctx, const GrBackendTextureDe
sc& desc, |
143 SkAlphaType at) { | 144 SkAlphaType at) { |
(...skipping 13 matching lines...) Expand all Loading... |
157 } | 158 } |
158 | 159 |
159 const bool isBudgeted = true; | 160 const bool isBudgeted = true; |
160 SkAutoTUnref<GrTexture> dst(GrDeepCopyTexture(src, isBudgeted)); | 161 SkAutoTUnref<GrTexture> dst(GrDeepCopyTexture(src, isBudgeted)); |
161 if (!dst) { | 162 if (!dst) { |
162 return NULL; | 163 return NULL; |
163 } | 164 } |
164 | 165 |
165 const SkSurface::Budgeted budgeted = SkSurface::kYes_Budgeted; | 166 const SkSurface::Budgeted budgeted = SkSurface::kYes_Budgeted; |
166 const int sampleCount = 0; // todo: make this an explicit parameter to newS
urface()? | 167 const int sampleCount = 0; // todo: make this an explicit parameter to newS
urface()? |
167 return SkNEW_ARGS(SkImage_Gpu, (desc.fWidth, desc.fHeight, at, dst, sampleCo
unt, budgeted)); | 168 return SkNEW_ARGS(SkImage_Gpu, (desc.fWidth, desc.fHeight, kNeedNewImageUniq
ueID, |
| 169 at, dst, sampleCount, budgeted)); |
168 } | 170 } |
169 | 171 |
170 SkImage* SkImage::NewFromYUVTexturesCopy(GrContext* ctx , SkYUVColorSpace colorS
pace, | 172 SkImage* SkImage::NewFromYUVTexturesCopy(GrContext* ctx , SkYUVColorSpace colorS
pace, |
171 const GrBackendObject yuvTextureHandles
[3], | 173 const GrBackendObject yuvTextureHandles
[3], |
172 const SkISize yuvSizes[3], | 174 const SkISize yuvSizes[3], |
173 GrSurfaceOrigin origin) { | 175 GrSurfaceOrigin origin) { |
174 const SkSurface::Budgeted budgeted = SkSurface::kYes_Budgeted; | 176 const SkSurface::Budgeted budgeted = SkSurface::kYes_Budgeted; |
175 | 177 |
176 if (yuvSizes[0].fWidth <= 0 || yuvSizes[0].fHeight <= 0 || | 178 if (yuvSizes[0].fWidth <= 0 || yuvSizes[0].fHeight <= 0 || |
177 yuvSizes[1].fWidth <= 0 || yuvSizes[1].fHeight <= 0 || | 179 yuvSizes[1].fWidth <= 0 || yuvSizes[1].fHeight <= 0 || |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 GrPaint paint; | 233 GrPaint paint; |
232 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); | 234 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); |
233 paint.addColorProcessor(GrYUVtoRGBEffect::Create(paint.getProcessorDataManag
er(), yTex, uTex, | 235 paint.addColorProcessor(GrYUVtoRGBEffect::Create(paint.getProcessorDataManag
er(), yTex, uTex, |
234 vTex, yuvSizes, colorSpace)
)->unref(); | 236 vTex, yuvSizes, colorSpace)
)->unref(); |
235 | 237 |
236 const SkRect rect = SkRect::MakeWH(SkIntToScalar(dstDesc.fWidth), | 238 const SkRect rect = SkRect::MakeWH(SkIntToScalar(dstDesc.fWidth), |
237 SkIntToScalar(dstDesc.fHeight)); | 239 SkIntToScalar(dstDesc.fHeight)); |
238 GrDrawContext* drawContext = ctx->drawContext(); | 240 GrDrawContext* drawContext = ctx->drawContext(); |
239 drawContext->drawRect(dst->asRenderTarget(), GrClip::WideOpen(), paint, SkMa
trix::I(), rect); | 241 drawContext->drawRect(dst->asRenderTarget(), GrClip::WideOpen(), paint, SkMa
trix::I(), rect); |
240 ctx->flushSurfaceWrites(dst); | 242 ctx->flushSurfaceWrites(dst); |
241 return SkNEW_ARGS(SkImage_Gpu, (dstDesc.fWidth, dstDesc.fHeight, kOpaque_SkA
lphaType, dst, 0, | 243 return SkNEW_ARGS(SkImage_Gpu, (dstDesc.fWidth, dstDesc.fHeight, kNeedNewIma
geUniqueID, |
242 budgeted)); | 244 kOpaque_SkAlphaType, dst, 0, budgeted)); |
243 } | 245 } |
244 | 246 |
245 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 247 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
246 | 248 |
247 GrTexture* GrDeepCopyTexture(GrTexture* src, bool budgeted) { | 249 GrTexture* GrDeepCopyTexture(GrTexture* src, bool budgeted) { |
248 GrContext* ctx = src->getContext(); | 250 GrContext* ctx = src->getContext(); |
249 | 251 |
250 GrSurfaceDesc desc = src->desc(); | 252 GrSurfaceDesc desc = src->desc(); |
251 GrTexture* dst = ctx->textureProvider()->createTexture(desc, budgeted, NULL,
0); | 253 GrTexture* dst = ctx->textureProvider()->createTexture(desc, budgeted, NULL,
0); |
252 if (!dst) { | 254 if (!dst) { |
253 return NULL; | 255 return NULL; |
254 } | 256 } |
255 | 257 |
256 const SkIRect srcR = SkIRect::MakeWH(desc.fWidth, desc.fHeight); | 258 const SkIRect srcR = SkIRect::MakeWH(desc.fWidth, desc.fHeight); |
257 const SkIPoint dstP = SkIPoint::Make(0, 0); | 259 const SkIPoint dstP = SkIPoint::Make(0, 0); |
258 ctx->copySurface(dst, src, srcR, dstP, GrContext::kFlushWrites_PixelOp); | 260 ctx->copySurface(dst, src, srcR, dstP, GrContext::kFlushWrites_PixelOp); |
259 return dst; | 261 return dst; |
260 } | 262 } |
261 | 263 |
OLD | NEW |