17839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/* 27839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Copyright 2012 Google Inc. 37839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * 47839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be 57839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * found in the LICENSE file. 67839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */ 77839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkPathOpsCubic.h" 87839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkPathOpsLine.h" 97839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkPathOpsQuad.h" 107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkPathOpsRect.h" 117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergervoid SkDRect::setBounds(const SkDLine& line) { 137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger set(line[0]); 147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger add(line[1]); 157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergervoid SkDRect::setBounds(const SkDQuad& quad) { 187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger set(quad[0]); 197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger add(quad[2]); 207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger double tValues[2]; 217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger int roots = 0; 227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger if (!between(quad[0].fX, quad[1].fX, quad[2].fX)) { 237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger roots = SkDQuad::FindExtrema(quad[0].fX, quad[1].fX, quad[2].fX, tValues); 247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger if (!between(quad[0].fY, quad[1].fY, quad[2].fY)) { 267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger roots += SkDQuad::FindExtrema(quad[0].fY, quad[1].fY, quad[2].fY, &tValues[roots]); 277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int x = 0; x < roots; ++x) { 2958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger add(quad.ptAtT(tValues[x])); 307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergervoid SkDRect::setRawBounds(const SkDQuad& quad) { 347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger set(quad[0]); 357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int x = 1; x < 3; ++x) { 367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger add(quad[x]); 377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic bool is_bounded_by_end_points(double a, double b, double c, double d) { 417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger return between(a, b, d) && between(a, c, d); 427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergervoid SkDRect::setBounds(const SkDCubic& c) { 457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger set(c[0]); 467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger add(c[3]); 477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger double tValues[4]; 487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger int roots = 0; 497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger if (!is_bounded_by_end_points(c[0].fX, c[1].fX, c[2].fX, c[3].fX)) { 507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger roots = SkDCubic::FindExtrema(c[0].fX, c[1].fX, c[2].fX, c[3].fX, tValues); 517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger if (!is_bounded_by_end_points(c[0].fY, c[1].fY, c[2].fY, c[3].fY)) { 537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger roots += SkDCubic::FindExtrema(c[0].fY, c[1].fY, c[2].fY, c[3].fY, &tValues[roots]); 547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int x = 0; x < roots; ++x) { 5658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger add(c.ptAtT(tValues[x])); 577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergervoid SkDRect::setRawBounds(const SkDCubic& cubic) { 617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger set(cubic[0]); 627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int x = 1; x < 4; ++x) { 637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger add(cubic[x]); 647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 66