fix cheapComputeDirection() in the non-convex case to pivot on the y-max point

rather than pivoting on the next. Also remove the loop, as it is just logically
wrong to think we can use this trick only a non-extrema pt.



git-svn-id: http://skia.googlecode.com/svn/trunk@3014 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
reed@google.com 2012-01-11 18:16:39 +00:00
parent b9349e1cb5
commit 3d19c385e7
2 changed files with 5 additions and 67 deletions

View File

@ -10,56 +10,6 @@
#include "SkPath.h"
#include "SkTypeface.h"
static void test_path(SkCanvas* canvas, const SkPath& path) {
SkPaint paint;
paint.setAntiAlias(true);
canvas->drawPath(path, paint);
paint.setStyle(SkPaint::kStroke_Style);
paint.setColor(SK_ColorRED);
canvas->drawPath(path, paint);
}
static void test_rev(SkCanvas* canvas, const SkPath& path) {
test_path(canvas, path);
SkPath rev;
rev.reverseAddPath(path);
canvas->save();
canvas->translate(SkIntToScalar(150), 0);
test_path(canvas, rev);
canvas->restore();
}
static void test_rev(SkCanvas* canvas) {
SkRect r = { 10, 10, 100, 60 };
SkPath path;
path.addRect(r); test_rev(canvas, path);
canvas->translate(0, 100);
path.offset(20, 20);
path.addRect(r); test_rev(canvas, path);
canvas->translate(0, 100);
path.reset();
path.moveTo(10, 10); path.lineTo(30, 30);
path.addOval(r);
r.offset(50, 20);
path.addOval(r);
test_rev(canvas, path);
SkPaint paint;
paint.setTextSize(SkIntToScalar(100));
SkTypeface* hira = SkTypeface::CreateFromName("Hiragino Maru Gothic Pro", SkTypeface::kNormal);
SkSafeUnref(paint.setTypeface(hira));
path.reset();
paint.getTextPath("e", 1, 50, 50, &path);
canvas->translate(0, 100);
test_rev(canvas, path);
}
namespace skiagm {
class StrokeFillGM : public GM {
@ -83,8 +33,8 @@ protected:
const size_t len = sizeof(text) - 1;
paint.setAntiAlias(true);
paint.setTextSize(SkIntToScalar(100));
SkTypeface* hira = SkTypeface::CreateFromName("Hiragino Maru Gothic Pro",
SkTypeface::kNormal);
// SkTypeface* hira = SkTypeface::CreateFromName("Hiragino Maru Gothic Pro", SkTypeface::kNormal);
SkTypeface* hira = SkTypeface::CreateFromName("Papyrus", SkTypeface::kNormal);
paint.setTypeface(hira);
SkScalar x = SkIntToScalar(180);
SkScalar y = SkIntToScalar(88);

View File

@ -1947,21 +1947,9 @@ bool SkPath::cheapComputeDirection(Direction* dir) const {
}
} else {
int i = find_max_y(pts, n);
// loop around until we get a non-zero cross
for (int j = 0; j < n; ++j) {
if (i < n - 2) {
cross = cross_prod(pts[i], pts[i + 1], pts[i + 2]);
} else {
cross = cross_prod(pts[i], pts[(i + 1) % n], pts[(i + 2) % n]);
}
if (cross) {
break;
}
SkASSERT(i < n);
if (++i == n) {
i = 0;
}
}
// can't always say (i-1) % n, in case i-1 goes negative, so we
// use (i+n-1) % n instead
cross = cross_prod(pts[(i + n - 1) % n], pts[i], pts[(i + 1) % n]);
}
if (cross) {
if (dir) {