detect more than one loop in computeconvexity
git-svn-id: http://skia.googlecode.com/svn/trunk@1326 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
7c42481c9d
commit
85b6e399d5
@ -1401,12 +1401,16 @@ static int SkScalarSign(SkScalar value) {
|
|||||||
return value < 0 ? -1 : (value > 0);
|
return value < 0 ? -1 : (value > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sign(SkScalar x) { return x < 0 ? -1 : 1; }
|
||||||
|
|
||||||
static int CrossProductSign(const SkVector& a, const SkVector& b) {
|
static int CrossProductSign(const SkVector& a, const SkVector& b) {
|
||||||
return SkScalarSign(SkPoint::CrossProduct(a, b));
|
return SkScalarSign(SkPoint::CrossProduct(a, b));
|
||||||
}
|
}
|
||||||
|
|
||||||
// only valid for a single contour
|
// only valid for a single contour
|
||||||
struct Convexicator {
|
struct Convexicator {
|
||||||
|
int fDx, fDy, fSx, fSy;
|
||||||
|
|
||||||
Convexicator() : fPtCount(0), fConvexity(SkPath::kUnknown_Convexity) {
|
Convexicator() : fPtCount(0), fConvexity(SkPath::kUnknown_Convexity) {
|
||||||
fSign = 0;
|
fSign = 0;
|
||||||
// warnings
|
// warnings
|
||||||
@ -1414,6 +1418,9 @@ struct Convexicator {
|
|||||||
fVec0.set(0, 0);
|
fVec0.set(0, 0);
|
||||||
fVec1.set(0, 0);
|
fVec1.set(0, 0);
|
||||||
fFirstVec.set(0, 0);
|
fFirstVec.set(0, 0);
|
||||||
|
|
||||||
|
fDx = fDy = 0;
|
||||||
|
fSx = fSy = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
SkPath::Convexity getConvexity() const { return fConvexity; }
|
SkPath::Convexity getConvexity() const { return fConvexity; }
|
||||||
@ -1436,6 +1443,17 @@ struct Convexicator {
|
|||||||
SkASSERT(fPtCount > 2);
|
SkASSERT(fPtCount > 2);
|
||||||
this->addVec(vec);
|
this->addVec(vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int sx = sign(vec.fX);
|
||||||
|
int sy = sign(vec.fY);
|
||||||
|
fDx += (sx != fSx);
|
||||||
|
fDy += (sy != fSy);
|
||||||
|
fSx = sx;
|
||||||
|
fSy = sy;
|
||||||
|
|
||||||
|
if (fDx > 3 || fDy > 3) {
|
||||||
|
fConvexity = SkPath::kConcave_Convexity;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -86,7 +86,7 @@ static void test_convexity2(skiatest::Reporter* reporter) {
|
|||||||
spiral.lineTo(.5,.5);
|
spiral.lineTo(.5,.5);
|
||||||
spiral.lineTo(.5,.75);
|
spiral.lineTo(.5,.75);
|
||||||
spiral.close();
|
spiral.close();
|
||||||
// check_convexity(reporter, spiral, SkPath::kConcave_Convexity);
|
check_convexity(reporter, spiral, SkPath::kConcave_Convexity);
|
||||||
|
|
||||||
SkPath dent;
|
SkPath dent;
|
||||||
dent.moveTo(0, 0);
|
dent.moveTo(0, 0);
|
||||||
@ -157,7 +157,7 @@ static void test_convexity(skiatest::Reporter* reporter) {
|
|||||||
} gRec[] = {
|
} gRec[] = {
|
||||||
{ "0 0", SkPath::kUnknown_Convexity },
|
{ "0 0", SkPath::kUnknown_Convexity },
|
||||||
{ "0 0 10 10", SkPath::kUnknown_Convexity },
|
{ "0 0 10 10", SkPath::kUnknown_Convexity },
|
||||||
{ "0 0 10 10 20 20 0 0 10 10", SkPath::kUnknown_Convexity },
|
{ "0 0 10 10 20 20 0 0 10 10", SkPath::kConcave_Convexity },
|
||||||
{ "0 0 10 10 10 20", SkPath::kConvex_Convexity },
|
{ "0 0 10 10 10 20", SkPath::kConvex_Convexity },
|
||||||
{ "0 0 10 10 10 0", SkPath::kConvex_Convexity },
|
{ "0 0 10 10 10 0", SkPath::kConvex_Convexity },
|
||||||
{ "0 0 10 10 10 0 0 10", SkPath::kConcave_Convexity },
|
{ "0 0 10 10 10 0 0 10", SkPath::kConcave_Convexity },
|
||||||
|
Loading…
Reference in New Issue
Block a user