Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(68)

Side by Side Diff: src/gpu/GrAAConvexPathRenderer.cpp

Issue 818233002: Remove coordchanges from drawstate (Closed) Base URL: https://skia.googlesource.com/skia.git@coord-change-off-paint
Patch Set: adding test to ignore Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gm/beziereffects.cpp ('k') | src/gpu/GrAAHairLinePathRenderer.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 487 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 * distance with negative being inside, positive outside. The edge is specified in 498 * distance with negative being inside, positive outside. The edge is specified in
499 * window space (y-down). If either the third or fourth component of the interpo lated 499 * window space (y-down). If either the third or fourth component of the interpo lated
500 * vertex coord is > 0 then the pixel is considered outside the edge. This is us ed to 500 * vertex coord is > 0 then the pixel is considered outside the edge. This is us ed to
501 * attempt to trim to a portion of the infinite quad. 501 * attempt to trim to a portion of the infinite quad.
502 * Requires shader derivative instruction support. 502 * Requires shader derivative instruction support.
503 */ 503 */
504 504
505 class QuadEdgeEffect : public GrGeometryProcessor { 505 class QuadEdgeEffect : public GrGeometryProcessor {
506 public: 506 public:
507 507
508 static GrGeometryProcessor* Create(GrColor color) { 508 static GrGeometryProcessor* Create(GrColor color, const SkMatrix& localMatri x) {
509 return SkNEW_ARGS(QuadEdgeEffect, (color)); 509 return SkNEW_ARGS(QuadEdgeEffect, (color, localMatrix));
510 } 510 }
511 511
512 virtual ~QuadEdgeEffect() {} 512 virtual ~QuadEdgeEffect() {}
513 513
514 virtual const char* name() const SK_OVERRIDE { return "QuadEdge"; } 514 virtual const char* name() const SK_OVERRIDE { return "QuadEdge"; }
515 515
516 const GrAttribute* inPosition() const { return fInPosition; } 516 const GrAttribute* inPosition() const { return fInPosition; }
517 const GrAttribute* inQuadEdge() const { return fInQuadEdge; } 517 const GrAttribute* inQuadEdge() const { return fInQuadEdge; }
518 518
519 class GLProcessor : public GrGLGeometryProcessor { 519 class GLProcessor : public GrGLGeometryProcessor {
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
619 const GrBatchTracker& t) const SK_OVERRIDE { 619 const GrBatchTracker& t) const SK_OVERRIDE {
620 const BatchTracker& mine = m.cast<BatchTracker>(); 620 const BatchTracker& mine = m.cast<BatchTracker>();
621 const BatchTracker& theirs = t.cast<BatchTracker>(); 621 const BatchTracker& theirs = t.cast<BatchTracker>();
622 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords, 622 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords,
623 that, theirs.fUsesLocalCoords) && 623 that, theirs.fUsesLocalCoords) &&
624 CanCombineOutput(mine.fInputColorType, mine.fColor, 624 CanCombineOutput(mine.fInputColorType, mine.fColor,
625 theirs.fInputColorType, theirs.fColor); 625 theirs.fInputColorType, theirs.fColor);
626 } 626 }
627 627
628 private: 628 private:
629 QuadEdgeEffect(GrColor color) : INHERITED(color) { 629 QuadEdgeEffect(GrColor color, const SkMatrix& localMatrix)
630 : INHERITED(color, false, localMatrix) {
630 this->initClassID<QuadEdgeEffect>(); 631 this->initClassID<QuadEdgeEffect>();
631 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr VertexAttribType)); 632 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr VertexAttribType));
632 fInQuadEdge = &this->addVertexAttrib(GrAttribute("inQuadEdge", kVec4f_Gr VertexAttribType)); 633 fInQuadEdge = &this->addVertexAttrib(GrAttribute("inQuadEdge", kVec4f_Gr VertexAttribType));
633 } 634 }
634 635
635 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { 636 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE {
636 return true; 637 return true;
637 } 638 }
638 639
639 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE { 640 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE {
(...skipping 14 matching lines...) Expand all
654 typedef GrGeometryProcessor INHERITED; 655 typedef GrGeometryProcessor INHERITED;
655 }; 656 };
656 657
657 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(QuadEdgeEffect); 658 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(QuadEdgeEffect);
658 659
659 GrGeometryProcessor* QuadEdgeEffect::TestCreate(SkRandom* random, 660 GrGeometryProcessor* QuadEdgeEffect::TestCreate(SkRandom* random,
660 GrContext*, 661 GrContext*,
661 const GrDrawTargetCaps& caps, 662 const GrDrawTargetCaps& caps,
662 GrTexture*[]) { 663 GrTexture*[]) {
663 // Doesn't work without derivative instructions. 664 // Doesn't work without derivative instructions.
664 return caps.shaderDerivativeSupport() ? QuadEdgeEffect::Create(GrRandomColor (random)) : NULL; 665 return caps.shaderDerivativeSupport() ?
666 QuadEdgeEffect::Create(GrRandomColor(random),
667 GrProcessorUnitTest::TestMatrix(random)) : NUL L;
665 } 668 }
666 669
667 /////////////////////////////////////////////////////////////////////////////// 670 ///////////////////////////////////////////////////////////////////////////////
668 671
669 bool GrAAConvexPathRenderer::canDrawPath(const GrDrawTarget* target, 672 bool GrAAConvexPathRenderer::canDrawPath(const GrDrawTarget* target,
670 const GrDrawState*, 673 const GrDrawState*,
671 const SkPath& path, 674 const SkPath& path,
672 const SkStrokeRec& stroke, 675 const SkStrokeRec& stroke,
673 bool antiAlias) const { 676 bool antiAlias) const {
674 return (target->caps()->shaderDerivativeSupport() && antiAlias && 677 return (target->caps()->shaderDerivativeSupport() && antiAlias &&
675 stroke.isFillStyle() && !path.isInverseFillType() && path.isConvex() ); 678 stroke.isFillStyle() && !path.isInverseFillType() && path.isConvex() );
676 } 679 }
677 680
678 bool GrAAConvexPathRenderer::onDrawPath(GrDrawTarget* target, 681 bool GrAAConvexPathRenderer::onDrawPath(GrDrawTarget* target,
679 GrDrawState* drawState, 682 GrDrawState* drawState,
680 GrColor color, 683 GrColor color,
681 const SkPath& origPath, 684 const SkPath& origPath,
682 const SkStrokeRec&, 685 const SkStrokeRec&,
683 bool antiAlias) { 686 bool antiAlias) {
684 687
685 const SkPath* path = &origPath; 688 const SkPath* path = &origPath;
686 if (path->isEmpty()) { 689 if (path->isEmpty()) {
687 return true; 690 return true;
688 } 691 }
689 692
690 SkMatrix viewMatrix = drawState->getViewMatrix(); 693 SkMatrix viewMatrix = drawState->getViewMatrix();
691 GrDrawState::AutoViewMatrixRestore avmr; 694 SkMatrix invert;
692 if (!avmr.setIdentity(drawState)) { 695 if (!viewMatrix.invert(&invert)) {
693 return false; 696 return false;
694 } 697 }
695 698
699 GrDrawState::AutoViewMatrixRestore avmr(drawState);
700
696 // We use the fact that SkPath::transform path does subdivision based on 701 // We use the fact that SkPath::transform path does subdivision based on
697 // perspective. Otherwise, we apply the view matrix when copying to the 702 // perspective. Otherwise, we apply the view matrix when copying to the
698 // segment representation. 703 // segment representation.
699 SkPath tmpPath; 704 SkPath tmpPath;
700 if (viewMatrix.hasPerspective()) { 705 if (viewMatrix.hasPerspective()) {
701 origPath.transform(viewMatrix, &tmpPath); 706 origPath.transform(viewMatrix, &tmpPath);
702 path = &tmpPath; 707 path = &tmpPath;
703 viewMatrix = SkMatrix::I(); 708 viewMatrix = SkMatrix::I();
704 } 709 }
705 710
(...skipping 12 matching lines...) Expand all
718 // We can't simply use the path bounds because we may degenerate cubics to q uads which produces 723 // We can't simply use the path bounds because we may degenerate cubics to q uads which produces
719 // new control points outside the original convex hull. 724 // new control points outside the original convex hull.
720 SkRect devBounds; 725 SkRect devBounds;
721 if (!get_segments(*path, viewMatrix, &segments, &fanPt, &vCount, &iCount, &d evBounds)) { 726 if (!get_segments(*path, viewMatrix, &segments, &fanPt, &vCount, &iCount, &d evBounds)) {
722 return false; 727 return false;
723 } 728 }
724 729
725 // Our computed verts should all be within one pixel of the segment control points. 730 // Our computed verts should all be within one pixel of the segment control points.
726 devBounds.outset(SK_Scalar1, SK_Scalar1); 731 devBounds.outset(SK_Scalar1, SK_Scalar1);
727 732
728 SkAutoTUnref<GrGeometryProcessor> quadProcessor(QuadEdgeEffect::Create(color )); 733 SkAutoTUnref<GrGeometryProcessor> quadProcessor(QuadEdgeEffect::Create(color , invert));
729 734
730 GrDrawTarget::AutoReleaseGeometry arg(target, vCount, quadProcessor->getVert exStride(), iCount); 735 GrDrawTarget::AutoReleaseGeometry arg(target, vCount, quadProcessor->getVert exStride(), iCount);
731 SkASSERT(quadProcessor->getVertexStride() == sizeof(QuadVertex)); 736 SkASSERT(quadProcessor->getVertexStride() == sizeof(QuadVertex));
732 if (!arg.succeeded()) { 737 if (!arg.succeeded()) {
733 return false; 738 return false;
734 } 739 }
735 verts = reinterpret_cast<QuadVertex*>(arg.vertices()); 740 verts = reinterpret_cast<QuadVertex*>(arg.vertices());
736 idxs = reinterpret_cast<uint16_t*>(arg.indices()); 741 idxs = reinterpret_cast<uint16_t*>(arg.indices());
737 742
738 SkSTArray<kPreallocDrawCnt, Draw, true> draws; 743 SkSTArray<kPreallocDrawCnt, Draw, true> draws;
(...skipping 20 matching lines...) Expand all
759 vOffset, // start vertex 764 vOffset, // start vertex
760 0, // start index 765 0, // start index
761 draw.fVertexCnt, 766 draw.fVertexCnt,
762 draw.fIndexCnt, 767 draw.fIndexCnt,
763 &devBounds); 768 &devBounds);
764 vOffset += draw.fVertexCnt; 769 vOffset += draw.fVertexCnt;
765 } 770 }
766 771
767 return true; 772 return true;
768 } 773 }
OLDNEW
« no previous file with comments | « gm/beziereffects.cpp ('k') | src/gpu/GrAAHairLinePathRenderer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698