Chromium Code Reviews| Index: src/gpu/effects/GrYUVtoRGBEffect.cpp |
| diff --git a/src/gpu/effects/GrYUVtoRGBEffect.cpp b/src/gpu/effects/GrYUVtoRGBEffect.cpp |
| index 736135282c2dbc7d1a51e5703542f3c070abe83e..3f0314e171a2e19129f8f9b259c50bb96aa92d40 100644 |
| --- a/src/gpu/effects/GrYUVtoRGBEffect.cpp |
| +++ b/src/gpu/effects/GrYUVtoRGBEffect.cpp |
| @@ -18,8 +18,22 @@ namespace { |
| class YUVtoRGBEffect : public GrFragmentProcessor { |
| public: |
| static GrFragmentProcessor* Create(GrTexture* yTexture, GrTexture* uTexture, |
| - GrTexture* vTexture, SkYUVColorSpace colorSpace) { |
| - return SkNEW_ARGS(YUVtoRGBEffect, (yTexture, uTexture, vTexture, colorSpace)); |
| + GrTexture* vTexture, SkISize sizes[3], |
| + SkYUVColorSpace colorSpace) { |
| + SkScalar w[3], h[3]; |
| + w[0] = SkIntToScalar(sizes[0].fWidth) / SkIntToScalar(yTexture ? yTexture->width() : 1); |
|
bsalomon
2015/02/13 18:26:09
can these textures really every be NULL?
|
| + h[0] = SkIntToScalar(sizes[0].fHeight) / SkIntToScalar(yTexture ? yTexture->height() : 1); |
| + w[1] = SkIntToScalar(sizes[1].fWidth) / SkIntToScalar(uTexture ? uTexture->width() : 1); |
| + h[1] = SkIntToScalar(sizes[1].fHeight) / SkIntToScalar(uTexture ? uTexture->height() : 1); |
| + w[2] = SkIntToScalar(sizes[2].fWidth) / SkIntToScalar(vTexture ? vTexture->width() : 1); |
| + h[2] = SkIntToScalar(sizes[2].fHeight) / SkIntToScalar(vTexture ? vTexture->height() : 1); |
| + SkMatrix yuvMatrix[3]; |
| + yuvMatrix[0] = GrCoordTransform::MakeDivByTextureWHMatrix(yTexture); |
| + yuvMatrix[1] = yuvMatrix[0]; |
| + yuvMatrix[1].preScale(w[1] / w[0], h[1] / h[0]); |
| + yuvMatrix[2] = yuvMatrix[0]; |
| + yuvMatrix[2].preScale(w[2] / w[0], h[2] / h[0]); |
| + return SkNEW_ARGS(YUVtoRGBEffect, (yTexture, uTexture, vTexture, yuvMatrix, colorSpace)); |
| } |
| const char* name() const SK_OVERRIDE { return "YUV to RGB"; } |
| @@ -53,9 +67,9 @@ public: |
| fsBuilder->codeAppendf("\t%s = vec4(\n\t\t", outputColor); |
| fsBuilder->appendTextureLookup(samplers[0], coords[0].c_str(), coords[0].getType()); |
| fsBuilder->codeAppend(".r,\n\t\t"); |
| - fsBuilder->appendTextureLookup(samplers[1], coords[0].c_str(), coords[0].getType()); |
| + fsBuilder->appendTextureLookup(samplers[1], coords[1].c_str(), coords[1].getType()); |
| fsBuilder->codeAppend(".r,\n\t\t"); |
| - fsBuilder->appendTextureLookup(samplers[2], coords[0].c_str(), coords[0].getType()); |
| + fsBuilder->appendTextureLookup(samplers[2], coords[2].c_str(), coords[2].getType()); |
| fsBuilder->codeAppendf(".r,\n\t\t1.0) * %s;\n", yuvMatrix); |
| } |
| @@ -89,18 +103,20 @@ public: |
| private: |
| YUVtoRGBEffect(GrTexture* yTexture, GrTexture* uTexture, GrTexture* vTexture, |
| - SkYUVColorSpace colorSpace) |
| - : fCoordTransform(kLocal_GrCoordSet, |
| - GrCoordTransform::MakeDivByTextureWHMatrix(yTexture), |
| - yTexture, GrTextureParams::kNone_FilterMode) |
| + SkMatrix yuvMatrix[3], SkYUVColorSpace colorSpace) |
| + : fYTransform(kLocal_GrCoordSet, yuvMatrix[0], yTexture, GrTextureParams::kNone_FilterMode) |
| , fYAccess(yTexture) |
| + , fUTransform(kLocal_GrCoordSet, yuvMatrix[1], uTexture, GrTextureParams::kNone_FilterMode) |
| , fUAccess(uTexture) |
| + , fVTransform(kLocal_GrCoordSet, yuvMatrix[2], vTexture, GrTextureParams::kNone_FilterMode) |
| , fVAccess(vTexture) |
| , fColorSpace(colorSpace) { |
| this->initClassID<YUVtoRGBEffect>(); |
| - this->addCoordTransform(&fCoordTransform); |
| + this->addCoordTransform(&fYTransform); |
| this->addTextureAccess(&fYAccess); |
| + this->addCoordTransform(&fUTransform); |
| this->addTextureAccess(&fUAccess); |
| + this->addCoordTransform(&fVTransform); |
| this->addTextureAccess(&fVAccess); |
| } |
| @@ -115,9 +131,11 @@ private: |
| GrInvariantOutput::kWillNot_ReadInput); |
| } |
| - GrCoordTransform fCoordTransform; |
| + GrCoordTransform fYTransform; |
| GrTextureAccess fYAccess; |
| + GrCoordTransform fUTransform; |
| GrTextureAccess fUAccess; |
| + GrCoordTransform fVTransform; |
| GrTextureAccess fVAccess; |
| SkYUVColorSpace fColorSpace; |
| @@ -140,6 +158,6 @@ const GrGLfloat YUVtoRGBEffect::GLProcessor::kRec601ConversionMatrix[16] = { |
| GrFragmentProcessor* |
| GrYUVtoRGBEffect::Create(GrTexture* yTexture, GrTexture* uTexture, GrTexture* vTexture, |
| - SkYUVColorSpace colorSpace) { |
| - return YUVtoRGBEffect::Create(yTexture, uTexture, vTexture, colorSpace); |
| + SkISize sizes[3], SkYUVColorSpace colorSpace) { |
| + return YUVtoRGBEffect::Create(yTexture, uTexture, vTexture, sizes, colorSpace); |
| } |