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 
8 #ifndef SkNormalMapSource_DEFINED
9 #define SkNormalMapSource_DEFINED
10 
11 #include "SkNormalSource.h"
12 
13 class SkNormalMapSourceImpl : public SkNormalSource {
14 public:
SkNormalMapSourceImpl(sk_sp<SkShader> mapShader,const SkMatrix & invCTM)15     SkNormalMapSourceImpl(sk_sp<SkShader> mapShader, const SkMatrix& invCTM)
16             : fMapShader(std::move(mapShader))
17             , fInvCTM(invCTM) {}
18 
19 #if SK_SUPPORT_GPU
20     sk_sp<GrFragmentProcessor> asFragmentProcessor(const SkShader::AsFPArgs&) const override;
21 #endif
22 
23     SkNormalSource::Provider* asProvider(const SkShader::ContextRec& rec,
24                                          SkArenaAlloc* alloc) const override;
25 
26     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkNormalMapSourceImpl)
27 
28 protected:
29     void flatten(SkWriteBuffer& buf) const override;
30 
31     bool computeNormTotalInverse(const SkShader::ContextRec& rec, SkMatrix* normTotalInverse) const;
32 
33 private:
34     class Provider : public SkNormalSource::Provider {
35     public:
36         Provider(const SkNormalMapSourceImpl& source, SkShader::Context* mapContext);
37 
38         void fillScanLine(int x, int y, SkPoint3 output[], int count) const override;
39 
40     private:
41         const SkNormalMapSourceImpl& fSource;
42         SkShader::Context* fMapContext;
43 
44         typedef SkNormalSource::Provider INHERITED;
45     };
46 
47     sk_sp<SkShader> fMapShader;
48     SkMatrix        fInvCTM; // Inverse of the canvas total matrix, used for rotating normals.
49 
50     friend class SkNormalSource;
51 
52     typedef SkNormalSource INHERITED;
53 };
54 
55 #endif
56 
57