From b9ed8845783ec3c59b2b185d26801f251adbf68d Mon Sep 17 00:00:00 2001 From: "gen.kim" Date: Sun, 3 May 2015 22:36:30 -0700 Subject: SkPictureShader: scale down if width or height is larger than maxTextureSize Grdient renders black because of failure onCreateTexture if one of width or height is larger than maxTextureSize with --force-gpu-rasterization. BUG=chromium:473166 Review URL: https://codereview.chromium.org/1101513004 --- src/core/SkPictureShader.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/core/SkPictureShader.cpp') 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; } -- cgit v1.2.3