|
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 } |