| 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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 // from the origin. | 74 // from the origin. |
| 75 p0 = segments[0].endPt(); | 75 p0 = segments[0].endPt(); |
| 76 SkPoint pi; | 76 SkPoint pi; |
| 77 SkPoint pj; | 77 SkPoint pj; |
| 78 // the first and last iteration of the below loop would compute | 78 // the first and last iteration of the below loop would compute |
| 79 // zeros since the starting / ending point is (0,0). So instead we start | 79 // zeros since the starting / ending point is (0,0). So instead we start |
| 80 // at i=1 and make the last iteration i=count-2. | 80 // at i=1 and make the last iteration i=count-2. |
| 81 pj = segments[1].endPt() - p0; | 81 pj = segments[1].endPt() - p0; |
| 82 for (int i = 1; i < count - 1; ++i) { | 82 for (int i = 1; i < count - 1; ++i) { |
| 83 pi = pj; | 83 pi = pj; |
| 84 const SkPoint pj = segments[i + 1].endPt() - p0; | 84 pj = segments[i + 1].endPt() - p0; |
| 85 | 85 |
| 86 SkScalar t = SkScalarMul(pi.fX, pj.fY) - SkScalarMul(pj.fX, pi.fY); | 86 SkScalar t = SkPoint::CrossProduct(pi, pj); |
| 87 area += t; | 87 area += t; |
| 88 center.fX += (pi.fX + pj.fX) * t; | 88 center.fX += (pi.fX + pj.fX) * t; |
| 89 center.fY += (pi.fY + pj.fY) * t; | 89 center.fY += (pi.fY + pj.fY) * t; |
| 90 | |
| 91 } | 90 } |
| 92 } | 91 } |
| 92 |
| 93 // If the poly has no area then we instead return the average of | 93 // If the poly has no area then we instead return the average of |
| 94 // its points. | 94 // its points. |
| 95 if (SkScalarNearlyZero(area)) { | 95 if (SkScalarNearlyZero(area)) { |
| 96 SkPoint avg; | 96 SkPoint avg; |
| 97 avg.set(0, 0); | 97 avg.set(0, 0); |
| 98 for (int i = 0; i < count; ++i) { | 98 for (int i = 0; i < count; ++i) { |
| 99 const SkPoint& pt = segments[i].endPt(); | 99 const SkPoint& pt = segments[i].endPt(); |
| 100 avg.fX += pt.fX; | 100 avg.fX += pt.fX; |
| 101 avg.fY += pt.fY; | 101 avg.fY += pt.fY; |
| 102 } | 102 } |
| 103 SkScalar denom = SK_Scalar1 / count; | 103 SkScalar denom = SK_Scalar1 / count; |
| 104 avg.scale(denom); | 104 avg.scale(denom); |
| 105 *c = avg; | 105 *c = avg; |
| 106 } else { | 106 } else { |
| 107 area *= 3; | 107 area *= 3; |
| 108 area = SkScalarInvert(area); | 108 area = SkScalarInvert(area); |
| 109 center.fX = SkScalarMul(center.fX, area); | 109 center.scale(area); |
| 110 center.fY = SkScalarMul(center.fY, area); | |
| 111 // undo the translate of p0 to the origin. | 110 // undo the translate of p0 to the origin. |
| 112 *c = center + p0; | 111 *c = center + p0; |
| 113 } | 112 } |
| 114 SkASSERT(!SkScalarIsNaN(c->fX) && !SkScalarIsNaN(c->fY)); | 113 SkASSERT(!SkScalarIsNaN(c->fX) && !SkScalarIsNaN(c->fY)); |
| 115 } | 114 } |
| 116 | 115 |
| 117 static void compute_vectors(SegmentArray* segments, | 116 static void compute_vectors(SegmentArray* segments, |
| 118 SkPoint* fanPt, | 117 SkPoint* fanPt, |
| 119 SkPathPriv::FirstDirection dir, | 118 SkPathPriv::FirstDirection dir, |
| 120 int* vCount, | 119 int* vCount, |
| (...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 909 if (!idxs) { | 908 if (!idxs) { |
| 910 SkDebugf("Could not allocate indices\n"); | 909 SkDebugf("Could not allocate indices\n"); |
| 911 return; | 910 return; |
| 912 } | 911 } |
| 913 | 912 |
| 914 SkSTArray<kPreallocDrawCnt, Draw, true> draws; | 913 SkSTArray<kPreallocDrawCnt, Draw, true> draws; |
| 915 create_vertices(segments, fanPt, &draws, verts, idxs); | 914 create_vertices(segments, fanPt, &draws, verts, idxs); |
| 916 | 915 |
| 917 GrVertices vertices; | 916 GrVertices vertices; |
| 918 | 917 |
| 919 for (int i = 0; i < draws.count(); ++i) { | 918 for (int j = 0; j < draws.count(); ++j) { |
| 920 const Draw& draw = draws[i]; | 919 const Draw& draw = draws[j]; |
| 921 vertices.initIndexed(kTriangles_GrPrimitiveType, vertexBuffer, i
ndexBuffer, | 920 vertices.initIndexed(kTriangles_GrPrimitiveType, vertexBuffer, i
ndexBuffer, |
| 922 firstVertex, firstIndex, draw.fVertexCnt, d
raw.fIndexCnt); | 921 firstVertex, firstIndex, draw.fVertexCnt, d
raw.fIndexCnt); |
| 923 target->draw(vertices); | 922 target->draw(vertices); |
| 924 firstVertex += draw.fVertexCnt; | 923 firstVertex += draw.fVertexCnt; |
| 925 firstIndex += draw.fIndexCnt; | 924 firstIndex += draw.fIndexCnt; |
| 926 } | 925 } |
| 927 } | 926 } |
| 928 } | 927 } |
| 929 | 928 |
| 930 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 929 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1013 DRAW_BATCH_TEST_DEFINE(AAConvexPathBatch) { | 1012 DRAW_BATCH_TEST_DEFINE(AAConvexPathBatch) { |
| 1014 AAConvexPathBatch::Geometry geometry; | 1013 AAConvexPathBatch::Geometry geometry; |
| 1015 geometry.fColor = GrRandomColor(random); | 1014 geometry.fColor = GrRandomColor(random); |
| 1016 geometry.fViewMatrix = GrTest::TestMatrixInvertible(random); | 1015 geometry.fViewMatrix = GrTest::TestMatrixInvertible(random); |
| 1017 geometry.fPath = GrTest::TestPathConvex(random); | 1016 geometry.fPath = GrTest::TestPathConvex(random); |
| 1018 | 1017 |
| 1019 return AAConvexPathBatch::Create(geometry); | 1018 return AAConvexPathBatch::Create(geometry); |
| 1020 } | 1019 } |
| 1021 | 1020 |
| 1022 #endif | 1021 #endif |
| OLD | NEW |