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>(); |
+} |