Index: src/gpu/SkGr.cpp |
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp |
index fb2916daff117fe697aa4633b5b50f70e2779272..ca7d6b8e84f253b8e81f9cfefbd484f5acab5079 100644 |
--- a/src/gpu/SkGr.cpp |
+++ b/src/gpu/SkGr.cpp |
@@ -506,7 +506,7 @@ static inline bool blend_requires_shader(const SkXfermode::Mode mode, bool primi |
static inline bool skpaint_to_grpaint_impl(GrContext* context, |
const SkPaint& skPaint, |
const SkMatrix& viewM, |
- const GrFragmentProcessor** shaderProcessor, |
+ sk_sp<GrFragmentProcessor>* shaderProcessor, |
SkXfermode::Mode* primColorMode, |
bool primitiveIsSrc, |
bool allowSRGBInputs, |
@@ -516,17 +516,15 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context, |
// Setup the initial color considering the shader, the SkPaint color, and the presence or not |
// of per-vertex colors. |
- SkAutoTUnref<const GrFragmentProcessor> aufp; |
- const GrFragmentProcessor* shaderFP = nullptr; |
+ sk_sp<GrFragmentProcessor> shaderFP; |
if (!primColorMode || blend_requires_shader(*primColorMode, primitiveIsSrc)) { |
if (shaderProcessor) { |
shaderFP = *shaderProcessor; |
} else if (const SkShader* shader = skPaint.getShader()) { |
SkSourceGammaTreatment gammaTreatment = allowSRGBInputs |
? SkSourceGammaTreatment::kRespect : SkSourceGammaTreatment::kIgnore; |
- aufp.reset(shader->asFragmentProcessor(context, viewM, nullptr, |
- skPaint.getFilterQuality(), gammaTreatment)); |
- shaderFP = aufp; |
+ shaderFP = shader->asFragmentProcessor(context, viewM, nullptr, |
+ skPaint.getFilterQuality(), gammaTreatment); |
if (!shaderFP) { |
return false; |
} |
@@ -549,16 +547,13 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context, |
GrColor shaderInput = SkColorToOpaqueGrColor(skPaint.getColor()); |
shaderFP = GrFragmentProcessor::OverrideInput(shaderFP, shaderInput); |
- aufp.reset(shaderFP); |
- |
if (primitiveIsSrc) { |
- shaderFP = GrXfermodeFragmentProcessor::CreateFromDstProcessor(shaderFP, |
- *primColorMode); |
+ shaderFP = GrXfermodeFragmentProcessor::MakeFromDstProcessor(std::move(shaderFP), |
+ *primColorMode); |
} else { |
- shaderFP = GrXfermodeFragmentProcessor::CreateFromSrcProcessor(shaderFP, |
- *primColorMode); |
+ shaderFP = GrXfermodeFragmentProcessor::MakeFromSrcProcessor(std::move(shaderFP), |
+ *primColorMode); |
} |
- aufp.reset(shaderFP); |
// The above may return null if compose results in a pass through of the prim color. |
if (shaderFP) { |
grPaint->addColorFragmentProcessor(shaderFP); |
@@ -566,39 +561,38 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context, |
GrColor paintAlpha = SkColorAlphaToGrColor(skPaint.getColor()); |
if (GrColor_WHITE != paintAlpha) { |
- grPaint->addColorFragmentProcessor(GrConstColorProcessor::Create( |
- paintAlpha, GrConstColorProcessor::kModulateRGBA_InputMode))->unref(); |
+ grPaint->addColorFragmentProcessor(GrConstColorProcessor::Make( |
+ paintAlpha, GrConstColorProcessor::kModulateRGBA_InputMode)); |
} |
} else { |
// The shader's FP sees the paint unpremul color |
grPaint->setColor(SkColorToUnpremulGrColor(skPaint.getColor())); |
- grPaint->addColorFragmentProcessor(shaderFP); |
+ grPaint->addColorFragmentProcessor(std::move(shaderFP)); |
} |
} else { |
if (primColorMode) { |
// There is a blend between the primitive color and the paint color. The blend considers |
// the opaque paint color. The paint's alpha is applied to the post-blended color. |
- SkAutoTUnref<const GrFragmentProcessor> processor( |
- GrConstColorProcessor::Create(SkColorToOpaqueGrColor(skPaint.getColor()), |
+ sk_sp<GrFragmentProcessor> processor( |
+ GrConstColorProcessor::Make(SkColorToOpaqueGrColor(skPaint.getColor()), |
GrConstColorProcessor::kIgnore_InputMode)); |
if (primitiveIsSrc) { |
- processor.reset(GrXfermodeFragmentProcessor::CreateFromDstProcessor(processor, |
- *primColorMode)); |
+ processor = GrXfermodeFragmentProcessor::MakeFromDstProcessor(std::move(processor), |
+ *primColorMode); |
} else { |
- processor.reset(GrXfermodeFragmentProcessor::CreateFromSrcProcessor(processor, |
- *primColorMode)); |
- |
+ processor = GrXfermodeFragmentProcessor::MakeFromSrcProcessor(std::move(processor), |
+ *primColorMode); |
} |
if (processor) { |
- grPaint->addColorFragmentProcessor(processor); |
+ grPaint->addColorFragmentProcessor(std::move(processor)); |
} |
grPaint->setColor(SkColorToOpaqueGrColor(skPaint.getColor())); |
GrColor paintAlpha = SkColorAlphaToGrColor(skPaint.getColor()); |
if (GrColor_WHITE != paintAlpha) { |
- grPaint->addColorFragmentProcessor(GrConstColorProcessor::Create( |
- paintAlpha, GrConstColorProcessor::kModulateRGBA_InputMode))->unref(); |
+ grPaint->addColorFragmentProcessor(GrConstColorProcessor::Make( |
+ paintAlpha, GrConstColorProcessor::kModulateRGBA_InputMode)); |
} |
} else { |
// No shader, no primitive color. |
@@ -612,10 +606,9 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context, |
if (applyColorFilterToPaintColor) { |
grPaint->setColor(SkColorToPremulGrColor(colorFilter->filterColor(skPaint.getColor()))); |
} else { |
- SkAutoTUnref<const GrFragmentProcessor> cfFP( |
- colorFilter->asFragmentProcessor(context)); |
+ sk_sp<GrFragmentProcessor> cfFP(colorFilter->asFragmentProcessor(context)); |
if (cfFP) { |
- grPaint->addColorFragmentProcessor(cfFP); |
+ grPaint->addColorFragmentProcessor(std::move(cfFP)); |
} else { |
return false; |
} |
@@ -627,14 +620,12 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context, |
SkASSERT(!grPaint->getXPFactory()); |
SkXfermode* xfermode = skPaint.getXfermode(); |
if (xfermode) { |
- // SafeUnref in case a new xfermode is added that returns null. |
- // In such cases we will fall back to kSrcOver_Mode. |
- SkSafeUnref(grPaint->setXPFactory(xfermode->asXPFactory())); |
+ grPaint->setXPFactory(xfermode->asXPFactory()); |
} |
#ifndef SK_IGNORE_GPU_DITHER |
if (skPaint.isDither() && grPaint->numColorFragmentProcessors() > 0) { |
- grPaint->addColorFragmentProcessor(GrDitherEffect::Create())->unref(); |
+ grPaint->addColorFragmentProcessor(GrDitherEffect::Make()); |
} |
#endif |
return true; |
@@ -649,7 +640,7 @@ bool SkPaintToGrPaint(GrContext* context, const SkPaint& skPaint, const SkMatrix |
/** Replaces the SkShader (if any) on skPaint with the passed in GrFragmentProcessor. */ |
bool SkPaintToGrPaintReplaceShader(GrContext* context, |
const SkPaint& skPaint, |
- const GrFragmentProcessor* shaderFP, |
+ sk_sp<GrFragmentProcessor> shaderFP, |
bool allowSRGBInputs, |
GrPaint* grPaint) { |
if (!shaderFP) { |
@@ -665,8 +656,8 @@ bool SkPaintToGrPaintNoShader(GrContext* context, |
bool allowSRGBInputs, |
GrPaint* grPaint) { |
// Use a ptr to a nullptr to to indicate that the SkShader is ignored and not replaced. |
- static const GrFragmentProcessor* kNullShaderFP = nullptr; |
- static const GrFragmentProcessor** kIgnoreShader = &kNullShaderFP; |
+ static sk_sp<GrFragmentProcessor> kNullShaderFP(nullptr); |
+ static sk_sp<GrFragmentProcessor>* kIgnoreShader = &kNullShaderFP; |
return skpaint_to_grpaint_impl(context, skPaint, SkMatrix::I(), kIgnoreShader, nullptr, false, |
allowSRGBInputs, grPaint); |
} |
@@ -687,33 +678,34 @@ bool SkPaintToGrPaintWithXfermode(GrContext* context, |
bool SkPaintToGrPaintWithTexture(GrContext* context, |
const SkPaint& paint, |
const SkMatrix& viewM, |
- const GrFragmentProcessor* fp, |
+ sk_sp<GrFragmentProcessor> fp, |
bool textureIsAlphaOnly, |
bool allowSRGBInputs, |
GrPaint* grPaint) { |
- SkAutoTUnref<const GrFragmentProcessor> shaderFP; |
+ sk_sp<GrFragmentProcessor> shaderFP; |
if (textureIsAlphaOnly) { |
if (const SkShader* shader = paint.getShader()) { |
SkSourceGammaTreatment gammaTreatment = allowSRGBInputs |
? SkSourceGammaTreatment::kRespect : SkSourceGammaTreatment::kIgnore; |
- shaderFP.reset(shader->asFragmentProcessor(context, |
- viewM, |
- nullptr, |
- paint.getFilterQuality(), |
- gammaTreatment)); |
+ shaderFP = shader->asFragmentProcessor(context, |
+ viewM, |
+ nullptr, |
+ paint.getFilterQuality(), |
+ gammaTreatment); |
if (!shaderFP) { |
return false; |
} |
- const GrFragmentProcessor* fpSeries[] = { shaderFP.get(), fp }; |
- shaderFP.reset(GrFragmentProcessor::RunInSeries(fpSeries, 2)); |
+ sk_sp<GrFragmentProcessor> fpSeries[] = { std::move(shaderFP), std::move(fp) }; |
+ shaderFP = GrFragmentProcessor::RunInSeries(fpSeries, 2); |
} else { |
- shaderFP.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); |
+ shaderFP = GrFragmentProcessor::MulOutputByInputUnpremulColor(fp); |
} |
} else { |
- shaderFP.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); |
+ shaderFP = GrFragmentProcessor::MulOutputByInputAlpha(fp); |
} |
- return SkPaintToGrPaintReplaceShader(context, paint, shaderFP.get(), allowSRGBInputs, grPaint); |
+ return SkPaintToGrPaintReplaceShader(context, paint, std::move(shaderFP), allowSRGBInputs, |
+ grPaint); |
} |