diff options
-rw-r--r-- | gpu/include/GrTArray.h | 13 | ||||
-rw-r--r-- | gpu/src/GrAAHairLinePathRenderer.cpp | 46 |
2 files changed, 37 insertions, 22 deletions
diff --git a/gpu/include/GrTArray.h b/gpu/include/GrTArray.h index c32a75e564..5477d25775 100644 --- a/gpu/include/GrTArray.h +++ b/gpu/include/GrTArray.h @@ -187,6 +187,11 @@ public: bool empty() const { return !fCount; } + /** + * Adds 1 new default-constructed T value and returns in by reference. Note + * the reference only remains valid until the next call that adds or removes + * elements. + */ T& push_back() { checkRealloc(1); new ((char*)fMemArray+sizeof(T)*fCount) T; @@ -194,13 +199,19 @@ public: return fItemArray[fCount-1]; } - void push_back_n(int n) { + /** + * Allocates n more default T values, and returns the address of the start + * of that new range. Note: this address is only valid until the next API + * call made on the array that might add or remove elements. + */ + T* push_back_n(int n) { GrAssert(n >= 0); checkRealloc(n); for (int i = 0; i < n; ++i) { new (fItemArray + fCount + i) T; } fCount += n; + return fItemArray + fCount - n; } void pop_back() { diff --git a/gpu/src/GrAAHairLinePathRenderer.cpp b/gpu/src/GrAAHairLinePathRenderer.cpp index eca295fbdb..f60e7cfc30 100644 --- a/gpu/src/GrAAHairLinePathRenderer.cpp +++ b/gpu/src/GrAAHairLinePathRenderer.cpp @@ -171,11 +171,10 @@ void convert_noninflect_cubic_to_quads(const SkPoint p[4], cAvg += c1; cAvg.scale(SK_ScalarHalf); - int idx = quads->count(); - quads->push_back_n(3); - (*quads)[idx+0] = p[0]; - (*quads)[idx+1] = cAvg; - (*quads)[idx+2] = p[3]; + SkPoint* pts = quads->push_back_n(3); + pts[0] = p[0]; + pts[1] = cAvg; + pts[2] = p[3]; return; } else { @@ -310,8 +309,9 @@ int generate_lines_and_quads(const SkPath& path, bounds.outset(SK_Scalar1, SK_Scalar1); bounds.roundOut(&ibounds); if (SkIRect::Intersects(clip, ibounds)) { - lines->push_back() = devPts[0]; - lines->push_back() = devPts[1]; + SkPoint* pts = lines->push_back_n(2); + pts[0] = devPts[0]; + pts[1] = devPts[1]; } break; case kQuadratic_PathCmd: @@ -324,16 +324,18 @@ int generate_lines_and_quads(const SkPath& path, int subdiv = num_quad_subdivs(devPts); GrAssert(subdiv >= -1); if (-1 == subdiv) { - lines->push_back() = devPts[0]; - lines->push_back() = devPts[1]; - lines->push_back() = devPts[1]; - lines->push_back() = devPts[2]; + SkPoint* pts = lines->push_back_n(4); + pts[0] = devPts[0]; + pts[1] = devPts[1]; + pts[2] = devPts[1]; + pts[3] = devPts[2]; } else { // when in perspective keep quads in src space SkPoint* qPts = persp ? pts : devPts; - quads->push_back() = qPts[0]; - quads->push_back() = qPts[1]; - quads->push_back() = qPts[2]; + SkPoint* pts = quads->push_back_n(3); + pts[0] = qPts[0]; + pts[1] = qPts[1]; + pts[2] = qPts[2]; quadSubdivCnts->push_back() = subdiv; totalQuadCount += 1 << subdiv; } @@ -375,17 +377,19 @@ int generate_lines_and_quads(const SkPath& path, int subdiv = num_quad_subdivs(qInDevSpace); GrAssert(subdiv >= -1); if (-1 == subdiv) { + SkPoint* pts = lines->push_back_n(4); // lines should always be in device coords - lines->push_back() = qInDevSpace[0]; - lines->push_back() = qInDevSpace[1]; - lines->push_back() = qInDevSpace[1]; - lines->push_back() = qInDevSpace[2]; + pts[0] = qInDevSpace[0]; + pts[1] = qInDevSpace[1]; + pts[2] = qInDevSpace[1]; + pts[3] = qInDevSpace[2]; } else { + SkPoint* pts = quads->push_back_n(3); // q is already in src space when there is no // perspective and dev coords otherwise. - quads->push_back() = q[0 + i]; - quads->push_back() = q[1 + i]; - quads->push_back() = q[2 + i]; + pts[0] = q[0 + i]; + pts[1] = q[1 + i]; + pts[2] = q[2 + i]; quadSubdivCnts->push_back() = subdiv; totalQuadCount += 1 << subdiv; } |