| 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 "GrDashingEffect.h" | 8 #include "GrDashingEffect.h" |
| 9 | 9 |
| 10 #include "GrBatchFlushState.h" | 10 #include "GrBatchFlushState.h" |
| 11 #include "GrBatchTest.h" | 11 #include "GrBatchTest.h" |
| 12 #include "GrCaps.h" | 12 #include "GrCaps.h" |
| 13 #include "GrGeometryProcessor.h" | 13 #include "GrGeometryProcessor.h" |
| 14 #include "GrContext.h" | 14 #include "GrContext.h" |
| 15 #include "GrCoordTransform.h" | 15 #include "GrCoordTransform.h" |
| 16 #include "GrDefaultGeoProcFactory.h" | 16 #include "GrDefaultGeoProcFactory.h" |
| 17 #include "GrInvariantOutput.h" | 17 #include "GrInvariantOutput.h" |
| 18 #include "GrProcessor.h" | 18 #include "GrProcessor.h" |
| 19 #include "GrStyle.h" | 19 #include "GrStyle.h" |
| 20 #include "SkGr.h" | 20 #include "SkGr.h" |
| 21 #include "batches/GrVertexBatch.h" | 21 #include "batches/GrVertexBatch.h" |
| 22 #include "glsl/GrGLSLFragmentShaderBuilder.h" | 22 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
| 23 #include "glsl/GrGLSLGeometryProcessor.h" | 23 #include "glsl/GrGLSLGeometryProcessor.h" |
| 24 #include "glsl/GrGLSLProgramDataManager.h" | 24 #include "glsl/GrGLSLProgramDataManager.h" |
| 25 #include "glsl/GrGLSLUniformHandler.h" | 25 #include "glsl/GrGLSLUniformHandler.h" |
| 26 #include "glsl/GrGLSLVarying.h" | 26 #include "glsl/GrGLSLVarying.h" |
| 27 #include "glsl/GrGLSLVertexShaderBuilder.h" | 27 #include "glsl/GrGLSLVertexShaderBuilder.h" |
| 28 | 28 |
| 29 using AAMode = GrDashingEffect::AAMode; |
| 30 |
| 29 /////////////////////////////////////////////////////////////////////////////// | 31 /////////////////////////////////////////////////////////////////////////////// |
| 30 | 32 |
| 31 // Returns whether or not the gpu can fast path the dash line effect. | 33 // Returns whether or not the gpu can fast path the dash line effect. |
| 32 bool GrDashingEffect::CanDrawDashLine(const SkPoint pts[2], const GrStyle& style
, | 34 bool GrDashingEffect::CanDrawDashLine(const SkPoint pts[2], const GrStyle& style
, |
| 33 const SkMatrix& viewMatrix) { | 35 const SkMatrix& viewMatrix) { |
| 34 // Pts must be either horizontal or vertical in src space | 36 // Pts must be either horizontal or vertical in src space |
| 35 if (pts[0].fX != pts[1].fX && pts[0].fY != pts[1].fY) { | 37 if (pts[0].fX != pts[1].fX && pts[0].fY != pts[1].fY) { |
| 36 return false; | 38 return false; |
| 37 } | 39 } |
| 38 | 40 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 67 SkScalar fIntervalLength; | 69 SkScalar fIntervalLength; |
| 68 SkRect fRect; | 70 SkRect fRect; |
| 69 }; | 71 }; |
| 70 struct DashCircleVertex { | 72 struct DashCircleVertex { |
| 71 SkPoint fPos; | 73 SkPoint fPos; |
| 72 SkPoint fDashPos; | 74 SkPoint fDashPos; |
| 73 SkScalar fIntervalLength; | 75 SkScalar fIntervalLength; |
| 74 SkScalar fRadius; | 76 SkScalar fRadius; |
| 75 SkScalar fCenterX; | 77 SkScalar fCenterX; |
| 76 }; | 78 }; |
| 77 | |
| 78 enum DashAAMode { | |
| 79 kBW_DashAAMode, | |
| 80 kEdgeAA_DashAAMode, | |
| 81 kMSAA_DashAAMode, | |
| 82 | |
| 83 kDashAAModeCount, | |
| 84 }; | |
| 85 }; | 79 }; |
| 86 | 80 |
| 87 static void calc_dash_scaling(SkScalar* parallelScale, SkScalar* perpScale, | 81 static void calc_dash_scaling(SkScalar* parallelScale, SkScalar* perpScale, |
| 88 const SkMatrix& viewMatrix, const SkPoint pts[2]) { | 82 const SkMatrix& viewMatrix, const SkPoint pts[2]) { |
| 89 SkVector vecSrc = pts[1] - pts[0]; | 83 SkVector vecSrc = pts[1] - pts[0]; |
| 90 SkScalar magSrc = vecSrc.length(); | 84 SkScalar magSrc = vecSrc.length(); |
| 91 SkScalar invSrc = magSrc ? SkScalarInvert(magSrc) : 0; | 85 SkScalar invSrc = magSrc ? SkScalarInvert(magSrc) : 0; |
| 92 vecSrc.scale(invSrc); | 86 vecSrc.scale(invSrc); |
| 93 | 87 |
| 94 SkVector vecSrcPerp; | 88 SkVector vecSrcPerp; |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 } | 226 } |
| 233 | 227 |
| 234 | 228 |
| 235 /** | 229 /** |
| 236 * An GrGeometryProcessor that renders a dashed line. | 230 * An GrGeometryProcessor that renders a dashed line. |
| 237 * This GrGeometryProcessor is meant for dashed lines that only have a single on
/off interval pair. | 231 * This GrGeometryProcessor is meant for dashed lines that only have a single on
/off interval pair. |
| 238 * Bounding geometry is rendered and the effect computes coverage based on the f
ragment's | 232 * Bounding geometry is rendered and the effect computes coverage based on the f
ragment's |
| 239 * position relative to the dashed line. | 233 * position relative to the dashed line. |
| 240 */ | 234 */ |
| 241 static GrGeometryProcessor* create_dash_gp(GrColor, | 235 static GrGeometryProcessor* create_dash_gp(GrColor, |
| 242 DashAAMode aaMode, | 236 AAMode aaMode, |
| 243 DashCap cap, | 237 DashCap cap, |
| 244 const SkMatrix& localMatrix, | 238 const SkMatrix& localMatrix, |
| 245 bool usesLocalCoords); | 239 bool usesLocalCoords); |
| 246 | 240 |
| 247 class DashBatch : public GrVertexBatch { | 241 class DashBatch : public GrVertexBatch { |
| 248 public: | 242 public: |
| 249 DEFINE_BATCH_CLASS_ID | 243 DEFINE_BATCH_CLASS_ID |
| 250 | |
| 251 struct Geometry { | 244 struct Geometry { |
| 252 SkMatrix fViewMatrix; | 245 SkMatrix fViewMatrix; |
| 253 SkMatrix fSrcRotInv; | 246 SkMatrix fSrcRotInv; |
| 254 SkPoint fPtsRot[2]; | 247 SkPoint fPtsRot[2]; |
| 255 SkScalar fSrcStrokeWidth; | 248 SkScalar fSrcStrokeWidth; |
| 256 SkScalar fPhase; | 249 SkScalar fPhase; |
| 257 SkScalar fIntervals[2]; | 250 SkScalar fIntervals[2]; |
| 258 SkScalar fParallelScale; | 251 SkScalar fParallelScale; |
| 259 SkScalar fPerpendicularScale; | 252 SkScalar fPerpendicularScale; |
| 260 GrColor fColor; | 253 GrColor fColor; |
| 261 }; | 254 }; |
| 262 | 255 |
| 263 static GrDrawBatch* Create(const Geometry& geometry, SkPaint::Cap cap, DashA
AMode aaMode, | 256 static GrDrawBatch* Create(const Geometry& geometry, SkPaint::Cap cap, AAMod
e aaMode, |
| 264 bool fullDash) { | 257 bool fullDash) { |
| 265 return new DashBatch(geometry, cap, aaMode, fullDash); | 258 return new DashBatch(geometry, cap, aaMode, fullDash); |
| 266 } | 259 } |
| 267 | 260 |
| 268 const char* name() const override { return "DashBatch"; } | 261 const char* name() const override { return "DashBatch"; } |
| 269 | 262 |
| 270 void computePipelineOptimizations(GrInitInvariantOutput* color, | 263 void computePipelineOptimizations(GrInitInvariantOutput* color, |
| 271 GrInitInvariantOutput* coverage, | 264 GrInitInvariantOutput* coverage, |
| 272 GrBatchToXPOverrides* overrides) const ove
rride { | 265 GrBatchToXPOverrides* overrides) const ove
rride { |
| 273 // When this is called on a batch, there is only one geometry bundle | 266 // When this is called on a batch, there is only one geometry bundle |
| 274 color->setKnownFourComponents(fGeoData[0].fColor); | 267 color->setKnownFourComponents(fGeoData[0].fColor); |
| 275 coverage->setUnknownSingleComponent(); | 268 coverage->setUnknownSingleComponent(); |
| 276 } | 269 } |
| 277 | 270 |
| 278 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 271 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 279 | 272 |
| 280 private: | 273 private: |
| 281 DashBatch(const Geometry& geometry, SkPaint::Cap cap, DashAAMode aaMode, boo
l fullDash) | 274 DashBatch(const Geometry& geometry, SkPaint::Cap cap, AAMode aaMode, bool fu
llDash) |
| 282 : INHERITED(ClassID()) { | 275 : INHERITED(ClassID()) { |
| 283 fGeoData.push_back(geometry); | 276 fGeoData.push_back(geometry); |
| 284 | 277 |
| 285 fBatch.fAAMode = aaMode; | 278 fBatch.fAAMode = aaMode; |
| 286 fBatch.fCap = cap; | 279 fBatch.fCap = cap; |
| 287 fBatch.fFullDash = fullDash; | 280 fBatch.fFullDash = fullDash; |
| 288 | 281 |
| 289 // compute bounds | 282 // compute bounds |
| 290 SkScalar halfStrokeWidth = 0.5f * geometry.fSrcStrokeWidth; | 283 SkScalar halfStrokeWidth = 0.5f * geometry.fSrcStrokeWidth; |
| 291 SkScalar xBloat = SkPaint::kButt_Cap == cap ? 0 : halfStrokeWidth; | 284 SkScalar xBloat = SkPaint::kButt_Cap == cap ? 0 : halfStrokeWidth; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 LocalCoords::kUnus
ed_Type); | 345 LocalCoords::kUnus
ed_Type); |
| 353 gp.reset(CreateForDeviceSpace(color, coverage, localCoords, this->vi
ewMatrix())); | 346 gp.reset(CreateForDeviceSpace(color, coverage, localCoords, this->vi
ewMatrix())); |
| 354 } | 347 } |
| 355 | 348 |
| 356 if (!gp) { | 349 if (!gp) { |
| 357 SkDebugf("Could not create GrGeometryProcessor\n"); | 350 SkDebugf("Could not create GrGeometryProcessor\n"); |
| 358 return; | 351 return; |
| 359 } | 352 } |
| 360 | 353 |
| 361 // useAA here means Edge AA or MSAA | 354 // useAA here means Edge AA or MSAA |
| 362 bool useAA = this->aaMode() != kBW_DashAAMode; | 355 bool useAA = this->aaMode() != AAMode::kNone; |
| 363 bool fullDash = this->fullDash(); | 356 bool fullDash = this->fullDash(); |
| 364 | 357 |
| 365 // We do two passes over all of the dashes. First we setup the start, e
nd, and bounds, | 358 // We do two passes over all of the dashes. First we setup the start, e
nd, and bounds, |
| 366 // rectangles. We preserve all of this work in the rects / draws arrays
below. Then we | 359 // rectangles. We preserve all of this work in the rects / draws arrays
below. Then we |
| 367 // iterate again over these decomposed dashes to generate vertices | 360 // iterate again over these decomposed dashes to generate vertices |
| 368 static const int kNumStackDashes = 128; | 361 static const int kNumStackDashes = 128; |
| 369 SkSTArray<kNumStackDashes, SkRect, true> rects; | 362 SkSTArray<kNumStackDashes, SkRect, true> rects; |
| 370 SkSTArray<kNumStackDashes, DashDraw, true> draws; | 363 SkSTArray<kNumStackDashes, DashDraw, true> draws; |
| 371 | 364 |
| 372 int totalRectCount = 0; | 365 int totalRectCount = 0; |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 | 472 |
| 480 if (SkPaint::kSquare_Cap == cap && 0 != args.fSrcStrokeWidth) { | 473 if (SkPaint::kSquare_Cap == cap && 0 != args.fSrcStrokeWidth) { |
| 481 // add cap to on interval and remove from off interval | 474 // add cap to on interval and remove from off interval |
| 482 devIntervals[0] += strokeWidth; | 475 devIntervals[0] += strokeWidth; |
| 483 devIntervals[1] -= strokeWidth; | 476 devIntervals[1] -= strokeWidth; |
| 484 } | 477 } |
| 485 SkScalar startOffset = devIntervals[1] * 0.5f + devPhase; | 478 SkScalar startOffset = devIntervals[1] * 0.5f + devPhase; |
| 486 | 479 |
| 487 // For EdgeAA, we bloat in X & Y for both square and round caps. | 480 // For EdgeAA, we bloat in X & Y for both square and round caps. |
| 488 // For MSAA, we don't bloat at all for square caps, and bloat in Y o
nly for round caps. | 481 // For MSAA, we don't bloat at all for square caps, and bloat in Y o
nly for round caps. |
| 489 SkScalar devBloatX = this->aaMode() == kEdgeAA_DashAAMode ? 0.5f : 0
.0f; | 482 SkScalar devBloatX = this->aaMode() == AAMode::kCoverage ? 0.5f : 0.
0f; |
| 490 SkScalar devBloatY = (SkPaint::kRound_Cap == cap && this->aaMode() =
= kMSAA_DashAAMode) | 483 SkScalar devBloatY; |
| 491 ? 0.5f : devBloatX; | 484 if (SkPaint::kRound_Cap == cap && this->aaMode() == AAMode::kCoverag
eWithMSAA) { |
| 485 devBloatY = 0.5f; |
| 486 } else { |
| 487 devBloatY = devBloatX; |
| 488 } |
| 492 | 489 |
| 493 SkScalar bloatX = devBloatX / args.fParallelScale; | 490 SkScalar bloatX = devBloatX / args.fParallelScale; |
| 494 SkScalar bloatY = devBloatY / args.fPerpendicularScale; | 491 SkScalar bloatY = devBloatY / args.fPerpendicularScale; |
| 495 | 492 |
| 496 if (devIntervals[1] <= 0.f && useAA) { | 493 if (devIntervals[1] <= 0.f && useAA) { |
| 497 // Case when we end up drawing a solid AA rect | 494 // Case when we end up drawing a solid AA rect |
| 498 // Reset the start rect to draw this single solid rect | 495 // Reset the start rect to draw this single solid rect |
| 499 // but it requires to upload a new intervals uniform so we can m
imic | 496 // but it requires to upload a new intervals uniform so we can m
imic |
| 500 // one giant dash | 497 // one giant dash |
| 501 draw.fPtsRot[0].fX -= hasStartRect ? startAdj : 0; | 498 draw.fPtsRot[0].fX -= hasStartRect ? startAdj : 0; |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 } | 655 } |
| 659 | 656 |
| 660 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; | 657 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; |
| 661 this->joinBounds(that->bounds()); | 658 this->joinBounds(that->bounds()); |
| 662 return true; | 659 return true; |
| 663 } | 660 } |
| 664 | 661 |
| 665 GrColor color() const { return fBatch.fColor; } | 662 GrColor color() const { return fBatch.fColor; } |
| 666 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } | 663 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } |
| 667 const SkMatrix& viewMatrix() const { return fGeoData[0].fViewMatrix; } | 664 const SkMatrix& viewMatrix() const { return fGeoData[0].fViewMatrix; } |
| 668 DashAAMode aaMode() const { return fBatch.fAAMode; } | 665 AAMode aaMode() const { return fBatch.fAAMode; } |
| 669 bool fullDash() const { return fBatch.fFullDash; } | 666 bool fullDash() const { return fBatch.fFullDash; } |
| 670 SkPaint::Cap cap() const { return fBatch.fCap; } | 667 SkPaint::Cap cap() const { return fBatch.fCap; } |
| 671 bool coverageIgnored() const { return fBatch.fCoverageIgnored; } | 668 bool coverageIgnored() const { return fBatch.fCoverageIgnored; } |
| 672 | 669 |
| 673 struct BatchTracker { | 670 struct BatchTracker { |
| 674 GrColor fColor; | 671 GrColor fColor; |
| 675 bool fUsesLocalCoords; | 672 bool fUsesLocalCoords; |
| 676 bool fColorIgnored; | 673 bool fColorIgnored; |
| 677 bool fCoverageIgnored; | 674 bool fCoverageIgnored; |
| 678 SkPaint::Cap fCap; | 675 SkPaint::Cap fCap; |
| 679 DashAAMode fAAMode; | 676 AAMode fAAMode; |
| 680 bool fFullDash; | 677 bool fFullDash; |
| 681 }; | 678 }; |
| 682 | 679 |
| 683 static const int kVertsPerDash = 4; | 680 static const int kVertsPerDash = 4; |
| 684 static const int kIndicesPerDash = 6; | 681 static const int kIndicesPerDash = 6; |
| 685 | 682 |
| 686 BatchTracker fBatch; | 683 BatchTracker fBatch; |
| 687 SkSTArray<1, Geometry, true> fGeoData; | 684 SkSTArray<1, Geometry, true> fGeoData; |
| 688 | 685 |
| 689 typedef GrVertexBatch INHERITED; | 686 typedef GrVertexBatch INHERITED; |
| 690 }; | 687 }; |
| 691 | 688 |
| 692 static GrDrawBatch* create_batch(GrColor color, const SkMatrix& viewMatrix, cons
t SkPoint pts[2], | 689 GrDrawBatch* GrDashingEffect::CreateDashLineBatch(GrColor color, |
| 693 bool useAA, const GrStyle& style, bool msaaRT)
{ | 690 const SkMatrix& viewMatrix, |
| 691 const SkPoint pts[2], |
| 692 AAMode aaMode, |
| 693 const GrStyle& style) { |
| 694 SkASSERT(GrDashingEffect::CanDrawDashLine(pts, style, viewMatrix)); | 694 SkASSERT(GrDashingEffect::CanDrawDashLine(pts, style, viewMatrix)); |
| 695 const SkScalar* intervals = style.dashIntervals(); | 695 const SkScalar* intervals = style.dashIntervals(); |
| 696 SkScalar phase = style.dashPhase(); | 696 SkScalar phase = style.dashPhase(); |
| 697 | 697 |
| 698 SkPaint::Cap cap = style.strokeRec().getCap(); | 698 SkPaint::Cap cap = style.strokeRec().getCap(); |
| 699 | 699 |
| 700 DashBatch::Geometry geometry; | 700 DashBatch::Geometry geometry; |
| 701 geometry.fSrcStrokeWidth = style.strokeRec().getWidth(); | 701 geometry.fSrcStrokeWidth = style.strokeRec().getWidth(); |
| 702 | 702 |
| 703 // the phase should be normalized to be [0, sum of all intervals) | 703 // the phase should be normalized to be [0, sum of all intervals) |
| (...skipping 17 matching lines...) Expand all Loading... |
| 721 geometry.fPtsRot); | 721 geometry.fPtsRot); |
| 722 | 722 |
| 723 SkScalar offInterval = intervals[1] * geometry.fParallelScale; | 723 SkScalar offInterval = intervals[1] * geometry.fParallelScale; |
| 724 SkScalar strokeWidth = geometry.fSrcStrokeWidth * geometry.fPerpendicularSca
le; | 724 SkScalar strokeWidth = geometry.fSrcStrokeWidth * geometry.fPerpendicularSca
le; |
| 725 | 725 |
| 726 if (SkPaint::kSquare_Cap == cap && 0 != geometry.fSrcStrokeWidth) { | 726 if (SkPaint::kSquare_Cap == cap && 0 != geometry.fSrcStrokeWidth) { |
| 727 // add cap to on interveal and remove from off interval | 727 // add cap to on interveal and remove from off interval |
| 728 offInterval -= strokeWidth; | 728 offInterval -= strokeWidth; |
| 729 } | 729 } |
| 730 | 730 |
| 731 DashAAMode aaMode = msaaRT ? kMSAA_DashAAMode : | |
| 732 useAA ? kEdgeAA_DashAAMode : kBW_DashAAMode; | |
| 733 | |
| 734 // TODO we can do a real rect call if not using fulldash(ie no off interval,
not using AA) | 731 // TODO we can do a real rect call if not using fulldash(ie no off interval,
not using AA) |
| 735 bool fullDash = offInterval > 0.f || aaMode != kBW_DashAAMode; | 732 bool fullDash = offInterval > 0.f || aaMode != AAMode::kNone; |
| 736 | 733 |
| 737 geometry.fColor = color; | 734 geometry.fColor = color; |
| 738 geometry.fViewMatrix = viewMatrix; | 735 geometry.fViewMatrix = viewMatrix; |
| 739 geometry.fPhase = phase; | 736 geometry.fPhase = phase; |
| 740 geometry.fIntervals[0] = intervals[0]; | 737 geometry.fIntervals[0] = intervals[0]; |
| 741 geometry.fIntervals[1] = intervals[1]; | 738 geometry.fIntervals[1] = intervals[1]; |
| 742 | 739 |
| 743 return DashBatch::Create(geometry, cap, aaMode, fullDash); | 740 return DashBatch::Create(geometry, cap, aaMode, fullDash); |
| 744 } | 741 } |
| 745 | 742 |
| 746 GrDrawBatch* GrDashingEffect::CreateDashLineBatch(GrColor color, | |
| 747 const SkMatrix& viewMatrix, | |
| 748 const SkPoint pts[2], | |
| 749 bool useAA, | |
| 750 bool msaaIsEnabled, | |
| 751 const GrStyle& style) { | |
| 752 return create_batch(color, viewMatrix, pts, useAA, style, msaaIsEnabled); | |
| 753 } | |
| 754 | |
| 755 ////////////////////////////////////////////////////////////////////////////// | 743 ////////////////////////////////////////////////////////////////////////////// |
| 756 | 744 |
| 757 class GLDashingCircleEffect; | 745 class GLDashingCircleEffect; |
| 758 | 746 |
| 759 /* | 747 /* |
| 760 * This effect will draw a dotted line (defined as a dashed lined with round cap
s and no on | 748 * This effect will draw a dotted line (defined as a dashed lined with round cap
s and no on |
| 761 * interval). The radius of the dots is given by the strokeWidth and the spacing
by the DashInfo. | 749 * interval). The radius of the dots is given by the strokeWidth and the spacing
by the DashInfo. |
| 762 * Both of the previous two parameters are in device space. This effect also req
uires the setting of | 750 * Both of the previous two parameters are in device space. This effect also req
uires the setting of |
| 763 * a vec2 vertex attribute for the the four corners of the bounding rect. This a
ttribute is the | 751 * a vec2 vertex attribute for the the four corners of the bounding rect. This a
ttribute is the |
| 764 * "dash position" of each vertex. In other words it is the vertex coords (in de
vice space) if we | 752 * "dash position" of each vertex. In other words it is the vertex coords (in de
vice space) if we |
| 765 * transform the line to be horizontal, with the start of line at the origin the
n shifted to the | 753 * transform the line to be horizontal, with the start of line at the origin the
n shifted to the |
| 766 * right by half the off interval. The line then goes in the positive x directio
n. | 754 * right by half the off interval. The line then goes in the positive x directio
n. |
| 767 */ | 755 */ |
| 768 class DashingCircleEffect : public GrGeometryProcessor { | 756 class DashingCircleEffect : public GrGeometryProcessor { |
| 769 public: | 757 public: |
| 770 typedef SkPathEffect::DashInfo DashInfo; | 758 typedef SkPathEffect::DashInfo DashInfo; |
| 771 | 759 |
| 772 static GrGeometryProcessor* Create(GrColor, | 760 static GrGeometryProcessor* Create(GrColor, |
| 773 DashAAMode aaMode, | 761 AAMode aaMode, |
| 774 const SkMatrix& localMatrix, | 762 const SkMatrix& localMatrix, |
| 775 bool usesLocalCoords); | 763 bool usesLocalCoords); |
| 776 | 764 |
| 777 const char* name() const override { return "DashingCircleEffect"; } | 765 const char* name() const override { return "DashingCircleEffect"; } |
| 778 | 766 |
| 779 const Attribute* inPosition() const { return fInPosition; } | 767 const Attribute* inPosition() const { return fInPosition; } |
| 780 | 768 |
| 781 const Attribute* inDashParams() const { return fInDashParams; } | 769 const Attribute* inDashParams() const { return fInDashParams; } |
| 782 | 770 |
| 783 const Attribute* inCircleParams() const { return fInCircleParams; } | 771 const Attribute* inCircleParams() const { return fInCircleParams; } |
| 784 | 772 |
| 785 DashAAMode aaMode() const { return fAAMode; } | 773 AAMode aaMode() const { return fAAMode; } |
| 786 | 774 |
| 787 GrColor color() const { return fColor; } | 775 GrColor color() const { return fColor; } |
| 788 | 776 |
| 789 bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } | 777 bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } |
| 790 | 778 |
| 791 const SkMatrix& localMatrix() const { return fLocalMatrix; } | 779 const SkMatrix& localMatrix() const { return fLocalMatrix; } |
| 792 | 780 |
| 793 bool usesLocalCoords() const { return fUsesLocalCoords; } | 781 bool usesLocalCoords() const { return fUsesLocalCoords; } |
| 794 | 782 |
| 795 void getGLSLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder* b) const
override; | 783 void getGLSLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder* b) const
override; |
| 796 | 784 |
| 797 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const overri
de; | 785 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const overri
de; |
| 798 | 786 |
| 799 private: | 787 private: |
| 800 DashingCircleEffect(GrColor, DashAAMode aaMode, const SkMatrix& localMatrix, | 788 DashingCircleEffect(GrColor, AAMode aaMode, const SkMatrix& localMatrix, |
| 801 bool usesLocalCoords); | 789 bool usesLocalCoords); |
| 802 | 790 |
| 803 GrColor fColor; | 791 GrColor fColor; |
| 804 SkMatrix fLocalMatrix; | 792 SkMatrix fLocalMatrix; |
| 805 bool fUsesLocalCoords; | 793 bool fUsesLocalCoords; |
| 806 DashAAMode fAAMode; | 794 AAMode fAAMode; |
| 807 const Attribute* fInPosition; | 795 const Attribute* fInPosition; |
| 808 const Attribute* fInDashParams; | 796 const Attribute* fInDashParams; |
| 809 const Attribute* fInCircleParams; | 797 const Attribute* fInCircleParams; |
| 810 | 798 |
| 811 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 799 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
| 812 | 800 |
| 813 typedef GrGeometryProcessor INHERITED; | 801 typedef GrGeometryProcessor INHERITED; |
| 814 }; | 802 }; |
| 815 | 803 |
| 816 ////////////////////////////////////////////////////////////////////////////// | 804 ////////////////////////////////////////////////////////////////////////////// |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 args.fTransformsIn, | 877 args.fTransformsIn, |
| 890 args.fTransformsOut); | 878 args.fTransformsOut); |
| 891 | 879 |
| 892 // transforms all points so that we can compare them to our test circle | 880 // transforms all points so that we can compare them to our test circle |
| 893 fragBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;
", | 881 fragBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;
", |
| 894 dashParams.fsIn(), dashParams.fsIn(), dashParams.fs
In(), | 882 dashParams.fsIn(), dashParams.fsIn(), dashParams.fs
In(), |
| 895 dashParams.fsIn()); | 883 dashParams.fsIn()); |
| 896 fragBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", dash
Params.fsIn()); | 884 fragBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", dash
Params.fsIn()); |
| 897 fragBuilder->codeAppendf("vec2 center = vec2(%s.y, 0.0);", circleParams.fsIn
()); | 885 fragBuilder->codeAppendf("vec2 center = vec2(%s.y, 0.0);", circleParams.fsIn
()); |
| 898 fragBuilder->codeAppend("float dist = length(center - fragPosShifted);"); | 886 fragBuilder->codeAppend("float dist = length(center - fragPosShifted);"); |
| 899 if (dce.aaMode() != kBW_DashAAMode) { | 887 if (dce.aaMode() != AAMode::kNone) { |
| 900 fragBuilder->codeAppendf("float diff = dist - %s.x;", circleParams.fsIn(
)); | 888 fragBuilder->codeAppendf("float diff = dist - %s.x;", circleParams.fsIn(
)); |
| 901 fragBuilder->codeAppend("diff = 1.0 - diff;"); | 889 fragBuilder->codeAppend("diff = 1.0 - diff;"); |
| 902 fragBuilder->codeAppend("float alpha = clamp(diff, 0.0, 1.0);"); | 890 fragBuilder->codeAppend("float alpha = clamp(diff, 0.0, 1.0);"); |
| 903 } else { | 891 } else { |
| 904 fragBuilder->codeAppendf("float alpha = 1.0;"); | 892 fragBuilder->codeAppendf("float alpha = 1.0;"); |
| 905 fragBuilder->codeAppendf("alpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;", cir
cleParams.fsIn()); | 893 fragBuilder->codeAppendf("alpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;", cir
cleParams.fsIn()); |
| 906 } | 894 } |
| 907 fragBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); | 895 fragBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); |
| 908 } | 896 } |
| 909 | 897 |
| 910 void GLDashingCircleEffect::setData(const GrGLSLProgramDataManager& pdman, | 898 void GLDashingCircleEffect::setData(const GrGLSLProgramDataManager& pdman, |
| 911 const GrPrimitiveProcessor& processor) { | 899 const GrPrimitiveProcessor& processor) { |
| 912 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); | 900 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); |
| 913 if (dce.color() != fColor) { | 901 if (dce.color() != fColor) { |
| 914 float c[4]; | 902 float c[4]; |
| 915 GrColorToRGBAFloat(dce.color(), c); | 903 GrColorToRGBAFloat(dce.color(), c); |
| 916 pdman.set4fv(fColorUniform, 1, c); | 904 pdman.set4fv(fColorUniform, 1, c); |
| 917 fColor = dce.color(); | 905 fColor = dce.color(); |
| 918 } | 906 } |
| 919 } | 907 } |
| 920 | 908 |
| 921 void GLDashingCircleEffect::GenKey(const GrGeometryProcessor& gp, | 909 void GLDashingCircleEffect::GenKey(const GrGeometryProcessor& gp, |
| 922 const GrGLSLCaps&, | 910 const GrGLSLCaps&, |
| 923 GrProcessorKeyBuilder* b) { | 911 GrProcessorKeyBuilder* b) { |
| 924 const DashingCircleEffect& dce = gp.cast<DashingCircleEffect>(); | 912 const DashingCircleEffect& dce = gp.cast<DashingCircleEffect>(); |
| 925 uint32_t key = 0; | 913 uint32_t key = 0; |
| 926 key |= dce.usesLocalCoords() && dce.localMatrix().hasPerspective() ? 0x1 : 0
x0; | 914 key |= dce.usesLocalCoords() && dce.localMatrix().hasPerspective() ? 0x1 : 0
x0; |
| 927 key |= dce.colorIgnored() ? 0x2 : 0x0; | 915 key |= dce.colorIgnored() ? 0x2 : 0x0; |
| 928 key |= dce.aaMode() << 8; | 916 key |= static_cast<uint32_t>(dce.aaMode()) << 8; |
| 929 b->add32(key); | 917 b->add32(key); |
| 930 } | 918 } |
| 931 | 919 |
| 932 ////////////////////////////////////////////////////////////////////////////// | 920 ////////////////////////////////////////////////////////////////////////////// |
| 933 | 921 |
| 934 GrGeometryProcessor* DashingCircleEffect::Create(GrColor color, | 922 GrGeometryProcessor* DashingCircleEffect::Create(GrColor color, |
| 935 DashAAMode aaMode, | 923 AAMode aaMode, |
| 936 const SkMatrix& localMatrix, | 924 const SkMatrix& localMatrix, |
| 937 bool usesLocalCoords) { | 925 bool usesLocalCoords) { |
| 938 return new DashingCircleEffect(color, aaMode, localMatrix, usesLocalCoords); | 926 return new DashingCircleEffect(color, aaMode, localMatrix, usesLocalCoords); |
| 939 } | 927 } |
| 940 | 928 |
| 941 void DashingCircleEffect::getGLSLProcessorKey(const GrGLSLCaps& caps, | 929 void DashingCircleEffect::getGLSLProcessorKey(const GrGLSLCaps& caps, |
| 942 GrProcessorKeyBuilder* b) const { | 930 GrProcessorKeyBuilder* b) const { |
| 943 GLDashingCircleEffect::GenKey(*this, caps, b); | 931 GLDashingCircleEffect::GenKey(*this, caps, b); |
| 944 } | 932 } |
| 945 | 933 |
| 946 GrGLSLPrimitiveProcessor* DashingCircleEffect::createGLSLInstance(const GrGLSLCa
ps&) const { | 934 GrGLSLPrimitiveProcessor* DashingCircleEffect::createGLSLInstance(const GrGLSLCa
ps&) const { |
| 947 return new GLDashingCircleEffect(); | 935 return new GLDashingCircleEffect(); |
| 948 } | 936 } |
| 949 | 937 |
| 950 DashingCircleEffect::DashingCircleEffect(GrColor color, | 938 DashingCircleEffect::DashingCircleEffect(GrColor color, |
| 951 DashAAMode aaMode, | 939 AAMode aaMode, |
| 952 const SkMatrix& localMatrix, | 940 const SkMatrix& localMatrix, |
| 953 bool usesLocalCoords) | 941 bool usesLocalCoords) |
| 954 : fColor(color) | 942 : fColor(color) |
| 955 , fLocalMatrix(localMatrix) | 943 , fLocalMatrix(localMatrix) |
| 956 , fUsesLocalCoords(usesLocalCoords) | 944 , fUsesLocalCoords(usesLocalCoords) |
| 957 , fAAMode(aaMode) { | 945 , fAAMode(aaMode) { |
| 958 this->initClassID<DashingCircleEffect>(); | 946 this->initClassID<DashingCircleEffect>(); |
| 959 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType)); | 947 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType)); |
| 960 fInDashParams = &this->addVertexAttrib(Attribute("inDashParams", kVec3f_GrVe
rtexAttribType)); | 948 fInDashParams = &this->addVertexAttrib(Attribute("inDashParams", kVec3f_GrVe
rtexAttribType)); |
| 961 fInCircleParams = &this->addVertexAttrib(Attribute("inCircleParams", | 949 fInCircleParams = &this->addVertexAttrib(Attribute("inCircleParams", |
| 962 kVec2f_GrVertexAttribType
)); | 950 kVec2f_GrVertexAttribType
)); |
| 963 } | 951 } |
| 964 | 952 |
| 965 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingCircleEffect); | 953 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingCircleEffect); |
| 966 | 954 |
| 967 const GrGeometryProcessor* DashingCircleEffect::TestCreate(GrProcessorTestData*
d) { | 955 const GrGeometryProcessor* DashingCircleEffect::TestCreate(GrProcessorTestData*
d) { |
| 968 DashAAMode aaMode = static_cast<DashAAMode>(d->fRandom->nextULessThan(kDashA
AModeCount)); | 956 AAMode aaMode = static_cast<AAMode>(d->fRandom->nextULessThan(GrDashingEffec
t::kAAModeCnt)); |
| 969 return DashingCircleEffect::Create(GrRandomColor(d->fRandom), | 957 return DashingCircleEffect::Create(GrRandomColor(d->fRandom), |
| 970 aaMode, GrTest::TestMatrix(d->fRandom), | 958 aaMode, GrTest::TestMatrix(d->fRandom), |
| 971 d->fRandom->nextBool()); | 959 d->fRandom->nextBool()); |
| 972 } | 960 } |
| 973 | 961 |
| 974 ////////////////////////////////////////////////////////////////////////////// | 962 ////////////////////////////////////////////////////////////////////////////// |
| 975 | 963 |
| 976 class GLDashingLineEffect; | 964 class GLDashingLineEffect; |
| 977 | 965 |
| 978 /* | 966 /* |
| 979 * This effect will draw a dashed line. The width of the dash is given by the st
rokeWidth and the | 967 * This effect will draw a dashed line. The width of the dash is given by the st
rokeWidth and the |
| 980 * length and spacing by the DashInfo. Both of the previous two parameters are i
n device space. | 968 * length and spacing by the DashInfo. Both of the previous two parameters are i
n device space. |
| 981 * This effect also requires the setting of a vec2 vertex attribute for the the
four corners of the | 969 * This effect also requires the setting of a vec2 vertex attribute for the the
four corners of the |
| 982 * bounding rect. This attribute is the "dash position" of each vertex. In other
words it is the | 970 * bounding rect. This attribute is the "dash position" of each vertex. In other
words it is the |
| 983 * vertex coords (in device space) if we transform the line to be horizontal, wi
th the start of | 971 * vertex coords (in device space) if we transform the line to be horizontal, wi
th the start of |
| 984 * line at the origin then shifted to the right by half the off interval. The li
ne then goes in the | 972 * line at the origin then shifted to the right by half the off interval. The li
ne then goes in the |
| 985 * positive x direction. | 973 * positive x direction. |
| 986 */ | 974 */ |
| 987 class DashingLineEffect : public GrGeometryProcessor { | 975 class DashingLineEffect : public GrGeometryProcessor { |
| 988 public: | 976 public: |
| 989 typedef SkPathEffect::DashInfo DashInfo; | 977 typedef SkPathEffect::DashInfo DashInfo; |
| 990 | 978 |
| 991 static GrGeometryProcessor* Create(GrColor, | 979 static GrGeometryProcessor* Create(GrColor, |
| 992 DashAAMode aaMode, | 980 AAMode aaMode, |
| 993 const SkMatrix& localMatrix, | 981 const SkMatrix& localMatrix, |
| 994 bool usesLocalCoords); | 982 bool usesLocalCoords); |
| 995 | 983 |
| 996 const char* name() const override { return "DashingEffect"; } | 984 const char* name() const override { return "DashingEffect"; } |
| 997 | 985 |
| 998 const Attribute* inPosition() const { return fInPosition; } | 986 const Attribute* inPosition() const { return fInPosition; } |
| 999 | 987 |
| 1000 const Attribute* inDashParams() const { return fInDashParams; } | 988 const Attribute* inDashParams() const { return fInDashParams; } |
| 1001 | 989 |
| 1002 const Attribute* inRectParams() const { return fInRectParams; } | 990 const Attribute* inRectParams() const { return fInRectParams; } |
| 1003 | 991 |
| 1004 DashAAMode aaMode() const { return fAAMode; } | 992 AAMode aaMode() const { return fAAMode; } |
| 1005 | 993 |
| 1006 GrColor color() const { return fColor; } | 994 GrColor color() const { return fColor; } |
| 1007 | 995 |
| 1008 bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } | 996 bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } |
| 1009 | 997 |
| 1010 const SkMatrix& localMatrix() const { return fLocalMatrix; } | 998 const SkMatrix& localMatrix() const { return fLocalMatrix; } |
| 1011 | 999 |
| 1012 bool usesLocalCoords() const { return fUsesLocalCoords; } | 1000 bool usesLocalCoords() const { return fUsesLocalCoords; } |
| 1013 | 1001 |
| 1014 void getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) c
onst override; | 1002 void getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) c
onst override; |
| 1015 | 1003 |
| 1016 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const overri
de; | 1004 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const overri
de; |
| 1017 | 1005 |
| 1018 private: | 1006 private: |
| 1019 DashingLineEffect(GrColor, DashAAMode aaMode, const SkMatrix& localMatrix, | 1007 DashingLineEffect(GrColor, AAMode aaMode, const SkMatrix& localMatrix, |
| 1020 bool usesLocalCoords); | 1008 bool usesLocalCoords); |
| 1021 | 1009 |
| 1022 GrColor fColor; | 1010 GrColor fColor; |
| 1023 SkMatrix fLocalMatrix; | 1011 SkMatrix fLocalMatrix; |
| 1024 bool fUsesLocalCoords; | 1012 bool fUsesLocalCoords; |
| 1025 DashAAMode fAAMode; | 1013 AAMode fAAMode; |
| 1026 const Attribute* fInPosition; | 1014 const Attribute* fInPosition; |
| 1027 const Attribute* fInDashParams; | 1015 const Attribute* fInDashParams; |
| 1028 const Attribute* fInRectParams; | 1016 const Attribute* fInRectParams; |
| 1029 | 1017 |
| 1030 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 1018 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
| 1031 | 1019 |
| 1032 typedef GrGeometryProcessor INHERITED; | 1020 typedef GrGeometryProcessor INHERITED; |
| 1033 }; | 1021 }; |
| 1034 | 1022 |
| 1035 ////////////////////////////////////////////////////////////////////////////// | 1023 ////////////////////////////////////////////////////////////////////////////// |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1101 de.inPosition()->fName, | 1089 de.inPosition()->fName, |
| 1102 de.localMatrix(), | 1090 de.localMatrix(), |
| 1103 args.fTransformsIn, | 1091 args.fTransformsIn, |
| 1104 args.fTransformsOut); | 1092 args.fTransformsOut); |
| 1105 | 1093 |
| 1106 // transforms all points so that we can compare them to our test rect | 1094 // transforms all points so that we can compare them to our test rect |
| 1107 fragBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;
", | 1095 fragBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;
", |
| 1108 inDashParams.fsIn(), inDashParams.fsIn(), inDashPar
ams.fsIn(), | 1096 inDashParams.fsIn(), inDashParams.fsIn(), inDashPar
ams.fsIn(), |
| 1109 inDashParams.fsIn()); | 1097 inDashParams.fsIn()); |
| 1110 fragBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", inDa
shParams.fsIn()); | 1098 fragBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", inDa
shParams.fsIn()); |
| 1111 if (de.aaMode() == kEdgeAA_DashAAMode) { | 1099 if (de.aaMode() == AAMode::kCoverage) { |
| 1112 // The amount of coverage removed in x and y by the edges is computed as
a pair of negative | 1100 // The amount of coverage removed in x and y by the edges is computed as
a pair of negative |
| 1113 // numbers, xSub and ySub. | 1101 // numbers, xSub and ySub. |
| 1114 fragBuilder->codeAppend("float xSub, ySub;"); | 1102 fragBuilder->codeAppend("float xSub, ySub;"); |
| 1115 fragBuilder->codeAppendf("xSub = min(fragPosShifted.x - %s.x, 0.0);", in
RectParams.fsIn()); | 1103 fragBuilder->codeAppendf("xSub = min(fragPosShifted.x - %s.x, 0.0);", in
RectParams.fsIn()); |
| 1116 fragBuilder->codeAppendf("xSub += min(%s.z - fragPosShifted.x, 0.0);", i
nRectParams.fsIn()); | 1104 fragBuilder->codeAppendf("xSub += min(%s.z - fragPosShifted.x, 0.0);", i
nRectParams.fsIn()); |
| 1117 fragBuilder->codeAppendf("ySub = min(fragPosShifted.y - %s.y, 0.0);", in
RectParams.fsIn()); | 1105 fragBuilder->codeAppendf("ySub = min(fragPosShifted.y - %s.y, 0.0);", in
RectParams.fsIn()); |
| 1118 fragBuilder->codeAppendf("ySub += min(%s.w - fragPosShifted.y, 0.0);", i
nRectParams.fsIn()); | 1106 fragBuilder->codeAppendf("ySub += min(%s.w - fragPosShifted.y, 0.0);", i
nRectParams.fsIn()); |
| 1119 // Now compute coverage in x and y and multiply them to get the fraction
of the pixel | 1107 // Now compute coverage in x and y and multiply them to get the fraction
of the pixel |
| 1120 // covered. | 1108 // covered. |
| 1121 fragBuilder->codeAppendf( | 1109 fragBuilder->codeAppendf( |
| 1122 "float alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0));"); | 1110 "float alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0));"); |
| 1123 } else if (de.aaMode() == kMSAA_DashAAMode) { | 1111 } else if (de.aaMode() == AAMode::kCoverageWithMSAA) { |
| 1124 // For MSAA, we don't modulate the alpha by the Y distance, since MSAA c
overage will handle | 1112 // For MSAA, we don't modulate the alpha by the Y distance, since MSAA c
overage will handle |
| 1125 // AA on the the top and bottom edges. The shader is only responsible fo
r intra-dash alpha. | 1113 // AA on the the top and bottom edges. The shader is only responsible fo
r intra-dash alpha. |
| 1126 fragBuilder->codeAppend("float xSub;"); | 1114 fragBuilder->codeAppend("float xSub;"); |
| 1127 fragBuilder->codeAppendf("xSub = min(fragPosShifted.x - %s.x, 0.0);", in
RectParams.fsIn()); | 1115 fragBuilder->codeAppendf("xSub = min(fragPosShifted.x - %s.x, 0.0);", in
RectParams.fsIn()); |
| 1128 fragBuilder->codeAppendf("xSub += min(%s.z - fragPosShifted.x, 0.0);", i
nRectParams.fsIn()); | 1116 fragBuilder->codeAppendf("xSub += min(%s.z - fragPosShifted.x, 0.0);", i
nRectParams.fsIn()); |
| 1129 // Now compute coverage in x to get the fraction of the pixel covered. | 1117 // Now compute coverage in x to get the fraction of the pixel covered. |
| 1130 fragBuilder->codeAppendf("float alpha = (1.0 + max(xSub, -1.0));"); | 1118 fragBuilder->codeAppendf("float alpha = (1.0 + max(xSub, -1.0));"); |
| 1131 } else { | 1119 } else { |
| 1132 // Assuming the bounding geometry is tight so no need to check y values | 1120 // Assuming the bounding geometry is tight so no need to check y values |
| 1133 fragBuilder->codeAppendf("float alpha = 1.0;"); | 1121 fragBuilder->codeAppendf("float alpha = 1.0;"); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1150 } | 1138 } |
| 1151 } | 1139 } |
| 1152 | 1140 |
| 1153 void GLDashingLineEffect::GenKey(const GrGeometryProcessor& gp, | 1141 void GLDashingLineEffect::GenKey(const GrGeometryProcessor& gp, |
| 1154 const GrGLSLCaps&, | 1142 const GrGLSLCaps&, |
| 1155 GrProcessorKeyBuilder* b) { | 1143 GrProcessorKeyBuilder* b) { |
| 1156 const DashingLineEffect& de = gp.cast<DashingLineEffect>(); | 1144 const DashingLineEffect& de = gp.cast<DashingLineEffect>(); |
| 1157 uint32_t key = 0; | 1145 uint32_t key = 0; |
| 1158 key |= de.usesLocalCoords() && de.localMatrix().hasPerspective() ? 0x1 : 0x0
; | 1146 key |= de.usesLocalCoords() && de.localMatrix().hasPerspective() ? 0x1 : 0x0
; |
| 1159 key |= de.colorIgnored() ? 0x2 : 0x0; | 1147 key |= de.colorIgnored() ? 0x2 : 0x0; |
| 1160 key |= de.aaMode() << 8; | 1148 key |= static_cast<int>(de.aaMode()) << 8; |
| 1161 b->add32(key); | 1149 b->add32(key); |
| 1162 } | 1150 } |
| 1163 | 1151 |
| 1164 ////////////////////////////////////////////////////////////////////////////// | 1152 ////////////////////////////////////////////////////////////////////////////// |
| 1165 | 1153 |
| 1166 GrGeometryProcessor* DashingLineEffect::Create(GrColor color, | 1154 GrGeometryProcessor* DashingLineEffect::Create(GrColor color, |
| 1167 DashAAMode aaMode, | 1155 AAMode aaMode, |
| 1168 const SkMatrix& localMatrix, | 1156 const SkMatrix& localMatrix, |
| 1169 bool usesLocalCoords) { | 1157 bool usesLocalCoords) { |
| 1170 return new DashingLineEffect(color, aaMode, localMatrix, usesLocalCoords); | 1158 return new DashingLineEffect(color, aaMode, localMatrix, usesLocalCoords); |
| 1171 } | 1159 } |
| 1172 | 1160 |
| 1173 void DashingLineEffect::getGLSLProcessorKey(const GrGLSLCaps& caps, | 1161 void DashingLineEffect::getGLSLProcessorKey(const GrGLSLCaps& caps, |
| 1174 GrProcessorKeyBuilder* b) const { | 1162 GrProcessorKeyBuilder* b) const { |
| 1175 GLDashingLineEffect::GenKey(*this, caps, b); | 1163 GLDashingLineEffect::GenKey(*this, caps, b); |
| 1176 } | 1164 } |
| 1177 | 1165 |
| 1178 GrGLSLPrimitiveProcessor* DashingLineEffect::createGLSLInstance(const GrGLSLCaps
&) const { | 1166 GrGLSLPrimitiveProcessor* DashingLineEffect::createGLSLInstance(const GrGLSLCaps
&) const { |
| 1179 return new GLDashingLineEffect(); | 1167 return new GLDashingLineEffect(); |
| 1180 } | 1168 } |
| 1181 | 1169 |
| 1182 DashingLineEffect::DashingLineEffect(GrColor color, | 1170 DashingLineEffect::DashingLineEffect(GrColor color, |
| 1183 DashAAMode aaMode, | 1171 AAMode aaMode, |
| 1184 const SkMatrix& localMatrix, | 1172 const SkMatrix& localMatrix, |
| 1185 bool usesLocalCoords) | 1173 bool usesLocalCoords) |
| 1186 : fColor(color) | 1174 : fColor(color) |
| 1187 , fLocalMatrix(localMatrix) | 1175 , fLocalMatrix(localMatrix) |
| 1188 , fUsesLocalCoords(usesLocalCoords) | 1176 , fUsesLocalCoords(usesLocalCoords) |
| 1189 , fAAMode(aaMode) { | 1177 , fAAMode(aaMode) { |
| 1190 this->initClassID<DashingLineEffect>(); | 1178 this->initClassID<DashingLineEffect>(); |
| 1191 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType)); | 1179 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType)); |
| 1192 fInDashParams = &this->addVertexAttrib(Attribute("inDashParams", kVec3f_GrVe
rtexAttribType)); | 1180 fInDashParams = &this->addVertexAttrib(Attribute("inDashParams", kVec3f_GrVe
rtexAttribType)); |
| 1193 fInRectParams = &this->addVertexAttrib(Attribute("inRect", kVec4f_GrVertexAt
tribType)); | 1181 fInRectParams = &this->addVertexAttrib(Attribute("inRect", kVec4f_GrVertexAt
tribType)); |
| 1194 } | 1182 } |
| 1195 | 1183 |
| 1196 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingLineEffect); | 1184 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DashingLineEffect); |
| 1197 | 1185 |
| 1198 const GrGeometryProcessor* DashingLineEffect::TestCreate(GrProcessorTestData* d)
{ | 1186 const GrGeometryProcessor* DashingLineEffect::TestCreate(GrProcessorTestData* d)
{ |
| 1199 DashAAMode aaMode = static_cast<DashAAMode>(d->fRandom->nextULessThan(kDashA
AModeCount)); | 1187 AAMode aaMode = static_cast<AAMode>(d->fRandom->nextULessThan(GrDashingEffec
t::kAAModeCnt)); |
| 1200 return DashingLineEffect::Create(GrRandomColor(d->fRandom), | 1188 return DashingLineEffect::Create(GrRandomColor(d->fRandom), |
| 1201 aaMode, GrTest::TestMatrix(d->fRandom), | 1189 aaMode, GrTest::TestMatrix(d->fRandom), |
| 1202 d->fRandom->nextBool()); | 1190 d->fRandom->nextBool()); |
| 1203 } | 1191 } |
| 1204 | 1192 |
| 1205 ////////////////////////////////////////////////////////////////////////////// | 1193 ////////////////////////////////////////////////////////////////////////////// |
| 1206 | 1194 |
| 1207 static GrGeometryProcessor* create_dash_gp(GrColor color, | 1195 static GrGeometryProcessor* create_dash_gp(GrColor color, |
| 1208 DashAAMode dashAAMode, | 1196 AAMode aaMode, |
| 1209 DashCap cap, | 1197 DashCap cap, |
| 1210 const SkMatrix& viewMatrix, | 1198 const SkMatrix& viewMatrix, |
| 1211 bool usesLocalCoords) { | 1199 bool usesLocalCoords) { |
| 1212 SkMatrix invert; | 1200 SkMatrix invert; |
| 1213 if (usesLocalCoords && !viewMatrix.invert(&invert)) { | 1201 if (usesLocalCoords && !viewMatrix.invert(&invert)) { |
| 1214 SkDebugf("Failed to invert\n"); | 1202 SkDebugf("Failed to invert\n"); |
| 1215 return nullptr; | 1203 return nullptr; |
| 1216 } | 1204 } |
| 1217 | 1205 |
| 1218 switch (cap) { | 1206 switch (cap) { |
| 1219 case kRound_DashCap: | 1207 case kRound_DashCap: |
| 1220 return DashingCircleEffect::Create(color, dashAAMode, invert, usesLo
calCoords); | 1208 return DashingCircleEffect::Create(color, aaMode, invert, usesLocalC
oords); |
| 1221 case kNonRound_DashCap: | 1209 case kNonRound_DashCap: |
| 1222 return DashingLineEffect::Create(color, dashAAMode, invert, usesLoca
lCoords); | 1210 return DashingLineEffect::Create(color, aaMode, invert, usesLocalCoo
rds); |
| 1223 } | 1211 } |
| 1224 return nullptr; | 1212 return nullptr; |
| 1225 } | 1213 } |
| 1226 | 1214 |
| 1227 ////////////////////////////////////////////////////////////////////////////////
///////////////// | 1215 ////////////////////////////////////////////////////////////////////////////////
///////////////// |
| 1228 | 1216 |
| 1229 #ifdef GR_TEST_UTILS | 1217 #ifdef GR_TEST_UTILS |
| 1230 | 1218 |
| 1231 DRAW_BATCH_TEST_DEFINE(DashBatch) { | 1219 DRAW_BATCH_TEST_DEFINE(DashBatch) { |
| 1232 GrColor color = GrRandomColor(random); | 1220 GrColor color = GrRandomColor(random); |
| 1233 SkMatrix viewMatrix = GrTest::TestMatrixPreservesRightAngles(random); | 1221 SkMatrix viewMatrix = GrTest::TestMatrixPreservesRightAngles(random); |
| 1234 bool useAA = random->nextBool(); | 1222 AAMode aaMode = static_cast<AAMode>(random->nextULessThan(GrDashingEffect::k
AAModeCnt)); |
| 1235 bool msaaRT = random->nextBool(); | |
| 1236 | 1223 |
| 1237 // We can only dash either horizontal or vertical lines | 1224 // We can only dash either horizontal or vertical lines |
| 1238 SkPoint pts[2]; | 1225 SkPoint pts[2]; |
| 1239 if (random->nextBool()) { | 1226 if (random->nextBool()) { |
| 1240 // vertical | 1227 // vertical |
| 1241 pts[0].fX = 1.f; | 1228 pts[0].fX = 1.f; |
| 1242 pts[0].fY = random->nextF() * 10.f; | 1229 pts[0].fY = random->nextF() * 10.f; |
| 1243 pts[1].fX = 1.f; | 1230 pts[1].fX = 1.f; |
| 1244 pts[1].fY = random->nextF() * 10.f; | 1231 pts[1].fY = random->nextF() * 10.f; |
| 1245 } else { | 1232 } else { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1287 SkScalar phase = random->nextRangeScalar(0, intervals[0] + intervals[1]); | 1274 SkScalar phase = random->nextRangeScalar(0, intervals[0] + intervals[1]); |
| 1288 | 1275 |
| 1289 SkPaint p; | 1276 SkPaint p; |
| 1290 p.setStyle(SkPaint::kStroke_Style); | 1277 p.setStyle(SkPaint::kStroke_Style); |
| 1291 p.setStrokeWidth(SkIntToScalar(1)); | 1278 p.setStrokeWidth(SkIntToScalar(1)); |
| 1292 p.setStrokeCap(cap); | 1279 p.setStrokeCap(cap); |
| 1293 p.setPathEffect(GrTest::TestDashPathEffect::Make(intervals, 2, phase)); | 1280 p.setPathEffect(GrTest::TestDashPathEffect::Make(intervals, 2, phase)); |
| 1294 | 1281 |
| 1295 GrStyle style(p); | 1282 GrStyle style(p); |
| 1296 | 1283 |
| 1297 return create_batch(color, viewMatrix, pts, useAA, style, msaaRT); | 1284 return GrDashingEffect::CreateDashLineBatch(color, viewMatrix, pts, aaMode,
style); |
| 1298 } | 1285 } |
| 1299 | 1286 |
| 1300 #endif | 1287 #endif |
| OLD | NEW |