diff --git a/src/core/SkPictureShader.cpp b/src/core/SkPictureShader.cpp index cd2301b91b..e831320a7e 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 bitmapShader(this->refBitmapShader(viewM, localMatrix)); + int maxTextureSize = 0; + if (context) { + maxTextureSize = context->getMaxTextureSize(); + } + SkAutoTUnref bitmapShader(this->refBitmapShader(viewM, localMatrix, maxTextureSize)); if (!bitmapShader) { return false; } diff --git a/src/core/SkPictureShader.h b/src/core/SkPictureShader.h index c40b01b828..3fa27b5a65 100644 --- a/src/core/SkPictureShader.h +++ b/src/core/SkPictureShader.h @@ -41,7 +41,7 @@ protected: private: SkPictureShader(const SkPicture*, TileMode, TileMode, const SkMatrix*, const SkRect*); - SkShader* refBitmapShader(const SkMatrix&, const SkMatrix* localMatrix) const; + SkShader* refBitmapShader(const SkMatrix&, const SkMatrix* localMatrix, const int maxTextureSize = 0) const; const SkPicture* fPicture; SkRect fTile;