xref: /aosp_15_r20/external/skia/tests/SubsetPath.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2015 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker #ifndef SubsetPath_DEFINED
8*c8dee2aaSAndroid Build Coastguard Worker #define SubsetPath_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTDArray.h"
12*c8dee2aaSAndroid Build Coastguard Worker 
13*c8dee2aaSAndroid Build Coastguard Worker /* Given a path, generate a the desired minimal subset of the original.
14*c8dee2aaSAndroid Build Coastguard Worker 
15*c8dee2aaSAndroid Build Coastguard Worker    This does a binary divide-and-conquer on the path, first splitting by
16*c8dee2aaSAndroid Build Coastguard Worker    contours, and then by verbs. The caller passes whether the previous subset
17*c8dee2aaSAndroid Build Coastguard Worker    behaved the same as the original. If not, the subset() call restores the
18*c8dee2aaSAndroid Build Coastguard Worker    prior state before returning a new subset.
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker    If a path fails a local test, this reduces the data to the
21*c8dee2aaSAndroid Build Coastguard Worker    minimal set that fails using a pattern like:
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker    bool testFailed = true;
24*c8dee2aaSAndroid Build Coastguard Worker    SkPath minimal;
25*c8dee2aaSAndroid Build Coastguard Worker    SubsetContours subsetContours(testPath);
26*c8dee2aaSAndroid Build Coastguard Worker    while (subsetContours.subset(testFailed, &minimal)) {
27*c8dee2aaSAndroid Build Coastguard Worker        testFailed = myPathTest(minimal);
28*c8dee2aaSAndroid Build Coastguard Worker    }
29*c8dee2aaSAndroid Build Coastguard Worker    testFailed = true;
30*c8dee2aaSAndroid Build Coastguard Worker    SubsetVerbs subsetVerbs(testPath);
31*c8dee2aaSAndroid Build Coastguard Worker    while (subsetVerbs.subset(testFailed, &minimal)) {
32*c8dee2aaSAndroid Build Coastguard Worker        testFailed = myPathTest(minimal);
33*c8dee2aaSAndroid Build Coastguard Worker    }
34*c8dee2aaSAndroid Build Coastguard Worker */
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker class SubsetPath {
37*c8dee2aaSAndroid Build Coastguard Worker public:
38*c8dee2aaSAndroid Build Coastguard Worker     SubsetPath(const SkPath& path);
~SubsetPath()39*c8dee2aaSAndroid Build Coastguard Worker     virtual ~SubsetPath() {}
40*c8dee2aaSAndroid Build Coastguard Worker     bool subset(bool testFailed, SkPath* sub);
41*c8dee2aaSAndroid Build Coastguard Worker protected:
42*c8dee2aaSAndroid Build Coastguard Worker     int range(int* end) const;
43*c8dee2aaSAndroid Build Coastguard Worker     virtual SkPath getSubsetPath() const = 0;
44*c8dee2aaSAndroid Build Coastguard Worker 
45*c8dee2aaSAndroid Build Coastguard Worker     const SkPath& fPath;
46*c8dee2aaSAndroid Build Coastguard Worker     SkTDArray<bool> fSelected;
47*c8dee2aaSAndroid Build Coastguard Worker     int fSubset;
48*c8dee2aaSAndroid Build Coastguard Worker     int fTries;
49*c8dee2aaSAndroid Build Coastguard Worker 
50*c8dee2aaSAndroid Build Coastguard Worker };
51*c8dee2aaSAndroid Build Coastguard Worker 
52*c8dee2aaSAndroid Build Coastguard Worker class SubsetContours : public SubsetPath {
53*c8dee2aaSAndroid Build Coastguard Worker public:
54*c8dee2aaSAndroid Build Coastguard Worker     SubsetContours(const SkPath& path);
55*c8dee2aaSAndroid Build Coastguard Worker protected:
56*c8dee2aaSAndroid Build Coastguard Worker     SkPath getSubsetPath() const override;
57*c8dee2aaSAndroid Build Coastguard Worker };
58*c8dee2aaSAndroid Build Coastguard Worker 
59*c8dee2aaSAndroid Build Coastguard Worker class SubsetVerbs : public SubsetPath {
60*c8dee2aaSAndroid Build Coastguard Worker public:
61*c8dee2aaSAndroid Build Coastguard Worker     SubsetVerbs(const SkPath& path);
62*c8dee2aaSAndroid Build Coastguard Worker protected:
63*c8dee2aaSAndroid Build Coastguard Worker     SkPath getSubsetPath() const override;
64*c8dee2aaSAndroid Build Coastguard Worker };
65*c8dee2aaSAndroid Build Coastguard Worker 
66*c8dee2aaSAndroid Build Coastguard Worker #endif
67