зеркало из https://github.com/mozilla/moz-skia.git
Fallback to moveTo when unable to find the first tangent in cubicTo
When calling cubicTo(a, b, c) and if the distance between fPrevPt and a is too small, b is used instead of a to calculate the first tangent, even if the distance between fPrevPt and b is too small. In debug mode, this is causing an assertion to fail in SkPathStroker::preJoinTo() and, in Release, the use of an unitialized value. The first patch set is adding a failing test. The second one add the fix to SkPathStroker::cubicTo() BUG=skia:2820 R=bsalomon@chromium.org, junov@chromium.org, reed@google.com, caryclark@google.com, bsalomon@google.com Author: piotaixr@chromium.org Review URL: https://codereview.chromium.org/460813002
This commit is contained in:
Родитель
a721c81672
Коммит
fac4e0e836
|
@ -424,7 +424,8 @@ void SkPathStroker::cubicTo(const SkPoint& pt1, const SkPoint& pt2,
|
|||
bool degenerateBC = SkPath::IsLineDegenerate(pt1, pt2);
|
||||
bool degenerateCD = SkPath::IsLineDegenerate(pt2, pt3);
|
||||
|
||||
if (degenerateAB + degenerateBC + degenerateCD >= 2) {
|
||||
if (degenerateAB + degenerateBC + degenerateCD >= 2
|
||||
|| (degenerateAB && SkPath::IsLineDegenerate(fPrevPt, pt2))) {
|
||||
this->lineTo(pt3);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -64,6 +64,32 @@ static void test_path_crbug364224() {
|
|||
canvas->drawPath(path, paint);
|
||||
}
|
||||
|
||||
/**
|
||||
* In debug mode, this path was causing an assertion to fail in
|
||||
* SkPathStroker::preJoinTo() and, in Release, the use of an unitialized value.
|
||||
*/
|
||||
static void make_path_crbugskia2820(SkPath* path, skiatest::Reporter* reporter) {
|
||||
SkPoint orig, p1, p2, p3;
|
||||
orig = SkPoint::Make(1.f, 1.f);
|
||||
p1 = SkPoint::Make(1.f - SK_ScalarNearlyZero, 1.f);
|
||||
p2 = SkPoint::Make(1.f, 1.f + SK_ScalarNearlyZero);
|
||||
p3 = SkPoint::Make(2.f, 2.f);
|
||||
|
||||
path->reset();
|
||||
path->moveTo(orig);
|
||||
path->cubicTo(p1, p2, p3);
|
||||
path->close();
|
||||
}
|
||||
|
||||
static void test_path_crbugskia2820(skiatest::Reporter* reporter) {//GrContext* context) {
|
||||
SkPath path;
|
||||
make_path_crbugskia2820(&path, reporter);
|
||||
|
||||
SkStrokeRec stroke(SkStrokeRec::kFill_InitStyle);
|
||||
stroke.setStrokeStyle(2 * SK_Scalar1);
|
||||
stroke.applyToPath(&path, path);
|
||||
}
|
||||
|
||||
static void make_path0(SkPath* path) {
|
||||
// from * https://code.google.com/p/skia/issues/detail?id=1706
|
||||
|
||||
|
@ -3553,4 +3579,5 @@ DEF_TEST(Paths, reporter) {
|
|||
PathTest_Private::TestPathTo(reporter);
|
||||
PathRefTest_Private::TestPathRef(reporter);
|
||||
test_dump(reporter);
|
||||
test_path_crbugskia2820(reporter);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче