SkNormalFlatSource.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Copyright 2016 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "src/core/SkNormalFlatSource.h"
  8. #include "include/core/SkPoint3.h"
  9. #include "src/core/SkArenaAlloc.h"
  10. #include "src/core/SkNormalSource.h"
  11. #include "src/core/SkReadBuffer.h"
  12. #include "src/core/SkWriteBuffer.h"
  13. #if SK_SUPPORT_GPU
  14. #include "src/gpu/glsl/GrGLSLFragmentProcessor.h"
  15. #include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h"
  16. class NormalFlatFP : public GrFragmentProcessor {
  17. public:
  18. static std::unique_ptr<GrFragmentProcessor> Make() {
  19. return std::unique_ptr<GrFragmentProcessor>(new NormalFlatFP());
  20. }
  21. const char* name() const override { return "NormalFlatFP"; }
  22. std::unique_ptr<GrFragmentProcessor> clone() const override { return Make(); }
  23. private:
  24. class GLSLNormalFlatFP : public GrGLSLFragmentProcessor {
  25. public:
  26. GLSLNormalFlatFP() {}
  27. void emitCode(EmitArgs& args) override {
  28. GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
  29. fragBuilder->codeAppendf("%s = half4(0, 0, 1, 0);", args.fOutputColor);
  30. }
  31. private:
  32. void onSetData(const GrGLSLProgramDataManager&, const GrFragmentProcessor&) override {}
  33. };
  34. NormalFlatFP()
  35. : INHERITED(kFlatNormalsFP_ClassID, kConstantOutputForConstantInput_OptimizationFlag) {
  36. }
  37. void onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override {}
  38. SkPMColor4f constantOutputForConstantInput(const SkPMColor4f&) const override {
  39. return { 0, 0, 1, 0 };
  40. }
  41. GrGLSLFragmentProcessor* onCreateGLSLInstance() const override { return new GLSLNormalFlatFP; }
  42. bool onIsEqual(const GrFragmentProcessor&) const override { return true; }
  43. typedef GrFragmentProcessor INHERITED;
  44. };
  45. std::unique_ptr<GrFragmentProcessor> SkNormalFlatSourceImpl::asFragmentProcessor(
  46. const GrFPArgs&) const {
  47. return NormalFlatFP::Make();
  48. }
  49. #endif // SK_SUPPORT_GPU
  50. ////////////////////////////////////////////////////////////////////////////
  51. SkNormalFlatSourceImpl::Provider::Provider() {}
  52. SkNormalFlatSourceImpl::Provider::~Provider() {}
  53. SkNormalSource::Provider* SkNormalFlatSourceImpl::asProvider(const SkShaderBase::ContextRec &rec,
  54. SkArenaAlloc *alloc) const {
  55. return alloc->make<Provider>();
  56. }
  57. void SkNormalFlatSourceImpl::Provider::fillScanLine(int x, int y, SkPoint3 output[],
  58. int count) const {
  59. for (int i = 0; i < count; i++) {
  60. output[i] = {0.0f, 0.0f, 1.0f};
  61. }
  62. }
  63. ////////////////////////////////////////////////////////////////////////////////
  64. sk_sp<SkFlattenable> SkNormalFlatSourceImpl::CreateProc(SkReadBuffer& buf) {
  65. return sk_make_sp<SkNormalFlatSourceImpl>();
  66. }
  67. void SkNormalFlatSourceImpl::flatten(SkWriteBuffer& buf) const {
  68. this->INHERITED::flatten(buf);
  69. }
  70. ////////////////////////////////////////////////////////////////////////////
  71. sk_sp<SkNormalSource> SkNormalSource::MakeFlat() {
  72. return sk_make_sp<SkNormalFlatSourceImpl>();
  73. }