| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 "GrOvalRenderer.h" | 8 #include "GrOvalRenderer.h" |
| 9 | 9 |
| 10 #include "GrBatchFlushState.h" | 10 #include "GrBatchFlushState.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "glsl/GrGLSLGeometryProcessor.h" | 26 #include "glsl/GrGLSLGeometryProcessor.h" |
| 27 #include "glsl/GrGLSLProgramDataManager.h" | 27 #include "glsl/GrGLSLProgramDataManager.h" |
| 28 #include "glsl/GrGLSLVarying.h" | 28 #include "glsl/GrGLSLVarying.h" |
| 29 #include "glsl/GrGLSLVertexShaderBuilder.h" | 29 #include "glsl/GrGLSLVertexShaderBuilder.h" |
| 30 #include "glsl/GrGLSLUniformHandler.h" | 30 #include "glsl/GrGLSLUniformHandler.h" |
| 31 #include "glsl/GrGLSLUtil.h" | 31 #include "glsl/GrGLSLUtil.h" |
| 32 | 32 |
| 33 // TODO(joshualitt) - Break this file up during GrBatch post implementation clea
nup | 33 // TODO(joshualitt) - Break this file up during GrBatch post implementation clea
nup |
| 34 | 34 |
| 35 namespace { | 35 namespace { |
| 36 // TODO(joshualitt) add per vertex colors | 36 |
| 37 struct CircleVertex { | 37 struct CircleVertex { |
| 38 SkPoint fPos; | 38 SkPoint fPos; |
| 39 GrColor fColor; |
| 39 SkPoint fOffset; | 40 SkPoint fOffset; |
| 40 SkScalar fOuterRadius; | 41 SkScalar fOuterRadius; |
| 41 SkScalar fInnerRadius; | 42 SkScalar fInnerRadius; |
| 42 }; | 43 }; |
| 43 | 44 |
| 44 struct EllipseVertex { | 45 struct EllipseVertex { |
| 45 SkPoint fPos; | 46 SkPoint fPos; |
| 47 GrColor fColor; |
| 46 SkPoint fOffset; | 48 SkPoint fOffset; |
| 47 SkPoint fOuterRadii; | 49 SkPoint fOuterRadii; |
| 48 SkPoint fInnerRadii; | 50 SkPoint fInnerRadii; |
| 49 }; | 51 }; |
| 50 | 52 |
| 51 struct DIEllipseVertex { | 53 struct DIEllipseVertex { |
| 52 SkPoint fPos; | 54 SkPoint fPos; |
| 55 GrColor fColor; |
| 53 SkPoint fOuterOffset; | 56 SkPoint fOuterOffset; |
| 54 SkPoint fInnerOffset; | 57 SkPoint fInnerOffset; |
| 55 }; | 58 }; |
| 56 | 59 |
| 57 inline bool circle_stays_circle(const SkMatrix& m) { | 60 inline bool circle_stays_circle(const SkMatrix& m) { |
| 58 return m.isSimilarity(); | 61 return m.isSimilarity(); |
| 59 } | 62 } |
| 60 | 63 |
| 61 } | 64 } |
| 62 | 65 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 74 */ | 77 */ |
| 75 | 78 |
| 76 class CircleEdgeEffect : public GrGeometryProcessor { | 79 class CircleEdgeEffect : public GrGeometryProcessor { |
| 77 public: | 80 public: |
| 78 static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatri
x& localMatrix, | 81 static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatri
x& localMatrix, |
| 79 bool usesLocalCoords) { | 82 bool usesLocalCoords) { |
| 80 return new CircleEdgeEffect(color, stroke, localMatrix, usesLocalCoords)
; | 83 return new CircleEdgeEffect(color, stroke, localMatrix, usesLocalCoords)
; |
| 81 } | 84 } |
| 82 | 85 |
| 83 const Attribute* inPosition() const { return fInPosition; } | 86 const Attribute* inPosition() const { return fInPosition; } |
| 87 const Attribute* inColor() const { return fInColor; } |
| 84 const Attribute* inCircleEdge() const { return fInCircleEdge; } | 88 const Attribute* inCircleEdge() const { return fInCircleEdge; } |
| 85 GrColor color() const { return fColor; } | 89 GrColor color() const { return fColor; } |
| 86 bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } | 90 bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } |
| 87 const SkMatrix& localMatrix() const { return fLocalMatrix; } | 91 const SkMatrix& localMatrix() const { return fLocalMatrix; } |
| 88 bool usesLocalCoords() const { return fUsesLocalCoords; } | 92 bool usesLocalCoords() const { return fUsesLocalCoords; } |
| 89 virtual ~CircleEdgeEffect() {} | 93 virtual ~CircleEdgeEffect() {} |
| 90 | 94 |
| 91 const char* name() const override { return "CircleEdge"; } | 95 const char* name() const override { return "CircleEdge"; } |
| 92 | 96 |
| 93 inline bool isStroked() const { return fStroke; } | 97 inline bool isStroked() const { return fStroke; } |
| 94 | 98 |
| 95 class GLSLProcessor : public GrGLSLGeometryProcessor { | 99 class GLSLProcessor : public GrGLSLGeometryProcessor { |
| 96 public: | 100 public: |
| 97 GLSLProcessor() | 101 GLSLProcessor() {} |
| 98 : fColor(GrColor_ILLEGAL) {} | |
| 99 | 102 |
| 100 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 103 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
| 101 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); | 104 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); |
| 102 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; | 105 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
| 103 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; | 106 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; |
| 104 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; | 107 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
| 105 | 108 |
| 106 // emit attributes | 109 // emit attributes |
| 107 varyingHandler->emitAttributes(ce); | 110 varyingHandler->emitAttributes(ce); |
| 108 | 111 |
| 109 GrGLSLVertToFrag v(kVec4f_GrSLType); | 112 GrGLSLVertToFrag v(kVec4f_GrSLType); |
| 110 varyingHandler->addVarying("CircleEdge", &v); | 113 varyingHandler->addVarying("CircleEdge", &v); |
| 111 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->f
Name); | 114 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->f
Name); |
| 112 | 115 |
| 113 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 116 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 114 // setup pass through color | 117 // setup pass through color |
| 115 if (!ce.colorIgnored()) { | 118 if (!ce.colorIgnored()) { |
| 116 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutpu
tColor, | 119 varyingHandler->addPassThroughAttribute(ce.inColor(), args.fOutp
utColor); |
| 117 &fColorUniform); | |
| 118 } | 120 } |
| 119 | 121 |
| 120 // Setup position | 122 // Setup position |
| 121 this->setupPosition(vertBuilder, gpArgs, ce.inPosition()->fName); | 123 this->setupPosition(vertBuilder, gpArgs, ce.inPosition()->fName); |
| 122 | 124 |
| 123 // emit transforms | 125 // emit transforms |
| 124 this->emitTransforms(vertBuilder, | 126 this->emitTransforms(vertBuilder, |
| 125 varyingHandler, | 127 varyingHandler, |
| 126 uniformHandler, | 128 uniformHandler, |
| 127 gpArgs->fPositionVar, | 129 gpArgs->fPositionVar, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 147 GrProcessorKeyBuilder* b) { | 149 GrProcessorKeyBuilder* b) { |
| 148 const CircleEdgeEffect& ce = gp.cast<CircleEdgeEffect>(); | 150 const CircleEdgeEffect& ce = gp.cast<CircleEdgeEffect>(); |
| 149 uint16_t key = ce.isStroked() ? 0x1 : 0x0; | 151 uint16_t key = ce.isStroked() ? 0x1 : 0x0; |
| 150 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0
x2 : 0x0; | 152 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0
x2 : 0x0; |
| 151 key |= ce.colorIgnored() ? 0x4 : 0x0; | 153 key |= ce.colorIgnored() ? 0x4 : 0x0; |
| 152 b->add32(key); | 154 b->add32(key); |
| 153 } | 155 } |
| 154 | 156 |
| 155 void setData(const GrGLSLProgramDataManager& pdman, | 157 void setData(const GrGLSLProgramDataManager& pdman, |
| 156 const GrPrimitiveProcessor& gp) override { | 158 const GrPrimitiveProcessor& gp) override { |
| 157 const CircleEdgeEffect& ce = gp.cast<CircleEdgeEffect>(); | |
| 158 if (ce.color() != fColor) { | |
| 159 float c[4]; | |
| 160 GrColorToRGBAFloat(ce.color(), c); | |
| 161 pdman.set4fv(fColorUniform, 1, c); | |
| 162 fColor = ce.color(); | |
| 163 } | |
| 164 } | 159 } |
| 165 | 160 |
| 166 void setTransformData(const GrPrimitiveProcessor& primProc, | 161 void setTransformData(const GrPrimitiveProcessor& primProc, |
| 167 const GrGLSLProgramDataManager& pdman, | 162 const GrGLSLProgramDataManager& pdman, |
| 168 int index, | 163 int index, |
| 169 const SkTArray<const GrCoordTransform*, true>& tra
nsforms) override { | 164 const SkTArray<const GrCoordTransform*, true>& tra
nsforms) override { |
| 170 this->setTransformDataHelper<CircleEdgeEffect>(primProc, pdman, inde
x, transforms); | 165 this->setTransformDataHelper<CircleEdgeEffect>(primProc, pdman, inde
x, transforms); |
| 171 } | 166 } |
| 172 | 167 |
| 173 private: | 168 private: |
| 174 GrColor fColor; | |
| 175 UniformHandle fColorUniform; | |
| 176 typedef GrGLSLGeometryProcessor INHERITED; | 169 typedef GrGLSLGeometryProcessor INHERITED; |
| 177 }; | 170 }; |
| 178 | 171 |
| 179 void getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) c
onst override { | 172 void getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) c
onst override { |
| 180 GLSLProcessor::GenKey(*this, caps, b); | 173 GLSLProcessor::GenKey(*this, caps, b); |
| 181 } | 174 } |
| 182 | 175 |
| 183 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const overri
de { | 176 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const overri
de { |
| 184 return new GLSLProcessor(); | 177 return new GLSLProcessor(); |
| 185 } | 178 } |
| 186 | 179 |
| 187 private: | 180 private: |
| 188 CircleEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix, bo
ol usesLocalCoords) | 181 CircleEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix, bo
ol usesLocalCoords) |
| 189 : fColor(color) | 182 : fColor(color) |
| 190 , fLocalMatrix(localMatrix) | 183 , fLocalMatrix(localMatrix) |
| 191 , fUsesLocalCoords(usesLocalCoords) { | 184 , fUsesLocalCoords(usesLocalCoords) { |
| 192 this->initClassID<CircleEdgeEffect>(); | 185 this->initClassID<CircleEdgeEffect>(); |
| 193 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVe
rtexAttribType, | 186 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVe
rtexAttribType, |
| 194 kHigh_GrSLPrecision)); | 187 kHigh_GrSLPrecision)); |
| 188 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); |
| 195 fInCircleEdge = &this->addVertexAttrib(Attribute("inCircleEdge", | 189 fInCircleEdge = &this->addVertexAttrib(Attribute("inCircleEdge", |
| 196 kVec4f_GrVertexAttrib
Type)); | 190 kVec4f_GrVertexAttrib
Type)); |
| 197 fStroke = stroke; | 191 fStroke = stroke; |
| 198 } | 192 } |
| 199 | 193 |
| 200 GrColor fColor; | 194 GrColor fColor; |
| 201 SkMatrix fLocalMatrix; | 195 SkMatrix fLocalMatrix; |
| 202 const Attribute* fInPosition; | 196 const Attribute* fInPosition; |
| 197 const Attribute* fInColor; |
| 203 const Attribute* fInCircleEdge; | 198 const Attribute* fInCircleEdge; |
| 204 bool fStroke; | 199 bool fStroke; |
| 205 bool fUsesLocalCoords; | 200 bool fUsesLocalCoords; |
| 206 | 201 |
| 207 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 202 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
| 208 | 203 |
| 209 typedef GrGeometryProcessor INHERITED; | 204 typedef GrGeometryProcessor INHERITED; |
| 210 }; | 205 }; |
| 211 | 206 |
| 212 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(CircleEdgeEffect); | 207 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(CircleEdgeEffect); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 233 static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatri
x& localMatrix, | 228 static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatri
x& localMatrix, |
| 234 bool usesLocalCoords) { | 229 bool usesLocalCoords) { |
| 235 return new EllipseEdgeEffect(color, stroke, localMatrix, usesLocalCoords
); | 230 return new EllipseEdgeEffect(color, stroke, localMatrix, usesLocalCoords
); |
| 236 } | 231 } |
| 237 | 232 |
| 238 virtual ~EllipseEdgeEffect() {} | 233 virtual ~EllipseEdgeEffect() {} |
| 239 | 234 |
| 240 const char* name() const override { return "EllipseEdge"; } | 235 const char* name() const override { return "EllipseEdge"; } |
| 241 | 236 |
| 242 const Attribute* inPosition() const { return fInPosition; } | 237 const Attribute* inPosition() const { return fInPosition; } |
| 238 const Attribute* inColor() const { return fInColor; } |
| 243 const Attribute* inEllipseOffset() const { return fInEllipseOffset; } | 239 const Attribute* inEllipseOffset() const { return fInEllipseOffset; } |
| 244 const Attribute* inEllipseRadii() const { return fInEllipseRadii; } | 240 const Attribute* inEllipseRadii() const { return fInEllipseRadii; } |
| 245 GrColor color() const { return fColor; } | 241 GrColor color() const { return fColor; } |
| 246 bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } | 242 bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } |
| 247 const SkMatrix& localMatrix() const { return fLocalMatrix; } | 243 const SkMatrix& localMatrix() const { return fLocalMatrix; } |
| 248 bool usesLocalCoords() const { return fUsesLocalCoords; } | 244 bool usesLocalCoords() const { return fUsesLocalCoords; } |
| 249 | 245 |
| 250 inline bool isStroked() const { return fStroke; } | 246 inline bool isStroked() const { return fStroke; } |
| 251 | 247 |
| 252 class GLSLProcessor : public GrGLSLGeometryProcessor { | 248 class GLSLProcessor : public GrGLSLGeometryProcessor { |
| 253 public: | 249 public: |
| 254 GLSLProcessor() | 250 GLSLProcessor() {} |
| 255 : fColor(GrColor_ILLEGAL) {} | |
| 256 | 251 |
| 257 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 252 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
| 258 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); | 253 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); |
| 259 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; | 254 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
| 260 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; | 255 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; |
| 261 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; | 256 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
| 262 | 257 |
| 263 // emit attributes | 258 // emit attributes |
| 264 varyingHandler->emitAttributes(ee); | 259 varyingHandler->emitAttributes(ee); |
| 265 | 260 |
| 266 GrGLSLVertToFrag ellipseOffsets(kVec2f_GrSLType); | 261 GrGLSLVertToFrag ellipseOffsets(kVec2f_GrSLType); |
| 267 varyingHandler->addVarying("EllipseOffsets", &ellipseOffsets); | 262 varyingHandler->addVarying("EllipseOffsets", &ellipseOffsets); |
| 268 vertBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), | 263 vertBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), |
| 269 ee.inEllipseOffset()->fName); | 264 ee.inEllipseOffset()->fName); |
| 270 | 265 |
| 271 GrGLSLVertToFrag ellipseRadii(kVec4f_GrSLType); | 266 GrGLSLVertToFrag ellipseRadii(kVec4f_GrSLType); |
| 272 varyingHandler->addVarying("EllipseRadii", &ellipseRadii); | 267 varyingHandler->addVarying("EllipseRadii", &ellipseRadii); |
| 273 vertBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), | 268 vertBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), |
| 274 ee.inEllipseRadii()->fName); | 269 ee.inEllipseRadii()->fName); |
| 275 | 270 |
| 276 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 271 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 277 // setup pass through color | 272 // setup pass through color |
| 278 if (!ee.colorIgnored()) { | 273 if (!ee.colorIgnored()) { |
| 279 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutpu
tColor, | 274 varyingHandler->addPassThroughAttribute(ee.inColor(), args.fOutp
utColor); |
| 280 &fColorUniform); | |
| 281 } | 275 } |
| 282 | 276 |
| 283 // Setup position | 277 // Setup position |
| 284 this->setupPosition(vertBuilder, gpArgs, ee.inPosition()->fName); | 278 this->setupPosition(vertBuilder, gpArgs, ee.inPosition()->fName); |
| 285 | 279 |
| 286 // emit transforms | 280 // emit transforms |
| 287 this->emitTransforms(vertBuilder, | 281 this->emitTransforms(vertBuilder, |
| 288 varyingHandler, | 282 varyingHandler, |
| 289 uniformHandler, | 283 uniformHandler, |
| 290 gpArgs->fPositionVar, | 284 gpArgs->fPositionVar, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 const GrGLSLCaps&, | 317 const GrGLSLCaps&, |
| 324 GrProcessorKeyBuilder* b) { | 318 GrProcessorKeyBuilder* b) { |
| 325 const EllipseEdgeEffect& ee = gp.cast<EllipseEdgeEffect>(); | 319 const EllipseEdgeEffect& ee = gp.cast<EllipseEdgeEffect>(); |
| 326 uint16_t key = ee.isStroked() ? 0x1 : 0x0; | 320 uint16_t key = ee.isStroked() ? 0x1 : 0x0; |
| 327 key |= ee.usesLocalCoords() && ee.localMatrix().hasPerspective() ? 0
x2 : 0x0; | 321 key |= ee.usesLocalCoords() && ee.localMatrix().hasPerspective() ? 0
x2 : 0x0; |
| 328 key |= ee.colorIgnored() ? 0x4 : 0x0; | 322 key |= ee.colorIgnored() ? 0x4 : 0x0; |
| 329 b->add32(key); | 323 b->add32(key); |
| 330 } | 324 } |
| 331 | 325 |
| 332 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitivePro
cessor& gp) override { | 326 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitivePro
cessor& gp) override { |
| 333 const EllipseEdgeEffect& ee = gp.cast<EllipseEdgeEffect>(); | |
| 334 if (ee.color() != fColor) { | |
| 335 float c[4]; | |
| 336 GrColorToRGBAFloat(ee.color(), c); | |
| 337 pdman.set4fv(fColorUniform, 1, c); | |
| 338 fColor = ee.color(); | |
| 339 } | |
| 340 } | 327 } |
| 341 | 328 |
| 342 void setTransformData(const GrPrimitiveProcessor& primProc, | 329 void setTransformData(const GrPrimitiveProcessor& primProc, |
| 343 const GrGLSLProgramDataManager& pdman, | 330 const GrGLSLProgramDataManager& pdman, |
| 344 int index, | 331 int index, |
| 345 const SkTArray<const GrCoordTransform*, true>& tra
nsforms) override { | 332 const SkTArray<const GrCoordTransform*, true>& tra
nsforms) override { |
| 346 this->setTransformDataHelper<EllipseEdgeEffect>(primProc, pdman, ind
ex, transforms); | 333 this->setTransformDataHelper<EllipseEdgeEffect>(primProc, pdman, ind
ex, transforms); |
| 347 } | 334 } |
| 348 | 335 |
| 349 private: | 336 private: |
| 350 GrColor fColor; | |
| 351 UniformHandle fColorUniform; | |
| 352 | |
| 353 typedef GrGLSLGeometryProcessor INHERITED; | 337 typedef GrGLSLGeometryProcessor INHERITED; |
| 354 }; | 338 }; |
| 355 | 339 |
| 356 void getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) c
onst override { | 340 void getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) c
onst override { |
| 357 GLSLProcessor::GenKey(*this, caps, b); | 341 GLSLProcessor::GenKey(*this, caps, b); |
| 358 } | 342 } |
| 359 | 343 |
| 360 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const overri
de { | 344 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const overri
de { |
| 361 return new GLSLProcessor(); | 345 return new GLSLProcessor(); |
| 362 } | 346 } |
| 363 | 347 |
| 364 private: | 348 private: |
| 365 EllipseEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix, | 349 EllipseEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix, |
| 366 bool usesLocalCoords) | 350 bool usesLocalCoords) |
| 367 : fColor(color) | 351 : fColor(color) |
| 368 , fLocalMatrix(localMatrix) | 352 , fLocalMatrix(localMatrix) |
| 369 , fUsesLocalCoords(usesLocalCoords) { | 353 , fUsesLocalCoords(usesLocalCoords) { |
| 370 this->initClassID<EllipseEdgeEffect>(); | 354 this->initClassID<EllipseEdgeEffect>(); |
| 371 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVe
rtexAttribType)); | 355 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVe
rtexAttribType)); |
| 356 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); |
| 372 fInEllipseOffset = &this->addVertexAttrib(Attribute("inEllipseOffset", | 357 fInEllipseOffset = &this->addVertexAttrib(Attribute("inEllipseOffset", |
| 373 kVec2f_GrVertexAttri
bType)); | 358 kVec2f_GrVertexAttri
bType)); |
| 374 fInEllipseRadii = &this->addVertexAttrib(Attribute("inEllipseRadii", | 359 fInEllipseRadii = &this->addVertexAttrib(Attribute("inEllipseRadii", |
| 375 kVec4f_GrVertexAttrib
Type)); | 360 kVec4f_GrVertexAttrib
Type)); |
| 376 fStroke = stroke; | 361 fStroke = stroke; |
| 377 } | 362 } |
| 378 | 363 |
| 379 const Attribute* fInPosition; | 364 const Attribute* fInPosition; |
| 365 const Attribute* fInColor; |
| 380 const Attribute* fInEllipseOffset; | 366 const Attribute* fInEllipseOffset; |
| 381 const Attribute* fInEllipseRadii; | 367 const Attribute* fInEllipseRadii; |
| 382 GrColor fColor; | 368 GrColor fColor; |
| 383 SkMatrix fLocalMatrix; | 369 SkMatrix fLocalMatrix; |
| 384 bool fStroke; | 370 bool fStroke; |
| 385 bool fUsesLocalCoords; | 371 bool fUsesLocalCoords; |
| 386 | 372 |
| 387 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 373 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
| 388 | 374 |
| 389 typedef GrGeometryProcessor INHERITED; | 375 typedef GrGeometryProcessor INHERITED; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 416 static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix
, Mode mode, | 402 static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix
, Mode mode, |
| 417 bool usesLocalCoords) { | 403 bool usesLocalCoords) { |
| 418 return new DIEllipseEdgeEffect(color, viewMatrix, mode, usesLocalCoords)
; | 404 return new DIEllipseEdgeEffect(color, viewMatrix, mode, usesLocalCoords)
; |
| 419 } | 405 } |
| 420 | 406 |
| 421 virtual ~DIEllipseEdgeEffect() {} | 407 virtual ~DIEllipseEdgeEffect() {} |
| 422 | 408 |
| 423 const char* name() const override { return "DIEllipseEdge"; } | 409 const char* name() const override { return "DIEllipseEdge"; } |
| 424 | 410 |
| 425 const Attribute* inPosition() const { return fInPosition; } | 411 const Attribute* inPosition() const { return fInPosition; } |
| 412 const Attribute* inColor() const { return fInColor; } |
| 426 const Attribute* inEllipseOffsets0() const { return fInEllipseOffsets0; } | 413 const Attribute* inEllipseOffsets0() const { return fInEllipseOffsets0; } |
| 427 const Attribute* inEllipseOffsets1() const { return fInEllipseOffsets1; } | 414 const Attribute* inEllipseOffsets1() const { return fInEllipseOffsets1; } |
| 428 GrColor color() const { return fColor; } | 415 GrColor color() const { return fColor; } |
| 429 bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } | 416 bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } |
| 430 const SkMatrix& viewMatrix() const { return fViewMatrix; } | 417 const SkMatrix& viewMatrix() const { return fViewMatrix; } |
| 431 bool usesLocalCoords() const { return fUsesLocalCoords; } | 418 bool usesLocalCoords() const { return fUsesLocalCoords; } |
| 432 | 419 |
| 433 inline Mode getMode() const { return fMode; } | 420 inline Mode getMode() const { return fMode; } |
| 434 | 421 |
| 435 class GLSLProcessor : public GrGLSLGeometryProcessor { | 422 class GLSLProcessor : public GrGLSLGeometryProcessor { |
| 436 public: | 423 public: |
| 437 GLSLProcessor() | 424 GLSLProcessor() |
| 438 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {} | 425 : fViewMatrix(SkMatrix::InvalidMatrix()) {} |
| 439 | 426 |
| 440 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override { | 427 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override { |
| 441 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>()
; | 428 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>()
; |
| 442 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; | 429 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
| 443 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; | 430 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; |
| 444 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; | 431 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
| 445 | 432 |
| 446 // emit attributes | 433 // emit attributes |
| 447 varyingHandler->emitAttributes(ee); | 434 varyingHandler->emitAttributes(ee); |
| 448 | 435 |
| 449 GrGLSLVertToFrag offsets0(kVec2f_GrSLType); | 436 GrGLSLVertToFrag offsets0(kVec2f_GrSLType); |
| 450 varyingHandler->addVarying("EllipseOffsets0", &offsets0); | 437 varyingHandler->addVarying("EllipseOffsets0", &offsets0); |
| 451 vertBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), | 438 vertBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), |
| 452 ee.inEllipseOffsets0()->fName); | 439 ee.inEllipseOffsets0()->fName); |
| 453 | 440 |
| 454 GrGLSLVertToFrag offsets1(kVec2f_GrSLType); | 441 GrGLSLVertToFrag offsets1(kVec2f_GrSLType); |
| 455 varyingHandler->addVarying("EllipseOffsets1", &offsets1); | 442 varyingHandler->addVarying("EllipseOffsets1", &offsets1); |
| 456 vertBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), | 443 vertBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), |
| 457 ee.inEllipseOffsets1()->fName); | 444 ee.inEllipseOffsets1()->fName); |
| 458 | 445 |
| 459 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 446 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 460 // setup pass through color | 447 // setup pass through color |
| 461 if (!ee.colorIgnored()) { | 448 if (!ee.colorIgnored()) { |
| 462 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutpu
tColor, | 449 varyingHandler->addPassThroughAttribute(ee.inColor(), args.fOutp
utColor); |
| 463 &fColorUniform); | |
| 464 } | 450 } |
| 465 | 451 |
| 466 // Setup position | 452 // Setup position |
| 467 this->setupPosition(vertBuilder, | 453 this->setupPosition(vertBuilder, |
| 468 uniformHandler, | 454 uniformHandler, |
| 469 gpArgs, | 455 gpArgs, |
| 470 ee.inPosition()->fName, | 456 ee.inPosition()->fName, |
| 471 ee.viewMatrix(), | 457 ee.viewMatrix(), |
| 472 &fViewMatrixUniform); | 458 &fViewMatrixUniform); |
| 473 | 459 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 533 void setData(const GrGLSLProgramDataManager& pdman, | 519 void setData(const GrGLSLProgramDataManager& pdman, |
| 534 const GrPrimitiveProcessor& gp) override { | 520 const GrPrimitiveProcessor& gp) override { |
| 535 const DIEllipseEdgeEffect& dee = gp.cast<DIEllipseEdgeEffect>(); | 521 const DIEllipseEdgeEffect& dee = gp.cast<DIEllipseEdgeEffect>(); |
| 536 | 522 |
| 537 if (!dee.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dee.
viewMatrix())) { | 523 if (!dee.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dee.
viewMatrix())) { |
| 538 fViewMatrix = dee.viewMatrix(); | 524 fViewMatrix = dee.viewMatrix(); |
| 539 float viewMatrix[3 * 3]; | 525 float viewMatrix[3 * 3]; |
| 540 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); | 526 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); |
| 541 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); | 527 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); |
| 542 } | 528 } |
| 543 | |
| 544 if (dee.color() != fColor) { | |
| 545 float c[4]; | |
| 546 GrColorToRGBAFloat(dee.color(), c); | |
| 547 pdman.set4fv(fColorUniform, 1, c); | |
| 548 fColor = dee.color(); | |
| 549 } | |
| 550 } | 529 } |
| 551 | 530 |
| 552 private: | 531 private: |
| 553 SkMatrix fViewMatrix; | 532 SkMatrix fViewMatrix; |
| 554 GrColor fColor; | |
| 555 UniformHandle fColorUniform; | |
| 556 UniformHandle fViewMatrixUniform; | 533 UniformHandle fViewMatrixUniform; |
| 557 | 534 |
| 558 typedef GrGLSLGeometryProcessor INHERITED; | 535 typedef GrGLSLGeometryProcessor INHERITED; |
| 559 }; | 536 }; |
| 560 | 537 |
| 561 void getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) c
onst override { | 538 void getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) c
onst override { |
| 562 GLSLProcessor::GenKey(*this, caps, b); | 539 GLSLProcessor::GenKey(*this, caps, b); |
| 563 } | 540 } |
| 564 | 541 |
| 565 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const overri
de { | 542 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const overri
de { |
| 566 return new GLSLProcessor(); | 543 return new GLSLProcessor(); |
| 567 } | 544 } |
| 568 | 545 |
| 569 private: | 546 private: |
| 570 DIEllipseEdgeEffect(GrColor color, const SkMatrix& viewMatrix, Mode mode, | 547 DIEllipseEdgeEffect(GrColor color, const SkMatrix& viewMatrix, Mode mode, |
| 571 bool usesLocalCoords) | 548 bool usesLocalCoords) |
| 572 : fColor(color) | 549 : fColor(color) |
| 573 , fViewMatrix(viewMatrix) | 550 , fViewMatrix(viewMatrix) |
| 574 , fUsesLocalCoords(usesLocalCoords) { | 551 , fUsesLocalCoords(usesLocalCoords) { |
| 575 this->initClassID<DIEllipseEdgeEffect>(); | 552 this->initClassID<DIEllipseEdgeEffect>(); |
| 576 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVe
rtexAttribType, | 553 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVe
rtexAttribType, |
| 577 kHigh_GrSLPrecision)); | 554 kHigh_GrSLPrecision)); |
| 555 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); |
| 578 fInEllipseOffsets0 = &this->addVertexAttrib(Attribute("inEllipseOffsets0
", | 556 fInEllipseOffsets0 = &this->addVertexAttrib(Attribute("inEllipseOffsets0
", |
| 579 kVec2f_GrVertexAtt
ribType)); | 557 kVec2f_GrVertexAtt
ribType)); |
| 580 fInEllipseOffsets1 = &this->addVertexAttrib(Attribute("inEllipseOffsets1
", | 558 fInEllipseOffsets1 = &this->addVertexAttrib(Attribute("inEllipseOffsets1
", |
| 581 kVec2f_GrVertexAtt
ribType)); | 559 kVec2f_GrVertexAtt
ribType)); |
| 582 fMode = mode; | 560 fMode = mode; |
| 583 } | 561 } |
| 584 | 562 |
| 585 const Attribute* fInPosition; | 563 const Attribute* fInPosition; |
| 564 const Attribute* fInColor; |
| 586 const Attribute* fInEllipseOffsets0; | 565 const Attribute* fInEllipseOffsets0; |
| 587 const Attribute* fInEllipseOffsets1; | 566 const Attribute* fInEllipseOffsets1; |
| 588 GrColor fColor; | 567 GrColor fColor; |
| 589 SkMatrix fViewMatrix; | 568 SkMatrix fViewMatrix; |
| 590 Mode fMode; | 569 Mode fMode; |
| 591 bool fUsesLocalCoords; | 570 bool fUsesLocalCoords; |
| 592 | 571 |
| 593 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 572 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
| 594 | 573 |
| 595 typedef GrGeometryProcessor INHERITED; | 574 typedef GrGeometryProcessor INHERITED; |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 715 QuadHelper helper; | 694 QuadHelper helper; |
| 716 CircleVertex* verts = reinterpret_cast<CircleVertex*>(helper.init(target
, vertexStride, | 695 CircleVertex* verts = reinterpret_cast<CircleVertex*>(helper.init(target
, vertexStride, |
| 717 instan
ceCount)); | 696 instan
ceCount)); |
| 718 if (!verts) { | 697 if (!verts) { |
| 719 return; | 698 return; |
| 720 } | 699 } |
| 721 | 700 |
| 722 for (int i = 0; i < instanceCount; i++) { | 701 for (int i = 0; i < instanceCount; i++) { |
| 723 const Geometry& geom = fGeoData[i]; | 702 const Geometry& geom = fGeoData[i]; |
| 724 | 703 |
| 704 GrColor color = geom.fColor; |
| 725 SkScalar innerRadius = geom.fInnerRadius; | 705 SkScalar innerRadius = geom.fInnerRadius; |
| 726 SkScalar outerRadius = geom.fOuterRadius; | 706 SkScalar outerRadius = geom.fOuterRadius; |
| 727 | 707 |
| 728 const SkRect& bounds = geom.fDevBounds; | 708 const SkRect& bounds = geom.fDevBounds; |
| 729 | 709 |
| 730 // The inner radius in the vertex data must be specified in normaliz
ed space. | 710 // The inner radius in the vertex data must be specified in normaliz
ed space. |
| 731 innerRadius = innerRadius / outerRadius; | 711 innerRadius = innerRadius / outerRadius; |
| 732 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop); | 712 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop); |
| 713 verts[0].fColor = color; |
| 733 verts[0].fOffset = SkPoint::Make(-1, -1); | 714 verts[0].fOffset = SkPoint::Make(-1, -1); |
| 734 verts[0].fOuterRadius = outerRadius; | 715 verts[0].fOuterRadius = outerRadius; |
| 735 verts[0].fInnerRadius = innerRadius; | 716 verts[0].fInnerRadius = innerRadius; |
| 736 | 717 |
| 737 verts[1].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom); | 718 verts[1].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom); |
| 719 verts[1].fColor = color; |
| 738 verts[1].fOffset = SkPoint::Make(-1, 1); | 720 verts[1].fOffset = SkPoint::Make(-1, 1); |
| 739 verts[1].fOuterRadius = outerRadius; | 721 verts[1].fOuterRadius = outerRadius; |
| 740 verts[1].fInnerRadius = innerRadius; | 722 verts[1].fInnerRadius = innerRadius; |
| 741 | 723 |
| 742 verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom); | 724 verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom); |
| 725 verts[2].fColor = color; |
| 743 verts[2].fOffset = SkPoint::Make(1, 1); | 726 verts[2].fOffset = SkPoint::Make(1, 1); |
| 744 verts[2].fOuterRadius = outerRadius; | 727 verts[2].fOuterRadius = outerRadius; |
| 745 verts[2].fInnerRadius = innerRadius; | 728 verts[2].fInnerRadius = innerRadius; |
| 746 | 729 |
| 747 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); | 730 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); |
| 731 verts[3].fColor = color; |
| 748 verts[3].fOffset = SkPoint::Make(1, -1); | 732 verts[3].fOffset = SkPoint::Make(1, -1); |
| 749 verts[3].fOuterRadius = outerRadius; | 733 verts[3].fOuterRadius = outerRadius; |
| 750 verts[3].fInnerRadius = innerRadius; | 734 verts[3].fInnerRadius = innerRadius; |
| 751 | 735 |
| 752 verts += kVerticesPerQuad; | 736 verts += kVerticesPerQuad; |
| 753 } | 737 } |
| 754 helper.recordDraw(target); | 738 helper.recordDraw(target); |
| 755 } | 739 } |
| 756 | 740 |
| 757 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 741 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 758 | 742 |
| 759 CircleBatch(const Geometry& geometry) : INHERITED(ClassID()) { | 743 CircleBatch(const Geometry& geometry) : INHERITED(ClassID()) { |
| 760 fGeoData.push_back(geometry); | 744 fGeoData.push_back(geometry); |
| 761 | 745 |
| 762 this->setBounds(geometry.fDevBounds); | 746 this->setBounds(geometry.fDevBounds); |
| 763 } | 747 } |
| 764 | 748 |
| 765 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 749 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
| 766 CircleBatch* that = t->cast<CircleBatch>(); | 750 CircleBatch* that = t->cast<CircleBatch>(); |
| 767 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), | 751 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), |
| 768 that->bounds(), caps)) { | 752 that->bounds(), caps)) { |
| 769 return false; | 753 return false; |
| 770 } | 754 } |
| 771 | 755 |
| 772 // TODO use vertex color to avoid breaking batches | |
| 773 if (this->color() != that->color()) { | |
| 774 return false; | |
| 775 } | |
| 776 | |
| 777 if (this->stroke() != that->stroke()) { | 756 if (this->stroke() != that->stroke()) { |
| 778 return false; | 757 return false; |
| 779 } | 758 } |
| 780 | 759 |
| 781 SkASSERT(this->usesLocalCoords() == that->usesLocalCoords()); | 760 SkASSERT(this->usesLocalCoords() == that->usesLocalCoords()); |
| 782 if (this->usesLocalCoords() && !this->viewMatrix().cheapEqualTo(that->vi
ewMatrix())) { | 761 if (this->usesLocalCoords() && !this->viewMatrix().cheapEqualTo(that->vi
ewMatrix())) { |
| 783 return false; | 762 return false; |
| 784 } | 763 } |
| 785 | 764 |
| 786 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; | 765 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 934 SkASSERT(vertexStride == sizeof(EllipseVertex)); | 913 SkASSERT(vertexStride == sizeof(EllipseVertex)); |
| 935 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>( | 914 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>( |
| 936 helper.init(target, vertexStride, instanceCount)); | 915 helper.init(target, vertexStride, instanceCount)); |
| 937 if (!verts) { | 916 if (!verts) { |
| 938 return; | 917 return; |
| 939 } | 918 } |
| 940 | 919 |
| 941 for (int i = 0; i < instanceCount; i++) { | 920 for (int i = 0; i < instanceCount; i++) { |
| 942 const Geometry& geom = fGeoData[i]; | 921 const Geometry& geom = fGeoData[i]; |
| 943 | 922 |
| 923 GrColor color = geom.fColor; |
| 944 SkScalar xRadius = geom.fXRadius; | 924 SkScalar xRadius = geom.fXRadius; |
| 945 SkScalar yRadius = geom.fYRadius; | 925 SkScalar yRadius = geom.fYRadius; |
| 946 | 926 |
| 947 // Compute the reciprocals of the radii here to save time in the sha
der | 927 // Compute the reciprocals of the radii here to save time in the sha
der |
| 948 SkScalar xRadRecip = SkScalarInvert(xRadius); | 928 SkScalar xRadRecip = SkScalarInvert(xRadius); |
| 949 SkScalar yRadRecip = SkScalarInvert(yRadius); | 929 SkScalar yRadRecip = SkScalarInvert(yRadius); |
| 950 SkScalar xInnerRadRecip = SkScalarInvert(geom.fInnerXRadius); | 930 SkScalar xInnerRadRecip = SkScalarInvert(geom.fInnerXRadius); |
| 951 SkScalar yInnerRadRecip = SkScalarInvert(geom.fInnerYRadius); | 931 SkScalar yInnerRadRecip = SkScalarInvert(geom.fInnerYRadius); |
| 952 | 932 |
| 953 const SkRect& bounds = geom.fDevBounds; | 933 const SkRect& bounds = geom.fDevBounds; |
| 954 | 934 |
| 955 // The inner radius in the vertex data must be specified in normaliz
ed space. | 935 // The inner radius in the vertex data must be specified in normaliz
ed space. |
| 956 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop); | 936 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop); |
| 937 verts[0].fColor = color; |
| 957 verts[0].fOffset = SkPoint::Make(-xRadius, -yRadius); | 938 verts[0].fOffset = SkPoint::Make(-xRadius, -yRadius); |
| 958 verts[0].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 939 verts[0].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 959 verts[0].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip)
; | 940 verts[0].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip)
; |
| 960 | 941 |
| 961 verts[1].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom); | 942 verts[1].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom); |
| 943 verts[1].fColor = color; |
| 962 verts[1].fOffset = SkPoint::Make(-xRadius, yRadius); | 944 verts[1].fOffset = SkPoint::Make(-xRadius, yRadius); |
| 963 verts[1].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 945 verts[1].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 964 verts[1].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip)
; | 946 verts[1].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip)
; |
| 965 | 947 |
| 966 verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom); | 948 verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom); |
| 949 verts[2].fColor = color; |
| 967 verts[2].fOffset = SkPoint::Make(xRadius, yRadius); | 950 verts[2].fOffset = SkPoint::Make(xRadius, yRadius); |
| 968 verts[2].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 951 verts[2].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 969 verts[2].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip)
; | 952 verts[2].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip)
; |
| 970 | 953 |
| 971 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); | 954 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); |
| 955 verts[3].fColor = color; |
| 972 verts[3].fOffset = SkPoint::Make(xRadius, -yRadius); | 956 verts[3].fOffset = SkPoint::Make(xRadius, -yRadius); |
| 973 verts[3].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 957 verts[3].fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 974 verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip)
; | 958 verts[3].fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadRecip)
; |
| 975 | 959 |
| 976 verts += kVerticesPerQuad; | 960 verts += kVerticesPerQuad; |
| 977 } | 961 } |
| 978 helper.recordDraw(target); | 962 helper.recordDraw(target); |
| 979 } | 963 } |
| 980 | 964 |
| 981 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 965 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 982 | 966 |
| 983 EllipseBatch(const Geometry& geometry) : INHERITED(ClassID()) { | 967 EllipseBatch(const Geometry& geometry) : INHERITED(ClassID()) { |
| 984 fGeoData.push_back(geometry); | 968 fGeoData.push_back(geometry); |
| 985 | 969 |
| 986 this->setBounds(geometry.fDevBounds); | 970 this->setBounds(geometry.fDevBounds); |
| 987 } | 971 } |
| 988 | 972 |
| 989 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 973 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
| 990 EllipseBatch* that = t->cast<EllipseBatch>(); | 974 EllipseBatch* that = t->cast<EllipseBatch>(); |
| 991 | 975 |
| 992 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), | 976 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), |
| 993 that->bounds(), caps)) { | 977 that->bounds(), caps)) { |
| 994 return false; | 978 return false; |
| 995 } | 979 } |
| 996 | 980 |
| 997 // TODO use vertex color to avoid breaking batches | |
| 998 if (this->color() != that->color()) { | |
| 999 return false; | |
| 1000 } | |
| 1001 | |
| 1002 if (this->stroke() != that->stroke()) { | 981 if (this->stroke() != that->stroke()) { |
| 1003 return false; | 982 return false; |
| 1004 } | 983 } |
| 1005 | 984 |
| 1006 SkASSERT(this->usesLocalCoords() == that->usesLocalCoords()); | 985 SkASSERT(this->usesLocalCoords() == that->usesLocalCoords()); |
| 1007 if (this->usesLocalCoords() && !this->viewMatrix().cheapEqualTo(that->vi
ewMatrix())) { | 986 if (this->usesLocalCoords() && !this->viewMatrix().cheapEqualTo(that->vi
ewMatrix())) { |
| 1008 return false; | 987 return false; |
| 1009 } | 988 } |
| 1010 | 989 |
| 1011 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; | 990 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1201 QuadHelper helper; | 1180 QuadHelper helper; |
| 1202 DIEllipseVertex* verts = reinterpret_cast<DIEllipseVertex*>( | 1181 DIEllipseVertex* verts = reinterpret_cast<DIEllipseVertex*>( |
| 1203 helper.init(target, vertexStride, instanceCount)); | 1182 helper.init(target, vertexStride, instanceCount)); |
| 1204 if (!verts) { | 1183 if (!verts) { |
| 1205 return; | 1184 return; |
| 1206 } | 1185 } |
| 1207 | 1186 |
| 1208 for (int i = 0; i < instanceCount; i++) { | 1187 for (int i = 0; i < instanceCount; i++) { |
| 1209 const Geometry& geom = fGeoData[i]; | 1188 const Geometry& geom = fGeoData[i]; |
| 1210 | 1189 |
| 1190 GrColor color = geom.fColor; |
| 1211 SkScalar xRadius = geom.fXRadius; | 1191 SkScalar xRadius = geom.fXRadius; |
| 1212 SkScalar yRadius = geom.fYRadius; | 1192 SkScalar yRadius = geom.fYRadius; |
| 1213 | 1193 |
| 1214 const SkRect& bounds = geom.fBounds; | 1194 const SkRect& bounds = geom.fBounds; |
| 1215 | 1195 |
| 1216 // This adjusts the "radius" to include the half-pixel border | 1196 // This adjusts the "radius" to include the half-pixel border |
| 1217 SkScalar offsetDx = geom.fGeoDx / xRadius; | 1197 SkScalar offsetDx = geom.fGeoDx / xRadius; |
| 1218 SkScalar offsetDy = geom.fGeoDy / yRadius; | 1198 SkScalar offsetDy = geom.fGeoDy / yRadius; |
| 1219 | 1199 |
| 1220 SkScalar innerRatioX = xRadius / geom.fInnerXRadius; | 1200 SkScalar innerRatioX = xRadius / geom.fInnerXRadius; |
| 1221 SkScalar innerRatioY = yRadius / geom.fInnerYRadius; | 1201 SkScalar innerRatioY = yRadius / geom.fInnerYRadius; |
| 1222 | 1202 |
| 1223 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop); | 1203 verts[0].fPos = SkPoint::Make(bounds.fLeft, bounds.fTop); |
| 1204 verts[0].fColor = color; |
| 1224 verts[0].fOuterOffset = SkPoint::Make(-1.0f - offsetDx, -1.0f - offs
etDy); | 1205 verts[0].fOuterOffset = SkPoint::Make(-1.0f - offsetDx, -1.0f - offs
etDy); |
| 1225 verts[0].fInnerOffset = SkPoint::Make(-innerRatioX - offsetDx, -inne
rRatioY - offsetDy); | 1206 verts[0].fInnerOffset = SkPoint::Make(-innerRatioX - offsetDx, -inne
rRatioY - offsetDy); |
| 1226 | 1207 |
| 1227 verts[1].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom); | 1208 verts[1].fPos = SkPoint::Make(bounds.fLeft, bounds.fBottom); |
| 1209 verts[1].fColor = color; |
| 1228 verts[1].fOuterOffset = SkPoint::Make(-1.0f - offsetDx, 1.0f + offse
tDy); | 1210 verts[1].fOuterOffset = SkPoint::Make(-1.0f - offsetDx, 1.0f + offse
tDy); |
| 1229 verts[1].fInnerOffset = SkPoint::Make(-innerRatioX - offsetDx, inner
RatioY + offsetDy); | 1211 verts[1].fInnerOffset = SkPoint::Make(-innerRatioX - offsetDx, inner
RatioY + offsetDy); |
| 1230 | 1212 |
| 1231 verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom); | 1213 verts[2].fPos = SkPoint::Make(bounds.fRight, bounds.fBottom); |
| 1214 verts[2].fColor = color; |
| 1232 verts[2].fOuterOffset = SkPoint::Make(1.0f + offsetDx, 1.0f + offset
Dy); | 1215 verts[2].fOuterOffset = SkPoint::Make(1.0f + offsetDx, 1.0f + offset
Dy); |
| 1233 verts[2].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, innerR
atioY + offsetDy); | 1216 verts[2].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, innerR
atioY + offsetDy); |
| 1234 | 1217 |
| 1235 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); | 1218 verts[3].fPos = SkPoint::Make(bounds.fRight, bounds.fTop); |
| 1219 verts[3].fColor = color; |
| 1236 verts[3].fOuterOffset = SkPoint::Make(1.0f + offsetDx, -1.0f - offse
tDy); | 1220 verts[3].fOuterOffset = SkPoint::Make(1.0f + offsetDx, -1.0f - offse
tDy); |
| 1237 verts[3].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, -inner
RatioY - offsetDy); | 1221 verts[3].fInnerOffset = SkPoint::Make(innerRatioX + offsetDx, -inner
RatioY - offsetDy); |
| 1238 | 1222 |
| 1239 verts += kVerticesPerQuad; | 1223 verts += kVerticesPerQuad; |
| 1240 } | 1224 } |
| 1241 helper.recordDraw(target); | 1225 helper.recordDraw(target); |
| 1242 } | 1226 } |
| 1243 | 1227 |
| 1244 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 1228 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 1245 | 1229 |
| 1246 DIEllipseBatch(const Geometry& geometry, const SkRect& bounds) : INHERITED(C
lassID()) { | 1230 DIEllipseBatch(const Geometry& geometry, const SkRect& bounds) : INHERITED(C
lassID()) { |
| 1247 fGeoData.push_back(geometry); | 1231 fGeoData.push_back(geometry); |
| 1248 | 1232 |
| 1249 this->setBounds(bounds); | 1233 this->setBounds(bounds); |
| 1250 } | 1234 } |
| 1251 | 1235 |
| 1252 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 1236 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
| 1253 DIEllipseBatch* that = t->cast<DIEllipseBatch>(); | 1237 DIEllipseBatch* that = t->cast<DIEllipseBatch>(); |
| 1254 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), | 1238 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), |
| 1255 that->bounds(), caps)) { | 1239 that->bounds(), caps)) { |
| 1256 return false; | 1240 return false; |
| 1257 } | 1241 } |
| 1258 | 1242 |
| 1259 // TODO use vertex color to avoid breaking batches | |
| 1260 if (this->color() != that->color()) { | |
| 1261 return false; | |
| 1262 } | |
| 1263 | |
| 1264 if (this->mode() != that->mode()) { | 1243 if (this->mode() != that->mode()) { |
| 1265 return false; | 1244 return false; |
| 1266 } | 1245 } |
| 1267 | 1246 |
| 1268 // TODO rewrite to allow positioning on CPU | 1247 // TODO rewrite to allow positioning on CPU |
| 1269 if (!this->viewMatrix().cheapEqualTo(that->viewMatrix())) { | 1248 if (!this->viewMatrix().cheapEqualTo(that->viewMatrix())) { |
| 1270 return false; | 1249 return false; |
| 1271 } | 1250 } |
| 1272 | 1251 |
| 1273 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; | 1252 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1572 kTriangles_GrPrimitiveType, vertexStride, indexBuffer, kVertsPerRRec
t, | 1551 kTriangles_GrPrimitiveType, vertexStride, indexBuffer, kVertsPerRRec
t, |
| 1573 indicesPerInstance, instanceCount)); | 1552 indicesPerInstance, instanceCount)); |
| 1574 if (!verts || !indexBuffer) { | 1553 if (!verts || !indexBuffer) { |
| 1575 SkDebugf("Could not allocate vertices\n"); | 1554 SkDebugf("Could not allocate vertices\n"); |
| 1576 return; | 1555 return; |
| 1577 } | 1556 } |
| 1578 | 1557 |
| 1579 for (int i = 0; i < instanceCount; i++) { | 1558 for (int i = 0; i < instanceCount; i++) { |
| 1580 const Geometry& args = fGeoData[i]; | 1559 const Geometry& args = fGeoData[i]; |
| 1581 | 1560 |
| 1561 GrColor color = args.fColor; |
| 1582 SkScalar outerRadius = args.fOuterRadius; | 1562 SkScalar outerRadius = args.fOuterRadius; |
| 1583 | 1563 |
| 1584 const SkRect& bounds = args.fDevBounds; | 1564 const SkRect& bounds = args.fDevBounds; |
| 1585 | 1565 |
| 1586 SkScalar yCoords[4] = { | 1566 SkScalar yCoords[4] = { |
| 1587 bounds.fTop, | 1567 bounds.fTop, |
| 1588 bounds.fTop + outerRadius, | 1568 bounds.fTop + outerRadius, |
| 1589 bounds.fBottom - outerRadius, | 1569 bounds.fBottom - outerRadius, |
| 1590 bounds.fBottom | 1570 bounds.fBottom |
| 1591 }; | 1571 }; |
| 1592 | 1572 |
| 1593 SkScalar yOuterRadii[4] = {-1, 0, 0, 1 }; | 1573 SkScalar yOuterRadii[4] = {-1, 0, 0, 1 }; |
| 1594 // The inner radius in the vertex data must be specified in normaliz
ed space. | 1574 // The inner radius in the vertex data must be specified in normaliz
ed space. |
| 1595 SkScalar innerRadius = args.fInnerRadius / args.fOuterRadius; | 1575 SkScalar innerRadius = args.fInnerRadius / args.fOuterRadius; |
| 1596 for (int i = 0; i < 4; ++i) { | 1576 for (int i = 0; i < 4; ++i) { |
| 1597 verts->fPos = SkPoint::Make(bounds.fLeft, yCoords[i]); | 1577 verts->fPos = SkPoint::Make(bounds.fLeft, yCoords[i]); |
| 1578 verts->fColor = color; |
| 1598 verts->fOffset = SkPoint::Make(-1, yOuterRadii[i]); | 1579 verts->fOffset = SkPoint::Make(-1, yOuterRadii[i]); |
| 1599 verts->fOuterRadius = outerRadius; | 1580 verts->fOuterRadius = outerRadius; |
| 1600 verts->fInnerRadius = innerRadius; | 1581 verts->fInnerRadius = innerRadius; |
| 1601 verts++; | 1582 verts++; |
| 1602 | 1583 |
| 1603 verts->fPos = SkPoint::Make(bounds.fLeft + outerRadius, yCoords[
i]); | 1584 verts->fPos = SkPoint::Make(bounds.fLeft + outerRadius, yCoords[
i]); |
| 1585 verts->fColor = color; |
| 1604 verts->fOffset = SkPoint::Make(0, yOuterRadii[i]); | 1586 verts->fOffset = SkPoint::Make(0, yOuterRadii[i]); |
| 1605 verts->fOuterRadius = outerRadius; | 1587 verts->fOuterRadius = outerRadius; |
| 1606 verts->fInnerRadius = innerRadius; | 1588 verts->fInnerRadius = innerRadius; |
| 1607 verts++; | 1589 verts++; |
| 1608 | 1590 |
| 1609 verts->fPos = SkPoint::Make(bounds.fRight - outerRadius, yCoords
[i]); | 1591 verts->fPos = SkPoint::Make(bounds.fRight - outerRadius, yCoords
[i]); |
| 1592 verts->fColor = color; |
| 1610 verts->fOffset = SkPoint::Make(0, yOuterRadii[i]); | 1593 verts->fOffset = SkPoint::Make(0, yOuterRadii[i]); |
| 1611 verts->fOuterRadius = outerRadius; | 1594 verts->fOuterRadius = outerRadius; |
| 1612 verts->fInnerRadius = innerRadius; | 1595 verts->fInnerRadius = innerRadius; |
| 1613 verts++; | 1596 verts++; |
| 1614 | 1597 |
| 1615 verts->fPos = SkPoint::Make(bounds.fRight, yCoords[i]); | 1598 verts->fPos = SkPoint::Make(bounds.fRight, yCoords[i]); |
| 1599 verts->fColor = color; |
| 1616 verts->fOffset = SkPoint::Make(1, yOuterRadii[i]); | 1600 verts->fOffset = SkPoint::Make(1, yOuterRadii[i]); |
| 1617 verts->fOuterRadius = outerRadius; | 1601 verts->fOuterRadius = outerRadius; |
| 1618 verts->fInnerRadius = innerRadius; | 1602 verts->fInnerRadius = innerRadius; |
| 1619 verts++; | 1603 verts++; |
| 1620 } | 1604 } |
| 1621 } | 1605 } |
| 1622 | 1606 |
| 1623 helper.recordDraw(target); | 1607 helper.recordDraw(target); |
| 1624 } | 1608 } |
| 1625 | 1609 |
| 1626 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 1610 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 1627 | 1611 |
| 1628 RRectCircleRendererBatch(const Geometry& geometry) : INHERITED(ClassID()) { | 1612 RRectCircleRendererBatch(const Geometry& geometry) : INHERITED(ClassID()) { |
| 1629 fGeoData.push_back(geometry); | 1613 fGeoData.push_back(geometry); |
| 1630 | 1614 |
| 1631 this->setBounds(geometry.fDevBounds); | 1615 this->setBounds(geometry.fDevBounds); |
| 1632 } | 1616 } |
| 1633 | 1617 |
| 1634 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 1618 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
| 1635 RRectCircleRendererBatch* that = t->cast<RRectCircleRendererBatch>(); | 1619 RRectCircleRendererBatch* that = t->cast<RRectCircleRendererBatch>(); |
| 1636 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), | 1620 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), |
| 1637 that->bounds(), caps)) { | 1621 that->bounds(), caps)) { |
| 1638 return false; | 1622 return false; |
| 1639 } | 1623 } |
| 1640 | 1624 |
| 1641 // TODO use vertex color to avoid breaking batches | |
| 1642 if (this->color() != that->color()) { | |
| 1643 return false; | |
| 1644 } | |
| 1645 | |
| 1646 if (this->stroke() != that->stroke()) { | 1625 if (this->stroke() != that->stroke()) { |
| 1647 return false; | 1626 return false; |
| 1648 } | 1627 } |
| 1649 | 1628 |
| 1650 SkASSERT(this->usesLocalCoords() == that->usesLocalCoords()); | 1629 SkASSERT(this->usesLocalCoords() == that->usesLocalCoords()); |
| 1651 if (this->usesLocalCoords() && !this->viewMatrix().cheapEqualTo(that->vi
ewMatrix())) { | 1630 if (this->usesLocalCoords() && !this->viewMatrix().cheapEqualTo(that->vi
ewMatrix())) { |
| 1652 return false; | 1631 return false; |
| 1653 } | 1632 } |
| 1654 | 1633 |
| 1655 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; | 1634 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1751 helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexB
uffer, | 1730 helper.init(target, kTriangles_GrPrimitiveType, vertexStride, indexB
uffer, |
| 1752 kVertsPerRRect, indicesPerInstance, instanceCount)); | 1731 kVertsPerRRect, indicesPerInstance, instanceCount)); |
| 1753 if (!verts || !indexBuffer) { | 1732 if (!verts || !indexBuffer) { |
| 1754 SkDebugf("Could not allocate vertices\n"); | 1733 SkDebugf("Could not allocate vertices\n"); |
| 1755 return; | 1734 return; |
| 1756 } | 1735 } |
| 1757 | 1736 |
| 1758 for (int i = 0; i < instanceCount; i++) { | 1737 for (int i = 0; i < instanceCount; i++) { |
| 1759 const Geometry& args = fGeoData[i]; | 1738 const Geometry& args = fGeoData[i]; |
| 1760 | 1739 |
| 1740 GrColor color = args.fColor; |
| 1741 |
| 1761 // Compute the reciprocals of the radii here to save time in the sha
der | 1742 // Compute the reciprocals of the radii here to save time in the sha
der |
| 1762 SkScalar xRadRecip = SkScalarInvert(args.fXRadius); | 1743 SkScalar xRadRecip = SkScalarInvert(args.fXRadius); |
| 1763 SkScalar yRadRecip = SkScalarInvert(args.fYRadius); | 1744 SkScalar yRadRecip = SkScalarInvert(args.fYRadius); |
| 1764 SkScalar xInnerRadRecip = SkScalarInvert(args.fInnerXRadius); | 1745 SkScalar xInnerRadRecip = SkScalarInvert(args.fInnerXRadius); |
| 1765 SkScalar yInnerRadRecip = SkScalarInvert(args.fInnerYRadius); | 1746 SkScalar yInnerRadRecip = SkScalarInvert(args.fInnerYRadius); |
| 1766 | 1747 |
| 1767 // Extend the radii out half a pixel to antialias. | 1748 // Extend the radii out half a pixel to antialias. |
| 1768 SkScalar xOuterRadius = args.fXRadius + SK_ScalarHalf; | 1749 SkScalar xOuterRadius = args.fXRadius + SK_ScalarHalf; |
| 1769 SkScalar yOuterRadius = args.fYRadius + SK_ScalarHalf; | 1750 SkScalar yOuterRadius = args.fYRadius + SK_ScalarHalf; |
| 1770 | 1751 |
| 1771 const SkRect& bounds = args.fDevBounds; | 1752 const SkRect& bounds = args.fDevBounds; |
| 1772 | 1753 |
| 1773 SkScalar yCoords[4] = { | 1754 SkScalar yCoords[4] = { |
| 1774 bounds.fTop, | 1755 bounds.fTop, |
| 1775 bounds.fTop + yOuterRadius, | 1756 bounds.fTop + yOuterRadius, |
| 1776 bounds.fBottom - yOuterRadius, | 1757 bounds.fBottom - yOuterRadius, |
| 1777 bounds.fBottom | 1758 bounds.fBottom |
| 1778 }; | 1759 }; |
| 1779 SkScalar yOuterOffsets[4] = { | 1760 SkScalar yOuterOffsets[4] = { |
| 1780 yOuterRadius, | 1761 yOuterRadius, |
| 1781 SK_ScalarNearlyZero, // we're using inversesqrt() in shader, so
can't be exactly 0 | 1762 SK_ScalarNearlyZero, // we're using inversesqrt() in shader, so
can't be exactly 0 |
| 1782 SK_ScalarNearlyZero, | 1763 SK_ScalarNearlyZero, |
| 1783 yOuterRadius | 1764 yOuterRadius |
| 1784 }; | 1765 }; |
| 1785 | 1766 |
| 1786 for (int i = 0; i < 4; ++i) { | 1767 for (int i = 0; i < 4; ++i) { |
| 1787 verts->fPos = SkPoint::Make(bounds.fLeft, yCoords[i]); | 1768 verts->fPos = SkPoint::Make(bounds.fLeft, yCoords[i]); |
| 1769 verts->fColor = color; |
| 1788 verts->fOffset = SkPoint::Make(xOuterRadius, yOuterOffsets[i]); | 1770 verts->fOffset = SkPoint::Make(xOuterRadius, yOuterOffsets[i]); |
| 1789 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 1771 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 1790 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadReci
p); | 1772 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadReci
p); |
| 1791 verts++; | 1773 verts++; |
| 1792 | 1774 |
| 1793 verts->fPos = SkPoint::Make(bounds.fLeft + xOuterRadius, yCoords
[i]); | 1775 verts->fPos = SkPoint::Make(bounds.fLeft + xOuterRadius, yCoords
[i]); |
| 1776 verts->fColor = color; |
| 1794 verts->fOffset = SkPoint::Make(SK_ScalarNearlyZero, yOuterOffset
s[i]); | 1777 verts->fOffset = SkPoint::Make(SK_ScalarNearlyZero, yOuterOffset
s[i]); |
| 1795 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 1778 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 1796 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadReci
p); | 1779 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadReci
p); |
| 1797 verts++; | 1780 verts++; |
| 1798 | 1781 |
| 1799 verts->fPos = SkPoint::Make(bounds.fRight - xOuterRadius, yCoord
s[i]); | 1782 verts->fPos = SkPoint::Make(bounds.fRight - xOuterRadius, yCoord
s[i]); |
| 1783 verts->fColor = color; |
| 1800 verts->fOffset = SkPoint::Make(SK_ScalarNearlyZero, yOuterOffset
s[i]); | 1784 verts->fOffset = SkPoint::Make(SK_ScalarNearlyZero, yOuterOffset
s[i]); |
| 1801 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 1785 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 1802 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadReci
p); | 1786 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadReci
p); |
| 1803 verts++; | 1787 verts++; |
| 1804 | 1788 |
| 1805 verts->fPos = SkPoint::Make(bounds.fRight, yCoords[i]); | 1789 verts->fPos = SkPoint::Make(bounds.fRight, yCoords[i]); |
| 1790 verts->fColor = color; |
| 1806 verts->fOffset = SkPoint::Make(xOuterRadius, yOuterOffsets[i]); | 1791 verts->fOffset = SkPoint::Make(xOuterRadius, yOuterOffsets[i]); |
| 1807 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); | 1792 verts->fOuterRadii = SkPoint::Make(xRadRecip, yRadRecip); |
| 1808 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadReci
p); | 1793 verts->fInnerRadii = SkPoint::Make(xInnerRadRecip, yInnerRadReci
p); |
| 1809 verts++; | 1794 verts++; |
| 1810 } | 1795 } |
| 1811 } | 1796 } |
| 1812 helper.recordDraw(target); | 1797 helper.recordDraw(target); |
| 1813 } | 1798 } |
| 1814 | 1799 |
| 1815 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 1800 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 1816 | 1801 |
| 1817 RRectEllipseRendererBatch(const Geometry& geometry) : INHERITED(ClassID()) { | 1802 RRectEllipseRendererBatch(const Geometry& geometry) : INHERITED(ClassID()) { |
| 1818 fGeoData.push_back(geometry); | 1803 fGeoData.push_back(geometry); |
| 1819 | 1804 |
| 1820 this->setBounds(geometry.fDevBounds); | 1805 this->setBounds(geometry.fDevBounds); |
| 1821 } | 1806 } |
| 1822 | 1807 |
| 1823 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 1808 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
| 1824 RRectEllipseRendererBatch* that = t->cast<RRectEllipseRendererBatch>(); | 1809 RRectEllipseRendererBatch* that = t->cast<RRectEllipseRendererBatch>(); |
| 1825 | 1810 |
| 1826 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), | 1811 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), |
| 1827 that->bounds(), caps)) { | 1812 that->bounds(), caps)) { |
| 1828 return false; | 1813 return false; |
| 1829 } | 1814 } |
| 1830 | 1815 |
| 1831 // TODO use vertex color to avoid breaking batches | |
| 1832 if (this->color() != that->color()) { | |
| 1833 return false; | |
| 1834 } | |
| 1835 | |
| 1836 if (this->stroke() != that->stroke()) { | 1816 if (this->stroke() != that->stroke()) { |
| 1837 return false; | 1817 return false; |
| 1838 } | 1818 } |
| 1839 | 1819 |
| 1840 SkASSERT(this->usesLocalCoords() == that->usesLocalCoords()); | 1820 SkASSERT(this->usesLocalCoords() == that->usesLocalCoords()); |
| 1841 if (this->usesLocalCoords() && !this->viewMatrix().cheapEqualTo(that->vi
ewMatrix())) { | 1821 if (this->usesLocalCoords() && !this->viewMatrix().cheapEqualTo(that->vi
ewMatrix())) { |
| 1842 return false; | 1822 return false; |
| 1843 } | 1823 } |
| 1844 | 1824 |
| 1845 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; | 1825 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2078 } | 2058 } |
| 2079 | 2059 |
| 2080 DRAW_BATCH_TEST_DEFINE(RRectBatch) { | 2060 DRAW_BATCH_TEST_DEFINE(RRectBatch) { |
| 2081 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); | 2061 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); |
| 2082 GrColor color = GrRandomColor(random); | 2062 GrColor color = GrRandomColor(random); |
| 2083 const SkRRect& rrect = GrTest::TestRRectSimple(random); | 2063 const SkRRect& rrect = GrTest::TestRRectSimple(random); |
| 2084 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra
ndom)); | 2064 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra
ndom)); |
| 2085 } | 2065 } |
| 2086 | 2066 |
| 2087 #endif | 2067 #endif |
| OLD | NEW |