diff options
Diffstat (limited to 'chromium/third_party/skia/src/effects/SkGpuBlurUtils.cpp')
-rw-r--r-- | chromium/third_party/skia/src/effects/SkGpuBlurUtils.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/chromium/third_party/skia/src/effects/SkGpuBlurUtils.cpp b/chromium/third_party/skia/src/effects/SkGpuBlurUtils.cpp index 6133db11d20..9da08e6f71f 100644 --- a/chromium/third_party/skia/src/effects/SkGpuBlurUtils.cpp +++ b/chromium/third_party/skia/src/effects/SkGpuBlurUtils.cpp @@ -28,11 +28,15 @@ static void scale_rect(SkRect* rect, float xScale, float yScale) { rect->fBottom = SkScalarMul(rect->fBottom, yScale); } -static float adjust_sigma(float sigma, int *scaleFactor, int *radius) { +static float adjust_sigma(float sigma, int maxTextureSize, int *scaleFactor, int *radius) { *scaleFactor = 1; while (sigma > MAX_BLUR_SIGMA) { *scaleFactor *= 2; sigma *= 0.5f; + if (*scaleFactor > maxTextureSize) { + *scaleFactor = maxTextureSize; + sigma = MAX_BLUR_SIGMA; + } } *radius = static_cast<int>(ceilf(sigma * 3.0f)); SkASSERT(*radius <= GrConvolutionEffect::kMaxKernelRadius); @@ -129,8 +133,9 @@ GrTexture* GaussianBlur(GrContext* context, SkIRect clearRect; int scaleFactorX, radiusX; int scaleFactorY, radiusY; - sigmaX = adjust_sigma(sigmaX, &scaleFactorX, &radiusX); - sigmaY = adjust_sigma(sigmaY, &scaleFactorY, &radiusY); + int maxTextureSize = context->getMaxTextureSize(); + sigmaX = adjust_sigma(sigmaX, maxTextureSize, &scaleFactorX, &radiusX); + sigmaY = adjust_sigma(sigmaY, maxTextureSize, &scaleFactorY, &radiusY); SkRect srcRect(rect); scale_rect(&srcRect, 1.0f / scaleFactorX, 1.0f / scaleFactorY); |