| |
1 /* |
| |
2 * Copyright 2012 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 "SkStrokeRec.h" |
| |
9 #include "SkPaintDefaults.h" |
| |
10 |
| |
11 // must be < 0, since ==0 means hairline, and >0 means normal stroke |
| |
12 #define kStrokeRec_FillStyleWidth (-SK_Scalar1) |
| |
13 |
| |
14 SkStrokeRec::SkStrokeRec(InitStyle s) { |
| |
15 fWidth = (kFill_InitStyle == s) ? kStrokeRec_FillStyleWidth : 0; |
| |
16 fMiterLimit = SkPaintDefaults_MiterLimit; |
| |
17 fCap = SkPaint::kDefault_Cap; |
| |
18 fJoin = SkPaint::kDefault_Join; |
| |
19 fStrokeAndFill = false; |
| |
20 } |
| |
21 |
| |
22 SkStrokeRec::SkStrokeRec(const SkStrokeRec& src) { |
| |
23 memcpy(this, &src, sizeof(src)); |
| |
24 } |
| |
25 |
| |
26 SkStrokeRec::SkStrokeRec(const SkPaint& paint) { |
| |
27 switch (paint.getStyle()) { |
| |
28 case SkPaint::kFill_Style: |
| |
29 fWidth = kStrokeRec_FillStyleWidth; |
| |
30 fStrokeAndFill = false; |
| |
31 break; |
| |
32 case SkPaint::kStroke_Style: |
| |
33 fWidth = paint.getStrokeWidth(); |
| |
34 fStrokeAndFill = false; |
| |
35 break; |
| |
36 case SkPaint::kStrokeAndFill_Style: |
| |
37 if (0 == paint.getStrokeWidth()) { |
| |
38 // hairline+fill == fill |
| |
39 fWidth = kStrokeRec_FillStyleWidth; |
| |
40 fStrokeAndFill = false; |
| |
41 } else { |
| |
42 fWidth = paint.getStrokeWidth(); |
| |
43 fStrokeAndFill = true; |
| |
44 } |
| |
45 break; |
| |
46 default: |
| |
47 SkDEBUGFAIL("unknown paint style"); |
| |
48 // fall back on just fill |
| |
49 fWidth = kStrokeRec_FillStyleWidth; |
| |
50 fStrokeAndFill = false; |
| |
51 break; |
| |
52 } |
| |
53 |
| |
54 // copy these from the paint, regardless of our "style" |
| |
55 fMiterLimit = paint.getStrokeMiter(); |
| |
56 fCap = paint.getStrokeCap(); |
| |
57 fJoin = paint.getStrokeJoin(); |
| |
58 } |
| |
59 |
| |
60 SkStrokeRec::Style SkStrokeRec::getStyle() const { |
| |
61 if (fWidth < 0) { |
| |
62 return kFill_Style; |
| |
63 } else if (0 == fWidth) { |
| |
64 return kHairline_Style; |
| |
65 } else { |
| |
66 return fStrokeAndFill ? kStrokeAndFill_Style : kStroke_Style; |
| |
67 } |
| |
68 } |
| |
69 |
| |
70 void SkStrokeRec::setFillStyle() { |
| |
71 fWidth = kStrokeRec_FillStyleWidth; |
| |
72 fStrokeAndFill = false; |
| |
73 } |
| |
74 |
| |
75 void SkStrokeRec::setHairlineStyle() { |
| |
76 fWidth = 0; |
| |
77 fStrokeAndFill = false; |
| |
78 } |
| |
79 |
| |
80 void SkStrokeRec::setStrokeStyle(SkScalar width, bool strokeAndFill) { |
| |
81 if (strokeAndFill && (0 == width)) { |
| |
82 // hairline+fill == fill |
| |
83 this->setFillStyle(); |
| |
84 } else { |
| |
85 fWidth = width; |
| |
86 fStrokeAndFill = strokeAndFill; |
| |
87 } |
| |
88 } |
| |
89 |
| |
90 #include "SkStroke.h" |
| |
91 |
| |
92 bool SkStrokeRec::applyToPath(SkPath* dst, const SkPath& src) const { |
| |
93 if (fWidth <= 0) { // hairline or fill |
| |
94 return false; |
| |
95 } |
| |
96 |
| |
97 SkStroke stroker; |
| |
98 stroker.setCap(fCap); |
| |
99 stroker.setJoin(fJoin); |
| |
100 stroker.setMiterLimit(fMiterLimit); |
| |
101 stroker.setWidth(fWidth); |
| |
102 stroker.setDoFill(fStrokeAndFill); |
| |
103 stroker.strokePath(src, dst); |
| |
104 return true; |
| |
105 } |