| Index: src/gpu/GrAAConvexPathRenderer.cpp | 
| diff --git a/src/gpu/GrAAConvexPathRenderer.cpp b/src/gpu/GrAAConvexPathRenderer.cpp | 
| index 408fcb541f9232d9d37e5262e33d344624688907..47315a453b2ad9d885fa120d4661de6892734c26 100644 | 
| --- a/src/gpu/GrAAConvexPathRenderer.cpp | 
| +++ b/src/gpu/GrAAConvexPathRenderer.cpp | 
| @@ -24,8 +24,6 @@ | 
| GrAAConvexPathRenderer::GrAAConvexPathRenderer() { | 
| } | 
|  | 
| -namespace { | 
| - | 
| struct Segment { | 
| enum { | 
| // These enum values are assumed in member functions below. | 
| @@ -57,7 +55,7 @@ struct Segment { | 
|  | 
| typedef SkTArray<Segment, true> SegmentArray; | 
|  | 
| -void center_of_mass(const SegmentArray& segments, SkPoint* c) { | 
| +static void center_of_mass(const SegmentArray& segments, SkPoint* c) { | 
| SkScalar area = 0; | 
| SkPoint center = {0, 0}; | 
| int count = segments.count(); | 
| @@ -108,11 +106,11 @@ void center_of_mass(const SegmentArray& segments, SkPoint* c) { | 
| GrAssert(!SkScalarIsNaN(c->fX) && !SkScalarIsNaN(c->fY)); | 
| } | 
|  | 
| -void compute_vectors(SegmentArray* segments, | 
| -                     SkPoint* fanPt, | 
| -                     SkPath::Direction dir, | 
| -                     int* vCount, | 
| -                     int* iCount) { | 
| +static void compute_vectors(SegmentArray* segments, | 
| +                            SkPoint* fanPt, | 
| +                            SkPath::Direction dir, | 
| +                            int* vCount, | 
| +                            int* iCount) { | 
| center_of_mass(*segments, fanPt); | 
| int count = segments->count(); | 
|  | 
| @@ -177,17 +175,17 @@ struct DegenerateTestData { | 
| SkScalar    fLineC; | 
| }; | 
|  | 
| -void update_degenerate_test(DegenerateTestData* data, const GrPoint& pt) { | 
| -    static const SkScalar TOL = (SK_Scalar1 / 16); | 
| -    static const SkScalar TOL_SQD = SkScalarMul(TOL, TOL); | 
| +static const SkScalar kClose = (SK_Scalar1 / 16); | 
| +static const SkScalar kCloseSqd = SkScalarMul(kClose, kClose); | 
|  | 
| +static void update_degenerate_test(DegenerateTestData* data, const GrPoint& pt) { | 
| switch (data->fStage) { | 
| case DegenerateTestData::kInitial: | 
| data->fFirstPoint = pt; | 
| data->fStage = DegenerateTestData::kPoint; | 
| break; | 
| case DegenerateTestData::kPoint: | 
| -            if (pt.distanceToSqd(data->fFirstPoint) > TOL_SQD) { | 
| +            if (pt.distanceToSqd(data->fFirstPoint) > kCloseSqd) { | 
| data->fLineNormal = pt - data->fFirstPoint; | 
| data->fLineNormal.normalize(); | 
| data->fLineNormal.setOrthog(data->fLineNormal); | 
| @@ -196,7 +194,7 @@ void update_degenerate_test(DegenerateTestData* data, const GrPoint& pt) { | 
| } | 
| break; | 
| case DegenerateTestData::kLine: | 
| -            if (SkScalarAbs(data->fLineNormal.dot(pt) + data->fLineC) > TOL) { | 
| +            if (SkScalarAbs(data->fLineNormal.dot(pt) + data->fLineC) > kClose) { | 
| data->fStage = DegenerateTestData::kNonDegenerate; | 
| } | 
| case DegenerateTestData::kNonDegenerate: | 
| @@ -206,7 +204,7 @@ void update_degenerate_test(DegenerateTestData* data, const GrPoint& pt) { | 
| } | 
| } | 
|  | 
| -inline bool get_direction(const SkPath& path, const SkMatrix& m, SkPath::Direction* dir) { | 
| +static inline bool get_direction(const SkPath& path, const SkMatrix& m, SkPath::Direction* dir) { | 
| if (!path.cheapComputeDirection(dir)) { | 
| return false; | 
| } | 
| @@ -220,12 +218,42 @@ inline bool get_direction(const SkPath& path, const SkMatrix& m, SkPath::Directi | 
| return true; | 
| } | 
|  | 
| -bool get_segments(const SkPath& path, | 
| -                  const SkMatrix& m, | 
| -                  SegmentArray* segments, | 
| -                  SkPoint* fanPt, | 
| -                  int* vCount, | 
| -                  int* iCount) { | 
| +static inline void add_line_to_segment(const SkPoint& pt, SegmentArray* segments) { | 
| +    segments->push_back(); | 
| +    segments->back().fType = Segment::kLine; | 
| +    segments->back().fPts[0] = pt; | 
| +} | 
| + | 
| +static inline void add_quad_segment(const SkPoint pts[3], SegmentArray* segments) { | 
| +    if (pts[0].distanceToSqd(pts[1]) < kCloseSqd || pts[1].distanceToSqd(pts[2]) < kCloseSqd) { | 
| +        if (pts[0] != pts[2]) { | 
| +            add_line_to_segment(pts[2], segments); | 
| +        } | 
| +    } else { | 
| +        segments->push_back(); | 
| +        segments->back().fType = Segment::kQuad; | 
| +        segments->back().fPts[0] = pts[1]; | 
| +        segments->back().fPts[1] = pts[2]; | 
| +    } | 
| +} | 
| + | 
| +static inline void add_cubic_segments(const SkPoint pts[4], | 
| +                                      SkPath::Direction dir, | 
| +                                      SegmentArray* segments) { | 
| +    SkSTArray<15, SkPoint, true> quads; | 
| +    GrPathUtils::convertCubicToQuads(pts, SK_Scalar1, true, dir, &quads); | 
| +    int count = quads.count(); | 
| +    for (int q = 0; q < count; q += 3) { | 
| +        add_quad_segment(&quads[q], segments); | 
| +    } | 
| +} | 
| + | 
| +static bool get_segments(const SkPath& path, | 
| +                         const SkMatrix& m, | 
| +                         SegmentArray* segments, | 
| +                         SkPoint* fanPt, | 
| +                         int* vCount, | 
| +                         int* iCount) { | 
| SkPath::Iter iter(path, true); | 
| // This renderer over-emphasizes very thin path regions. We use the distance | 
| // to the path from the sample to compute coverage. Every pixel intersected | 
| @@ -250,38 +278,23 @@ bool get_segments(const SkPath& path, | 
| update_degenerate_test(°enerateData, pts[0]); | 
| break; | 
| case SkPath::kLine_Verb: { | 
| -                m.mapPoints(pts + 1, 1); | 
| +                m.mapPoints(&pts[1], 1); | 
| update_degenerate_test(°enerateData, pts[1]); | 
| -                segments->push_back(); | 
| -                segments->back().fType = Segment::kLine; | 
| -                segments->back().fPts[0] = pts[1]; | 
| +                add_line_to_segment(pts[1], segments); | 
| break; | 
| } | 
| case SkPath::kQuad_Verb: | 
| -                m.mapPoints(pts + 1, 2); | 
| +                m.mapPoints(pts, 3); | 
| update_degenerate_test(°enerateData, pts[1]); | 
| update_degenerate_test(°enerateData, pts[2]); | 
| -                segments->push_back(); | 
| -                segments->back().fType = Segment::kQuad; | 
| -                segments->back().fPts[0] = pts[1]; | 
| -                segments->back().fPts[1] = pts[2]; | 
| +                add_quad_segment(pts, segments); | 
| break; | 
| case SkPath::kCubic_Verb: { | 
| m.mapPoints(pts, 4); | 
| update_degenerate_test(°enerateData, pts[1]); | 
| update_degenerate_test(°enerateData, pts[2]); | 
| update_degenerate_test(°enerateData, pts[3]); | 
| -                // unlike quads and lines, the pts[0] will also be read (in | 
| -                // convertCubicToQuads). | 
| -                SkSTArray<15, SkPoint, true> quads; | 
| -                GrPathUtils::convertCubicToQuads(pts, SK_Scalar1, true, dir, &quads); | 
| -                int count = quads.count(); | 
| -                for (int q = 0; q < count; q += 3) { | 
| -                    segments->push_back(); | 
| -                    segments->back().fType = Segment::kQuad; | 
| -                    segments->back().fPts[0] = quads[q + 1]; | 
| -                    segments->back().fPts[1] = quads[q + 2]; | 
| -                } | 
| +                add_cubic_segments(pts, dir, segments); | 
| break; | 
| }; | 
| case SkPath::kDone_Verb: | 
| @@ -312,11 +325,11 @@ struct Draw { | 
|  | 
| typedef SkTArray<Draw, true> DrawArray; | 
|  | 
| -void create_vertices(const SegmentArray&  segments, | 
| -                     const SkPoint& fanPt, | 
| -                     DrawArray*     draws, | 
| -                     QuadVertex*    verts, | 
| -                     uint16_t*      idxs) { | 
| +static void create_vertices(const SegmentArray&  segments, | 
| +                            const SkPoint& fanPt, | 
| +                            DrawArray*     draws, | 
| +                            QuadVertex*    verts, | 
| +                            uint16_t*      idxs) { | 
| Draw* draw = &draws->push_back(); | 
| // alias just to make vert/index assignments easier to read. | 
| int* v = &draw->fVertexCnt; | 
| @@ -459,8 +472,6 @@ void create_vertices(const SegmentArray&  segments, | 
| } | 
| } | 
|  | 
| -} | 
| - | 
| /////////////////////////////////////////////////////////////////////////////// | 
|  | 
| /* | 
|  |