1 /*
2  * Copyright 2017 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 SkSVGPattern_DEFINED
9 #define SkSVGPattern_DEFINED
10 
11 #include "experimental/svg/model/SkSVGHiddenContainer.h"
12 #include "experimental/svg/model/SkSVGTypes.h"
13 
14 class SkSVGRenderContext;
15 
16 class SkSVGPattern final : public SkSVGHiddenContainer {
17 public:
18     ~SkSVGPattern() override = default;
19 
Make()20     static sk_sp<SkSVGPattern> Make() {
21         return sk_sp<SkSVGPattern>(new SkSVGPattern());
22     }
23 
24     void setX(const SkSVGLength&);
25     void setY(const SkSVGLength&);
26     void setWidth(const SkSVGLength&);
27     void setHeight(const SkSVGLength&);
28     void setHref(const SkSVGStringType&);
29     void setPatternTransform(const SkSVGTransformType&);
30 
31 protected:
32     SkSVGPattern();
33 
34     void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
35 
36     bool onAsPaint(const SkSVGRenderContext&, SkPaint*) const override;
37 
38 private:
39     struct PatternAttributes {
40         SkTLazy<SkSVGLength>        fX,
41                                     fY,
42                                     fWidth,
43                                     fHeight;
44         SkTLazy<SkSVGTransformType> fPatternTransform;
45     } fAttributes;
46 
47     SkSVGStringType    fHref;
48 
49     const SkSVGPattern* resolveHref(const SkSVGRenderContext&, PatternAttributes*) const;
50     const SkSVGPattern* hrefTarget(const SkSVGRenderContext&) const;
51 
52     // TODO:
53     //   - patternUnits
54     //   - patternContentUnits
55 
56     typedef SkSVGHiddenContainer INHERITED;
57 };
58 
59 #endif // SkSVGPattern_DEFINED
60