1496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com/*
2496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com * Copyright 2012 Google Inc.
3496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com *
4496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com * Use of this source code is governed by a BSD-style license that can be
5496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com * found in the LICENSE file.
6496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com */
7496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com#include "PathOpsQuadIntersectionTestData.h"
8496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com#include "SkIntersections.h"
9496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com#include "SkPathOpsRect.h"
10496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com#include "SkReduceOrder.h"
11496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com#include "Test.h"
12496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com
13a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclarkstatic const QuadPts testSet[] = {
14496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    {{{1, 1}, {2, 2}, {1, 1.000003}}},
15496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    {{{1, 0}, {2, 6}, {3, 0}}}
16496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com};
17496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com
18ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic const size_t testSetCount = SK_ARRAY_COUNT(testSet);
19496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com
20496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.comstatic void oneOffTest(skiatest::Reporter* reporter) {
21496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    for (size_t index = 0; index < testSetCount; ++index) {
22a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark        const QuadPts& q = testSet[index];
23a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark        SkDQuad quad;
24a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark        quad.debugSet(q.fPts);
25496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com        SkReduceOrder reducer;
26927b7028d44c46e9cbc18368f16ec2262d59d94dcaryclark@google.com        SkDEBUGCODE(int result = ) reducer.reduce(quad);
27496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com        SkASSERT(result == 3);
28496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    }
29496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com}
30496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com
31496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.comstatic void standardTestCases(skiatest::Reporter* reporter) {
32496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    size_t index;
33496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    SkReduceOrder reducer;
34496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    int order;
35496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    enum {
36496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com        RunAll,
37496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com        RunQuadraticLines,
38496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com        RunQuadraticModLines,
39496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com        RunNone
40496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    } run = RunAll;
41496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    int firstTestIndex = 0;
42496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com#if 0
43496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    run = RunQuadraticLines;
44496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    firstTestIndex = 1;
45496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com#endif
46496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    int firstQuadraticLineTest = run == RunAll ? 0 : run == RunQuadraticLines ? firstTestIndex
47496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com            : SK_MaxS32;
48496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    int firstQuadraticModLineTest = run == RunAll ? 0 : run == RunQuadraticModLines ? firstTestIndex
49496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com            : SK_MaxS32;
50496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com
51496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    for (index = firstQuadraticLineTest; index < quadraticLines_count; ++index) {
52a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark        const QuadPts& q = quadraticLines[index];
53a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark        SkDQuad quad;
54a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark        quad.debugSet(q.fPts);
55927b7028d44c46e9cbc18368f16ec2262d59d94dcaryclark@google.com        order = reducer.reduce(quad);
56496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com        if (order != 2) {
57fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com            SkDebugf("[%d] line quad order=%d\n", (int) index, order);
58496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com        }
59496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    }
60496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    for (index = firstQuadraticModLineTest; index < quadraticModEpsilonLines_count; ++index) {
61a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark        const QuadPts& q = quadraticModEpsilonLines[index];
62a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark        SkDQuad quad;
63a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark        quad.debugSet(q.fPts);
64927b7028d44c46e9cbc18368f16ec2262d59d94dcaryclark@google.com        order = reducer.reduce(quad);
6565f553182ab7069378ef863d30094d0327f178d0caryclark        if (order != 2 && order != 3) {  // FIXME: data probably is not good
66fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com            SkDebugf("[%d] line mod quad order=%d\n", (int) index, order);
67496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com        }
68496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    }
69496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com}
70496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com
7178e7b4e1b928fa69f672be3c743df6d6c3ecbcedtfarina@chromium.orgDEF_TEST(PathOpsReduceOrderQuad, reporter) {
72496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    oneOffTest(reporter);
73496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com    standardTestCases(reporter);
74496120185c7baed4edf1c110f4f5b43f29bab1c0caryclark@google.com}
75