| Index: src/core/SkNormalFlatSource.cpp | 
| diff --git a/src/core/SkNormalFlatSource.cpp b/src/core/SkNormalFlatSource.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..fcb1a4f3adadb9707f6b5d5ff8b9281008df9ce0 | 
| --- /dev/null | 
| +++ b/src/core/SkNormalFlatSource.cpp | 
| @@ -0,0 +1,107 @@ | 
| +/* | 
| + * Copyright 2016 Google Inc. | 
| + * | 
| + * Use of this source code is governed by a BSD-style license that can be | 
| + * found in the LICENSE file. | 
| + */ | 
| + | 
| +#include "SkNormalFlatSource.h" | 
| + | 
| +#include "SkNormalSource.h" | 
| +#include "SkPoint3.h" | 
| +#include "SkReadBuffer.h" | 
| +#include "SkWriteBuffer.h" | 
| + | 
| +#if SK_SUPPORT_GPU | 
| +#include "GrInvariantOutput.h" | 
| +#include "glsl/GrGLSLFragmentProcessor.h" | 
| +#include "glsl/GrGLSLFragmentShaderBuilder.h" | 
| + | 
| +class NormalFlatFP : public GrFragmentProcessor { | 
| +public: | 
| +    NormalFlatFP() { | 
| +        this->initClassID<NormalFlatFP>(); | 
| +    } | 
| + | 
| +    class GLSLNormalFlatFP : public GrGLSLFragmentProcessor { | 
| +    public: | 
| +        GLSLNormalFlatFP() {} | 
| + | 
| +        void emitCode(EmitArgs& args) override { | 
| +            GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 
| + | 
| +            fragBuilder->codeAppendf("%s = vec4(0, 0, 1, 0);", args.fOutputColor); | 
| +        } | 
| + | 
| +        static void GenKey(const GrProcessor& proc, const GrGLSLCaps&, | 
| +                           GrProcessorKeyBuilder* b) { | 
| +            b->add32(0x0); | 
| +        } | 
| + | 
| +    protected: | 
| +        void onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& proc) override {} | 
| +    }; | 
| + | 
| +    void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override { | 
| +        GLSLNormalFlatFP::GenKey(*this, caps, b); | 
| +    } | 
| + | 
| +    const char* name() const override { return "NormalFlatFP"; } | 
| + | 
| +    void onComputeInvariantOutput(GrInvariantOutput* inout) const override { | 
| +        inout->setToUnknown(GrInvariantOutput::ReadInput::kWillNot_ReadInput); | 
| +    } | 
| + | 
| +private: | 
| +    GrGLSLFragmentProcessor* onCreateGLSLInstance() const override { return new GLSLNormalFlatFP; } | 
| + | 
| +    bool onIsEqual(const GrFragmentProcessor& proc) const override { | 
| +        return true; | 
| +    } | 
| +}; | 
| + | 
| +sk_sp<GrFragmentProcessor> SkNormalFlatSourceImpl::asFragmentProcessor( | 
| +        const SkShader::AsFPArgs&) const { | 
| + | 
| +    return sk_make_sp<NormalFlatFP>(); | 
| +} | 
| + | 
| +#endif // SK_SUPPORT_GPU | 
| + | 
| +//////////////////////////////////////////////////////////////////////////// | 
| + | 
| +SkNormalFlatSourceImpl::Provider::Provider() {} | 
| + | 
| +SkNormalFlatSourceImpl::Provider::~Provider() {} | 
| + | 
| +SkNormalSource::Provider* SkNormalFlatSourceImpl::asProvider(const SkShader::ContextRec &rec, | 
| +                                                           void *storage) const { | 
| +    return new (storage) Provider(); | 
| +} | 
| + | 
| +size_t SkNormalFlatSourceImpl::providerSize(const SkShader::ContextRec&) const { | 
| +    return sizeof(Provider); | 
| +} | 
| + | 
| +void SkNormalFlatSourceImpl::Provider::fillScanLine(int x, int y, SkPoint3 output[], | 
| +                                                  int count) const { | 
| +    for (int i = 0; i < count; i++) { | 
| +        output[i] = {0.0f, 0.0f, 1.0f}; | 
| +    } | 
| +} | 
| + | 
| +//////////////////////////////////////////////////////////////////////////////// | 
| + | 
| +sk_sp<SkFlattenable> SkNormalFlatSourceImpl::CreateProc(SkReadBuffer& buf) { | 
| +    return sk_make_sp<SkNormalFlatSourceImpl>(); | 
| +} | 
| + | 
| +void SkNormalFlatSourceImpl::flatten(SkWriteBuffer& buf) const { | 
| +    this->INHERITED::flatten(buf); | 
| +} | 
| + | 
| +//////////////////////////////////////////////////////////////////////////// | 
| + | 
| +sk_sp<SkNormalSource> SkNormalSource::MakeFlat() { | 
| +    return sk_make_sp<SkNormalFlatSourceImpl>(); | 
| +} | 
|  |