Chromium Code Reviews| Index: src/core/SkPictureShader.cpp |
| diff --git a/src/core/SkPictureShader.cpp b/src/core/SkPictureShader.cpp |
| index cd2301b91b5f0f640896990cc58ed33717e43f5c..b0ea318eb4b3f1eb1ba5e4fb9b88bb7e14f6de40 100644 |
| --- a/src/core/SkPictureShader.cpp |
| +++ b/src/core/SkPictureShader.cpp |
| @@ -141,7 +141,8 @@ void SkPictureShader::flatten(SkWriteBuffer& buffer) const { |
| fPicture->flatten(buffer); |
| } |
| -SkShader* SkPictureShader::refBitmapShader(const SkMatrix& matrix, const SkMatrix* localM) const { |
| +SkShader* SkPictureShader::refBitmapShader(const SkMatrix& matrix, const SkMatrix* localM, |
| + const int maxTextureSize) const { |
| SkASSERT(fPicture && !fPicture->cullRect().isEmpty()); |
| SkMatrix m; |
| @@ -171,6 +172,17 @@ SkShader* SkPictureShader::refBitmapShader(const SkMatrix& matrix, const SkMatri |
| scaledSize.set(SkScalarMul(scaledSize.width(), clampScale), |
| SkScalarMul(scaledSize.height(), clampScale)); |
| } |
| +#if SK_SUPPORT_GPU |
| + // Scale down the tile size if larger than maxTextureSize for GPU Path or it should fail on create texture |
| + if (maxTextureSize) { |
| + if (scaledSize.width() > maxTextureSize || scaledSize.height() > maxTextureSize) { |
| + SkScalar downScale = SkScalarDiv(maxTextureSize, |
| + SkMax32(scaledSize.width(), scaledSize.height())); |
| + scaledSize.set(SkScalarMul(scaledSize.width(), downScale), |
| + SkScalarMul(scaledSize.height(), downScale)); |
| + } |
| + } |
| +#endif |
| SkISize tileSize = scaledSize.toRound(); |
| if (tileSize.isEmpty()) { |
| @@ -299,7 +311,10 @@ bool SkPictureShader::asFragmentProcessor(GrContext* context, const SkPaint& pai |
| const SkMatrix& viewM, const SkMatrix* localMatrix, |
| GrColor* paintColor, |
| GrFragmentProcessor** fp) const { |
| - SkAutoTUnref<SkShader> bitmapShader(this->refBitmapShader(viewM, localMatrix)); |
| + int maxTextureSize = 0; |
| + if (context) |
|
bsalomon
2015/04/30 12:53:15
small nit, we always use braces, even for one line
gen.kim
2015/05/04 04:02:44
Thanks, fixed
|
| + maxTextureSize = context->getMaxTextureSize(); |
| + SkAutoTUnref<SkShader> bitmapShader(this->refBitmapShader(viewM, localMatrix, maxTextureSize)); |
| if (!bitmapShader) { |
| return false; |
| } |