• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* libs/graphics/sgl/SkPathEffect.cpp
2 **
3 ** Copyright 2006, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 **     http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17 
18 #include "SkPathEffect.h"
19 #include "SkPath.h"
20 #include "SkBuffer.h"
21 
22 //////////////////////////////////////////////////////////////////////////////////
23 
SkPairPathEffect(SkPathEffect * pe0,SkPathEffect * pe1)24 SkPairPathEffect::SkPairPathEffect(SkPathEffect* pe0, SkPathEffect* pe1)
25     : fPE0(pe0), fPE1(pe1)
26 {
27     SkASSERT(pe0);
28     SkASSERT(pe1);
29     fPE0->ref();
30     fPE1->ref();
31 }
32 
~SkPairPathEffect()33 SkPairPathEffect::~SkPairPathEffect()
34 {
35     fPE0->unref();
36     fPE1->unref();
37 }
38 
39 /*
40     Format: [oe0-factory][pe1-factory][pe0-size][pe0-data][pe1-data]
41 */
flatten(SkFlattenableWriteBuffer & buffer)42 void SkPairPathEffect::flatten(SkFlattenableWriteBuffer& buffer)
43 {
44     buffer.writeFlattenable(fPE0);
45     buffer.writeFlattenable(fPE1);
46 }
47 
SkPairPathEffect(SkFlattenableReadBuffer & buffer)48 SkPairPathEffect::SkPairPathEffect(SkFlattenableReadBuffer& buffer)
49 {
50     fPE0 = (SkPathEffect*)buffer.readFlattenable();
51     fPE1 = (SkPathEffect*)buffer.readFlattenable();
52 }
53 
54 //////////////////////////////////////////////////////////////////////////////////
55 
filterPath(SkPath * dst,const SkPath & src,SkScalar * width)56 bool SkComposePathEffect::filterPath(SkPath* dst, const SkPath& src, SkScalar* width)
57 {
58     SkPath          tmp;
59     const SkPath*   ptr = &src;
60 
61     if (fPE1->filterPath(&tmp, src, width))
62         ptr = &tmp;
63     return fPE0->filterPath(dst, *ptr, width);
64 }
65 
66 //////////////////////////////////////////////////////////////////////////////////
67 
filterPath(SkPath * dst,const SkPath & src,SkScalar * width)68 bool SkSumPathEffect::filterPath(SkPath* dst, const SkPath& src, SkScalar* width)
69 {
70     // use bit-or so that we always call both, even if the first one succeeds
71     return  fPE0->filterPath(dst, src, width) | fPE1->filterPath(dst, src, width);
72 }
73 
74 /////////////////////////////////////////////////////////////////////////////////
75 
76 #include "SkStroke.h"
77 
SkStrokePathEffect(const SkPaint & paint)78 SkStrokePathEffect::SkStrokePathEffect(const SkPaint& paint)
79     : fWidth(paint.getStrokeWidth()), fMiter(paint.getStrokeMiter()),
80       fStyle(SkToU8(paint.getStyle())), fJoin(SkToU8(paint.getStrokeJoin())), fCap(SkToU8(paint.getStrokeCap()))
81 {
82 }
83 
SkStrokePathEffect(SkScalar width,SkPaint::Style style,SkPaint::Join join,SkPaint::Cap cap,SkScalar miter)84 SkStrokePathEffect::SkStrokePathEffect(SkScalar width, SkPaint::Style style, SkPaint::Join join, SkPaint::Cap cap, SkScalar miter)
85     : fWidth(width), fMiter(miter), fStyle(SkToU8(style)), fJoin(SkToU8(join)), fCap(SkToU8(cap))
86 {
87     if (miter < 0)  // signal they want the default
88         fMiter = SK_DefaultMiterLimit;
89 }
90 
filterPath(SkPath * dst,const SkPath & src,SkScalar * width)91 bool SkStrokePathEffect::filterPath(SkPath* dst, const SkPath& src, SkScalar* width)
92 {
93     if (fWidth < 0 || fStyle == SkPaint::kFill_Style)
94         return false;
95 
96     if (fStyle == SkPaint::kStroke_Style && fWidth == 0)    // hairline
97     {
98         *width = 0;
99         return true;
100     }
101 
102     SkStroke    stroke;
103 
104     stroke.setWidth(fWidth);
105     stroke.setMiterLimit(fMiter);
106     stroke.setJoin((SkPaint::Join)fJoin);
107     stroke.setCap((SkPaint::Cap)fCap);
108     stroke.setDoFill(fStyle == SkPaint::kStrokeAndFill_Style);
109 
110     stroke.strokePath(src, dst);
111     return true;
112 }
113 
getFactory()114 SkFlattenable::Factory SkStrokePathEffect::getFactory()
115 {
116     return CreateProc;
117 }
118 
CreateProc(SkFlattenableReadBuffer & buffer)119 SkFlattenable* SkStrokePathEffect::CreateProc(SkFlattenableReadBuffer& buffer)
120 {
121     return SkNEW_ARGS(SkStrokePathEffect, (buffer));
122 }
123 
flatten(SkFlattenableWriteBuffer & buffer)124 void SkStrokePathEffect::flatten(SkFlattenableWriteBuffer& buffer)
125 {
126     buffer.writeScalar(fWidth);
127     buffer.writeScalar(fMiter);
128     buffer.write8(fStyle);
129     buffer.write8(fJoin);
130     buffer.write8(fCap);
131 }
132 
SkStrokePathEffect(SkFlattenableReadBuffer & buffer)133 SkStrokePathEffect::SkStrokePathEffect(SkFlattenableReadBuffer& buffer)
134 {
135     fWidth = buffer.readScalar();
136     fMiter = buffer.readScalar();
137     fStyle = buffer.readU8();
138     fJoin = buffer.readU8();
139     fCap = buffer.readU8();
140 }
141 
142 
143