OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2015 Google Inc. | 3 * Copyright 2015 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "SkBitmapProcState.h" | 9 #include "SkBitmapProcState.h" |
10 #include "SkColor.h" | 10 #include "SkColor.h" |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 | 72 |
73 bool isOpaque() const override; | 73 bool isOpaque() const override; |
74 | 74 |
75 #if SK_SUPPORT_GPU | 75 #if SK_SUPPORT_GPU |
76 const GrFragmentProcessor* asFragmentProcessor(GrContext*, | 76 const GrFragmentProcessor* asFragmentProcessor(GrContext*, |
77 const SkMatrix& viewM, | 77 const SkMatrix& viewM, |
78 const SkMatrix* localMatrix, | 78 const SkMatrix* localMatrix, |
79 SkFilterQuality) const overri
de; | 79 SkFilterQuality) const overri
de; |
80 #endif | 80 #endif |
81 | 81 |
| 82 size_t contextSize(const ContextRec&) const override; |
| 83 |
82 class LightingShaderContext : public SkShader::Context { | 84 class LightingShaderContext : public SkShader::Context { |
83 public: | 85 public: |
84 // The context takes ownership of the states. It will call their destruc
tors | 86 // The context takes ownership of the states. It will call their destruc
tors |
85 // but will NOT free the memory. | 87 // but will NOT free the memory. |
86 LightingShaderContext(const SkLightingShaderImpl&, const ContextRec&, | 88 LightingShaderContext(const SkLightingShaderImpl&, const ContextRec&, |
87 SkBitmapProcState* diffuseState, SkBitmapProcState
* normalState); | 89 SkBitmapProcState* diffuseState, SkBitmapProcState
* normalState); |
88 ~LightingShaderContext() override; | 90 ~LightingShaderContext() override; |
89 | 91 |
90 void shadeSpan(int x, int y, SkPMColor[], int count) override; | 92 void shadeSpan(int x, int y, SkPMColor[], int count) override; |
91 | 93 |
92 uint32_t getFlags() const override { return fFlags; } | 94 uint32_t getFlags() const override { return fFlags; } |
93 | 95 |
94 private: | 96 private: |
95 SkBitmapProcState* fDiffuseState; | 97 SkBitmapProcState* fDiffuseState; |
96 SkBitmapProcState* fNormalState; | 98 SkBitmapProcState* fNormalState; |
97 uint32_t fFlags; | 99 uint32_t fFlags; |
98 | 100 |
99 typedef SkShader::Context INHERITED; | 101 typedef SkShader::Context INHERITED; |
100 }; | 102 }; |
101 | 103 |
102 SK_TO_STRING_OVERRIDE() | 104 SK_TO_STRING_OVERRIDE() |
103 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingShaderImpl) | 105 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLightingShaderImpl) |
104 | 106 |
105 protected: | 107 protected: |
106 void flatten(SkWriteBuffer&) const override; | 108 void flatten(SkWriteBuffer&) const override; |
107 size_t onContextSize(const ContextRec&) const override; | |
108 Context* onCreateContext(const ContextRec&, void*) const override; | 109 Context* onCreateContext(const ContextRec&, void*) const override; |
109 bool computeNormTotalInverse(const ContextRec& rec, SkMatrix* normTotalInver
se) const; | 110 bool computeNormTotalInverse(const ContextRec& rec, SkMatrix* normTotalInver
se) const; |
110 | 111 |
111 private: | 112 private: |
112 SkBitmap fDiffuseMap; | 113 SkBitmap fDiffuseMap; |
113 SkBitmap fNormalMap; | 114 SkBitmap fNormalMap; |
114 | 115 |
115 SkAutoTUnref<const SkLightingShader::Lights> fLights; | 116 SkAutoTUnref<const SkLightingShader::Lights> fLights; |
116 | 117 |
117 SkMatrix fNormLocalMatrix; | 118 SkMatrix fNormLocalMatrix; |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
408 } | 409 } |
409 | 410 |
410 #endif | 411 #endif |
411 | 412 |
412 //////////////////////////////////////////////////////////////////////////// | 413 //////////////////////////////////////////////////////////////////////////// |
413 | 414 |
414 bool SkLightingShaderImpl::isOpaque() const { | 415 bool SkLightingShaderImpl::isOpaque() const { |
415 return fDiffuseMap.isOpaque(); | 416 return fDiffuseMap.isOpaque(); |
416 } | 417 } |
417 | 418 |
| 419 size_t SkLightingShaderImpl::contextSize(const ContextRec&) const { |
| 420 return 2 * sizeof(SkBitmapProcState) + sizeof(LightingShaderContext); |
| 421 } |
| 422 |
418 SkLightingShaderImpl::LightingShaderContext::LightingShaderContext(const SkLight
ingShaderImpl& shader, | 423 SkLightingShaderImpl::LightingShaderContext::LightingShaderContext(const SkLight
ingShaderImpl& shader, |
419 const Context
Rec& rec, | 424 const Context
Rec& rec, |
420 SkBitmapProcS
tate* diffuseState, | 425 SkBitmapProcS
tate* diffuseState, |
421 SkBitmapProcS
tate* normalState) | 426 SkBitmapProcS
tate* normalState) |
422 : INHERITED(shader, rec) | 427 : INHERITED(shader, rec) |
423 , fDiffuseState(diffuseState) | 428 , fDiffuseState(diffuseState) |
424 , fNormalState(normalState) | 429 , fNormalState(normalState) |
425 { | 430 { |
426 const SkPixmap& pixmap = fDiffuseState->fPixmap; | 431 const SkPixmap& pixmap = fDiffuseState->fPixmap; |
427 bool isOpaque = pixmap.isOpaque(); | 432 bool isOpaque = pixmap.isOpaque(); |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 total.setConcat(*rec.fMatrix, fNormLocalMatrix); | 648 total.setConcat(*rec.fMatrix, fNormLocalMatrix); |
644 | 649 |
645 const SkMatrix* m = &total; | 650 const SkMatrix* m = &total; |
646 if (rec.fLocalMatrix) { | 651 if (rec.fLocalMatrix) { |
647 total.setConcat(*m, *rec.fLocalMatrix); | 652 total.setConcat(*m, *rec.fLocalMatrix); |
648 m = &total; | 653 m = &total; |
649 } | 654 } |
650 return m->invert(normTotalInverse); | 655 return m->invert(normTotalInverse); |
651 } | 656 } |
652 | 657 |
653 size_t SkLightingShaderImpl::onContextSize(const ContextRec&) const { | |
654 return 2 * sizeof(SkBitmapProcState) + sizeof(LightingShaderContext); | |
655 } | |
656 | |
657 SkShader::Context* SkLightingShaderImpl::onCreateContext(const ContextRec& rec, | 658 SkShader::Context* SkLightingShaderImpl::onCreateContext(const ContextRec& rec, |
658 void* storage) const { | 659 void* storage) const { |
659 | 660 |
660 SkMatrix diffTotalInv; | 661 SkMatrix diffTotalInv; |
661 // computeTotalInverse was called in SkShader::createContext so we know it w
ill succeed | 662 // computeTotalInverse was called in SkShader::createContext so we know it w
ill succeed |
662 SkAssertResult(this->computeTotalInverse(rec, &diffTotalInv)); | 663 SkAssertResult(this->computeTotalInverse(rec, &diffTotalInv)); |
663 | 664 |
664 SkMatrix normTotalInv; | 665 SkMatrix normTotalInv; |
665 if (!this->computeNormTotalInverse(rec, &normTotalInv)) { | 666 if (!this->computeNormTotalInverse(rec, &normTotalInv)) { |
666 return nullptr; | 667 return nullptr; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
717 normLocalM); | 718 normLocalM); |
718 } | 719 } |
719 | 720 |
720 /////////////////////////////////////////////////////////////////////////////// | 721 /////////////////////////////////////////////////////////////////////////////// |
721 | 722 |
722 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingShader) | 723 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingShader) |
723 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingShaderImpl) | 724 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingShaderImpl) |
724 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 725 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
725 | 726 |
726 /////////////////////////////////////////////////////////////////////////////// | 727 /////////////////////////////////////////////////////////////////////////////// |
OLD | NEW |