diff options
author | 2015-04-15 14:18:34 -0700 | |
---|---|---|
committer | 2015-04-15 14:18:34 -0700 | |
commit | bed83a66f5fa5821a3a08da32157a6155960b15e (patch) | |
tree | 91c3878d7233b716049d0396d97fd4d60eb38ba8 /src/gpu/SkGr.cpp | |
parent | bc0273524b039c45dcea2c1ab5ab379c75486c07 (diff) |
Don't draw if SkShader::asNewFragmentProcessor fails.
BUG=chromium:473156
Review URL: https://codereview.chromium.org/1089063002
Diffstat (limited to 'src/gpu/SkGr.cpp')
-rw-r--r-- | src/gpu/SkGr.cpp | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp index b44276cd4e..3161c81604 100644 --- a/src/gpu/SkGr.cpp +++ b/src/gpu/SkGr.cpp @@ -642,7 +642,7 @@ bool GrPixelConfig2ColorAndProfileType(GrPixelConfig config, SkColorType* ctOut, /////////////////////////////////////////////////////////////////////////////// -void SkPaint2GrPaintNoShader(GrContext* context, GrRenderTarget* rt, const SkPaint& skPaint, +bool SkPaint2GrPaintNoShader(GrContext* context, GrRenderTarget* rt, const SkPaint& skPaint, GrColor paintColor, bool constantColor, GrPaint* grPaint) { grPaint->setDither(skPaint.isDither()); @@ -652,6 +652,7 @@ void SkPaint2GrPaintNoShader(GrContext* context, GrRenderTarget* rt, const SkPai GrXPFactory* xpFactory = NULL; if (!SkXfermode::AsXPFactory(mode, &xpFactory)) { // Fall back to src-over + // return false here? xpFactory = GrPorterDuffXPFactory::Create(SkXfermode::kSrcOver_Mode); } SkASSERT(xpFactory); @@ -669,6 +670,7 @@ void SkPaint2GrPaintNoShader(GrContext* context, GrRenderTarget* rt, const SkPai grPaint->setColor(SkColor2GrColor(filtered)); } else { SkTDArray<GrFragmentProcessor*> array; + // return false if failed? if (colorFilter->asFragmentProcessors(context, &array)) { for (int i = 0; i < array.count(); ++i) { grPaint->addColorProcessor(array[i]); @@ -699,15 +701,15 @@ void SkPaint2GrPaintNoShader(GrContext* context, GrRenderTarget* rt, const SkPai } } #endif + return true; } -void SkPaint2GrPaintShader(GrContext* context, GrRenderTarget* rt, const SkPaint& skPaint, - const SkMatrix& viewM, bool constantColor, GrPaint* grPaint) { +bool SkPaint2GrPaint(GrContext* context, GrRenderTarget* rt, const SkPaint& skPaint, + const SkMatrix& viewM, bool constantColor, GrPaint* grPaint) { SkShader* shader = skPaint.getShader(); if (NULL == shader) { - SkPaint2GrPaintNoShader(context, rt, skPaint, SkColor2GrColor(skPaint.getColor()), - constantColor, grPaint); - return; + return SkPaint2GrPaintNoShader(context, rt, skPaint, SkColor2GrColor(skPaint.getColor()), + constantColor, grPaint); } GrColor paintColor = SkColor2GrColor(skPaint.getColor()); @@ -719,7 +721,10 @@ void SkPaint2GrPaintShader(GrContext* context, GrRenderTarget* rt, const SkPaint // Allow the shader to modify paintColor and also create an effect to be installed as // the first color effect on the GrPaint. GrFragmentProcessor* fp = NULL; - if (shader->asFragmentProcessor(context, skPaint, viewM, NULL, &paintColor, &fp) && fp) { + if (!shader->asFragmentProcessor(context, skPaint, viewM, NULL, &paintColor, &fp)) { + return false; + } + if (fp) { grPaint->addColorProcessor(fp)->unref(); constantColor = false; } @@ -727,5 +732,5 @@ void SkPaint2GrPaintShader(GrContext* context, GrRenderTarget* rt, const SkPaint // The grcolor is automatically set when calling asFragmentProcessor. // If the shader can be seen as an effect it returns true and adds its effect to the grpaint. - SkPaint2GrPaintNoShader(context, rt, skPaint, paintColor, constantColor, grPaint); + return SkPaint2GrPaintNoShader(context, rt, skPaint, paintColor, constantColor, grPaint); } |