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 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 | 328 |
329 SkPoint devicePts[2]; | 329 SkPoint devicePts[2]; |
330 vm.mapPoints(devicePts, ptsRot, 2); | 330 vm.mapPoints(devicePts, ptsRot, 2); |
331 SkScalar lineLength = SkPoint::Distance(devicePts[0], devicePts[1]); | 331 SkScalar lineLength = SkPoint::Distance(devicePts[0], devicePts[1]); |
332 if (hasCap) { | 332 if (hasCap) { |
333 lineLength += 2.f * halfDevStroke; | 333 lineLength += 2.f * halfDevStroke; |
334 } | 334 } |
335 devIntervals[0] = lineLength; | 335 devIntervals[0] = lineLength; |
336 } | 336 } |
337 | 337 |
338 const GrGeometryProcessor* gp; | 338 SkAutoTUnref<const GrGeometryProcessor> gp; |
339 bool fullDash = devIntervals[1] > 0.f || useAA; | 339 bool fullDash = devIntervals[1] > 0.f || useAA; |
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(color, edgeType, devInfo, strokeWidth, capT
ype); | 350 gp.reset(GrDashingEffect::Create(color, edgeType, devInfo, strokeWidth,
capType)); |
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(color, GrDefaultGeoProcFactory::kPo
sition_GPType); | 353 gp.reset(GrDefaultGeoProcFactory::Create(color, GrDefaultGeoProcFactory:
:kPosition_GPType)); |
354 } | 354 } |
355 | 355 |
356 drawState->setGeometryProcessor(gp)->unref(); | |
357 | |
358 int totalRectCnt = 0; | 356 int totalRectCnt = 0; |
359 | 357 |
360 totalRectCnt += !lineDone ? 1 : 0; | 358 totalRectCnt += !lineDone ? 1 : 0; |
361 totalRectCnt += hasStartRect ? 1 : 0; | 359 totalRectCnt += hasStartRect ? 1 : 0; |
362 totalRectCnt += hasEndRect ? 1 : 0; | 360 totalRectCnt += hasEndRect ? 1 : 0; |
363 | 361 |
364 GrDrawTarget::AutoReleaseGeometry geo(target, | 362 GrDrawTarget::AutoReleaseGeometry geo(target, |
365 totalRectCnt * 4, | 363 totalRectCnt * 4, |
366 gp->getVertexStride(), 0); | 364 gp->getVertexStride(), 0); |
367 if (!geo.succeeded()) { | 365 if (!geo.succeeded()) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 devIntervals[0], halfDevStroke); | 426 devIntervals[0], halfDevStroke); |
429 } else { | 427 } else { |
430 SkPoint* verts = reinterpret_cast<SkPoint*>(geo.vertices()); | 428 SkPoint* verts = reinterpret_cast<SkPoint*>(geo.vertices()); |
431 SkASSERT(gp->getVertexStride() == sizeof(SkPoint)); | 429 SkASSERT(gp->getVertexStride() == sizeof(SkPoint)); |
432 setup_dashed_rect_pos(endRect, curVIdx, combinedMatrix, verts); | 430 setup_dashed_rect_pos(endRect, curVIdx, combinedMatrix, verts); |
433 } | 431 } |
434 | 432 |
435 } | 433 } |
436 | 434 |
437 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); | 435 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); |
438 target->drawIndexedInstances(drawState, kTriangles_GrPrimitiveType, totalRec
tCnt, 4, 6); | 436 target->drawIndexedInstances(drawState, gp, kTriangles_GrPrimitiveType, tota
lRectCnt, 4, 6); |
439 target->resetIndexSource(); | 437 target->resetIndexSource(); |
440 return true; | 438 return true; |
441 } | 439 } |
442 | 440 |
443 ////////////////////////////////////////////////////////////////////////////// | 441 ////////////////////////////////////////////////////////////////////////////// |
444 | 442 |
445 class GLDashingCircleEffect; | 443 class GLDashingCircleEffect; |
446 /* | 444 /* |
447 * This effect will draw a dotted line (defined as a dashed lined with round cap
s and no on | 445 * This effect will draw a dotted line (defined as a dashed lined with round cap
s and no on |
448 * interval). The radius of the dots is given by the strokeWidth and the spacing
by the DashInfo. | 446 * interval). The radius of the dots is given by the strokeWidth and the spacing
by the DashInfo. |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 GrProcessorKeyBuilder* b) const SK_OVERRIDE; | 480 GrProcessorKeyBuilder* b) const SK_OVERRIDE; |
483 | 481 |
484 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker&) const
SK_OVERRIDE; | 482 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker&) const
SK_OVERRIDE; |
485 | 483 |
486 private: | 484 private: |
487 DashingCircleEffect(GrColor, GrPrimitiveEdgeType edgeType, const DashInfo& i
nfo, | 485 DashingCircleEffect(GrColor, GrPrimitiveEdgeType edgeType, const DashInfo& i
nfo, |
488 SkScalar radius); | 486 SkScalar radius); |
489 | 487 |
490 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE; | 488 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE; |
491 | 489 |
492 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE; | 490 virtual void onComputeOutputCoverage(GrInitInvariantOutput*) const SK_OVERRI
DE; |
493 | 491 |
494 GrPrimitiveEdgeType fEdgeType; | 492 GrPrimitiveEdgeType fEdgeType; |
495 const GrAttribute* fInPosition; | 493 const GrAttribute* fInPosition; |
496 const GrAttribute* fInCoord; | 494 const GrAttribute* fInCoord; |
497 SkScalar fIntervalLength; | 495 SkScalar fIntervalLength; |
498 SkScalar fRadius; | 496 SkScalar fRadius; |
499 SkScalar fCenterX; | 497 SkScalar fCenterX; |
500 | 498 |
501 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 499 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
502 | 500 |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 SkScalar radius) { | 605 SkScalar radius) { |
608 if (info.fCount != 2 || info.fIntervals[0] != 0) { | 606 if (info.fCount != 2 || info.fIntervals[0] != 0) { |
609 return NULL; | 607 return NULL; |
610 } | 608 } |
611 | 609 |
612 return SkNEW_ARGS(DashingCircleEffect, (color, edgeType, info, radius)); | 610 return SkNEW_ARGS(DashingCircleEffect, (color, edgeType, info, radius)); |
613 } | 611 } |
614 | 612 |
615 DashingCircleEffect::~DashingCircleEffect() {} | 613 DashingCircleEffect::~DashingCircleEffect() {} |
616 | 614 |
617 void DashingCircleEffect::onComputeInvariantOutput(GrInvariantOutput* inout) con
st { | 615 void DashingCircleEffect::onComputeOutputCoverage(GrInitInvariantOutput* out) co
nst { |
618 inout->mulByUnknownAlpha(); | 616 out->setIsUnknownSingleComponent(); |
619 } | 617 } |
620 | 618 |
621 void DashingCircleEffect::getGLProcessorKey(const GrBatchTracker& bt, | 619 void DashingCircleEffect::getGLProcessorKey(const GrBatchTracker& bt, |
622 const GrGLCaps& caps, | 620 const GrGLCaps& caps, |
623 GrProcessorKeyBuilder* b) const { | 621 GrProcessorKeyBuilder* b) const { |
624 GLDashingCircleEffect::GenKey(*this, bt, caps, b); | 622 GLDashingCircleEffect::GenKey(*this, bt, caps, b); |
625 } | 623 } |
626 | 624 |
627 GrGLGeometryProcessor* DashingCircleEffect::createGLInstance(const GrBatchTracke
r& bt) const { | 625 GrGLGeometryProcessor* DashingCircleEffect::createGLInstance(const GrBatchTracke
r& bt) const { |
628 return SkNEW_ARGS(GLDashingCircleEffect, (*this, bt)); | 626 return SkNEW_ARGS(GLDashingCircleEffect, (*this, bt)); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
712 GrProcessorKeyBuilder* b) const SK_OVERRIDE; | 710 GrProcessorKeyBuilder* b) const SK_OVERRIDE; |
713 | 711 |
714 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE; | 712 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE; |
715 | 713 |
716 private: | 714 private: |
717 DashingLineEffect(GrColor, GrPrimitiveEdgeType edgeType, const DashInfo& inf
o, | 715 DashingLineEffect(GrColor, GrPrimitiveEdgeType edgeType, const DashInfo& inf
o, |
718 SkScalar strokeWidth); | 716 SkScalar strokeWidth); |
719 | 717 |
720 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE; | 718 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE; |
721 | 719 |
722 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE; | 720 virtual void onComputeOutputCoverage(GrInitInvariantOutput*) const SK_OVERRI
DE; |
723 | 721 |
724 GrPrimitiveEdgeType fEdgeType; | 722 GrPrimitiveEdgeType fEdgeType; |
725 const GrAttribute* fInPosition; | 723 const GrAttribute* fInPosition; |
726 const GrAttribute* fInCoord; | 724 const GrAttribute* fInCoord; |
727 SkRect fRect; | 725 SkRect fRect; |
728 SkScalar fIntervalLength; | 726 SkScalar fIntervalLength; |
729 | 727 |
730 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 728 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
731 | 729 |
732 typedef GrGeometryProcessor INHERITED; | 730 typedef GrGeometryProcessor INHERITED; |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
850 SkScalar strokeWidth) { | 848 SkScalar strokeWidth) { |
851 if (info.fCount != 2) { | 849 if (info.fCount != 2) { |
852 return NULL; | 850 return NULL; |
853 } | 851 } |
854 | 852 |
855 return SkNEW_ARGS(DashingLineEffect, (color, edgeType, info, strokeWidth)); | 853 return SkNEW_ARGS(DashingLineEffect, (color, edgeType, info, strokeWidth)); |
856 } | 854 } |
857 | 855 |
858 DashingLineEffect::~DashingLineEffect() {} | 856 DashingLineEffect::~DashingLineEffect() {} |
859 | 857 |
860 void DashingLineEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const
{ | 858 void DashingLineEffect::onComputeOutputCoverage(GrInitInvariantOutput* out) cons
t { |
861 inout->mulByUnknownAlpha(); | 859 out->setIsUnknownSingleComponent(); |
862 } | 860 } |
863 | 861 |
864 void DashingLineEffect::getGLProcessorKey(const GrBatchTracker& bt, | 862 void DashingLineEffect::getGLProcessorKey(const GrBatchTracker& bt, |
865 const GrGLCaps& caps, | 863 const GrGLCaps& caps, |
866 GrProcessorKeyBuilder* b) const { | 864 GrProcessorKeyBuilder* b) const { |
867 GLDashingLineEffect::GenKey(*this, bt, caps, b); | 865 GLDashingLineEffect::GenKey(*this, bt, caps, b); |
868 } | 866 } |
869 | 867 |
870 GrGLGeometryProcessor* DashingLineEffect::createGLInstance(const GrBatchTracker&
bt) const { | 868 GrGLGeometryProcessor* DashingLineEffect::createGLInstance(const GrBatchTracker&
bt) const { |
871 return SkNEW_ARGS(GLDashingLineEffect, (*this, bt)); | 869 return SkNEW_ARGS(GLDashingLineEffect, (*this, bt)); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
924 switch (cap) { | 922 switch (cap) { |
925 case GrDashingEffect::kRound_DashCap: | 923 case GrDashingEffect::kRound_DashCap: |
926 return DashingCircleEffect::Create(color, edgeType, info, SkScalarHa
lf(strokeWidth)); | 924 return DashingCircleEffect::Create(color, edgeType, info, SkScalarHa
lf(strokeWidth)); |
927 case GrDashingEffect::kNonRound_DashCap: | 925 case GrDashingEffect::kNonRound_DashCap: |
928 return DashingLineEffect::Create(color, edgeType, info, strokeWidth)
; | 926 return DashingLineEffect::Create(color, edgeType, info, strokeWidth)
; |
929 default: | 927 default: |
930 SkFAIL("Unexpected dashed cap."); | 928 SkFAIL("Unexpected dashed cap."); |
931 } | 929 } |
932 return NULL; | 930 return NULL; |
933 } | 931 } |
OLD | NEW |