1a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark/* 2a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark * Copyright 2014 Google Inc. 3a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark * 4a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark * Use of this source code is governed by a BSD-style license that can be 5a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark * found in the LICENSE file. 6a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark */ 7a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark#include "SkOpEdgeBuilder.h" 8a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark#include "SkPathOpsCommon.h" 9a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark 10a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclarkbool TightBounds(const SkPath& path, SkRect* result) { 11a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark // turn path into list of segments 12a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark SkTArray<SkOpContour> contours; 13a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark SkOpEdgeBuilder builder(path, contours); 14a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark if (!builder.finish()) { 15a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark return false; 16a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark } 17a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark SkTArray<SkOpContour*, true> contourList; 18a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark MakeContourList(contours, contourList, false, false); 19a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark SkOpContour** currentPtr = contourList.begin(); 20a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark result->setEmpty(); 21a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark if (!currentPtr) { 22a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark return true; 23a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark } 24a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark SkOpContour** listEnd = contourList.end(); 25a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark SkOpContour* current = *currentPtr++; 26a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark SkPathOpsBounds bounds = current->bounds(); 27a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark while (currentPtr != listEnd) { 28a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark current = *currentPtr++; 29a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark bounds.add(current->bounds()); 30a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark } 31a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark *result = bounds; 32a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark return true; 33a8d2ffb1c2e245ae06bdd1c20f34995ab8311cf6caryclark} 34