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