| 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 "../GrAARectRenderer.h" | 10 #include "../GrAARectRenderer.h" |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 static void setup_dashed_rect_pos(const SkRect& rect, int idx, const SkMatrix& m
atrix, | 158 static void setup_dashed_rect_pos(const SkRect& rect, int idx, const SkMatrix& m
atrix, |
| 159 SkPoint* verts) { | 159 SkPoint* verts) { |
| 160 verts[idx] = SkPoint::Make(rect.fLeft, rect.fTop); | 160 verts[idx] = SkPoint::Make(rect.fLeft, rect.fTop); |
| 161 verts[idx + 1] = SkPoint::Make(rect.fLeft, rect.fBottom); | 161 verts[idx + 1] = SkPoint::Make(rect.fLeft, rect.fBottom); |
| 162 verts[idx + 2] = SkPoint::Make(rect.fRight, rect.fBottom); | 162 verts[idx + 2] = SkPoint::Make(rect.fRight, rect.fBottom); |
| 163 verts[idx + 3] = SkPoint::Make(rect.fRight, rect.fTop); | 163 verts[idx + 3] = SkPoint::Make(rect.fRight, rect.fTop); |
| 164 matrix.mapPoints(&verts[idx], 4); | 164 matrix.mapPoints(&verts[idx], 4); |
| 165 } | 165 } |
| 166 | 166 |
| 167 bool GrDashingEffect::DrawDashLine(GrGpu* gpu, GrDrawTarget* target, GrDrawState
* drawState, | 167 bool GrDashingEffect::DrawDashLine(GrGpu* gpu, GrDrawTarget* target, GrDrawState
* drawState, |
| 168 const SkPoint pts[2], const GrPaint& paint, | 168 GrColor color, const SkPoint pts[2], const Gr
Paint& paint, |
| 169 const GrStrokeInfo& strokeInfo, const SkMatri
x& vm) { | 169 const GrStrokeInfo& strokeInfo, const SkMatri
x& vm) { |
| 170 | 170 |
| 171 if (!can_fast_path_dash(pts, strokeInfo, *target, *drawState, vm)) { | 171 if (!can_fast_path_dash(pts, strokeInfo, *target, *drawState, vm)) { |
| 172 return false; | 172 return false; |
| 173 } | 173 } |
| 174 | 174 |
| 175 const SkPathEffect::DashInfo& info = strokeInfo.getDashInfo(); | 175 const SkPathEffect::DashInfo& info = strokeInfo.getDashInfo(); |
| 176 | 176 |
| 177 SkPaint::Cap cap = strokeInfo.getStrokeRec().getCap(); | 177 SkPaint::Cap cap = strokeInfo.getStrokeRec().getCap(); |
| 178 | 178 |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 if (fullDash) { | 340 if (fullDash) { |
| 341 SkPathEffect::DashInfo devInfo; | 341 SkPathEffect::DashInfo devInfo; |
| 342 devInfo.fPhase = devPhase; | 342 devInfo.fPhase = devPhase; |
| 343 devInfo.fCount = 2; | 343 devInfo.fCount = 2; |
| 344 devInfo.fIntervals = devIntervals; | 344 devInfo.fIntervals = devIntervals; |
| 345 GrPrimitiveEdgeType edgeType= useAA ? kFillAA_GrProcessorEdgeType : | 345 GrPrimitiveEdgeType edgeType= useAA ? kFillAA_GrProcessorEdgeType : |
| 346 kFillBW_GrProcessorEdgeType; | 346 kFillBW_GrProcessorEdgeType; |
| 347 bool isRoundCap = SkPaint::kRound_Cap == cap; | 347 bool isRoundCap = SkPaint::kRound_Cap == cap; |
| 348 GrDashingEffect::DashCap capType = isRoundCap ? GrDashingEffect::kRound_
DashCap : | 348 GrDashingEffect::DashCap capType = isRoundCap ? GrDashingEffect::kRound_
DashCap : |
| 349 GrDashingEffect::kNonRou
nd_DashCap; | 349 GrDashingEffect::kNonRou
nd_DashCap; |
| 350 gp = GrDashingEffect::Create(edgeType, devInfo, strokeWidth, capType); | 350 gp = GrDashingEffect::Create(color, edgeType, devInfo, strokeWidth, capT
ype); |
| 351 } else { | 351 } else { |
| 352 // Set up the vertex data for the line and start/end dashes | 352 // Set up the vertex data for the line and start/end dashes |
| 353 gp = GrDefaultGeoProcFactory::Create(GrDefaultGeoProcFactory::kPosition_
GPType); | 353 gp = GrDefaultGeoProcFactory::Create(color, GrDefaultGeoProcFactory::kPo
sition_GPType); |
| 354 } | 354 } |
| 355 | 355 |
| 356 drawState->setGeometryProcessor(gp)->unref(); | 356 drawState->setGeometryProcessor(gp)->unref(); |
| 357 | 357 |
| 358 int totalRectCnt = 0; | 358 int totalRectCnt = 0; |
| 359 | 359 |
| 360 totalRectCnt += !lineDone ? 1 : 0; | 360 totalRectCnt += !lineDone ? 1 : 0; |
| 361 totalRectCnt += hasStartRect ? 1 : 0; | 361 totalRectCnt += hasStartRect ? 1 : 0; |
| 362 totalRectCnt += hasEndRect ? 1 : 0; | 362 totalRectCnt += hasEndRect ? 1 : 0; |
| 363 | 363 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 * Both of the previous two parameters are in device space. This effect also req
uires the setting of | 449 * Both of the previous two parameters are in device space. This effect also req
uires the setting of |
| 450 * a vec2 vertex attribute for the the four corners of the bounding rect. This a
ttribute is the | 450 * a vec2 vertex attribute for the the four corners of the bounding rect. This a
ttribute is the |
| 451 * "dash position" of each vertex. In other words it is the vertex coords (in de
vice space) if we | 451 * "dash position" of each vertex. In other words it is the vertex coords (in de
vice space) if we |
| 452 * transform the line to be horizontal, with the start of line at the origin the
n shifted to the | 452 * transform the line to be horizontal, with the start of line at the origin the
n shifted to the |
| 453 * right by half the off interval. The line then goes in the positive x directio
n. | 453 * right by half the off interval. The line then goes in the positive x directio
n. |
| 454 */ | 454 */ |
| 455 class DashingCircleEffect : public GrGeometryProcessor { | 455 class DashingCircleEffect : public GrGeometryProcessor { |
| 456 public: | 456 public: |
| 457 typedef SkPathEffect::DashInfo DashInfo; | 457 typedef SkPathEffect::DashInfo DashInfo; |
| 458 | 458 |
| 459 static GrGeometryProcessor* Create(GrPrimitiveEdgeType edgeType, | 459 static GrGeometryProcessor* Create(GrColor, |
| 460 GrPrimitiveEdgeType edgeType, |
| 460 const DashInfo& info, | 461 const DashInfo& info, |
| 461 SkScalar radius); | 462 SkScalar radius); |
| 462 | 463 |
| 463 virtual ~DashingCircleEffect(); | 464 virtual ~DashingCircleEffect(); |
| 464 | 465 |
| 465 virtual const char* name() const SK_OVERRIDE { return "DashingCircleEffect";
} | 466 virtual const char* name() const SK_OVERRIDE { return "DashingCircleEffect";
} |
| 466 | 467 |
| 467 const GrAttribute* inPosition() const { return fInPosition; } | 468 const GrAttribute* inPosition() const { return fInPosition; } |
| 468 | 469 |
| 469 const GrAttribute* inCoord() const { return fInCoord; } | 470 const GrAttribute* inCoord() const { return fInCoord; } |
| 470 | 471 |
| 471 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } | 472 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } |
| 472 | 473 |
| 473 SkScalar getRadius() const { return fRadius; } | 474 SkScalar getRadius() const { return fRadius; } |
| 474 | 475 |
| 475 SkScalar getCenterX() const { return fCenterX; } | 476 SkScalar getCenterX() const { return fCenterX; } |
| 476 | 477 |
| 477 SkScalar getIntervalLength() const { return fIntervalLength; } | 478 SkScalar getIntervalLength() const { return fIntervalLength; } |
| 478 | 479 |
| 479 virtual void getGLProcessorKey(const GrBatchTracker&, | 480 virtual void getGLProcessorKey(const GrBatchTracker&, |
| 480 const GrGLCaps&, | 481 const GrGLCaps&, |
| 481 GrProcessorKeyBuilder* b) const SK_OVERRIDE; | 482 GrProcessorKeyBuilder* b) const SK_OVERRIDE; |
| 482 | 483 |
| 483 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker&) const
SK_OVERRIDE; | 484 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker&) const
SK_OVERRIDE; |
| 484 | 485 |
| 485 private: | 486 private: |
| 486 DashingCircleEffect(GrPrimitiveEdgeType edgeType, const DashInfo& info, SkSc
alar radius); | 487 DashingCircleEffect(GrColor, GrPrimitiveEdgeType edgeType, const DashInfo& i
nfo, |
| 488 SkScalar radius); |
| 487 | 489 |
| 488 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE; | 490 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE; |
| 489 | 491 |
| 490 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE; | 492 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE; |
| 491 | 493 |
| 492 GrPrimitiveEdgeType fEdgeType; | 494 GrPrimitiveEdgeType fEdgeType; |
| 493 const GrAttribute* fInPosition; | 495 const GrAttribute* fInPosition; |
| 494 const GrAttribute* fInCoord; | 496 const GrAttribute* fInCoord; |
| 495 SkScalar fIntervalLength; | 497 SkScalar fIntervalLength; |
| 496 SkScalar fRadius; | 498 SkScalar fRadius; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 593 void GLDashingCircleEffect::GenKey(const GrGeometryProcessor& processor, | 595 void GLDashingCircleEffect::GenKey(const GrGeometryProcessor& processor, |
| 594 const GrBatchTracker&, | 596 const GrBatchTracker&, |
| 595 const GrGLCaps&, | 597 const GrGLCaps&, |
| 596 GrProcessorKeyBuilder* b) { | 598 GrProcessorKeyBuilder* b) { |
| 597 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); | 599 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); |
| 598 b->add32(dce.getEdgeType()); | 600 b->add32(dce.getEdgeType()); |
| 599 } | 601 } |
| 600 | 602 |
| 601 ////////////////////////////////////////////////////////////////////////////// | 603 ////////////////////////////////////////////////////////////////////////////// |
| 602 | 604 |
| 603 GrGeometryProcessor* DashingCircleEffect::Create(GrPrimitiveEdgeType edgeType, c
onst DashInfo& info, | 605 GrGeometryProcessor* DashingCircleEffect::Create(GrColor color, |
| 606 GrPrimitiveEdgeType edgeType, |
| 607 const DashInfo& info, |
| 604 SkScalar radius) { | 608 SkScalar radius) { |
| 605 if (info.fCount != 2 || info.fIntervals[0] != 0) { | 609 if (info.fCount != 2 || info.fIntervals[0] != 0) { |
| 606 return NULL; | 610 return NULL; |
| 607 } | 611 } |
| 608 | 612 |
| 609 return SkNEW_ARGS(DashingCircleEffect, (edgeType, info, radius)); | 613 return SkNEW_ARGS(DashingCircleEffect, (color, edgeType, info, radius)); |
| 610 } | 614 } |
| 611 | 615 |
| 612 DashingCircleEffect::~DashingCircleEffect() {} | 616 DashingCircleEffect::~DashingCircleEffect() {} |
| 613 | 617 |
| 614 void DashingCircleEffect::onComputeInvariantOutput(GrInvariantOutput* inout) con
st { | 618 void DashingCircleEffect::onComputeInvariantOutput(GrInvariantOutput* inout) con
st { |
| 615 inout->mulByUnknownAlpha(); | 619 inout->mulByUnknownAlpha(); |
| 616 } | 620 } |
| 617 | 621 |
| 618 void DashingCircleEffect::getGLProcessorKey(const GrBatchTracker& bt, | 622 void DashingCircleEffect::getGLProcessorKey(const GrBatchTracker& bt, |
| 619 const GrGLCaps& caps, | 623 const GrGLCaps& caps, |
| 620 GrProcessorKeyBuilder* b) const { | 624 GrProcessorKeyBuilder* b) const { |
| 621 GLDashingCircleEffect::GenKey(*this, bt, caps, b); | 625 GLDashingCircleEffect::GenKey(*this, bt, caps, b); |
| 622 } | 626 } |
| 623 | 627 |
| 624 GrGLGeometryProcessor* DashingCircleEffect::createGLInstance(const GrBatchTracke
r& bt) const { | 628 GrGLGeometryProcessor* DashingCircleEffect::createGLInstance(const GrBatchTracke
r& bt) const { |
| 625 return SkNEW_ARGS(GLDashingCircleEffect, (*this, bt)); | 629 return SkNEW_ARGS(GLDashingCircleEffect, (*this, bt)); |
| 626 } | 630 } |
| 627 | 631 |
| 628 DashingCircleEffect::DashingCircleEffect(GrPrimitiveEdgeType edgeType, const Das
hInfo& info, | 632 DashingCircleEffect::DashingCircleEffect(GrColor color, |
| 633 GrPrimitiveEdgeType edgeType, |
| 634 const DashInfo& info, |
| 629 SkScalar radius) | 635 SkScalar radius) |
| 630 : fEdgeType(edgeType) { | 636 : INHERITED(color), fEdgeType(edgeType) { |
| 631 this->initClassID<DashingCircleEffect>(); | 637 this->initClassID<DashingCircleEffect>(); |
| 632 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVert
exAttribType)); | 638 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVert
exAttribType)); |
| 633 fInCoord = &this->addVertexAttrib(GrAttribute("inCoord", kVec2f_GrVertexAttr
ibType)); | 639 fInCoord = &this->addVertexAttrib(GrAttribute("inCoord", kVec2f_GrVertexAttr
ibType)); |
| 634 SkScalar onLen = info.fIntervals[0]; | 640 SkScalar onLen = info.fIntervals[0]; |
| 635 SkScalar offLen = info.fIntervals[1]; | 641 SkScalar offLen = info.fIntervals[1]; |
| 636 fIntervalLength = onLen + offLen; | 642 fIntervalLength = onLen + offLen; |
| 637 fRadius = radius; | 643 fRadius = radius; |
| 638 fCenterX = SkScalarHalf(offLen); | 644 fCenterX = SkScalarHalf(offLen); |
| 639 } | 645 } |
| 640 | 646 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 656 kGrProcessorEdgeTypeCnt)); | 662 kGrProcessorEdgeTypeCnt)); |
| 657 SkScalar strokeWidth = random->nextRangeScalar(0, 100.f); | 663 SkScalar strokeWidth = random->nextRangeScalar(0, 100.f); |
| 658 DashInfo info; | 664 DashInfo info; |
| 659 info.fCount = 2; | 665 info.fCount = 2; |
| 660 SkAutoTArray<SkScalar> intervals(info.fCount); | 666 SkAutoTArray<SkScalar> intervals(info.fCount); |
| 661 info.fIntervals = intervals.get(); | 667 info.fIntervals = intervals.get(); |
| 662 info.fIntervals[0] = 0; | 668 info.fIntervals[0] = 0; |
| 663 info.fIntervals[1] = random->nextRangeScalar(0, 10.f); | 669 info.fIntervals[1] = random->nextRangeScalar(0, 10.f); |
| 664 info.fPhase = random->nextRangeScalar(0, info.fIntervals[1]); | 670 info.fPhase = random->nextRangeScalar(0, info.fIntervals[1]); |
| 665 | 671 |
| 666 return DashingCircleEffect::Create(edgeType, info, strokeWidth); | 672 return DashingCircleEffect::Create(GrRandomColor(random), edgeType, info, st
rokeWidth); |
| 667 } | 673 } |
| 668 | 674 |
| 669 ////////////////////////////////////////////////////////////////////////////// | 675 ////////////////////////////////////////////////////////////////////////////// |
| 670 | 676 |
| 671 class GLDashingLineEffect; | 677 class GLDashingLineEffect; |
| 672 | 678 |
| 673 /* | 679 /* |
| 674 * This effect will draw a dashed line. The width of the dash is given by the st
rokeWidth and the | 680 * This effect will draw a dashed line. The width of the dash is given by the st
rokeWidth and the |
| 675 * length and spacing by the DashInfo. Both of the previous two parameters are i
n device space. | 681 * length and spacing by the DashInfo. Both of the previous two parameters are i
n device space. |
| 676 * This effect also requires the setting of a vec2 vertex attribute for the the
four corners of the | 682 * This effect also requires the setting of a vec2 vertex attribute for the the
four corners of the |
| 677 * bounding rect. This attribute is the "dash position" of each vertex. In other
words it is the | 683 * bounding rect. This attribute is the "dash position" of each vertex. In other
words it is the |
| 678 * vertex coords (in device space) if we transform the line to be horizontal, wi
th the start of | 684 * vertex coords (in device space) if we transform the line to be horizontal, wi
th the start of |
| 679 * line at the origin then shifted to the right by half the off interval. The li
ne then goes in the | 685 * line at the origin then shifted to the right by half the off interval. The li
ne then goes in the |
| 680 * positive x direction. | 686 * positive x direction. |
| 681 */ | 687 */ |
| 682 class DashingLineEffect : public GrGeometryProcessor { | 688 class DashingLineEffect : public GrGeometryProcessor { |
| 683 public: | 689 public: |
| 684 typedef SkPathEffect::DashInfo DashInfo; | 690 typedef SkPathEffect::DashInfo DashInfo; |
| 685 | 691 |
| 686 static GrGeometryProcessor* Create(GrPrimitiveEdgeType edgeType, | 692 static GrGeometryProcessor* Create(GrColor, |
| 693 GrPrimitiveEdgeType edgeType, |
| 687 const DashInfo& info, | 694 const DashInfo& info, |
| 688 SkScalar strokeWidth); | 695 SkScalar strokeWidth); |
| 689 | 696 |
| 690 virtual ~DashingLineEffect(); | 697 virtual ~DashingLineEffect(); |
| 691 | 698 |
| 692 virtual const char* name() const SK_OVERRIDE { return "DashingEffect"; } | 699 virtual const char* name() const SK_OVERRIDE { return "DashingEffect"; } |
| 693 | 700 |
| 694 const GrAttribute* inPosition() const { return fInPosition; } | 701 const GrAttribute* inPosition() const { return fInPosition; } |
| 695 | 702 |
| 696 const GrAttribute* inCoord() const { return fInCoord; } | 703 const GrAttribute* inCoord() const { return fInCoord; } |
| 697 | 704 |
| 698 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } | 705 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } |
| 699 | 706 |
| 700 const SkRect& getRect() const { return fRect; } | 707 const SkRect& getRect() const { return fRect; } |
| 701 | 708 |
| 702 SkScalar getIntervalLength() const { return fIntervalLength; } | 709 SkScalar getIntervalLength() const { return fIntervalLength; } |
| 703 | 710 |
| 704 virtual void getGLProcessorKey(const GrBatchTracker& bt, | 711 virtual void getGLProcessorKey(const GrBatchTracker& bt, |
| 705 const GrGLCaps& caps, | 712 const GrGLCaps& caps, |
| 706 GrProcessorKeyBuilder* b) const SK_OVERRIDE; | 713 GrProcessorKeyBuilder* b) const SK_OVERRIDE; |
| 707 | 714 |
| 708 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE; | 715 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE; |
| 709 | 716 |
| 710 private: | 717 private: |
| 711 DashingLineEffect(GrPrimitiveEdgeType edgeType, const DashInfo& info, SkScal
ar strokeWidth); | 718 DashingLineEffect(GrColor, GrPrimitiveEdgeType edgeType, const DashInfo& inf
o, |
| 719 SkScalar strokeWidth); |
| 712 | 720 |
| 713 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE; | 721 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE; |
| 714 | 722 |
| 715 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE; | 723 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE; |
| 716 | 724 |
| 717 GrPrimitiveEdgeType fEdgeType; | 725 GrPrimitiveEdgeType fEdgeType; |
| 718 const GrAttribute* fInPosition; | 726 const GrAttribute* fInPosition; |
| 719 const GrAttribute* fInCoord; | 727 const GrAttribute* fInCoord; |
| 720 SkRect fRect; | 728 SkRect fRect; |
| 721 SkScalar fIntervalLength; | 729 SkScalar fIntervalLength; |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 830 void GLDashingLineEffect::GenKey(const GrGeometryProcessor& processor, | 838 void GLDashingLineEffect::GenKey(const GrGeometryProcessor& processor, |
| 831 const GrBatchTracker&, | 839 const GrBatchTracker&, |
| 832 const GrGLCaps&, | 840 const GrGLCaps&, |
| 833 GrProcessorKeyBuilder* b) { | 841 GrProcessorKeyBuilder* b) { |
| 834 const DashingLineEffect& de = processor.cast<DashingLineEffect>(); | 842 const DashingLineEffect& de = processor.cast<DashingLineEffect>(); |
| 835 b->add32(de.getEdgeType()); | 843 b->add32(de.getEdgeType()); |
| 836 } | 844 } |
| 837 | 845 |
| 838 ////////////////////////////////////////////////////////////////////////////// | 846 ////////////////////////////////////////////////////////////////////////////// |
| 839 | 847 |
| 840 GrGeometryProcessor* DashingLineEffect::Create(GrPrimitiveEdgeType edgeType, | 848 GrGeometryProcessor* DashingLineEffect::Create(GrColor color, |
| 849 GrPrimitiveEdgeType edgeType, |
| 841 const DashInfo& info, | 850 const DashInfo& info, |
| 842 SkScalar strokeWidth) { | 851 SkScalar strokeWidth) { |
| 843 if (info.fCount != 2) { | 852 if (info.fCount != 2) { |
| 844 return NULL; | 853 return NULL; |
| 845 } | 854 } |
| 846 | 855 |
| 847 return SkNEW_ARGS(DashingLineEffect, (edgeType, info, strokeWidth)); | 856 return SkNEW_ARGS(DashingLineEffect, (color, edgeType, info, strokeWidth)); |
| 848 } | 857 } |
| 849 | 858 |
| 850 DashingLineEffect::~DashingLineEffect() {} | 859 DashingLineEffect::~DashingLineEffect() {} |
| 851 | 860 |
| 852 void DashingLineEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const
{ | 861 void DashingLineEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const
{ |
| 853 inout->mulByUnknownAlpha(); | 862 inout->mulByUnknownAlpha(); |
| 854 } | 863 } |
| 855 | 864 |
| 856 void DashingLineEffect::getGLProcessorKey(const GrBatchTracker& bt, | 865 void DashingLineEffect::getGLProcessorKey(const GrBatchTracker& bt, |
| 857 const GrGLCaps& caps, | 866 const GrGLCaps& caps, |
| 858 GrProcessorKeyBuilder* b) const { | 867 GrProcessorKeyBuilder* b) const { |
| 859 GLDashingLineEffect::GenKey(*this, bt, caps, b); | 868 GLDashingLineEffect::GenKey(*this, bt, caps, b); |
| 860 } | 869 } |
| 861 | 870 |
| 862 GrGLGeometryProcessor* DashingLineEffect::createGLInstance(const GrBatchTracker&
bt) const { | 871 GrGLGeometryProcessor* DashingLineEffect::createGLInstance(const GrBatchTracker&
bt) const { |
| 863 return SkNEW_ARGS(GLDashingLineEffect, (*this, bt)); | 872 return SkNEW_ARGS(GLDashingLineEffect, (*this, bt)); |
| 864 } | 873 } |
| 865 | 874 |
| 866 DashingLineEffect::DashingLineEffect(GrPrimitiveEdgeType edgeType, const DashInf
o& info, | 875 DashingLineEffect::DashingLineEffect(GrColor color, |
| 876 GrPrimitiveEdgeType edgeType, |
| 877 const DashInfo& info, |
| 867 SkScalar strokeWidth) | 878 SkScalar strokeWidth) |
| 868 : fEdgeType(edgeType) { | 879 : INHERITED(color), fEdgeType(edgeType) { |
| 869 this->initClassID<DashingLineEffect>(); | 880 this->initClassID<DashingLineEffect>(); |
| 870 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVert
exAttribType)); | 881 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVert
exAttribType)); |
| 871 fInCoord = &this->addVertexAttrib(GrAttribute("inCoord", kVec2f_GrVertexAttr
ibType)); | 882 fInCoord = &this->addVertexAttrib(GrAttribute("inCoord", kVec2f_GrVertexAttr
ibType)); |
| 872 SkScalar onLen = info.fIntervals[0]; | 883 SkScalar onLen = info.fIntervals[0]; |
| 873 SkScalar offLen = info.fIntervals[1]; | 884 SkScalar offLen = info.fIntervals[1]; |
| 874 SkScalar halfOffLen = SkScalarHalf(offLen); | 885 SkScalar halfOffLen = SkScalarHalf(offLen); |
| 875 SkScalar halfStroke = SkScalarHalf(strokeWidth); | 886 SkScalar halfStroke = SkScalarHalf(strokeWidth); |
| 876 fIntervalLength = onLen + offLen; | 887 fIntervalLength = onLen + offLen; |
| 877 fRect.set(halfOffLen, -halfStroke, halfOffLen + onLen, halfStroke); | 888 fRect.set(halfOffLen, -halfStroke, halfOffLen + onLen, halfStroke); |
| 878 } | 889 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 894 kGrProcessorEdgeTypeCnt)); | 905 kGrProcessorEdgeTypeCnt)); |
| 895 SkScalar strokeWidth = random->nextRangeScalar(0, 100.f); | 906 SkScalar strokeWidth = random->nextRangeScalar(0, 100.f); |
| 896 DashInfo info; | 907 DashInfo info; |
| 897 info.fCount = 2; | 908 info.fCount = 2; |
| 898 SkAutoTArray<SkScalar> intervals(info.fCount); | 909 SkAutoTArray<SkScalar> intervals(info.fCount); |
| 899 info.fIntervals = intervals.get(); | 910 info.fIntervals = intervals.get(); |
| 900 info.fIntervals[0] = random->nextRangeScalar(0, 10.f); | 911 info.fIntervals[0] = random->nextRangeScalar(0, 10.f); |
| 901 info.fIntervals[1] = random->nextRangeScalar(0, 10.f); | 912 info.fIntervals[1] = random->nextRangeScalar(0, 10.f); |
| 902 info.fPhase = random->nextRangeScalar(0, info.fIntervals[0] + info.fInterval
s[1]); | 913 info.fPhase = random->nextRangeScalar(0, info.fIntervals[0] + info.fInterval
s[1]); |
| 903 | 914 |
| 904 return DashingLineEffect::Create(edgeType, info, strokeWidth); | 915 return DashingLineEffect::Create(GrRandomColor(random), edgeType, info, stro
keWidth); |
| 905 } | 916 } |
| 906 | 917 |
| 907 ////////////////////////////////////////////////////////////////////////////// | 918 ////////////////////////////////////////////////////////////////////////////// |
| 908 | 919 |
| 909 GrGeometryProcessor* GrDashingEffect::Create(GrPrimitiveEdgeType edgeType, | 920 GrGeometryProcessor* GrDashingEffect::Create(GrColor color, |
| 921 GrPrimitiveEdgeType edgeType, |
| 910 const SkPathEffect::DashInfo& info, | 922 const SkPathEffect::DashInfo& info, |
| 911 SkScalar strokeWidth, | 923 SkScalar strokeWidth, |
| 912 GrDashingEffect::DashCap cap) { | 924 GrDashingEffect::DashCap cap) { |
| 913 switch (cap) { | 925 switch (cap) { |
| 914 case GrDashingEffect::kRound_DashCap: | 926 case GrDashingEffect::kRound_DashCap: |
| 915 return DashingCircleEffect::Create(edgeType, info, SkScalarHalf(stro
keWidth)); | 927 return DashingCircleEffect::Create(color, edgeType, info, SkScalarHa
lf(strokeWidth)); |
| 916 case GrDashingEffect::kNonRound_DashCap: | 928 case GrDashingEffect::kNonRound_DashCap: |
| 917 return DashingLineEffect::Create(edgeType, info, strokeWidth); | 929 return DashingLineEffect::Create(color, edgeType, info, strokeWidth)
; |
| 918 default: | 930 default: |
| 919 SkFAIL("Unexpected dashed cap."); | 931 SkFAIL("Unexpected dashed cap."); |
| 920 } | 932 } |
| 921 return NULL; | 933 return NULL; |
| 922 } | 934 } |
| OLD | NEW |