1 /*
2  * Copyright 2020 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 #include "experimental/skrive/include/SkRive.h"
9 
10 #include "experimental/skrive/src/reader/StreamReader.h"
11 
12 namespace skrive {
13 
14 namespace internal {
15 
16 template <typename T>
17 size_t parse_node(StreamReader*, T*);
18 
19 template <>
parse_node(StreamReader * sr,Paint * node)20 size_t parse_node<Paint>(StreamReader* sr, Paint* node) {
21     const auto parent_id = parse_node<Component>(sr, node);
22 
23     node->setOpacity(sr->readFloat("opacity"));
24 
25     return parent_id;
26 }
27 
parse_fill_stroke(StreamReader * sr,Paint * node)28 void parse_fill_stroke(StreamReader* sr, Paint* node) {
29     if (node->style() == SkPaint::kFill_Style) {
30         static constexpr SkPathFillType gFillTypeMap[] = {
31             SkPathFillType::kWinding,  // 0
32             SkPathFillType::kEvenOdd,  // 1
33         };
34         node->setFillRule(gFillTypeMap[std::min<size_t>(sr->readUInt8("fillRule"),
35                                                         SK_ARRAY_COUNT(gFillTypeMap) - 1)]);
36     } else {
37         node->setStrokeWidth(sr->readFloat("width"));
38 
39         static constexpr SkPaint::Cap gCapMap[] = {
40             SkPaint::kButt_Cap,   // 0
41             SkPaint::kRound_Cap,  // 1
42             SkPaint::kSquare_Cap, // 2
43         };
44         node->setStrokeCap(gCapMap[std::min<size_t>(sr->readUInt8("cap"),
45                                                     SK_ARRAY_COUNT(gCapMap) - 1)]);
46 
47         static constexpr SkPaint::Join gJoinMap[] = {
48             SkPaint::kMiter_Join,  // 0
49             SkPaint::kRound_Join,  // 1
50             SkPaint::kBevel_Join,  // 2
51         };
52         node->setStrokeJoin(gJoinMap[std::min<size_t>(sr->readUInt8("join"),
53                                                       SK_ARRAY_COUNT(gJoinMap) - 1)]);
54 
55         static constexpr Paint::StrokeTrim gTrimMap[] = {
56             Paint::StrokeTrim::kOff,         // 0
57             Paint::StrokeTrim::kSequential,  // 1
58             Paint::StrokeTrim::kSynced,      // 2
59         };
60         node->setStrokeTrim(gTrimMap[std::min<size_t>(sr->readUInt8("trim"),
61                                                       SK_ARRAY_COUNT(gTrimMap) - 1)]);
62 
63         if (node->getStrokeTrim() != Paint::StrokeTrim::kOff) {
64             node->setStrokeTrimStart (sr->readFloat("start" ));
65             node->setStrokeTrimEnd   (sr->readFloat("end"   ));
66             node->setStrokeTrimOffset(sr->readFloat("offset"));
67         }
68     }
69 }
70 
71 } // namespace internal
72 
onApply(SkPaint * paint) const73 void Paint::onApply(SkPaint* paint) const {
74     paint->setAntiAlias(true);
75     paint->setStyle(this->style());
76 
77     paint->setStrokeWidth(fStrokeWidth);
78     paint->setStrokeCap  (fStrokeCap  );
79     paint->setStrokeJoin (fStrokeJoin );
80 }
81 
82 } // namespace skrive
83