| Index: src/gpu/GrFragmentProcessor.cpp
|
| diff --git a/src/gpu/GrFragmentProcessor.cpp b/src/gpu/GrFragmentProcessor.cpp
|
| index 9524c84df1e0d881b2f94524194385bfc5edc07d..96a0f716c93749f4b7a7698d10f05be84c47f357 100644
|
| --- a/src/gpu/GrFragmentProcessor.cpp
|
| +++ b/src/gpu/GrFragmentProcessor.cpp
|
| @@ -89,7 +89,7 @@ void GrFragmentProcessor::addCoordTransform(const GrCoordTransform* transform) {
|
| fNumTransformsExclChildren++;
|
| }
|
|
|
| -int GrFragmentProcessor::registerChildProcessor(const GrFragmentProcessor* child) {
|
| +int GrFragmentProcessor::registerChildProcessor(sk_sp<GrFragmentProcessor> child) {
|
| // Append the child's transforms to our transforms array and the child's textures array to our
|
| // textures array
|
| if (!child->fCoordTransforms.empty()) {
|
| @@ -101,15 +101,15 @@ int GrFragmentProcessor::registerChildProcessor(const GrFragmentProcessor* child
|
| child->fTextureAccesses.begin());
|
| }
|
|
|
| - int index = fChildProcessors.count();
|
| - fChildProcessors.push_back(SkRef(child));
|
| -
|
| this->combineRequiredFeatures(*child);
|
|
|
| if (child->usesLocalCoords()) {
|
| fUsesLocalCoords = true;
|
| }
|
|
|
| + int index = fChildProcessors.count();
|
| + fChildProcessors.push_back(child.release());
|
| +
|
| return index;
|
| }
|
|
|
| @@ -134,20 +134,21 @@ bool GrFragmentProcessor::hasSameTransforms(const GrFragmentProcessor& that) con
|
| return true;
|
| }
|
|
|
| -const GrFragmentProcessor* GrFragmentProcessor::MulOutputByInputAlpha(
|
| - const GrFragmentProcessor* fp) {
|
| +sk_sp<GrFragmentProcessor> GrFragmentProcessor::MulOutputByInputAlpha(
|
| + sk_sp<GrFragmentProcessor> fp) {
|
| if (!fp) {
|
| return nullptr;
|
| }
|
| - return GrXfermodeFragmentProcessor::CreateFromDstProcessor(fp, SkXfermode::kDstIn_Mode);
|
| + return GrXfermodeFragmentProcessor::MakeFromDstProcessor(std::move(fp),
|
| + SkXfermode::kDstIn_Mode);
|
| }
|
|
|
| -const GrFragmentProcessor* GrFragmentProcessor::MulOutputByInputUnpremulColor(
|
| - const GrFragmentProcessor* fp) {
|
| +sk_sp<GrFragmentProcessor> GrFragmentProcessor::MulOutputByInputUnpremulColor(
|
| + sk_sp<GrFragmentProcessor> fp) {
|
|
|
| class PremulFragmentProcessor : public GrFragmentProcessor {
|
| public:
|
| - PremulFragmentProcessor(const GrFragmentProcessor* processor) {
|
| + PremulFragmentProcessor(sk_sp<GrFragmentProcessor> processor) {
|
| this->initClassID<PremulFragmentProcessor>();
|
| this->registerChildProcessor(processor);
|
| }
|
| @@ -209,19 +210,19 @@ const GrFragmentProcessor* GrFragmentProcessor::MulOutputByInputUnpremulColor(
|
| if (!fp) {
|
| return nullptr;
|
| }
|
| - return new PremulFragmentProcessor(fp);
|
| + return sk_sp<GrFragmentProcessor>(new PremulFragmentProcessor(std::move(fp)));
|
| }
|
|
|
| //////////////////////////////////////////////////////////////////////////////
|
|
|
| -const GrFragmentProcessor* GrFragmentProcessor::OverrideInput(const GrFragmentProcessor* fp,
|
| +sk_sp<GrFragmentProcessor> GrFragmentProcessor::OverrideInput(sk_sp<GrFragmentProcessor> fp,
|
| GrColor color) {
|
| class ReplaceInputFragmentProcessor : public GrFragmentProcessor {
|
| public:
|
| - ReplaceInputFragmentProcessor(const GrFragmentProcessor* child, GrColor color)
|
| + ReplaceInputFragmentProcessor(sk_sp<GrFragmentProcessor> child, GrColor color)
|
| : fColor(color) {
|
| this->initClassID<ReplaceInputFragmentProcessor>();
|
| - this->registerChildProcessor(child);
|
| + this->registerChildProcessor(std::move(child));
|
| }
|
|
|
| const char* name() const override { return "Replace Color"; }
|
| @@ -285,21 +286,21 @@ const GrFragmentProcessor* GrFragmentProcessor::OverrideInput(const GrFragmentPr
|
| GrInvariantOutput childOut(0x0, kNone_GrColorComponentFlags, false);
|
| fp->computeInvariantOutput(&childOut);
|
| if (childOut.willUseInputColor()) {
|
| - return new ReplaceInputFragmentProcessor(fp, color);
|
| + return sk_sp<GrFragmentProcessor>(new ReplaceInputFragmentProcessor(std::move(fp), color));
|
| } else {
|
| - return SkRef(fp);
|
| + return fp;
|
| }
|
| }
|
|
|
| -const GrFragmentProcessor* GrFragmentProcessor::RunInSeries(const GrFragmentProcessor* series[],
|
| +sk_sp<GrFragmentProcessor> GrFragmentProcessor::RunInSeries(sk_sp<GrFragmentProcessor>* series,
|
| int cnt) {
|
| class SeriesFragmentProcessor : public GrFragmentProcessor {
|
| public:
|
| - SeriesFragmentProcessor(const GrFragmentProcessor* children[], int cnt){
|
| + SeriesFragmentProcessor(sk_sp<GrFragmentProcessor>* children, int cnt){
|
| SkASSERT(cnt > 1);
|
| this->initClassID<SeriesFragmentProcessor>();
|
| for (int i = 0; i < cnt; ++i) {
|
| - this->registerChildProcessor(children[i]);
|
| + this->registerChildProcessor(std::move(children[i]));
|
| }
|
| }
|
|
|
| @@ -330,13 +331,8 @@ const GrFragmentProcessor* GrFragmentProcessor::RunInSeries(const GrFragmentProc
|
|
|
| void onComputeInvariantOutput(GrInvariantOutput* inout) const override {
|
| GrProcOptInfo info;
|
| - SkTDArray<const GrFragmentProcessor*> children;
|
| - children.setCount(this->numChildProcessors());
|
| - for (int i = 0; i < children.count(); ++i) {
|
| - children[i] = &this->childProcessor(i);
|
| - }
|
| - info.calcWithInitialValues(children.begin(), children.count(), inout->color(),
|
| - inout->validFlags(), false, false);
|
| + info.calcWithInitialValues(fChildProcessors.begin(), fChildProcessors.count(),
|
| + inout->color(), inout->validFlags(), false, false);
|
| for (int i = 0; i < this->numChildProcessors(); ++i) {
|
| this->childProcessor(i).computeInvariantOutput(inout);
|
| }
|
| @@ -348,36 +344,34 @@ const GrFragmentProcessor* GrFragmentProcessor::RunInSeries(const GrFragmentProc
|
| }
|
|
|
| // Run the through the series, do the invariant output processing, and look for eliminations.
|
| - SkTDArray<const GrFragmentProcessor*> replacementSeries;
|
| - SkAutoTUnref<const GrFragmentProcessor> colorFP;
|
| GrProcOptInfo info;
|
| -
|
| - info.calcWithInitialValues(series, cnt, 0x0, kNone_GrColorComponentFlags, false, false);
|
| + info.calcWithInitialValues(sk_sp_address_as_pointer_address(series), cnt,
|
| + 0x0, kNone_GrColorComponentFlags, false, false);
|
| if (kRGBA_GrColorComponentFlags == info.validFlags()) {
|
| - return GrConstColorProcessor::Create(info.color(),
|
| - GrConstColorProcessor::kIgnore_InputMode);
|
| + return GrConstColorProcessor::Make(info.color(), GrConstColorProcessor::kIgnore_InputMode);
|
| + }
|
| +
|
| + SkTArray<sk_sp<GrFragmentProcessor>> replacementSeries;
|
| +
|
| + int firstIdx = info.firstEffectiveProcessorIndex();
|
| + cnt -= firstIdx;
|
| + if (firstIdx > 0 && info.inputColorIsUsed()) {
|
| + sk_sp<GrFragmentProcessor> colorFP(GrConstColorProcessor::Make(
|
| + info.inputColorToFirstEffectiveProccesor(), GrConstColorProcessor::kIgnore_InputMode));
|
| + cnt += 1;
|
| + replacementSeries.reserve(cnt);
|
| + replacementSeries.emplace_back(std::move(colorFP));
|
| + for (int i = 0; i < cnt - 1; ++i) {
|
| + replacementSeries.emplace_back(std::move(series[firstIdx + i]));
|
| + }
|
| + series = replacementSeries.begin();
|
| } else {
|
| - int firstIdx = info.firstEffectiveProcessorIndex();
|
| + series += firstIdx;
|
| cnt -= firstIdx;
|
| - if (firstIdx > 0 && info.inputColorIsUsed()) {
|
| - colorFP.reset(GrConstColorProcessor::Create(info.inputColorToFirstEffectiveProccesor(),
|
| - GrConstColorProcessor::kIgnore_InputMode));
|
| - cnt += 1;
|
| - replacementSeries.setCount(cnt);
|
| - replacementSeries[0] = colorFP;
|
| - for (int i = 0; i < cnt - 1; ++i) {
|
| - replacementSeries[i + 1] = series[firstIdx + i];
|
| - }
|
| - series = replacementSeries.begin();
|
| - } else {
|
| - series += firstIdx;
|
| - cnt -= firstIdx;
|
| - }
|
| }
|
|
|
| if (1 == cnt) {
|
| - return SkRef(series[0]);
|
| - } else {
|
| - return new SeriesFragmentProcessor(series, cnt);
|
| + return series[0];
|
| }
|
| + return sk_sp<GrFragmentProcessor>(new SeriesFragmentProcessor(series, cnt));
|
| }
|
|
|