Index: src/gpu/effects/GrYUVtoRGBEffect.cpp |
diff --git a/src/gpu/effects/GrYUVtoRGBEffect.cpp b/src/gpu/effects/GrYUVtoRGBEffect.cpp |
index 736135282c2dbc7d1a51e5703542f3c070abe83e..8daf34829c20e1663b52f2fbeeb2a834ff607218 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->width()); |
+ h[0] = SkIntToScalar(sizes[0].fHeight) / SkIntToScalar(yTexture->height()); |
+ w[1] = SkIntToScalar(sizes[1].fWidth) / SkIntToScalar(uTexture->width()); |
+ h[1] = SkIntToScalar(sizes[1].fHeight) / SkIntToScalar(uTexture->height()); |
+ w[2] = SkIntToScalar(sizes[2].fWidth) / SkIntToScalar(vTexture->width()); |
+ h[2] = SkIntToScalar(sizes[2].fHeight) / SkIntToScalar(vTexture->height()); |
+ 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,7 @@ 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) { |
+ SkASSERT(yTexture && uTexture && vTexture && sizes); |
+ return YUVtoRGBEffect::Create(yTexture, uTexture, vTexture, sizes, colorSpace); |
} |