16c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark/* 26c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark * Copyright 2015 Google Inc. 36c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark * 46c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark * Use of this source code is governed by a BSD-style license that can be 56c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark * found in the LICENSE file. 66c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark */ 76c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark#include "PathOpsTestCommon.h" 86c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark#include "SkIntersections.h" 96c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark#include "SkPathOpsConic.h" 106c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark#include "SkPathOpsQuad.h" 116c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark#include "SkReduceOrder.h" 126c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark#include "Test.h" 136c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark 146c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclarkstatic struct conicQuad { 15a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark ConicPts conic; 16a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark QuadPts quad; 176c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark} conicQuadTests[] = { 186c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark {{{{{494.348663,224.583771}, {494.365143,224.633194}, {494.376404,224.684067}}}, 0.998645842f}, 196c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark {{{494.30481,224.474213}, {494.334961,224.538284}, {494.355774,224.605927}}}}, 206c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark 216c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark {{{{{494.348663,224.583771}, {494.365143,224.633194}, {494.376404,224.684067}}}, 0.998645842f}, 226c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark {{{494.355774f, 224.605927f}, {494.363708f, 224.631714f}, {494.370148f, 224.657471f}}}}, 236c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark}; 246c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark 256c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclarkstatic const int conicQuadTests_count = (int) SK_ARRAY_COUNT(conicQuadTests); 266c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark 276c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclarkstatic void conicQuadIntersection(skiatest::Reporter* reporter, int index) { 28a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark const ConicPts& c = conicQuadTests[index].conic; 29a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark SkDConic conic; 30a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark conic.debugSet(c.fPts.fPts, c.fWeight); 316c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark SkASSERT(ValidConic(conic)); 32a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark const QuadPts& q = conicQuadTests[index].quad; 33a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark SkDQuad quad; 34a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark quad.debugSet(q.fPts); 356c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark SkASSERT(ValidQuad(quad)); 366c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark SkReduceOrder reduce1; 376c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark SkReduceOrder reduce2; 386c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark int order1 = reduce2.reduce(conic.fPts); 396c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark int order2 = reduce1.reduce(quad); 406c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark if (order2 != 3) { 416c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark SkDebugf("[%d] conic order=%d\n", index, order1); 426c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark REPORTER_ASSERT(reporter, 0); 436c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark } 446c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark if (order1 != 3) { 456c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark SkDebugf("[%d] quad order=%d\n", index, order2); 466c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark REPORTER_ASSERT(reporter, 0); 476c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark } 486c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark SkIntersections i; 496c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark int roots = i.intersect(conic, quad); 506c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark for (int pt = 0; pt < roots; ++pt) { 516c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark double tt1 = i[0][pt]; 526c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark SkDPoint xy1 = conic.ptAtT(tt1); 536c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark double tt2 = i[1][pt]; 546c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark SkDPoint xy2 = quad.ptAtT(tt2); 556c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark if (!xy1.approximatelyEqual(xy2)) { 566c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark SkDebugf("%s [%d,%d] x!= t1=%g (%g,%g) t2=%g (%g,%g)\n", 576c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark __FUNCTION__, index, pt, tt1, xy1.fX, xy1.fY, tt2, xy2.fX, xy2.fY); 586c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark } 596c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark REPORTER_ASSERT(reporter, xy1.approximatelyEqual(xy2)); 606c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark } 616c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark reporter->bumpTestCount(); 626c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark} 636c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark 646c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclarkDEF_TEST(PathOpsConicQuadIntersection, reporter) { 656c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark for (int index = 0; index < conicQuadTests_count; ++index) { 666c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark conicQuadIntersection(reporter, index); 676c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark reporter->bumpTestCount(); 686c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark } 696c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark} 706c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark 716c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclarkDEF_TEST(PathOpsConicQuadIntersectionOneOff, reporter) { 726c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark conicQuadIntersection(reporter, 1); 736c3b9cdcb047afe963c7bcf34834ba2ecccacc33caryclark} 74