| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 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 "GrTextureToYUVPlanes.h" | 8 #include "GrTextureToYUVPlanes.h" |
| 9 #include "effects/GrSimpleTextureEffect.h" | 9 #include "effects/GrSimpleTextureEffect.h" |
| 10 #include "effects/GrYUVEffect.h" | 10 #include "effects/GrYUVEffect.h" |
| 11 #include "GrClip.h" | 11 #include "GrClip.h" |
| 12 #include "GrContext.h" | 12 #include "GrContext.h" |
| 13 #include "GrDrawContext.h" | 13 #include "GrDrawContext.h" |
| 14 #include "GrPaint.h" | 14 #include "GrPaint.h" |
| 15 #include "GrTextureProvider.h" | 15 #include "GrTextureProvider.h" |
| 16 | 16 |
| 17 namespace { | 17 namespace { |
| 18 using CreateFPProc = const GrFragmentProcessor* (*)(const GrFragmentProcesso
r*, | 18 using MakeFPProc = sk_sp<GrFragmentProcessor> (*)(sk_sp<GrFragmentProcessor>
, |
| 19 SkYUVColorSpace colorSpa
ce); | 19 SkYUVColorSpace colorSpace
); |
| 20 }; | 20 }; |
| 21 | 21 |
| 22 static bool convert_texture(GrTexture* src, GrDrawContext* dst, int dstW, int ds
tH, | 22 static bool convert_texture(GrTexture* src, GrDrawContext* dst, int dstW, int ds
tH, |
| 23 SkYUVColorSpace colorSpace, CreateFPProc proc) { | 23 SkYUVColorSpace colorSpace, MakeFPProc proc) { |
| 24 | 24 |
| 25 SkScalar xScale = SkIntToScalar(src->width()) / dstW / src->width(); | 25 SkScalar xScale = SkIntToScalar(src->width()) / dstW / src->width(); |
| 26 SkScalar yScale = SkIntToScalar(src->height()) / dstH / src->height(); | 26 SkScalar yScale = SkIntToScalar(src->height()) / dstH / src->height(); |
| 27 GrTextureParams::FilterMode filter; | 27 GrTextureParams::FilterMode filter; |
| 28 if (dstW == src->width() && dstW == src->height()) { | 28 if (dstW == src->width() && dstW == src->height()) { |
| 29 filter = GrTextureParams::kNone_FilterMode; | 29 filter = GrTextureParams::kNone_FilterMode; |
| 30 } else { | 30 } else { |
| 31 filter = GrTextureParams::kBilerp_FilterMode; | 31 filter = GrTextureParams::kBilerp_FilterMode; |
| 32 } | 32 } |
| 33 | 33 |
| 34 SkAutoTUnref<const GrFragmentProcessor> fp( | 34 sk_sp<GrFragmentProcessor> fp( |
| 35 GrSimpleTextureEffect::Create(src, SkMatrix::MakeScale(xScale, yScal
e), filter)); | 35 GrSimpleTextureEffect::Make(src, SkMatrix::MakeScale(xScale, yScale)
, filter)); |
| 36 if (!fp) { | 36 if (!fp) { |
| 37 return false; | 37 return false; |
| 38 } | 38 } |
| 39 fp.reset(proc(fp, colorSpace)); | 39 fp = proc(std::move(fp), colorSpace); |
| 40 if (!fp) { | 40 if (!fp) { |
| 41 return false; | 41 return false; |
| 42 } | 42 } |
| 43 GrPaint paint; | 43 GrPaint paint; |
| 44 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); | 44 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); |
| 45 paint.addColorFragmentProcessor(fp); | 45 paint.addColorFragmentProcessor(std::move(fp)); |
| 46 dst->drawRect(GrNoClip(), paint, SkMatrix::I(), SkRect::MakeIWH(dstW, dstH))
; | 46 dst->drawRect(GrNoClip(), paint, SkMatrix::I(), SkRect::MakeIWH(dstW, dstH))
; |
| 47 return true; | 47 return true; |
| 48 } | 48 } |
| 49 | 49 |
| 50 bool GrTextureToYUVPlanes(GrTexture* texture, const SkISize sizes[3], void* cons
t planes[3], | 50 bool GrTextureToYUVPlanes(GrTexture* texture, const SkISize sizes[3], void* cons
t planes[3], |
| 51 const size_t rowBytes[3], SkYUVColorSpace colorSpace)
{ | 51 const size_t rowBytes[3], SkYUVColorSpace colorSpace)
{ |
| 52 if (GrContext* context = texture->getContext()) { | 52 if (GrContext* context = texture->getContext()) { |
| 53 // Depending on the relative sizes of the y, u, and v planes we may do 1
to 3 draws/ | 53 // Depending on the relative sizes of the y, u, and v planes we may do 1
to 3 draws/ |
| 54 // readbacks. | 54 // readbacks. |
| 55 sk_sp<GrDrawContext> yuvDrawContext; | 55 sk_sp<GrDrawContext> yuvDrawContext; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 if (!uDrawContext || !vDrawContext) { | 100 if (!uDrawContext || !vDrawContext) { |
| 101 return false; | 101 return false; |
| 102 } | 102 } |
| 103 } | 103 } |
| 104 } | 104 } |
| 105 | 105 |
| 106 // Do all the draws before any readback. | 106 // Do all the draws before any readback. |
| 107 if (yuvDrawContext) { | 107 if (yuvDrawContext) { |
| 108 if (!convert_texture(texture, yuvDrawContext.get(), | 108 if (!convert_texture(texture, yuvDrawContext.get(), |
| 109 sizes[0].fWidth, sizes[0].fHeight, | 109 sizes[0].fWidth, sizes[0].fHeight, |
| 110 colorSpace, GrYUVEffect::CreateRGBToYUV)) { | 110 colorSpace, GrYUVEffect::MakeRGBToYUV)) { |
| 111 return false; | 111 return false; |
| 112 } | 112 } |
| 113 } else { | 113 } else { |
| 114 SkASSERT(yDrawContext); | 114 SkASSERT(yDrawContext); |
| 115 if (!convert_texture(texture, yDrawContext.get(), | 115 if (!convert_texture(texture, yDrawContext.get(), |
| 116 sizes[0].fWidth, sizes[0].fHeight, | 116 sizes[0].fWidth, sizes[0].fHeight, |
| 117 colorSpace, GrYUVEffect::CreateRGBToY)) { | 117 colorSpace, GrYUVEffect::MakeRGBToY)) { |
| 118 return false; | 118 return false; |
| 119 } | 119 } |
| 120 if (uvDrawContext) { | 120 if (uvDrawContext) { |
| 121 if (!convert_texture(texture, uvDrawContext.get(), | 121 if (!convert_texture(texture, uvDrawContext.get(), |
| 122 sizes[1].fWidth, sizes[1].fHeight, | 122 sizes[1].fWidth, sizes[1].fHeight, |
| 123 colorSpace, GrYUVEffect::CreateRGBToUV)) { | 123 colorSpace, GrYUVEffect::MakeRGBToUV)) { |
| 124 return false; | 124 return false; |
| 125 } | 125 } |
| 126 } else { | 126 } else { |
| 127 SkASSERT(uDrawContext && vDrawContext); | 127 SkASSERT(uDrawContext && vDrawContext); |
| 128 if (!convert_texture(texture, uDrawContext.get(), | 128 if (!convert_texture(texture, uDrawContext.get(), |
| 129 sizes[1].fWidth, sizes[1].fHeight, | 129 sizes[1].fWidth, sizes[1].fHeight, |
| 130 colorSpace, GrYUVEffect::CreateRGBToU)) { | 130 colorSpace, GrYUVEffect::MakeRGBToU)) { |
| 131 return false; | 131 return false; |
| 132 } | 132 } |
| 133 if (!convert_texture(texture, vDrawContext.get(), | 133 if (!convert_texture(texture, vDrawContext.get(), |
| 134 sizes[2].fWidth, sizes[2].fHeight, | 134 sizes[2].fWidth, sizes[2].fHeight, |
| 135 colorSpace, GrYUVEffect::CreateRGBToV)) { | 135 colorSpace, GrYUVEffect::MakeRGBToV)) { |
| 136 return false; | 136 return false; |
| 137 } | 137 } |
| 138 } | 138 } |
| 139 } | 139 } |
| 140 | 140 |
| 141 if (yuvDrawContext) { | 141 if (yuvDrawContext) { |
| 142 SkASSERT(sizes[0] == sizes[1] && sizes[1] == sizes[2]); | 142 SkASSERT(sizes[0] == sizes[1] && sizes[1] == sizes[2]); |
| 143 sk_sp<GrTexture> yuvTex(yuvDrawContext->asTexture()); | 143 sk_sp<GrTexture> yuvTex(yuvDrawContext->asTexture()); |
| 144 SkASSERT(yuvTex); | 144 SkASSERT(yuvTex); |
| 145 SkISize yuvSize = sizes[0]; | 145 SkISize yuvSize = sizes[0]; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 if (!tex->readPixels(0, 0, sizes[2].fWidth, sizes[2].fHeight, | 221 if (!tex->readPixels(0, 0, sizes[2].fWidth, sizes[2].fHeight, |
| 222 kAlpha_8_GrPixelConfig, planes[2], rowBytes
[2])) { | 222 kAlpha_8_GrPixelConfig, planes[2], rowBytes
[2])) { |
| 223 return false; | 223 return false; |
| 224 } | 224 } |
| 225 return true; | 225 return true; |
| 226 } | 226 } |
| 227 } | 227 } |
| 228 } | 228 } |
| 229 return false; | 229 return false; |
| 230 } | 230 } |
| OLD | NEW |