19166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com/*
29166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com * Copyright 2012 Google Inc.
39166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com *
49166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com * Use of this source code is governed by a BSD-style license that can be
59166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com * found in the LICENSE file.
69166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com */
79166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com#include "SkDQuadImplicit.h"
89166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com#include "SkPathOpsQuad.h"
99166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com#include "Test.h"
109166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
119166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.comstatic bool point_on_parameterized_curve(const SkDQuad& quad, const SkDPoint& point) {
129166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    SkDQuadImplicit q(quad);
139166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    double  xx = q.x2() * point.fX * point.fX;
149166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    double  xy = q.xy() * point.fX * point.fY;
159166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    double  yy = q.y2() * point.fY * point.fY;
169166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    double   x = q.x() * point.fX;
179166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    double   y = q.y() * point.fY;
189166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    double   c = q.c();
199166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    double sum = xx + xy + yy + x + y + c;
209166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    return approximately_zero(sum);
219166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com}
229166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
239166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.comstatic const SkDQuad quadratics[] = {
249166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    {{{0, 0}, {1, 0}, {1, 1}}},
259166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com};
269166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
274431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orgstatic const int quadratics_count = (int) SK_ARRAY_COUNT(quadratics);
289166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
2978e7b4e1b928fa69f672be3c743df6d6c3ecbcedtfarina@chromium.orgDEF_TEST(PathOpsQuadImplicit, reporter) {
309166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    // split large quadratic
319166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    // compare original, parts, to see if the are coincident
324431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    for (int index = 0; index < quadratics_count; ++index) {
339166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com        const SkDQuad& test = quadratics[index];
349166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com        SkDQuadPair split = test.chopAt(0.5);
359166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com        SkDQuad midThird = test.subDivide(1.0/3, 2.0/3);
369166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com        const SkDQuad* quads[] = {
379166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com            &test, &midThird, &split.first(), &split.second()
389166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com        };
394431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org        int quadsCount = (int) SK_ARRAY_COUNT(quads);
404431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org        for (int one = 0; one < quadsCount; ++one) {
414431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org            for (int two = 0; two < quadsCount; ++two) {
424431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org                for (int inner = 0; inner < 3; inner += 2) {
439166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com                     REPORTER_ASSERT(reporter, point_on_parameterized_curve(*quads[one],
449166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com                            (*quads[two])[inner]));
459166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com                }
469166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com                REPORTER_ASSERT(reporter, SkDQuadImplicit::Match(*quads[one], *quads[two]));
479166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com            }
489166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com        }
499166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    }
509166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com}
51