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