PathOpsSimplifyFailTest.cpp revision 66560ca776773858abfffd59974eac32c942acc3
15f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/* 25f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Copyright 2013 Google Inc. 35f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 45f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Use of this source code is governed by a BSD-style license that can be 55f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * found in the LICENSE file. 65f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 75f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes#include "SkPathOps.h" 85f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes#include "SkPath.h" 95f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes#include "SkPoint.h" 105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes#include "Test.h" 115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesstatic const SkPoint nonFinitePts[] = { 135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { SK_ScalarInfinity, 0 }, 145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { 0, SK_ScalarInfinity }, 155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { SK_ScalarInfinity, SK_ScalarInfinity }, 165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { SK_ScalarNegativeInfinity, 0}, 175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { 0, SK_ScalarNegativeInfinity }, 185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { SK_ScalarNegativeInfinity, SK_ScalarNegativeInfinity }, 195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { SK_ScalarNegativeInfinity, SK_ScalarInfinity }, 205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { SK_ScalarInfinity, SK_ScalarNegativeInfinity }, 215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { SK_ScalarNaN, 0 }, 225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { 0, SK_ScalarNaN }, 235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { SK_ScalarNaN, SK_ScalarNaN }, 245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes}; 255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesconst size_t nonFinitePtsCount = sizeof(nonFinitePts) / sizeof(nonFinitePts[0]); 275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesstatic const SkPoint finitePts[] = { 295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { 0, 0 }, 305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { SK_ScalarMax, 0 }, 315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { 0, SK_ScalarMax }, 325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { SK_ScalarMax, SK_ScalarMax }, 335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { SK_ScalarMin, 0 }, 345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { 0, SK_ScalarMin }, 355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes { SK_ScalarMin, SK_ScalarMin }, 365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes}; 375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesconst size_t finitePtsCount = sizeof(finitePts) / sizeof(finitePts[0]); 395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesstatic void PathOpsSimplifyFailTest(skiatest::Reporter* reporter) { 415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes for (int index = 0; index < (int) (13 * nonFinitePtsCount * finitePtsCount); ++index) { 425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes SkPath path; 435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int i = (int) (index % nonFinitePtsCount); 445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int f = (int) (index % finitePtsCount); 455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int g = (int) ((f + 1) % finitePtsCount); 465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes switch (index % 13) { 475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 0: path.lineTo(nonFinitePts[i]); break; 485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 1: path.quadTo(nonFinitePts[i], nonFinitePts[i]); break; 495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 2: path.quadTo(nonFinitePts[i], finitePts[f]); break; 505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 3: path.quadTo(finitePts[f], nonFinitePts[i]); break; 515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 4: path.cubicTo(nonFinitePts[i], finitePts[f], finitePts[f]); break; 525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 5: path.cubicTo(finitePts[f], nonFinitePts[i], finitePts[f]); break; 535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 6: path.cubicTo(finitePts[f], finitePts[f], nonFinitePts[i]); break; 545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 7: path.cubicTo(nonFinitePts[i], nonFinitePts[i], finitePts[f]); break; 555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 8: path.cubicTo(nonFinitePts[i], finitePts[f], nonFinitePts[i]); break; 565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 9: path.cubicTo(finitePts[f], nonFinitePts[i], nonFinitePts[i]); break; 575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 10: path.cubicTo(nonFinitePts[i], nonFinitePts[i], nonFinitePts[i]); break; 585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 11: path.cubicTo(nonFinitePts[i], finitePts[f], finitePts[g]); break; 595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 12: path.moveTo(nonFinitePts[i]); break; 605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes SkPath result; 625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes result.setFillType(SkPath::kWinding_FillType); 635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes bool success = Simplify(path, &result); 645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes REPORTER_ASSERT(reporter, !success); 655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes REPORTER_ASSERT(reporter, result.isEmpty()); 665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes REPORTER_ASSERT(reporter, result.getFillType() == SkPath::kWinding_FillType); 675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes reporter->bumpTestCount(); 685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes for (int index = 0; index < (int) (11 * finitePtsCount); ++index) { 705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes SkPath path; 715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int f = (int) (index % finitePtsCount); 725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int g = (int) ((f + 1) % finitePtsCount); 735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes switch (index % 11) { 745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 0: path.lineTo(finitePts[f]); break; 755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 1: path.quadTo(finitePts[f], finitePts[f]); break; 765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 2: path.quadTo(finitePts[f], finitePts[g]); break; 775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 3: path.quadTo(finitePts[g], finitePts[f]); break; 785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 4: path.cubicTo(finitePts[f], finitePts[f], finitePts[f]); break; 795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 5: path.cubicTo(finitePts[f], finitePts[f], finitePts[g]); break; 805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 6: path.cubicTo(finitePts[f], finitePts[g], finitePts[f]); break; 815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 7: path.cubicTo(finitePts[f], finitePts[g], finitePts[g]); break; 825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 8: path.cubicTo(finitePts[g], finitePts[f], finitePts[f]); break; 835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 9: path.cubicTo(finitePts[g], finitePts[f], finitePts[g]); break; 845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes case 10: path.moveTo(finitePts[f]); break; 855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes SkPath result; 875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes result.setFillType(SkPath::kWinding_FillType); 885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes bool success = Simplify(path, &result); 895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes REPORTER_ASSERT(reporter, success); 905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes REPORTER_ASSERT(reporter, result.getFillType() != SkPath::kWinding_FillType); 915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes reporter->bumpTestCount(); 925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes} 945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes#include "TestClassDef.h" 965f0a23683aa603d8c50b6dd071a565821b76067bElliott HughesDEFINE_TESTCLASS_SHORT(PathOpsSimplifyFailTest) 975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes