Index: src/core/SkNormalSource.cpp |
diff --git a/src/core/SkNormalSource.cpp b/src/core/SkNormalSource.cpp |
index 7dc8bc1aea7be24ea6ddfc4583fbdce37988d32b..394ce8fe45eab79934790050fbeb34f9bf750955 100644 |
--- a/src/core/SkNormalSource.cpp |
+++ b/src/core/SkNormalSource.cpp |
@@ -34,9 +34,9 @@ public: |
#endif |
SkNormalSource::Provider* asProvider(const SkShader::ContextRec& rec, |
- void* storage) const override; |
- |
+ void* storage) const override; |
size_t providerSize(const SkShader::ContextRec& rec) const override; |
+ |
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(NormalMapSourceImpl) |
protected: |
@@ -472,11 +472,194 @@ sk_sp<SkNormalSource> SkNormalSource::MakeFlat() { |
//////////////////////////////////////////////////////////////////////////// |
+class SK_API NormalBevelSourceImpl : public SkNormalSource { |
egdaniel
2016/07/14 17:23:30
I feel like this should be in its own file. Same w
dvonbeck
2016/07/22 15:08:22
Done.
|
+public: |
+ NormalBevelSourceImpl(BevelType type, SkScalar width, SkScalar height) |
+ : fType(type) |
+ , fWidth(width) |
+ , fHeight(height) {} |
+ |
+#if SK_SUPPORT_GPU |
+ sk_sp<GrFragmentProcessor> asFragmentProcessor(GrContext*, |
+ const SkMatrix& viewM, |
+ const SkMatrix* localMatrix, |
+ SkFilterQuality, |
+ SkSourceGammaTreatment) const override; |
+#endif |
+ |
+ SkNormalSource::Provider* asProvider(const SkShader::ContextRec& rec, |
+ void* storage) const override; |
+ size_t providerSize(const SkShader::ContextRec& rec) const override; |
+ |
+ SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(NormalBevelSourceImpl) |
+ |
+protected: |
+ void flatten(SkWriteBuffer& buf) const override; |
+ |
+private: |
+ class Provider : public SkNormalSource::Provider { |
+ public: |
+ Provider(const NormalBevelSourceImpl& source); |
+ |
+ virtual ~Provider(); |
+ |
+ void fillScanLine(int x, int y, SkPoint3 output[], int count) const override; |
+ |
+ private: |
+ const NormalBevelSourceImpl& fSource; |
+ |
+ typedef SkNormalSource::Provider INHERITED; |
+ }; |
+ |
+ SkNormalSource::BevelType fType; |
+ SkScalar fWidth; |
+ SkScalar fHeight; |
+ |
+ friend class SkNormalSource; |
+ |
+ typedef SkNormalSource INHERITED; |
+}; |
+ |
+//////////////////////////////////////////////////////////////////////////// |
+ |
+#if SK_SUPPORT_GPU |
+ |
+class NormalBevelFP : public GrFragmentProcessor { |
+public: |
+ NormalBevelFP(SkNormalSource::BevelType type, SkScalar width, SkScalar height) |
+ : fType(type) |
+ , fWidth(width) |
+ , fHeight(height) { |
+ this->initClassID<NormalBevelFP>(); |
+ } |
+ |
+ class GLSLNormalBevelFP : public GrGLSLFragmentProcessor { |
+ public: |
+ GLSLNormalBevelFP() { |
+ fPrevType = SkNormalSource::BevelType::kLinear; |
+ fPrevWidth = SkFloatToScalar(0.0f); |
+ fPrevHeight = SkFloatToScalar(0.0f); |
+ } |
+ |
+ 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 { |
+ const NormalBevelFP& normalBevelFP = proc.cast<NormalBevelFP>(); |
+ |
+ fPrevType = normalBevelFP.fType; |
+ fPrevWidth = normalBevelFP.fWidth; |
+ fPrevHeight = normalBevelFP.fHeight; |
+ } |
+ |
+ private: |
+ SkNormalSource::BevelType fPrevType; |
+ SkScalar fPrevWidth; |
+ SkScalar fPrevHeight; |
+ }; |
+ |
+ void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override { |
+ GLSLNormalBevelFP::GenKey(*this, caps, b); |
+ } |
+ |
+ const char* name() const override { return "NormalBevelFP"; } |
+ |
+ void onComputeInvariantOutput(GrInvariantOutput* inout) const override { |
+ inout->setToUnknown(GrInvariantOutput::ReadInput::kWillNot_ReadInput); |
+ } |
+ |
+private: |
+ GrGLSLFragmentProcessor* onCreateGLSLInstance() const override { return new GLSLNormalBevelFP; } |
+ |
+ bool onIsEqual(const GrFragmentProcessor& proc) const override { |
+ const NormalBevelFP& normalBevelFP = proc.cast<NormalBevelFP>(); |
+ return fType == normalBevelFP.fType && |
+ fWidth == normalBevelFP.fWidth && |
+ fHeight == normalBevelFP.fHeight; |
+ } |
+ |
+ SkNormalSource::BevelType fType; |
+ SkScalar fWidth; |
+ SkScalar fHeight; |
+}; |
+ |
+sk_sp<GrFragmentProcessor> NormalBevelSourceImpl::asFragmentProcessor( |
+ GrContext *context, |
+ const SkMatrix &viewM, |
+ const SkMatrix *localMatrix, |
+ SkFilterQuality filterQuality, |
+ SkSourceGammaTreatment gammaTreatment) const { |
+ |
+ return sk_make_sp<NormalBevelFP>(fType, fWidth, fHeight); |
+} |
+ |
+#endif // SK_SUPPORT_GPU |
+ |
+//////////////////////////////////////////////////////////////////////////// |
+ |
+NormalBevelSourceImpl::Provider::Provider(const NormalBevelSourceImpl& source) |
+ : fSource(source) {} |
+ |
+NormalBevelSourceImpl::Provider::~Provider() {} |
+ |
+SkNormalSource::Provider* NormalBevelSourceImpl::asProvider(const SkShader::ContextRec &rec, |
+ void *storage) const { |
+ return new (storage) Provider(*this); |
+} |
+ |
+size_t NormalBevelSourceImpl::providerSize(const SkShader::ContextRec&) const { |
+ return sizeof(Provider); |
+} |
+ |
+void NormalBevelSourceImpl::Provider::fillScanLine(int x, int y, SkPoint3 output[], |
+ int count) const { |
+ for (int i = 0; i < count; i++) { |
+ output[i] = {0, 0, 1.0}; |
+ } |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
+sk_sp<SkFlattenable> NormalBevelSourceImpl::CreateProc(SkReadBuffer& buf) { |
+ |
+ auto type = static_cast<SkNormalSource::BevelType>(buf.readInt()); |
+ SkScalar width = buf.readScalar(); |
+ SkScalar height = buf.readScalar(); |
+ |
+ return sk_make_sp<NormalBevelSourceImpl>(type, width, height); |
+} |
+ |
+void NormalBevelSourceImpl::flatten(SkWriteBuffer& buf) const { |
+ this->INHERITED::flatten(buf); |
+ |
+ buf.writeInt(static_cast<int>(fType)); |
+ buf.writeScalar(fWidth); |
+ buf.writeScalar(fHeight); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////// |
+ |
+sk_sp<SkNormalSource> SkNormalSource::MakeBevel(BevelType type, SkScalar width, SkScalar height) { |
+ return sk_make_sp<NormalBevelSourceImpl>(type, width, height); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////// |
+ |
//////////////////////////////////////////////////////////////////////////// |
SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkNormalSource) |
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(NormalMapSourceImpl) |
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(NormalFlatSourceImpl) |
+ SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(NormalBevelSourceImpl) |
SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
//////////////////////////////////////////////////////////////////////////// |