OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrOvalEffect.h" | 8 #include "GrOvalEffect.h" |
9 | 9 |
10 #include "gl/GrGLEffect.h" | 10 #include "gl/GrGLEffect.h" |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 | 130 |
131 void GLCircleEffect::emitCode(GrGLShaderBuilder* builder, | 131 void GLCircleEffect::emitCode(GrGLShaderBuilder* builder, |
132 const GrDrawEffect& drawEffect, | 132 const GrDrawEffect& drawEffect, |
133 EffectKey key, | 133 EffectKey key, |
134 const char* outputColor, | 134 const char* outputColor, |
135 const char* inputColor, | 135 const char* inputColor, |
136 const TransformedCoordsArray&, | 136 const TransformedCoordsArray&, |
137 const TextureSamplerArray& samplers) { | 137 const TextureSamplerArray& samplers) { |
138 const CircleEffect& ce = drawEffect.castEffect<CircleEffect>(); | 138 const CircleEffect& ce = drawEffect.castEffect<CircleEffect>(); |
139 const char *circleName; | 139 const char *circleName; |
140 // The circle uniform is (center.x, center.y, radius + 0.5) | 140 // The circle uniform is (center.x, center.y, radius + 0.5) for regular fill
s and |
| 141 // (... ,radius - 0.5) for inverse fills. |
141 fCircleUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility
, | 142 fCircleUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility
, |
142 kVec3f_GrSLType, | 143 kVec3f_GrSLType, |
143 "circle", | 144 "circle", |
144 &circleName); | 145 &circleName); |
145 const char* fragmentPos = builder->fragmentPosition(); | 146 const char* fragmentPos = builder->fragmentPosition(); |
146 | 147 |
147 SkASSERT(kHairlineAA_GrEffectEdgeType != ce.getEdgeType()); | 148 SkASSERT(kHairlineAA_GrEffectEdgeType != ce.getEdgeType()); |
148 if (GrEffectEdgeTypeIsInverseFill(ce.getEdgeType())) { | 149 if (GrEffectEdgeTypeIsInverseFill(ce.getEdgeType())) { |
149 builder->fsCodeAppendf("\t\tfloat d = length(%s.xy - %s.xy) - %s.z;\n", | 150 builder->fsCodeAppendf("\t\tfloat d = length(%s.xy - %s.xy) - %s.z;\n", |
150 circleName, fragmentPos, circleName); | 151 circleName, fragmentPos, circleName); |
(...skipping 13 matching lines...) Expand all Loading... |
164 | 165 |
165 GrGLEffect::EffectKey GLCircleEffect::GenKey(const GrDrawEffect& drawEffect, | 166 GrGLEffect::EffectKey GLCircleEffect::GenKey(const GrDrawEffect& drawEffect, |
166 const GrGLCaps&) { | 167 const GrGLCaps&) { |
167 const CircleEffect& ce = drawEffect.castEffect<CircleEffect>(); | 168 const CircleEffect& ce = drawEffect.castEffect<CircleEffect>(); |
168 return ce.getEdgeType(); | 169 return ce.getEdgeType(); |
169 } | 170 } |
170 | 171 |
171 void GLCircleEffect::setData(const GrGLUniformManager& uman, const GrDrawEffect&
drawEffect) { | 172 void GLCircleEffect::setData(const GrGLUniformManager& uman, const GrDrawEffect&
drawEffect) { |
172 const CircleEffect& ce = drawEffect.castEffect<CircleEffect>(); | 173 const CircleEffect& ce = drawEffect.castEffect<CircleEffect>(); |
173 if (ce.getRadius() != fPrevRadius || ce.getCenter() != fPrevCenter) { | 174 if (ce.getRadius() != fPrevRadius || ce.getCenter() != fPrevCenter) { |
174 uman.set3f(fCircleUniform, ce.getCenter().fX, ce.getCenter().fY, ce.getR
adius() + 0.5f); | 175 SkScalar radius = ce.getRadius(); |
| 176 if (GrEffectEdgeTypeIsInverseFill(ce.getEdgeType())) { |
| 177 radius -= 0.5f; |
| 178 } else { |
| 179 radius += 0.5f; |
| 180 } |
| 181 uman.set3f(fCircleUniform, ce.getCenter().fX, ce.getCenter().fY, radius)
; |
175 fPrevCenter = ce.getCenter(); | 182 fPrevCenter = ce.getCenter(); |
176 fPrevRadius = ce.getRadius(); | 183 fPrevRadius = ce.getRadius(); |
177 } | 184 } |
178 } | 185 } |
179 | 186 |
180 ////////////////////////////////////////////////////////////////////////////// | 187 ////////////////////////////////////////////////////////////////////////////// |
181 | 188 |
182 class GLEllipseEffect; | 189 class GLEllipseEffect; |
183 | 190 |
184 class EllipseEffect : public GrEffect { | 191 class EllipseEffect : public GrEffect { |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 w /= 2; | 378 w /= 2; |
372 return CircleEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, oval
.fTop + w), w); | 379 return CircleEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, oval
.fTop + w), w); |
373 } else { | 380 } else { |
374 w /= 2; | 381 w /= 2; |
375 h /= 2; | 382 h /= 2; |
376 return EllipseEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, ova
l.fTop + h), w, h); | 383 return EllipseEffect::Create(edgeType, SkPoint::Make(oval.fLeft + w, ova
l.fTop + h), w, h); |
377 } | 384 } |
378 | 385 |
379 return NULL; | 386 return NULL; |
380 } | 387 } |
OLD | NEW |