| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright 2011 Google Inc. | 2  * Copyright 2011 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 "GrAAHairLinePathRenderer.h" | 8 #include "GrAAHairLinePathRenderer.h" | 
| 9 | 9 | 
| 10 #include "GrBatchFlushState.h" | 10 #include "GrBatchFlushState.h" | 
| (...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 799     const SkMatrix* geometryProcessorLocalM = &invert; | 799     const SkMatrix* geometryProcessorLocalM = &invert; | 
| 800     const SkMatrix* toDevice = nullptr; | 800     const SkMatrix* toDevice = nullptr; | 
| 801     const SkMatrix* toSrc = nullptr; | 801     const SkMatrix* toSrc = nullptr; | 
| 802     if (hasPerspective) { | 802     if (hasPerspective) { | 
| 803         geometryProcessorViewM = &this->viewMatrix(); | 803         geometryProcessorViewM = &this->viewMatrix(); | 
| 804         geometryProcessorLocalM = &SkMatrix::I(); | 804         geometryProcessorLocalM = &SkMatrix::I(); | 
| 805         toDevice = &this->viewMatrix(); | 805         toDevice = &this->viewMatrix(); | 
| 806         toSrc = &invert; | 806         toSrc = &invert; | 
| 807     } | 807     } | 
| 808 | 808 | 
| 809     SkAutoTUnref<const GrGeometryProcessor> lineGP; |  | 
| 810     { |  | 
| 811         using namespace GrDefaultGeoProcFactory; |  | 
| 812 |  | 
| 813         Color color(this->color()); |  | 
| 814         Coverage coverage(Coverage::kAttribute_Type); |  | 
| 815         LocalCoords localCoords(this->usesLocalCoords() ? LocalCoords::kUsePosit
     ion_Type : |  | 
| 816                                                           LocalCoords::kUnused_T
     ype); |  | 
| 817         localCoords.fMatrix = geometryProcessorLocalM; |  | 
| 818         lineGP.reset(GrDefaultGeoProcFactory::Create(color, coverage, localCoord
     s, |  | 
| 819                                                      *geometryProcessorViewM)); |  | 
| 820     } |  | 
| 821 |  | 
| 822     SkAutoTUnref<const GrGeometryProcessor> quadGP( |  | 
| 823             GrQuadEffect::Create(this->color(), |  | 
| 824                                  *geometryProcessorViewM, |  | 
| 825                                  kHairlineAA_GrProcessorEdgeType, |  | 
| 826                                  target->caps(), |  | 
| 827                                  *geometryProcessorLocalM, |  | 
| 828                                  this->usesLocalCoords(), |  | 
| 829                                  this->coverage())); |  | 
| 830 |  | 
| 831     SkAutoTUnref<const GrGeometryProcessor> conicGP( |  | 
| 832             GrConicEffect::Create(this->color(), |  | 
| 833                                   *geometryProcessorViewM, |  | 
| 834                                   kHairlineAA_GrProcessorEdgeType, |  | 
| 835                                   target->caps(), |  | 
| 836                                   *geometryProcessorLocalM, |  | 
| 837                                   this->usesLocalCoords(), |  | 
| 838                                   this->coverage())); |  | 
| 839 |  | 
| 840     // This is hand inlined for maximum performance. | 809     // This is hand inlined for maximum performance. | 
| 841     PREALLOC_PTARRAY(128) lines; | 810     PREALLOC_PTARRAY(128) lines; | 
| 842     PREALLOC_PTARRAY(128) quads; | 811     PREALLOC_PTARRAY(128) quads; | 
| 843     PREALLOC_PTARRAY(128) conics; | 812     PREALLOC_PTARRAY(128) conics; | 
| 844     IntArray qSubdivs; | 813     IntArray qSubdivs; | 
| 845     FloatArray cWeights; | 814     FloatArray cWeights; | 
| 846     int quadCount = 0; | 815     int quadCount = 0; | 
| 847 | 816 | 
| 848     int instanceCount = fGeoData.count(); | 817     int instanceCount = fGeoData.count(); | 
| 849     for (int i = 0; i < instanceCount; i++) { | 818     for (int i = 0; i < instanceCount; i++) { | 
| 850         const Geometry& args = fGeoData[i]; | 819         const Geometry& args = fGeoData[i]; | 
| 851         quadCount += gather_lines_and_quads(args.fPath, args.fViewMatrix, args.f
     DevClipBounds, | 820         quadCount += gather_lines_and_quads(args.fPath, args.fViewMatrix, args.f
     DevClipBounds, | 
| 852                                             &lines, &quads, &conics, &qSubdivs, 
     &cWeights); | 821                                             &lines, &quads, &conics, &qSubdivs, 
     &cWeights); | 
| 853     } | 822     } | 
| 854 | 823 | 
| 855     int lineCount = lines.count() / 2; | 824     int lineCount = lines.count() / 2; | 
| 856     int conicCount = conics.count() / 3; | 825     int conicCount = conics.count() / 3; | 
| 857 | 826 | 
| 858     // do lines first | 827     // do lines first | 
| 859     if (lineCount) { | 828     if (lineCount) { | 
|  | 829         SkAutoTUnref<const GrGeometryProcessor> lineGP; | 
|  | 830         { | 
|  | 831             using namespace GrDefaultGeoProcFactory; | 
|  | 832 | 
|  | 833             Color color(this->color()); | 
|  | 834             Coverage coverage(Coverage::kAttribute_Type); | 
|  | 835             LocalCoords localCoords(this->usesLocalCoords() ? LocalCoords::kUseP
     osition_Type : | 
|  | 836                                     LocalCoords::kUnused_Type); | 
|  | 837             localCoords.fMatrix = geometryProcessorLocalM; | 
|  | 838             lineGP.reset(GrDefaultGeoProcFactory::Create(color, coverage, localC
     oords, | 
|  | 839                                                          *geometryProcessorViewM
     )); | 
|  | 840         } | 
|  | 841 | 
| 860         SkAutoTUnref<const GrBuffer> linesIndexBuffer( | 842         SkAutoTUnref<const GrBuffer> linesIndexBuffer( | 
| 861             ref_lines_index_buffer(target->resourceProvider())); | 843             ref_lines_index_buffer(target->resourceProvider())); | 
| 862         target->initDraw(lineGP); |  | 
| 863 | 844 | 
| 864         const GrBuffer* vertexBuffer; | 845         const GrBuffer* vertexBuffer; | 
| 865         int firstVertex; | 846         int firstVertex; | 
| 866 | 847 | 
| 867         size_t vertexStride = lineGP->getVertexStride(); | 848         size_t vertexStride = lineGP->getVertexStride(); | 
| 868         int vertexCount = kLineSegNumVertices * lineCount; | 849         int vertexCount = kLineSegNumVertices * lineCount; | 
| 869         LineVertex* verts = reinterpret_cast<LineVertex*>( | 850         LineVertex* verts = reinterpret_cast<LineVertex*>( | 
| 870             target->makeVertexSpace(vertexStride, vertexCount, &vertexBuffer, &f
     irstVertex)); | 851             target->makeVertexSpace(vertexStride, vertexCount, &vertexBuffer, &f
     irstVertex)); | 
| 871 | 852 | 
| 872         if (!verts|| !linesIndexBuffer) { | 853         if (!verts|| !linesIndexBuffer) { | 
| 873             SkDebugf("Could not allocate vertices\n"); | 854             SkDebugf("Could not allocate vertices\n"); | 
| 874             return; | 855             return; | 
| 875         } | 856         } | 
| 876 | 857 | 
| 877         SkASSERT(lineGP->getVertexStride() == sizeof(LineVertex)); | 858         SkASSERT(lineGP->getVertexStride() == sizeof(LineVertex)); | 
| 878 | 859 | 
| 879         for (int i = 0; i < lineCount; ++i) { | 860         for (int i = 0; i < lineCount; ++i) { | 
| 880             add_line(&lines[2*i], toSrc, this->coverage(), &verts); | 861             add_line(&lines[2*i], toSrc, this->coverage(), &verts); | 
| 881         } | 862         } | 
| 882 | 863 | 
| 883         { | 864         GrMesh mesh; | 
| 884             GrMesh mesh; | 865         mesh.initInstanced(kTriangles_GrPrimitiveType, vertexBuffer, linesIndexB
     uffer, | 
| 885             mesh.initInstanced(kTriangles_GrPrimitiveType, vertexBuffer, linesIn
     dexBuffer, | 866                            firstVertex, kLineSegNumVertices, kIdxsPerLineSeg, li
     neCount, | 
| 886                                firstVertex, kLineSegNumVertices, kIdxsPerLineSeg
     , lineCount, | 867                            kLineSegsNumInIdxBuffer); | 
| 887                                kLineSegsNumInIdxBuffer); | 868         target->draw(lineGP, mesh); | 
| 888             target->draw(mesh); |  | 
| 889         } |  | 
| 890     } | 869     } | 
| 891 | 870 | 
| 892     if (quadCount || conicCount) { | 871     if (quadCount || conicCount) { | 
|  | 872         SkAutoTUnref<const GrGeometryProcessor> quadGP( | 
|  | 873             GrQuadEffect::Create(this->color(), | 
|  | 874                                  *geometryProcessorViewM, | 
|  | 875                                  kHairlineAA_GrProcessorEdgeType, | 
|  | 876                                  target->caps(), | 
|  | 877                                  *geometryProcessorLocalM, | 
|  | 878                                  this->usesLocalCoords(), | 
|  | 879                                  this->coverage())); | 
|  | 880 | 
|  | 881         SkAutoTUnref<const GrGeometryProcessor> conicGP( | 
|  | 882             GrConicEffect::Create(this->color(), | 
|  | 883                                   *geometryProcessorViewM, | 
|  | 884                                   kHairlineAA_GrProcessorEdgeType, | 
|  | 885                                   target->caps(), | 
|  | 886                                   *geometryProcessorLocalM, | 
|  | 887                                   this->usesLocalCoords(), | 
|  | 888                                   this->coverage())); | 
|  | 889 | 
| 893         const GrBuffer* vertexBuffer; | 890         const GrBuffer* vertexBuffer; | 
| 894         int firstVertex; | 891         int firstVertex; | 
| 895 | 892 | 
| 896         SkAutoTUnref<const GrBuffer> quadsIndexBuffer( | 893         SkAutoTUnref<const GrBuffer> quadsIndexBuffer( | 
| 897             ref_quads_index_buffer(target->resourceProvider())); | 894             ref_quads_index_buffer(target->resourceProvider())); | 
| 898 | 895 | 
| 899         size_t vertexStride = sizeof(BezierVertex); | 896         size_t vertexStride = sizeof(BezierVertex); | 
| 900         int vertexCount = kQuadNumVertices * quadCount + kQuadNumVertices * coni
     cCount; | 897         int vertexCount = kQuadNumVertices * quadCount + kQuadNumVertices * coni
     cCount; | 
| 901         void *vertices = target->makeVertexSpace(vertexStride, vertexCount, | 898         void *vertices = target->makeVertexSpace(vertexStride, vertexCount, | 
| 902                                                  &vertexBuffer, &firstVertex); | 899                                                  &vertexBuffer, &firstVertex); | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 914             SkASSERT(qSubdivs[i] >= 0); | 911             SkASSERT(qSubdivs[i] >= 0); | 
| 915             add_quads(&quads[3*i], qSubdivs[i], toDevice, toSrc, &bezVerts); | 912             add_quads(&quads[3*i], qSubdivs[i], toDevice, toSrc, &bezVerts); | 
| 916         } | 913         } | 
| 917 | 914 | 
| 918         // Start Conics | 915         // Start Conics | 
| 919         for (int i = 0; i < conicCount; ++i) { | 916         for (int i = 0; i < conicCount; ++i) { | 
| 920             add_conics(&conics[3*i], cWeights[i], toDevice, toSrc, &bezVerts); | 917             add_conics(&conics[3*i], cWeights[i], toDevice, toSrc, &bezVerts); | 
| 921         } | 918         } | 
| 922 | 919 | 
| 923         if (quadCount > 0) { | 920         if (quadCount > 0) { | 
| 924             target->initDraw(quadGP); | 921             GrMesh mesh; | 
| 925 | 922             mesh.initInstanced(kTriangles_GrPrimitiveType, vertexBuffer, quadsIn
     dexBuffer, | 
| 926             { | 923                                firstVertex, kQuadNumVertices, kIdxsPerQuad, quad
     Count, | 
| 927                 GrMesh mesh; | 924                                kQuadsNumInIdxBuffer); | 
| 928                 mesh.initInstanced(kTriangles_GrPrimitiveType, vertexBuffer, qua
     dsIndexBuffer, | 925             target->draw(quadGP, mesh); | 
| 929                                    firstVertex, kQuadNumVertices, kIdxsPerQuad, 
     quadCount, | 926             firstVertex += quadCount * kQuadNumVertices; | 
| 930                                    kQuadsNumInIdxBuffer); |  | 
| 931                 target->draw(mesh); |  | 
| 932                 firstVertex += quadCount * kQuadNumVertices; |  | 
| 933            } |  | 
| 934         } | 927         } | 
| 935 | 928 | 
| 936         if (conicCount > 0) { | 929         if (conicCount > 0) { | 
| 937             target->initDraw(conicGP); | 930             GrMesh mesh; | 
| 938 | 931             mesh.initInstanced(kTriangles_GrPrimitiveType, vertexBuffer, quadsIn
     dexBuffer, | 
| 939             { | 932                                firstVertex, kQuadNumVertices, kIdxsPerQuad, coni
     cCount, | 
| 940                 GrMesh mesh; | 933                                kQuadsNumInIdxBuffer); | 
| 941                 mesh.initInstanced(kTriangles_GrPrimitiveType, vertexBuffer, qua
     dsIndexBuffer, | 934             target->draw(conicGP, mesh); | 
| 942                                    firstVertex, kQuadNumVertices, kIdxsPerQuad, 
     conicCount, |  | 
| 943                                    kQuadsNumInIdxBuffer); |  | 
| 944                 target->draw(mesh); |  | 
| 945             } |  | 
| 946         } | 935         } | 
| 947     } | 936     } | 
| 948 } | 937 } | 
| 949 | 938 | 
| 950 static GrDrawBatch* create_hairline_batch(GrColor color, | 939 static GrDrawBatch* create_hairline_batch(GrColor color, | 
| 951                                           const SkMatrix& viewMatrix, | 940                                           const SkMatrix& viewMatrix, | 
| 952                                           const SkPath& path, | 941                                           const SkPath& path, | 
| 953                                           const GrStrokeInfo& stroke, | 942                                           const GrStrokeInfo& stroke, | 
| 954                                           const SkIRect& devClipBounds) { | 943                                           const SkIRect& devClipBounds) { | 
| 955     SkScalar hairlineCoverage; | 944     SkScalar hairlineCoverage; | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 989     GrColor color = GrRandomColor(random); | 978     GrColor color = GrRandomColor(random); | 
| 990     SkMatrix viewMatrix = GrTest::TestMatrix(random); | 979     SkMatrix viewMatrix = GrTest::TestMatrix(random); | 
| 991     GrStrokeInfo stroke(SkStrokeRec::kHairline_InitStyle); | 980     GrStrokeInfo stroke(SkStrokeRec::kHairline_InitStyle); | 
| 992     SkPath path = GrTest::TestPath(random); | 981     SkPath path = GrTest::TestPath(random); | 
| 993     SkIRect devClipBounds; | 982     SkIRect devClipBounds; | 
| 994     devClipBounds.setEmpty(); | 983     devClipBounds.setEmpty(); | 
| 995     return create_hairline_batch(color, viewMatrix, path, stroke, devClipBounds)
     ; | 984     return create_hairline_batch(color, viewMatrix, path, stroke, devClipBounds)
     ; | 
| 996 } | 985 } | 
| 997 | 986 | 
| 998 #endif | 987 #endif | 
| OLD | NEW | 
|---|