aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-02-15 16:52:51 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-02-15 16:52:51 +0000
commit278dc6929b6481204874dcfcc055e2aaa30a95b2 (patch)
treef716bed53bc8e43c86ba18d7a22fcdb17baff08b /src
parentdd43df99b16b67f7b00457b7fff4b2539da40702 (diff)
Use cheapComputeDirection to determine normal facing in GrAAConvexPathRenderer
Review URL: http://codereview.appspot.com/5649083/ git-svn-id: http://skia.googlecode.com/svn/trunk@3198 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r--src/gpu/GrAAConvexPathRenderer.cpp45
1 files changed, 34 insertions, 11 deletions
diff --git a/src/gpu/GrAAConvexPathRenderer.cpp b/src/gpu/GrAAConvexPathRenderer.cpp
index e1dbb63380..1a8a38904c 100644
--- a/src/gpu/GrAAConvexPathRenderer.cpp
+++ b/src/gpu/GrAAConvexPathRenderer.cpp
@@ -69,25 +69,44 @@ void center_of_mass(const SegmentArray& segments, SkPoint* c) {
center.fX += (pi.fX + pj.fX) * t;
center.fY += (pi.fY + pj.fY) * t;
}
- area *= 3;
- area = GrScalarDiv(GR_Scalar1, area);
- center.fX = GrScalarMul(center.fX, area);
- center.fY = GrScalarMul(center.fY, area);
- *c = center;
+ // If the poly has no area then we instead return the average of
+ // its points.
+ if (SkScalarAbs(area) < SK_ScalarNearlyZero) {
+ SkPoint avg;
+ avg.set(0, 0);
+ for (int i = 0; i < count; ++i) {
+ const SkPoint& pt = segments[i].endPt();
+ avg.fX += pt.fX;
+ avg.fY += pt.fY;
+ }
+ SkScalar denom = SK_Scalar1 / count;
+ avg.scale(denom);
+ *c = avg;
+ } else {
+ area *= 3;
+ area = GrScalarDiv(GR_Scalar1, area);
+ center.fX = GrScalarMul(center.fX, area);
+ center.fY = GrScalarMul(center.fY, area);
+ *c = center;
+ }
+ GrAssert(!SkScalarIsNaN(c->fX) && !SkScalarIsNaN(c->fY));
}
void compute_vectors(SegmentArray* segments,
- SkPoint* fanPt,
+ SkPoint* fanPt,
+ SkPath::Direction dir,
int* vCount,
int* iCount) {
center_of_mass(*segments, fanPt);
int count = segments->count();
- // figure out which way the normals should point
+ // Make the normals point towards the outside
GrPoint::Side normSide;
- fanPt->distanceToLineBetweenSqd((*segments)[0].endPt(),
- (*segments)[1].endPt(),
- &normSide);
+ if (dir == SkPath::kCCW_Direction) {
+ normSide = GrPoint::kRight_Side;
+ } else {
+ normSide = GrPoint::kLeft_Side;
+ }
*vCount = 0;
*iCount = 0;
@@ -227,7 +246,11 @@ bool get_segments(const GrPath& path,
if (degenerateData.isDegenerate()) {
return false;
} else {
- compute_vectors(segments, fanPt, vCount, iCount);
+ SkPath::Direction dir;
+ GR_DEBUGCODE(bool succeeded = )
+ path.cheapComputeDirection(&dir);
+ GrAssert(succeeded);
+ compute_vectors(segments, fanPt, dir, vCount, iCount);
return true;
}
default: