| Index: src/core/SkPictureShader.cpp
|
| diff --git a/src/core/SkPictureShader.cpp b/src/core/SkPictureShader.cpp
|
| index cd2301b91b5f0f640896990cc58ed33717e43f5c..e831320a7ec38649a578a96cf70da29d60a6feb1 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,11 @@ 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) {
|
| + maxTextureSize = context->getMaxTextureSize();
|
| + }
|
| + SkAutoTUnref<SkShader> bitmapShader(this->refBitmapShader(viewM, localMatrix, maxTextureSize));
|
| if (!bitmapShader) {
|
| return false;
|
| }
|
|
|