OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "GrAAConvexPathRenderer.h" | 9 #include "GrAAConvexPathRenderer.h" |
10 | 10 |
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
603 GrGeometryProcessor* QuadEdgeEffect::TestCreate(SkRandom* random, | 603 GrGeometryProcessor* QuadEdgeEffect::TestCreate(SkRandom* random, |
604 GrContext*, | 604 GrContext*, |
605 const GrDrawTargetCaps& caps, | 605 const GrDrawTargetCaps& caps, |
606 GrTexture*[]) { | 606 GrTexture*[]) { |
607 // Doesn't work without derivative instructions. | 607 // Doesn't work without derivative instructions. |
608 return caps.shaderDerivativeSupport() ? QuadEdgeEffect::Create() : NULL; | 608 return caps.shaderDerivativeSupport() ? QuadEdgeEffect::Create() : NULL; |
609 } | 609 } |
610 | 610 |
611 /////////////////////////////////////////////////////////////////////////////// | 611 /////////////////////////////////////////////////////////////////////////////// |
612 | 612 |
613 bool GrAAConvexPathRenderer::canDrawPath(const SkPath& path, | 613 bool GrAAConvexPathRenderer::canDrawPath(const GrDrawTarget* target, |
| 614 const GrDrawState*, |
| 615 const SkPath& path, |
614 const SkStrokeRec& stroke, | 616 const SkStrokeRec& stroke, |
615 const GrDrawTarget* target, | |
616 bool antiAlias) const { | 617 bool antiAlias) const { |
617 return (target->caps()->shaderDerivativeSupport() && antiAlias && | 618 return (target->caps()->shaderDerivativeSupport() && antiAlias && |
618 stroke.isFillStyle() && !path.isInverseFillType() && path.isConvex()
); | 619 stroke.isFillStyle() && !path.isInverseFillType() && path.isConvex()
); |
619 } | 620 } |
620 | 621 |
621 namespace { | 622 namespace { |
622 | 623 |
623 // position + edge | 624 // position + edge |
624 extern const GrVertexAttrib gPathAttribs[] = { | 625 extern const GrVertexAttrib gPathAttribs[] = { |
625 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding
}, | 626 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding
}, |
626 {kVec4f_GrVertexAttribType, sizeof(SkPoint), kGeometryProcessor_GrVertexAttr
ibBinding} | 627 {kVec4f_GrVertexAttribType, sizeof(SkPoint), kGeometryProcessor_GrVertexAttr
ibBinding} |
627 }; | 628 }; |
628 | 629 |
629 }; | 630 }; |
630 | 631 |
631 bool GrAAConvexPathRenderer::onDrawPath(const SkPath& origPath, | 632 bool GrAAConvexPathRenderer::onDrawPath(GrDrawTarget* target, |
| 633 GrDrawState* drawState, |
| 634 const SkPath& origPath, |
632 const SkStrokeRec&, | 635 const SkStrokeRec&, |
633 GrDrawTarget* target, | |
634 bool antiAlias) { | 636 bool antiAlias) { |
635 | 637 |
636 const SkPath* path = &origPath; | 638 const SkPath* path = &origPath; |
637 if (path->isEmpty()) { | 639 if (path->isEmpty()) { |
638 return true; | 640 return true; |
639 } | 641 } |
640 | 642 |
641 SkMatrix viewMatrix = target->getDrawState().getViewMatrix(); | 643 SkMatrix viewMatrix = drawState->getViewMatrix(); |
642 GrDrawTarget::AutoStateRestore asr; | 644 GrDrawState::AutoViewMatrixRestore avmr; |
643 if (!asr.setIdentity(target, GrDrawTarget::kPreserve_ASRInit)) { | 645 if (!avmr.setIdentity(drawState)) { |
644 return false; | 646 return false; |
645 } | 647 } |
646 GrDrawState* drawState = target->drawState(); | |
647 | 648 |
648 // We use the fact that SkPath::transform path does subdivision based on | 649 // We use the fact that SkPath::transform path does subdivision based on |
649 // perspective. Otherwise, we apply the view matrix when copying to the | 650 // perspective. Otherwise, we apply the view matrix when copying to the |
650 // segment representation. | 651 // segment representation. |
651 SkPath tmpPath; | 652 SkPath tmpPath; |
652 if (viewMatrix.hasPerspective()) { | 653 if (viewMatrix.hasPerspective()) { |
653 origPath.transform(viewMatrix, &tmpPath); | 654 origPath.transform(viewMatrix, &tmpPath); |
654 path = &tmpPath; | 655 path = &tmpPath; |
655 viewMatrix = SkMatrix::I(); | 656 viewMatrix = SkMatrix::I(); |
656 } | 657 } |
(...skipping 18 matching lines...) Expand all Loading... |
675 } | 676 } |
676 | 677 |
677 // Our computed verts should all be within one pixel of the segment control
points. | 678 // Our computed verts should all be within one pixel of the segment control
points. |
678 devBounds.outset(SK_Scalar1, SK_Scalar1); | 679 devBounds.outset(SK_Scalar1, SK_Scalar1); |
679 | 680 |
680 drawState->setVertexAttribs<gPathAttribs>(SK_ARRAY_COUNT(gPathAttribs), size
of(QuadVertex)); | 681 drawState->setVertexAttribs<gPathAttribs>(SK_ARRAY_COUNT(gPathAttribs), size
of(QuadVertex)); |
681 | 682 |
682 GrGeometryProcessor* quadProcessor = QuadEdgeEffect::Create(); | 683 GrGeometryProcessor* quadProcessor = QuadEdgeEffect::Create(); |
683 drawState->setGeometryProcessor(quadProcessor)->unref(); | 684 drawState->setGeometryProcessor(quadProcessor)->unref(); |
684 | 685 |
685 GrDrawTarget::AutoReleaseGeometry arg(target, vCount, iCount); | 686 GrDrawTarget::AutoReleaseGeometry arg(target, vCount, drawState->getVertexSt
ride(), iCount); |
686 if (!arg.succeeded()) { | 687 if (!arg.succeeded()) { |
687 return false; | 688 return false; |
688 } | 689 } |
689 verts = reinterpret_cast<QuadVertex*>(arg.vertices()); | 690 verts = reinterpret_cast<QuadVertex*>(arg.vertices()); |
690 idxs = reinterpret_cast<uint16_t*>(arg.indices()); | 691 idxs = reinterpret_cast<uint16_t*>(arg.indices()); |
691 | 692 |
692 SkSTArray<kPreallocDrawCnt, Draw, true> draws; | 693 SkSTArray<kPreallocDrawCnt, Draw, true> draws; |
693 create_vertices(segments, fanPt, &draws, verts, idxs); | 694 create_vertices(segments, fanPt, &draws, verts, idxs); |
694 | 695 |
695 // Check devBounds | 696 // Check devBounds |
696 #ifdef SK_DEBUG | 697 #ifdef SK_DEBUG |
697 SkRect tolDevBounds = devBounds; | 698 SkRect tolDevBounds = devBounds; |
698 tolDevBounds.outset(SK_Scalar1 / 10000, SK_Scalar1 / 10000); | 699 tolDevBounds.outset(SK_Scalar1 / 10000, SK_Scalar1 / 10000); |
699 SkRect actualBounds; | 700 SkRect actualBounds; |
700 actualBounds.set(verts[0].fPos, verts[1].fPos); | 701 actualBounds.set(verts[0].fPos, verts[1].fPos); |
701 for (int i = 2; i < vCount; ++i) { | 702 for (int i = 2; i < vCount; ++i) { |
702 actualBounds.growToInclude(verts[i].fPos.fX, verts[i].fPos.fY); | 703 actualBounds.growToInclude(verts[i].fPos.fX, verts[i].fPos.fY); |
703 } | 704 } |
704 SkASSERT(tolDevBounds.contains(actualBounds)); | 705 SkASSERT(tolDevBounds.contains(actualBounds)); |
705 #endif | 706 #endif |
706 | 707 |
707 int vOffset = 0; | 708 int vOffset = 0; |
708 for (int i = 0; i < draws.count(); ++i) { | 709 for (int i = 0; i < draws.count(); ++i) { |
709 const Draw& draw = draws[i]; | 710 const Draw& draw = draws[i]; |
710 target->drawIndexed(kTriangles_GrPrimitiveType, | 711 target->drawIndexed(drawState, |
| 712 kTriangles_GrPrimitiveType, |
711 vOffset, // start vertex | 713 vOffset, // start vertex |
712 0, // start index | 714 0, // start index |
713 draw.fVertexCnt, | 715 draw.fVertexCnt, |
714 draw.fIndexCnt, | 716 draw.fIndexCnt, |
715 &devBounds); | 717 &devBounds); |
716 vOffset += draw.fVertexCnt; | 718 vOffset += draw.fVertexCnt; |
717 } | 719 } |
718 | 720 |
719 return true; | 721 return true; |
720 } | 722 } |
OLD | NEW |