OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 #include "PathOpsExtendedTest.h" | 7 #include "PathOpsExtendedTest.h" |
8 | 8 |
9 #define TEST(name) { name, #name } | 9 #define TEST(name) { name, #name } |
10 | 10 |
(...skipping 1969 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1980 path.moveTo(3, 4); | 1980 path.moveTo(3, 4); |
1981 path.cubicTo(1, 5, 4, 3, 6, 4); | 1981 path.cubicTo(1, 5, 4, 3, 6, 4); |
1982 path.close(); | 1982 path.close(); |
1983 pathB.setFillType(SkPath::kWinding_FillType); | 1983 pathB.setFillType(SkPath::kWinding_FillType); |
1984 pathB.moveTo(3, 4); | 1984 pathB.moveTo(3, 4); |
1985 pathB.cubicTo(4, 6, 4, 3, 5, 1); | 1985 pathB.cubicTo(4, 6, 4, 3, 5, 1); |
1986 pathB.close(); | 1986 pathB.close(); |
1987 testPathOp(reporter, path, pathB, kIntersect_PathOp); | 1987 testPathOp(reporter, path, pathB, kIntersect_PathOp); |
1988 } | 1988 } |
1989 | 1989 |
| 1990 static void issue1418b(skiatest::Reporter* reporter) { |
| 1991 SkPath path1; |
| 1992 path1.moveTo(0, 0); |
| 1993 path1.lineTo(1, 0); |
| 1994 path1.lineTo(1, 1); |
| 1995 path1.lineTo(0, 1); |
| 1996 path1.lineTo(0, 0); |
| 1997 path1.close(); |
| 1998 path1.setFillType(SkPath::kWinding_FillType); |
| 1999 SkPath path2; |
| 2000 path2.moveTo(0.646446645f, -0.353553414f); |
| 2001 path2.quadTo(0.792893291f, -0.50000006f, 1.00000012f, -0.50000006f); |
| 2002 path2.quadTo(1.20710683f, -0.50000006f, 1.35355353f, -0.353553414f); |
| 2003 path2.quadTo(1.50000012f, -0.207106799f, 1.50000012f, 0); |
| 2004 path2.quadTo(1.50000012f, 0.207106799f, 1.35355353f, 0.353553414f); |
| 2005 path2.quadTo(1.20710683f, 0.50000006f, 1.00000012f, 0.50000006f); |
| 2006 path2.quadTo(0.792893291f, 0.50000006f, 0.646446645f, 0.353553414f); |
| 2007 path2.quadTo(0.50000006f, 0.207106799f, 0.50000006f, 0); |
| 2008 path2.quadTo(0.50000006f, -0.207106799f, 0.646446645f, -0.353553414f); |
| 2009 path2.close(); |
| 2010 path2.moveTo(1.00000012f, 0.50000006f); |
| 2011 path2.lineTo(1.00000012f, 1.00000012f); |
| 2012 path2.lineTo(0.50000006f, 1.00000012f); |
| 2013 path2.quadTo(0.50000006f, 0.792893291f, 0.646446645f, 0.646446645f); |
| 2014 path2.quadTo(0.792893291f, 0.50000006f, 1.00000012f, 0.50000006f); |
| 2015 path2.close(); |
| 2016 path2.setFillType(SkPath::kEvenOdd_FillType); |
| 2017 testPathOp(reporter, path1, path2, kIntersect_PathOp); |
| 2018 } |
| 2019 |
| 2020 static void rectOp1i(skiatest::Reporter* reporter) { |
| 2021 SkPath path, pathB; |
| 2022 path.setFillType(SkPath::kWinding_FillType); |
| 2023 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction); |
| 2024 path.addRect(2, 2, 4, 4, SkPath::kCW_Direction); |
| 2025 pathB.setFillType(SkPath::kWinding_FillType); |
| 2026 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); |
| 2027 pathB.addRect(0, 0, 2, 2, SkPath::kCW_Direction); |
| 2028 testPathOp(reporter, path, pathB, kIntersect_PathOp); |
| 2029 } |
| 2030 |
| 2031 static void rectOp2i(skiatest::Reporter* reporter) { |
| 2032 SkPath path, pathB; |
| 2033 path.setFillType(SkPath::kEvenOdd_FillType); |
| 2034 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction); |
| 2035 path.addRect(0, 0, 3, 3, SkPath::kCW_Direction); |
| 2036 pathB.setFillType(SkPath::kWinding_FillType); |
| 2037 pathB.addRect(0, 0, 2, 2, SkPath::kCW_Direction); |
| 2038 pathB.addRect(0, 0, 2, 2, SkPath::kCW_Direction); |
| 2039 testPathOp(reporter, path, pathB, kIntersect_PathOp); |
| 2040 } |
| 2041 |
| 2042 static void rectOp3x(skiatest::Reporter* reporter) { |
| 2043 SkPath path, pathB; |
| 2044 path.setFillType(SkPath::kEvenOdd_FillType); |
| 2045 path.moveTo(0, 0); |
| 2046 path.lineTo(3, 0); |
| 2047 path.lineTo(3, 3); |
| 2048 path.lineTo(0, 3); |
| 2049 path.close(); |
| 2050 path.moveTo(2, 2); |
| 2051 path.lineTo(3, 2); |
| 2052 path.lineTo(3, 3); |
| 2053 path.lineTo(2, 3); |
| 2054 path.close(); |
| 2055 pathB.setFillType(SkPath::kWinding_FillType); |
| 2056 pathB.moveTo(1, 1); |
| 2057 pathB.lineTo(3, 1); |
| 2058 pathB.lineTo(3, 3); |
| 2059 pathB.lineTo(1, 3); |
| 2060 pathB.close(); |
| 2061 pathB.moveTo(2, 2); |
| 2062 pathB.lineTo(3, 2); |
| 2063 pathB.lineTo(3, 3); |
| 2064 pathB.lineTo(2, 3); |
| 2065 pathB.close(); |
| 2066 testPathOp(reporter, path, pathB, kXOR_PathOp); |
| 2067 } |
| 2068 |
| 2069 #if 0 |
| 2070 static void issue1435(skiatest::Reporter* reporter) { |
| 2071 SkPath path1; |
| 2072 path1.moveTo(160, 60); |
| 2073 path1.lineTo(220, 230); |
| 2074 path1.lineTo(60, 120); |
| 2075 path1.lineTo(260, 120); |
| 2076 path1.lineTo(90, 230); |
| 2077 path1.lineTo(160, 60); |
| 2078 path1.close(); |
| 2079 path1.setFillType(SkPath::kEvenOdd_FillType); |
| 2080 |
| 2081 |
| 2082 SkPath path2; |
| 2083 path2.moveTo(142.589081f, 102.283646f); |
| 2084 path2.quadTo(149.821579f, 100, 158, 100); |
| 2085 path2.quadTo(167.156921f, 100, 175.128036f, 102.862793f); |
| 2086 path2.lineTo(181.176468f, 120); |
| 2087 path2.lineTo(135.294128f, 120); |
| 2088 path2.lineTo(142.589081f, 102.283646f); |
| 2089 path2.close(); |
| 2090 path2.moveTo(118.681946f, 160.343842f); |
| 2091 path2.lineTo(135.294128f, 120); |
| 2092 path2.lineTo(117.933762f, 120); |
| 2093 path2.quadTo(108, 132.942657f, 108, 150); |
| 2094 path2.quadTo(108, 151.54483f, 108.08149f, 153.05603f); |
| 2095 path2.lineTo(118.681946f, 160.343842f); |
| 2096 path2.close(); |
| 2097 path2.moveTo(156.969696f, 186.666672f); |
| 2098 path2.lineTo(118.681946f, 160.343842f); |
| 2099 path2.lineTo(113.458946f, 173.028259f); |
| 2100 path2.quadTo(116.94117f, 179.651855f, 122.644661f, 185.355347f); |
| 2101 path2.quadTo(130.792465f, 193.503143f, 140.817978f, 197.117783f); |
| 2102 path2.lineTo(156.969696f, 186.666672f); |
| 2103 path2.close(); |
| 2104 path2.moveTo(195.830978f, 161.521133f); |
| 2105 path2.lineTo(156.969696f, 186.666672f); |
| 2106 path2.lineTo(173.157288f, 197.795639f); |
| 2107 path2.quadTo(184.392426f, 194.318268f, 193.355347f, 185.355347f); |
| 2108 path2.quadTo(197.805817f, 180.904861f, 200.903809f, 175.894165f); |
| 2109 path2.lineTo(195.830978f, 161.521133f); |
| 2110 path2.close(); |
| 2111 path2.moveTo(195.830978f, 161.521133f); |
| 2112 path2.lineTo(207.878281f, 153.725815f); |
| 2113 path2.quadTo(208, 151.888062f, 208, 150); |
| 2114 path2.quadTo(208, 132.942657f, 198.066238f, 120); |
| 2115 path2.lineTo(181.176468f, 120); |
| 2116 path2.lineTo(195.830978f, 161.521133f); |
| 2117 path2.close(); |
| 2118 path2.setFillType(SkPath::kEvenOdd_FillType); |
| 2119 testPathOp(reporter, path1, path2, kIntersect_PathOp); |
| 2120 } |
| 2121 #endif |
| 2122 |
| 2123 #if 0 |
| 2124 static void bufferOverflow(skiatest::Reporter* reporter) { |
| 2125 SkPath path; |
| 2126 path.addRect(0,0, 300,170141183460469231731687303715884105728.); |
| 2127 SkPath pathB; |
| 2128 pathB.addRect(0,0, 300,16); |
| 2129 testPathOp(reporter, path, pathB, kUnion_PathOp); |
| 2130 } |
| 2131 #endif |
| 2132 |
1990 #if 0 | 2133 #if 0 |
1991 static void skpkkiste_to716(skiatest::Reporter* reporter) { | 2134 static void skpkkiste_to716(skiatest::Reporter* reporter) { |
1992 SkPath path; | 2135 SkPath path; |
1993 path.setFillType(SkPath::kEvenOdd_FillType); | 2136 path.setFillType(SkPath::kEvenOdd_FillType); |
1994 path.moveTo(1173, 284); | 2137 path.moveTo(1173, 284); |
1995 path.cubicTo(1173, 285.125824f, 1173.37207f, 286.164734f, 1174, 287.000488f)
; | 2138 path.cubicTo(1173, 285.125824f, 1173.37207f, 286.164734f, 1174, 287.000488f)
; |
1996 path.lineTo(1174, 123.999496f); | 2139 path.lineTo(1174, 123.999496f); |
1997 path.cubicTo(1173.37207f, 124.835243f, 1173, 125.874168f, 1173, 127); | 2140 path.cubicTo(1173.37207f, 124.835243f, 1173, 125.874168f, 1173, 127); |
1998 path.lineTo(1173, 284); | 2141 path.lineTo(1173, 284); |
1999 path.close(); | 2142 path.close(); |
2000 SkPath pathB; | 2143 SkPath pathB; |
2001 pathB.setFillType(SkPath::kWinding_FillType); | 2144 pathB.setFillType(SkPath::kWinding_FillType); |
2002 pathB.moveTo(1340, 122); | 2145 pathB.moveTo(1340, 122); |
2003 pathB.cubicTo(1342.76147f, 122, 1345, 124.238579f, 1345, 127); | 2146 pathB.cubicTo(1342.76147f, 122, 1345, 124.238579f, 1345, 127); |
2004 pathB.lineTo(1345, 284); | 2147 pathB.lineTo(1345, 284); |
2005 pathB.cubicTo(1345, 286.761414f, 1342.76147f, 289, 1340, 289); | 2148 pathB.cubicTo(1345, 286.761414f, 1342.76147f, 289, 1340, 289); |
2006 pathB.lineTo(1178, 289); | 2149 pathB.lineTo(1178, 289); |
2007 pathB.cubicTo(1175.23853f, 289, 1173, 286.761414f, 1173, 284); | 2150 pathB.cubicTo(1175.23853f, 289, 1173, 286.761414f, 1173, 284); |
2008 pathB.lineTo(1173, 127); | 2151 pathB.lineTo(1173, 127); |
2009 pathB.cubicTo(1173, 124.238579f, 1175.23853f, 122, 1178, 122); | 2152 pathB.cubicTo(1173, 124.238579f, 1175.23853f, 122, 1178, 122); |
2010 pathB.lineTo(1340, 122); | 2153 pathB.lineTo(1340, 122); |
2011 pathB.close(); | 2154 pathB.close(); |
2012 testPathOp(reporter, path, pathB, kIntersect_PathOp); | 2155 testPathOp(reporter, path, pathB, kIntersect_PathOp); |
2013 } | 2156 } |
2014 #endif | 2157 #endif |
2015 | 2158 |
| 2159 static void loopEdge1(skiatest::Reporter* reporter) { |
| 2160 SkPath path; |
| 2161 path.setFillType(SkPath::kEvenOdd_FillType); |
| 2162 path.moveTo(0,0); |
| 2163 path.lineTo(3,0); |
| 2164 path.lineTo(3,2); |
| 2165 path.lineTo(1,2); |
| 2166 path.lineTo(1,1); |
| 2167 path.lineTo(2,1); |
| 2168 path.lineTo(2,3); |
| 2169 path.lineTo(0,3); |
| 2170 path.close(); |
| 2171 SkPath pathB; |
| 2172 pathB.setFillType(SkPath::kEvenOdd_FillType); |
| 2173 pathB.moveTo(1,2); |
| 2174 pathB.lineTo(2,2); |
| 2175 pathB.lineTo(2,4); |
| 2176 pathB.lineTo(1,4); |
| 2177 pathB.close(); |
| 2178 testPathOp(reporter, path, pathB, kIntersect_PathOp); |
| 2179 } |
| 2180 |
| 2181 static void loopEdge2(skiatest::Reporter* reporter) { |
| 2182 SkPath path; |
| 2183 path.setFillType(SkPath::kEvenOdd_FillType); |
| 2184 path.moveTo(0,0); |
| 2185 path.lineTo(3,0); |
| 2186 path.lineTo(3,2); |
| 2187 path.lineTo(1,2); |
| 2188 path.lineTo(1,1); |
| 2189 path.lineTo(2,1); |
| 2190 path.lineTo(2,3); |
| 2191 path.lineTo(0,3); |
| 2192 path.close(); |
| 2193 SkPath pathB; |
| 2194 pathB.setFillType(SkPath::kEvenOdd_FillType); |
| 2195 pathB.moveTo(1 - 1e-6f,2); |
| 2196 pathB.lineTo(2 - 1e-6f,2); |
| 2197 pathB.lineTo(2 - 1e-6f,4); |
| 2198 pathB.lineTo(1 - 1e-6f,4); |
| 2199 pathB.close(); |
| 2200 testPathOp(reporter, path, pathB, kIntersect_PathOp); |
| 2201 } |
| 2202 |
| 2203 static void cubicOp86i(skiatest::Reporter* reporter) { |
| 2204 SkPath path, pathB; |
| 2205 path.setFillType(SkPath::kWinding_FillType); |
| 2206 path.moveTo(0, 4); |
| 2207 path.cubicTo(3, 4, 6, 2, 5, 2); |
| 2208 path.close(); |
| 2209 pathB.setFillType(SkPath::kEvenOdd_FillType); |
| 2210 pathB.moveTo(2, 6); |
| 2211 pathB.cubicTo(2, 5, 4, 0, 4, 3); |
| 2212 pathB.close(); |
| 2213 testPathOp(reporter, path, pathB, kIntersect_PathOp); |
| 2214 } |
| 2215 |
| 2216 static void cubicOp87u(skiatest::Reporter* reporter) { |
| 2217 SkPath path, pathB; |
| 2218 path.setFillType(SkPath::kWinding_FillType); |
| 2219 path.moveTo(0,1); |
| 2220 path.cubicTo(0,2, 2,0, 6,4); |
| 2221 path.close(); |
| 2222 pathB.setFillType(SkPath::kWinding_FillType); |
| 2223 pathB.moveTo(0,2); |
| 2224 pathB.cubicTo(4,6, 1,0, 2,0); |
| 2225 pathB.close(); |
| 2226 testPathOp(reporter, path, pathB, kUnion_PathOp); |
| 2227 } |
| 2228 |
| 2229 static void cubicOp88u(skiatest::Reporter* reporter) { |
| 2230 SkPath path, pathB; |
| 2231 path.setFillType(SkPath::kWinding_FillType); |
| 2232 path.moveTo(0,1); |
| 2233 path.cubicTo(2,5, 5,0, 6,4); |
| 2234 path.close(); |
| 2235 pathB.setFillType(SkPath::kWinding_FillType); |
| 2236 pathB.moveTo(0,5); |
| 2237 pathB.cubicTo(4,6, 1,0, 5,2); |
| 2238 pathB.close(); |
| 2239 testPathOp(reporter, path, pathB, kUnion_PathOp); |
| 2240 } |
| 2241 |
| 2242 static void cubicOp89u(skiatest::Reporter* reporter) { |
| 2243 SkPath path, pathB; |
| 2244 path.setFillType(SkPath::kWinding_FillType); |
| 2245 path.moveTo(0, 3); |
| 2246 path.cubicTo(1, 6, 5, 0, 6, 3); |
| 2247 path.close(); |
| 2248 pathB.setFillType(SkPath::kWinding_FillType); |
| 2249 pathB.moveTo(0, 5); |
| 2250 pathB.cubicTo(3, 6, 3, 0, 6, 1); |
| 2251 pathB.close(); |
| 2252 testPathOp(reporter, path, pathB, kUnion_PathOp); |
| 2253 } |
| 2254 |
| 2255 static void cubicOp90u(skiatest::Reporter* reporter) { |
| 2256 SkPath path, pathB; |
| 2257 path.setFillType(SkPath::kEvenOdd_FillType); |
| 2258 path.moveTo(0, 5); |
| 2259 path.cubicTo(1, 2, 5, 2, 4, 1); |
| 2260 path.close(); |
| 2261 pathB.setFillType(SkPath::kEvenOdd_FillType); |
| 2262 pathB.moveTo(2, 5); |
| 2263 pathB.cubicTo(1, 4, 5, 0, 2, 1); |
| 2264 pathB.close(); |
| 2265 testPathOp(reporter, path, pathB, kUnion_PathOp); |
| 2266 } |
| 2267 |
| 2268 static void cubicOp91u(skiatest::Reporter* reporter) { |
| 2269 SkPath path, pathB; |
| 2270 path.setFillType(SkPath::kWinding_FillType); |
| 2271 path.moveTo(1, 6); |
| 2272 path.cubicTo(0, 3, 6, 3, 5, 0); |
| 2273 path.close(); |
| 2274 pathB.setFillType(SkPath::kWinding_FillType); |
| 2275 pathB.moveTo(3, 6); |
| 2276 pathB.cubicTo(0, 5, 6, 1, 3, 0); |
| 2277 pathB.close(); |
| 2278 testPathOp(reporter, path, pathB, kUnion_PathOp); |
| 2279 } |
2016 static void (*firstTest)(skiatest::Reporter* ) = 0; | 2280 static void (*firstTest)(skiatest::Reporter* ) = 0; |
2017 | 2281 |
2018 static struct TestDesc tests[] = { | 2282 static struct TestDesc tests[] = { |
2019 // TEST(skpkkiste_to716), | 2283 // TEST(skpkkiste_to716), |
| 2284 // TEST(bufferOverflow), |
| 2285 // TEST(issue1435), |
| 2286 TEST(cubicOp91u), |
| 2287 TEST(cubicOp90u), |
| 2288 TEST(cubicOp89u), |
| 2289 TEST(cubicOp88u), |
| 2290 TEST(cubicOp87u), |
| 2291 TEST(cubicOp86i), |
| 2292 TEST(loopEdge2), |
| 2293 TEST(loopEdge1), |
| 2294 TEST(rectOp3x), |
| 2295 TEST(rectOp2i), |
| 2296 TEST(rectOp1i), |
| 2297 TEST(issue1418b), |
2020 TEST(cubicOp85i), | 2298 TEST(cubicOp85i), |
2021 TEST(issue1417), | 2299 TEST(issue1417), |
2022 TEST(issue1418), | 2300 TEST(issue1418), |
2023 TEST(skpkkiste_to98), | 2301 TEST(skpkkiste_to98), |
2024 TEST(skpahrefs_com29), | 2302 TEST(skpahrefs_com29), |
2025 TEST(cubicOp85d), | 2303 TEST(cubicOp85d), |
2026 TEST(skpahrefs_com88), | 2304 TEST(skpahrefs_com88), |
2027 TEST(skphealth_com76), | 2305 TEST(skphealth_com76), |
2028 TEST(skpancestry_com1), | 2306 TEST(skpancestry_com1), |
2029 TEST(skpbyte_com1), | 2307 TEST(skpbyte_com1), |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2160 static const size_t subTestCount = SK_ARRAY_COUNT(subTests); | 2438 static const size_t subTestCount = SK_ARRAY_COUNT(subTests); |
2161 | 2439 |
2162 static void (*firstSubTest)(skiatest::Reporter* ) = 0; | 2440 static void (*firstSubTest)(skiatest::Reporter* ) = 0; |
2163 | 2441 |
2164 static bool runSubTestsFirst = false; | 2442 static bool runSubTestsFirst = false; |
2165 static bool runReverse = false; | 2443 static bool runReverse = false; |
2166 static void (*stopTest)(skiatest::Reporter* ) = 0; | 2444 static void (*stopTest)(skiatest::Reporter* ) = 0; |
2167 | 2445 |
2168 static void PathOpsOpTest(skiatest::Reporter* reporter) { | 2446 static void PathOpsOpTest(skiatest::Reporter* reporter) { |
2169 #ifdef SK_DEBUG | 2447 #ifdef SK_DEBUG |
2170 gDebugMaxWindSum = 4; | 2448 SkPathOpsDebug::gMaxWindSum = 4; |
2171 gDebugMaxWindValue = 4; | 2449 SkPathOpsDebug::gMaxWindValue = 4; |
2172 #endif | 2450 #endif |
2173 #if DEBUG_SHOW_TEST_NAME | 2451 #if DEBUG_SHOW_TEST_NAME |
2174 strncpy(DEBUG_FILENAME_STRING, "", DEBUG_FILENAME_STRING_LENGTH); | 2452 strncpy(DEBUG_FILENAME_STRING, "", DEBUG_FILENAME_STRING_LENGTH); |
2175 #endif | 2453 #endif |
2176 if (runSubTestsFirst) { | 2454 if (runSubTestsFirst) { |
2177 RunTestSet(reporter, subTests, subTestCount, firstSubTest, stopTest, run
Reverse); | 2455 RunTestSet(reporter, subTests, subTestCount, firstSubTest, stopTest, run
Reverse); |
2178 } | 2456 } |
2179 RunTestSet(reporter, tests, testCount, firstTest, stopTest, runReverse); | 2457 RunTestSet(reporter, tests, testCount, firstTest, stopTest, runReverse); |
2180 if (!runSubTestsFirst) { | 2458 if (!runSubTestsFirst) { |
2181 RunTestSet(reporter, subTests, subTestCount, firstSubTest, stopTest, run
Reverse); | 2459 RunTestSet(reporter, subTests, subTestCount, firstSubTest, stopTest, run
Reverse); |
2182 } | 2460 } |
2183 #ifdef SK_DEBUG | 2461 #ifdef SK_DEBUG |
2184 gDebugMaxWindSum = SK_MaxS32; | 2462 SkPathOpsDebug::gMaxWindSum = SK_MaxS32; |
2185 gDebugMaxWindValue = SK_MaxS32; | 2463 SkPathOpsDebug::gMaxWindValue = SK_MaxS32; |
2186 #endif | 2464 #endif |
2187 } | 2465 } |
2188 | 2466 |
2189 #include "TestClassDef.h" | 2467 #include "TestClassDef.h" |
2190 DEFINE_TESTCLASS_SHORT(PathOpsOpTest) | 2468 DEFINE_TESTCLASS_SHORT(PathOpsOpTest) |
OLD | NEW |