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