1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #include "PathOpsExtendedTest.h" 8 9 #define TEST(name) { name, #name } 10 11 static void cubicOp1d(skiatest::Reporter* reporter) { 12 SkPath path, pathB; 13 path.setFillType(SkPath::kWinding_FillType); 14 path.moveTo(0,1); 15 path.cubicTo(0,2, 1,0, 1,0); 16 path.close(); 17 pathB.setFillType(SkPath::kWinding_FillType); 18 pathB.moveTo(0,1); 19 pathB.cubicTo(0,1, 1,0, 2,0); 20 pathB.close(); 21 testPathOp(reporter, path, pathB, kDifference_PathOp); 22 } 23 24 static void cubicOp2d(skiatest::Reporter* reporter) { 25 SkPath path, pathB; 26 path.setFillType(SkPath::kWinding_FillType); 27 path.moveTo(0,2); 28 path.cubicTo(0,1, 1,0, 1,0); 29 path.close(); 30 pathB.setFillType(SkPath::kWinding_FillType); 31 pathB.moveTo(0,1); 32 pathB.cubicTo(0,1, 2,0, 1,0); 33 pathB.close(); 34 testPathOp(reporter, path, pathB, kDifference_PathOp); 35 } 36 37 static void cubicOp3d(skiatest::Reporter* reporter) { 38 SkPath path, pathB; 39 path.setFillType(SkPath::kWinding_FillType); 40 path.moveTo(0,1); 41 path.cubicTo(2,3, 1,0, 1,0); 42 path.close(); 43 pathB.setFillType(SkPath::kWinding_FillType); 44 pathB.moveTo(0,1); 45 pathB.cubicTo(0,1, 1,0, 3,2); 46 pathB.close(); 47 testPathOp(reporter, path, pathB, kDifference_PathOp); 48 } 49 50 static void cubicOp5d(skiatest::Reporter* reporter) { 51 SkPath path, pathB; 52 path.setFillType(SkPath::kWinding_FillType); 53 path.moveTo(0,1); 54 path.cubicTo(0,2, 1,0, 2,0); 55 path.close(); 56 pathB.setFillType(SkPath::kWinding_FillType); 57 pathB.moveTo(0,1); 58 pathB.cubicTo(0,2, 1,0, 2,0); 59 pathB.close(); 60 testPathOp(reporter, path, pathB, kDifference_PathOp); 61 } 62 63 static void cubicOp6d(skiatest::Reporter* reporter) { 64 SkPath path, pathB; 65 path.setFillType(SkPath::kWinding_FillType); 66 path.moveTo(0,1); 67 path.cubicTo(0,6, 1,0, 3,0); 68 path.close(); 69 pathB.setFillType(SkPath::kWinding_FillType); 70 pathB.moveTo(0,1); 71 pathB.cubicTo(0,3, 1,0, 6,0); 72 pathB.close(); 73 testPathOp(reporter, path, pathB, kDifference_PathOp); 74 } 75 76 static void cubicOp7d(skiatest::Reporter* reporter) { 77 SkPath path, pathB; 78 path.setFillType(SkPath::kWinding_FillType); 79 path.moveTo(0,1); 80 path.cubicTo(3,4, 1,0, 3,0); 81 path.close(); 82 pathB.setFillType(SkPath::kWinding_FillType); 83 pathB.moveTo(0,1); 84 pathB.cubicTo(0,3, 1,0, 4,3); 85 pathB.close(); 86 testPathOp(reporter, path, pathB, kDifference_PathOp); 87 } 88 89 static void cubicOp8d(skiatest::Reporter* reporter) { 90 SkPath path, pathB; 91 path.setFillType(SkPath::kWinding_FillType); 92 path.moveTo(0,1); 93 path.cubicTo(0,5, 1,0, 4,0); 94 path.close(); 95 pathB.setFillType(SkPath::kWinding_FillType); 96 pathB.moveTo(0,1); 97 pathB.cubicTo(0,4, 1,0, 5,0); 98 pathB.close(); 99 testPathOp(reporter, path, pathB, kDifference_PathOp); 100 } 101 102 static void cubicOp9d(skiatest::Reporter* reporter) { 103 SkPath path, pathB; 104 path.setFillType(SkPath::kWinding_FillType); 105 path.moveTo(0,1); 106 path.cubicTo(1,6, 1,0, 2,1); 107 path.close(); 108 pathB.setFillType(SkPath::kWinding_FillType); 109 pathB.moveTo(0,1); 110 pathB.cubicTo(1,2, 1,0, 6,1); 111 pathB.close(); 112 testPathOp(reporter, path, pathB, kDifference_PathOp); 113 } 114 115 static void quadOp9d(skiatest::Reporter* reporter) { 116 SkPath path, pathB; 117 path.setFillType(SkPath::kWinding_FillType); 118 path.moveTo(0,1); 119 path.quadTo(1,6, 1.5f,1); 120 path.quadTo(1.5f,0.5f, 2,1); 121 path.close(); 122 pathB.setFillType(SkPath::kWinding_FillType); 123 pathB.moveTo(0,1); 124 pathB.quadTo(1,2, 1.4f,1); 125 pathB.quadTo(3,0.4f, 6,1); 126 pathB.close(); 127 testPathOp(reporter, path, pathB, kDifference_PathOp); 128 } 129 130 static void lineOp9d(skiatest::Reporter* reporter) { 131 SkPath path, pathB; 132 path.setFillType(SkPath::kWinding_FillType); 133 path.moveTo(0,1); 134 path.lineTo(1,6); 135 path.lineTo(1.5f,1); 136 path.lineTo(1.8f,0.8f); 137 path.lineTo(2,1); 138 path.close(); 139 pathB.setFillType(SkPath::kWinding_FillType); 140 pathB.moveTo(0,1); 141 pathB.lineTo(1,2); 142 pathB.lineTo(1.4f,1); 143 pathB.lineTo(3,0.4f); 144 pathB.lineTo(6,1); 145 pathB.close(); 146 testPathOp(reporter, path, pathB, kDifference_PathOp); 147 } 148 149 static void cubicOp1i(skiatest::Reporter* reporter) { 150 SkPath path, pathB; 151 path.setFillType(SkPath::kWinding_FillType); 152 path.moveTo(0,1); 153 path.cubicTo(1,2, 1,0, 2,1); 154 path.close(); 155 pathB.setFillType(SkPath::kWinding_FillType); 156 pathB.moveTo(0,1); 157 pathB.cubicTo(1,2, 1,0, 2,1); 158 pathB.close(); 159 testPathOp(reporter, path, pathB, kIntersect_PathOp); 160 } 161 162 static void cubicOp10d(skiatest::Reporter* reporter) { 163 SkPath path, pathB; 164 path.setFillType(SkPath::kWinding_FillType); 165 path.moveTo(0,1); 166 path.cubicTo(1,3, 1,0, 4,1); 167 path.close(); 168 pathB.setFillType(SkPath::kWinding_FillType); 169 pathB.moveTo(0,1); 170 pathB.cubicTo(1,4, 1,0, 3,1); 171 pathB.close(); 172 testPathOp(reporter, path, pathB, kDifference_PathOp); 173 } 174 175 static void cubicOp11d(skiatest::Reporter* reporter) { 176 SkPath path, pathB; 177 path.setFillType(SkPath::kWinding_FillType); 178 path.moveTo(0,1); 179 path.cubicTo(3,4, 1,0, 5,1); 180 path.close(); 181 pathB.setFillType(SkPath::kWinding_FillType); 182 pathB.moveTo(0,1); 183 pathB.cubicTo(1,5, 1,0, 4,3); 184 pathB.close(); 185 testPathOp(reporter, path, pathB, kDifference_PathOp); 186 } 187 188 static void cubicOp12d(skiatest::Reporter* reporter) { 189 SkPath path, pathB; 190 path.setFillType(SkPath::kWinding_FillType); 191 path.moveTo(0,1); 192 path.cubicTo(1,6, 1,0, 1,0); 193 path.close(); 194 pathB.setFillType(SkPath::kWinding_FillType); 195 pathB.moveTo(0,1); 196 pathB.cubicTo(0,1, 1,0, 6,1); 197 pathB.close(); 198 testPathOp(reporter, path, pathB, kDifference_PathOp); 199 } 200 201 static void cubicOp13d(skiatest::Reporter* reporter) { 202 SkPath path, pathB; 203 path.setFillType(SkPath::kWinding_FillType); 204 path.moveTo(0,1); 205 path.cubicTo(4,5, 1,0, 5,3); 206 path.close(); 207 pathB.setFillType(SkPath::kWinding_FillType); 208 pathB.moveTo(0,1); 209 pathB.cubicTo(3,5, 1,0, 5,4); 210 pathB.close(); 211 testPathOp(reporter, path, pathB, kDifference_PathOp); 212 } 213 214 static void cubicOp14d(skiatest::Reporter* reporter) { 215 SkPath path, pathB; 216 path.setFillType(SkPath::kWinding_FillType); 217 path.moveTo(0,1); 218 path.cubicTo(0,2, 2,0, 2,1); 219 path.close(); 220 pathB.setFillType(SkPath::kWinding_FillType); 221 pathB.moveTo(0,2); 222 pathB.cubicTo(1,2, 1,0, 2,0); 223 pathB.close(); 224 testPathOp(reporter, path, pathB, kDifference_PathOp); 225 } 226 227 static void cubicOp15d(skiatest::Reporter* reporter) { 228 SkPath path, pathB; 229 path.setFillType(SkPath::kWinding_FillType); 230 path.moveTo(0,1); 231 path.cubicTo(3,6, 2,0, 2,1); 232 path.close(); 233 pathB.setFillType(SkPath::kWinding_FillType); 234 pathB.moveTo(0,2); 235 pathB.cubicTo(1,2, 1,0, 6,3); 236 pathB.close(); 237 testPathOp(reporter, path, pathB, kDifference_PathOp); 238 } 239 240 static void cubicOp16d(skiatest::Reporter* reporter) { 241 SkPath path, pathB; 242 path.setFillType(SkPath::kWinding_FillType); 243 path.moveTo(0,2); 244 path.cubicTo(0,1, 3,0, 1,0); 245 path.close(); 246 pathB.setFillType(SkPath::kWinding_FillType); 247 pathB.moveTo(0,3); 248 pathB.cubicTo(0,1, 2,0, 1,0); 249 pathB.close(); 250 testPathOp(reporter, path, pathB, kDifference_PathOp); 251 } 252 253 static void cubicOp17d(skiatest::Reporter* reporter) { 254 SkPath path, pathB; 255 path.setFillType(SkPath::kWinding_FillType); 256 path.moveTo(0,2); 257 path.cubicTo(0,2, 4,0, 2,1); 258 path.close(); 259 pathB.setFillType(SkPath::kWinding_FillType); 260 pathB.moveTo(0,4); 261 pathB.cubicTo(1,2, 2,0, 2,0); 262 pathB.close(); 263 testPathOp(reporter, path, pathB, kDifference_PathOp); 264 } 265 266 static void cubicOp18d(skiatest::Reporter* reporter) { 267 SkPath path, pathB; 268 path.setFillType(SkPath::kWinding_FillType); 269 path.moveTo(0,1); 270 path.cubicTo(3,5, 2,0, 2,1); 271 path.close(); 272 pathB.setFillType(SkPath::kWinding_FillType); 273 pathB.moveTo(0,2); 274 pathB.cubicTo(1,2, 1,0, 5,3); 275 pathB.close(); 276 testPathOp(reporter, path, pathB, kDifference_PathOp); 277 } 278 279 static void cubicOp19i(skiatest::Reporter* reporter) { 280 SkPath path, pathB; 281 path.setFillType(SkPath::kWinding_FillType); 282 path.moveTo(0,2); 283 path.cubicTo(0,1, 2,1, 6,2); 284 path.close(); 285 pathB.setFillType(SkPath::kWinding_FillType); 286 pathB.moveTo(1,2); 287 pathB.cubicTo(2,6, 2,0, 1,0); 288 pathB.close(); 289 testPathOp(reporter, path, pathB, kIntersect_PathOp); 290 } 291 292 static void cubicOp20d(skiatest::Reporter* reporter) { 293 SkPath path, pathB; 294 path.setFillType(SkPath::kWinding_FillType); 295 path.moveTo(0,1); 296 path.cubicTo(0,1, 6,0, 2,1); 297 path.close(); 298 pathB.setFillType(SkPath::kWinding_FillType); 299 pathB.moveTo(0,6); 300 pathB.cubicTo(1,2, 1,0, 1,0); 301 pathB.close(); 302 testPathOp(reporter, path, pathB, kDifference_PathOp); 303 } 304 305 static void cubicOp21d(skiatest::Reporter* reporter) { 306 SkPath path, pathB; 307 path.setFillType(SkPath::kWinding_FillType); 308 path.moveTo(0,1); 309 path.cubicTo(0,1, 2,1, 6,5); 310 path.close(); 311 pathB.setFillType(SkPath::kWinding_FillType); 312 pathB.moveTo(1,2); 313 pathB.cubicTo(5,6, 1,0, 1,0); 314 pathB.close(); 315 testPathOp(reporter, path, pathB, kDifference_PathOp); 316 } 317 318 static void cubicOp22d(skiatest::Reporter* reporter) { 319 SkPath path, pathB; 320 path.setFillType(SkPath::kWinding_FillType); 321 path.moveTo(0,1); 322 path.cubicTo(2,3, 3,0, 2,1); 323 path.close(); 324 pathB.setFillType(SkPath::kWinding_FillType); 325 pathB.moveTo(0,3); 326 pathB.cubicTo(1,2, 1,0, 3,2); 327 pathB.close(); 328 testPathOp(reporter, path, pathB, kDifference_PathOp); 329 } 330 331 static void cubicOp23d(skiatest::Reporter* reporter) { 332 SkPath path, pathB; 333 path.setFillType(SkPath::kWinding_FillType); 334 path.moveTo(0,1); 335 path.cubicTo(1,2, 4,0, 2,1); 336 path.close(); 337 pathB.setFillType(SkPath::kWinding_FillType); 338 pathB.moveTo(0,4); 339 pathB.cubicTo(1,2, 1,0, 2,1); 340 pathB.close(); 341 testPathOp(reporter, path, pathB, kDifference_PathOp); 342 } 343 344 static void cubicOp24d(skiatest::Reporter* reporter) { 345 SkPath path, pathB; 346 path.setFillType(SkPath::kWinding_FillType); 347 path.moveTo(0,1); 348 path.cubicTo(1,2, 2,0, 3,2); 349 path.close(); 350 pathB.setFillType(SkPath::kWinding_FillType); 351 pathB.moveTo(0,2); 352 pathB.cubicTo(2,3, 1,0, 2,1); 353 pathB.close(); 354 testPathOp(reporter, path, pathB, kDifference_PathOp); 355 } 356 357 static void testIntersect1(skiatest::Reporter* reporter) { 358 SkPath one, two; 359 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction); 360 two.addRect(3, 3, 9, 9, SkPath::kCW_Direction); 361 testPathOp(reporter, one, two, kIntersect_PathOp); 362 } 363 364 static void testUnion1(skiatest::Reporter* reporter) { 365 SkPath one, two; 366 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction); 367 two.addRect(3, 3, 9, 9, SkPath::kCW_Direction); 368 testPathOp(reporter, one, two, kUnion_PathOp); 369 } 370 371 static void testDiff1(skiatest::Reporter* reporter) { 372 SkPath one, two; 373 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction); 374 two.addRect(3, 3, 9, 9, SkPath::kCW_Direction); 375 testPathOp(reporter, one, two, kDifference_PathOp); 376 } 377 378 static void testXor1(skiatest::Reporter* reporter) { 379 SkPath one, two; 380 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction); 381 two.addRect(3, 3, 9, 9, SkPath::kCW_Direction); 382 testPathOp(reporter, one, two, kXOR_PathOp); 383 } 384 385 static void testIntersect2(skiatest::Reporter* reporter) { 386 SkPath one, two; 387 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction); 388 two.addRect(0, 3, 9, 9, SkPath::kCW_Direction); 389 testPathOp(reporter, one, two, kIntersect_PathOp); 390 } 391 392 static void testUnion2(skiatest::Reporter* reporter) { 393 SkPath one, two; 394 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction); 395 two.addRect(0, 3, 9, 9, SkPath::kCW_Direction); 396 testPathOp(reporter, one, two, kUnion_PathOp); 397 } 398 399 static void testDiff2(skiatest::Reporter* reporter) { 400 SkPath one, two; 401 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction); 402 two.addRect(0, 3, 9, 9, SkPath::kCW_Direction); 403 testPathOp(reporter, one, two, kDifference_PathOp); 404 } 405 406 static void testXor2(skiatest::Reporter* reporter) { 407 SkPath one, two; 408 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction); 409 two.addRect(0, 3, 9, 9, SkPath::kCW_Direction); 410 testPathOp(reporter, one, two, kXOR_PathOp); 411 } 412 413 static void testOp1d(skiatest::Reporter* reporter) { 414 SkPath path, pathB; 415 path.setFillType(SkPath::kWinding_FillType); 416 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 417 path.addRect(0, 0, 2, 2, SkPath::kCW_Direction); 418 pathB.setFillType(SkPath::kWinding_FillType); 419 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 420 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 421 testPathOp(reporter, path, pathB, kDifference_PathOp); 422 } 423 424 static void testOp2d(skiatest::Reporter* reporter) { 425 SkPath path, pathB; 426 path.setFillType(SkPath::kWinding_FillType); 427 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 428 path.addRect(0, 0, 2, 2, SkPath::kCW_Direction); 429 pathB.setFillType(SkPath::kEvenOdd_FillType); 430 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 431 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 432 testPathOp(reporter, path, pathB, kDifference_PathOp); 433 } 434 435 static void testOp3d(skiatest::Reporter* reporter) { 436 SkPath path, pathB; 437 path.setFillType(SkPath::kWinding_FillType); 438 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 439 path.addRect(1, 1, 2, 2, SkPath::kCW_Direction); 440 pathB.setFillType(SkPath::kWinding_FillType); 441 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 442 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 443 testPathOp(reporter, path, pathB, kDifference_PathOp); 444 } 445 446 static void testOp1u(skiatest::Reporter* reporter) { 447 SkPath path, pathB; 448 path.setFillType(SkPath::kWinding_FillType); 449 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 450 path.addRect(0, 0, 3, 3, SkPath::kCW_Direction); 451 pathB.setFillType(SkPath::kWinding_FillType); 452 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 453 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 454 testPathOp(reporter, path, pathB, kUnion_PathOp); 455 } 456 457 static void testOp4d(skiatest::Reporter* reporter) { 458 SkPath path, pathB; 459 path.setFillType(SkPath::kWinding_FillType); 460 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 461 path.addRect(2, 2, 4, 4, SkPath::kCW_Direction); 462 pathB.setFillType(SkPath::kWinding_FillType); 463 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 464 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 465 testPathOp(reporter, path, pathB, kDifference_PathOp); 466 } 467 468 static void testOp5d(skiatest::Reporter* reporter) { 469 SkPath path, pathB; 470 path.setFillType(SkPath::kEvenOdd_FillType); 471 path.addRect(0, 0, 2, 2, SkPath::kCW_Direction); 472 path.addRect(0, 0, 3, 3, SkPath::kCW_Direction); 473 pathB.setFillType(SkPath::kEvenOdd_FillType); 474 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 475 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 476 testPathOp(reporter, path, pathB, kDifference_PathOp); 477 } 478 479 static void testOp6d(skiatest::Reporter* reporter) { 480 SkPath path, pathB; 481 path.setFillType(SkPath::kEvenOdd_FillType); 482 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 483 path.addRect(0, 0, 3, 3, SkPath::kCW_Direction); 484 pathB.setFillType(SkPath::kWinding_FillType); 485 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 486 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 487 testPathOp(reporter, path, pathB, kDifference_PathOp); 488 } 489 490 static void testOp7d(skiatest::Reporter* reporter) { 491 SkPath path, pathB; 492 path.setFillType(SkPath::kEvenOdd_FillType); 493 path.addRect(0, 0, 2, 2, SkPath::kCW_Direction); 494 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 495 pathB.setFillType(SkPath::kEvenOdd_FillType); 496 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 497 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction); 498 testPathOp(reporter, path, pathB, kDifference_PathOp); 499 } 500 501 static void testOp2u(skiatest::Reporter* reporter) { 502 SkPath path, pathB; 503 path.setFillType(SkPath::kEvenOdd_FillType); 504 path.addRect(0, 0, 2, 2, SkPath::kCW_Direction); 505 path.addRect(0, 0, 2, 2, SkPath::kCW_Direction); 506 pathB.setFillType(SkPath::kWinding_FillType); 507 pathB.addRect(0, 0, 3, 3, SkPath::kCW_Direction); 508 pathB.addRect(1, 1, 2, 2, SkPath::kCW_Direction); 509 testPathOp(reporter, path, pathB, kUnion_PathOp); 510 } 511 512 static void testOp8d(skiatest::Reporter* reporter) { 513 SkPath path, pathB; 514 path.addRect(0, 0, 640, 480); 515 pathB.moveTo(577330, 1971.72f); 516 pathB.cubicTo(10.7082f, -116.596f, 262.057f, 45.6468f, 294.694f, 1.96237f); 517 pathB.close(); 518 testPathOp(reporter, path, pathB, kDifference_PathOp); 519 } 520 static void cubicOp25i(skiatest::Reporter* reporter) { 521 SkPath path, pathB; 522 path.setFillType(SkPath::kWinding_FillType); 523 path.moveTo(0,1); 524 path.cubicTo(2,4, 5,0, 3,2); 525 path.close(); 526 pathB.setFillType(SkPath::kWinding_FillType); 527 pathB.moveTo(0,5); 528 pathB.cubicTo(2,3, 1,0, 4,2); 529 pathB.close(); 530 testPathOp(reporter, path, pathB, kIntersect_PathOp); 531 } 532 533 static void cubicOp26d(skiatest::Reporter* reporter) { 534 SkPath path, pathB; 535 path.setFillType(SkPath::kWinding_FillType); 536 path.moveTo(0,1); 537 path.cubicTo(3,4, 4,0, 3,2); 538 path.close(); 539 pathB.setFillType(SkPath::kWinding_FillType); 540 pathB.moveTo(0,4); 541 pathB.cubicTo(2,3, 1,0, 4,3); 542 pathB.close(); 543 testPathOp(reporter, path, pathB, kDifference_PathOp); 544 } 545 546 static void cubicOp27d(skiatest::Reporter* reporter) { 547 SkPath path, pathB; 548 path.setFillType(SkPath::kWinding_FillType); 549 path.moveTo(0,1); 550 path.cubicTo(3,6, 1,0, 5,2); 551 path.close(); 552 pathB.setFillType(SkPath::kWinding_FillType); 553 pathB.moveTo(0,1); 554 pathB.cubicTo(2,5, 1,0, 6,3); 555 pathB.close(); 556 testPathOp(reporter, path, pathB, kDifference_PathOp); 557 } 558 559 static void cubicOp28u(skiatest::Reporter* reporter) { 560 SkPath path, pathB; 561 path.setFillType(SkPath::kWinding_FillType); 562 path.moveTo(0,1); 563 path.cubicTo(1,4, 6,0, 3,2); 564 path.close(); 565 pathB.setFillType(SkPath::kWinding_FillType); 566 pathB.moveTo(0,6); 567 pathB.cubicTo(2,3, 1,0, 4,1); 568 pathB.close(); 569 testPathOp(reporter, path, pathB, kUnion_PathOp); 570 } 571 572 static void cubicOp29d(skiatest::Reporter* reporter) { 573 SkPath path, pathB; 574 path.setFillType(SkPath::kWinding_FillType); 575 path.moveTo(0,1); 576 path.cubicTo(2,5, 6,0, 4,2); 577 path.close(); 578 pathB.setFillType(SkPath::kWinding_FillType); 579 pathB.moveTo(0,6); 580 pathB.cubicTo(2,4, 1,0, 5,2); 581 pathB.close(); 582 testPathOp(reporter, path, pathB, kDifference_PathOp); 583 } 584 585 static void cubicOp30d(skiatest::Reporter* reporter) { 586 SkPath path, pathB; 587 path.setFillType(SkPath::kWinding_FillType); 588 path.moveTo(0,1); 589 path.cubicTo(2,5, 6,0, 5,3); 590 path.close(); 591 pathB.setFillType(SkPath::kWinding_FillType); 592 pathB.moveTo(0,6); 593 pathB.cubicTo(3,5, 1,0, 5,2); 594 pathB.close(); 595 testPathOp(reporter, path, pathB, kDifference_PathOp); 596 } 597 598 static void cubicOp31d(skiatest::Reporter* reporter) { 599 SkPath path, pathB; 600 path.setFillType(SkPath::kWinding_FillType); 601 path.moveTo(0,2); 602 path.cubicTo(0,3, 2,1, 4,0); 603 path.close(); 604 pathB.setFillType(SkPath::kWinding_FillType); 605 pathB.moveTo(1,2); 606 pathB.cubicTo(0,4, 2,0, 3,0); 607 pathB.close(); 608 testPathOp(reporter, path, pathB, kDifference_PathOp); 609 } 610 611 static void cubicOp31u(skiatest::Reporter* reporter) { 612 SkPath path, pathB; 613 path.setFillType(SkPath::kWinding_FillType); 614 path.moveTo(0,2); 615 path.cubicTo(0,3, 2,1, 4,0); 616 path.close(); 617 pathB.setFillType(SkPath::kWinding_FillType); 618 pathB.moveTo(1,2); 619 pathB.cubicTo(0,4, 2,0, 3,0); 620 pathB.close(); 621 testPathOp(reporter, path, pathB, kUnion_PathOp); 622 } 623 624 static void cubicOp31x(skiatest::Reporter* reporter) { 625 SkPath path, pathB; 626 path.setFillType(SkPath::kWinding_FillType); 627 path.moveTo(0,2); 628 path.cubicTo(0,3, 2,1, 4,0); 629 path.close(); 630 pathB.setFillType(SkPath::kWinding_FillType); 631 pathB.moveTo(1,2); 632 pathB.cubicTo(0,4, 2,0, 3,0); 633 pathB.close(); 634 testPathOp(reporter, path, pathB, kXOR_PathOp); 635 } 636 637 static void cubicOp32d(skiatest::Reporter* reporter) { 638 SkPath path, pathB; 639 path.setFillType(SkPath::kWinding_FillType); 640 path.moveTo(0,1); 641 path.cubicTo(1,2, 6,0, 3,1); 642 path.close(); 643 pathB.setFillType(SkPath::kWinding_FillType); 644 pathB.moveTo(0,6); 645 pathB.cubicTo(1,3, 1,0, 2,1); 646 pathB.close(); 647 testPathOp(reporter, path, pathB, kDifference_PathOp); 648 } 649 650 static void cubicOp33i(skiatest::Reporter* reporter) { 651 SkPath path, pathB; 652 path.setFillType(SkPath::kWinding_FillType); 653 path.moveTo(0,1); 654 path.cubicTo(1,2, 6,0, 3,1); 655 path.close(); 656 pathB.setFillType(SkPath::kWinding_FillType); 657 pathB.moveTo(0,6); 658 pathB.cubicTo(1,3, 1,0, 2,1); 659 pathB.close(); 660 testPathOp(reporter, path, pathB, kIntersect_PathOp); 661 } 662 663 static void cubicOp34d(skiatest::Reporter* reporter) { 664 SkPath path, pathB; 665 path.setFillType(SkPath::kWinding_FillType); 666 path.moveTo(0,1); 667 path.cubicTo(3,5, 2,1, 3,1); 668 path.close(); 669 pathB.setFillType(SkPath::kWinding_FillType); 670 pathB.moveTo(1,2); 671 pathB.cubicTo(1,3, 1,0, 5,3); 672 pathB.close(); 673 testPathOp(reporter, path, pathB, kDifference_PathOp); 674 } 675 676 static void cubicOp35d(skiatest::Reporter* reporter) { 677 SkPath path, pathB; 678 path.setFillType(SkPath::kWinding_FillType); 679 path.moveTo(0,1); 680 path.cubicTo(1,5, 2,1, 4,0); 681 path.close(); 682 pathB.setFillType(SkPath::kWinding_FillType); 683 pathB.moveTo(1,2); 684 pathB.cubicTo(0,4, 1,0, 5,1); 685 pathB.close(); 686 testPathOp(reporter, path, pathB, kDifference_PathOp); 687 } 688 689 static void cubicOp36u(skiatest::Reporter* reporter) { 690 SkPath path, pathB; 691 path.setFillType(SkPath::kWinding_FillType); 692 path.moveTo(0,1); 693 path.cubicTo(1,6, 2,0, 5,1); 694 path.close(); 695 pathB.setFillType(SkPath::kWinding_FillType); 696 pathB.moveTo(0,2); 697 pathB.cubicTo(1,5, 1,0, 6,1); 698 pathB.close(); 699 testPathOp(reporter, path, pathB, kUnion_PathOp); 700 } 701 702 static void cubicOp37d(skiatest::Reporter* reporter) { 703 SkPath path, pathB; 704 path.setFillType(SkPath::kWinding_FillType); 705 path.moveTo(0,1); 706 path.cubicTo(2,6, 6,1, 4,3); 707 path.close(); 708 pathB.setFillType(SkPath::kWinding_FillType); 709 pathB.moveTo(1,6); 710 pathB.cubicTo(3,4, 1,0, 6,2); 711 pathB.close(); 712 testPathOp(reporter, path, pathB, kDifference_PathOp); 713 } 714 715 #if 1 716 // this fails to detect a cubic/cubic intersection 717 // the slight overlap is missed when the cubics are approximated by quadratics 718 // and the subsequent line/cubic intersection also (correctly) misses the intersection 719 // if the line/cubic was a matching line/approx.quadratic then the missing intersection 720 // could have been detected 721 static void cubicOp38d(skiatest::Reporter* reporter) { 722 SkPath path, pathB; 723 path.setFillType(SkPath::kWinding_FillType); 724 path.moveTo(0,1); 725 path.cubicTo(0,6, 3,2, 4,1); 726 path.close(); 727 pathB.setFillType(SkPath::kWinding_FillType); 728 pathB.moveTo(2,3); 729 pathB.cubicTo(1,4, 1,0, 6,0); 730 pathB.close(); 731 testPathOp(reporter, path, pathB, kDifference_PathOp); 732 } 733 #endif 734 735 static void cubicOp39d(skiatest::Reporter* reporter) { 736 SkPath path, pathB; 737 path.setFillType(SkPath::kWinding_FillType); 738 path.moveTo(0,1); 739 path.cubicTo(2,3, 5,1, 4,3); 740 path.close(); 741 pathB.setFillType(SkPath::kWinding_FillType); 742 pathB.moveTo(1,5); 743 pathB.cubicTo(3,4, 1,0, 3,2); 744 pathB.close(); 745 testPathOp(reporter, path, pathB, kDifference_PathOp); 746 } 747 748 static void cubicOp40d(skiatest::Reporter* reporter) { 749 SkPath path, pathB; 750 path.setFillType(SkPath::kWinding_FillType); 751 path.moveTo(0,1); 752 path.cubicTo(1,5, 3,2, 4,2); 753 path.close(); 754 pathB.setFillType(SkPath::kWinding_FillType); 755 pathB.moveTo(2,3); 756 pathB.cubicTo(2,4, 1,0, 5,1); 757 pathB.close(); 758 testPathOp(reporter, path, pathB, kDifference_PathOp); 759 } 760 761 static void cubicOp41i(skiatest::Reporter* reporter) { 762 SkPath path, pathB; 763 path.setFillType(SkPath::kWinding_FillType); 764 path.moveTo(0,1); 765 path.cubicTo(2,6, 4,3, 6,4); 766 path.close(); 767 pathB.setFillType(SkPath::kWinding_FillType); 768 pathB.moveTo(3,4); 769 pathB.cubicTo(4,6, 1,0, 6,2); 770 pathB.close(); 771 testPathOp(reporter, path, pathB, kIntersect_PathOp); 772 } 773 774 static void cubicOp42d(skiatest::Reporter* reporter) { 775 SkPath path, pathB; 776 path.setFillType(SkPath::kWinding_FillType); 777 path.moveTo(0,1); 778 path.cubicTo(1,2, 6,5, 5,4); 779 path.close(); 780 pathB.setFillType(SkPath::kWinding_FillType); 781 pathB.moveTo(5,6); 782 pathB.cubicTo(4,5, 1,0, 2,1); 783 pathB.close(); 784 testPathOp(reporter, path, pathB, kDifference_PathOp); 785 } 786 787 static void cubicOp43d(skiatest::Reporter* reporter) { 788 SkPath path, pathB; 789 path.setFillType(SkPath::kWinding_FillType); 790 path.moveTo(0,2); 791 path.cubicTo(1,2, 4,0, 3,1); 792 path.close(); 793 pathB.setFillType(SkPath::kWinding_FillType); 794 pathB.moveTo(0,4); 795 pathB.cubicTo(1,3, 2,0, 2,1); 796 pathB.close(); 797 testPathOp(reporter, path, pathB, kDifference_PathOp); 798 } 799 800 static void cubicOp44d(skiatest::Reporter* reporter) { 801 SkPath path, pathB; 802 path.setFillType(SkPath::kWinding_FillType); 803 path.moveTo(0,2); 804 path.cubicTo(3,6, 4,0, 3,2); 805 path.close(); 806 pathB.setFillType(SkPath::kWinding_FillType); 807 pathB.moveTo(0,4); 808 pathB.cubicTo(2,3, 2,0, 6,3); 809 pathB.close(); 810 testPathOp(reporter, path, pathB, kDifference_PathOp); 811 } 812 813 static void cubicOp45d(skiatest::Reporter* reporter) { 814 SkPath path, pathB; 815 path.setFillType(SkPath::kWinding_FillType); 816 path.moveTo(0,2); 817 path.cubicTo(2,4, 4,0, 3,2); 818 path.close(); 819 pathB.setFillType(SkPath::kWinding_FillType); 820 pathB.moveTo(0,4); 821 pathB.cubicTo(2,3, 2,0, 4,2); 822 pathB.close(); 823 testPathOp(reporter, path, pathB, kDifference_PathOp); 824 } 825 826 static void cubicOp46d(skiatest::Reporter* reporter) { 827 SkPath path, pathB; 828 path.setFillType(SkPath::kWinding_FillType); 829 path.moveTo(0,2); 830 path.cubicTo(3,5, 5,0, 4,2); 831 path.close(); 832 pathB.setFillType(SkPath::kWinding_FillType); 833 pathB.moveTo(0,5); 834 pathB.cubicTo(2,4, 2,0, 5,3); 835 pathB.close(); 836 testPathOp(reporter, path, pathB, kDifference_PathOp); 837 } 838 839 static void cubicOp47d(skiatest::Reporter* reporter) { 840 SkPath path, pathB; 841 path.setFillType(SkPath::kWinding_FillType); 842 path.moveTo(0,1); 843 path.cubicTo(1,6, 6,2, 5,4); 844 path.close(); 845 pathB.setFillType(SkPath::kWinding_FillType); 846 pathB.moveTo(2,6); 847 pathB.cubicTo(4,5, 1,0, 6,1); 848 pathB.close(); 849 testPathOp(reporter, path, pathB, kDifference_PathOp); 850 } 851 852 static void cubicOp48d(skiatest::Reporter* reporter) { 853 SkPath path, pathB; 854 path.setFillType(SkPath::kWinding_FillType); 855 path.moveTo(0,2); 856 path.cubicTo(2,3, 5,1, 3,2); 857 path.close(); 858 pathB.setFillType(SkPath::kWinding_FillType); 859 pathB.moveTo(1,5); 860 pathB.cubicTo(2,3, 2,0, 3,2); 861 pathB.close(); 862 testPathOp(reporter, path, pathB, kDifference_PathOp); 863 } 864 865 static void cubicOp49d(skiatest::Reporter* reporter) { 866 SkPath path, pathB; 867 path.setFillType(SkPath::kWinding_FillType); 868 path.moveTo(0,2); 869 path.cubicTo(1,5, 3,2, 4,1); 870 path.close(); 871 pathB.setFillType(SkPath::kWinding_FillType); 872 pathB.moveTo(2,3); 873 pathB.cubicTo(1,4, 2,0, 5,1); 874 pathB.close(); 875 testPathOp(reporter, path, pathB, kDifference_PathOp); 876 } 877 878 static void cubicOp50d(skiatest::Reporter* reporter) { 879 SkPath path, pathB; 880 path.setFillType(SkPath::kWinding_FillType); 881 path.moveTo(0,3); 882 path.cubicTo(1,6, 5,0, 5,1); 883 path.close(); 884 pathB.setFillType(SkPath::kWinding_FillType); 885 pathB.moveTo(0,5); 886 pathB.cubicTo(1,5, 3,0, 6,1); 887 pathB.close(); 888 testPathOp(reporter, path, pathB, kDifference_PathOp); 889 } 890 891 static void cubicOp51d(skiatest::Reporter* reporter) { 892 SkPath path, pathB; 893 path.setFillType(SkPath::kWinding_FillType); 894 path.moveTo(0,3); 895 path.cubicTo(1,2, 4,1, 6,0); 896 path.close(); 897 pathB.setFillType(SkPath::kWinding_FillType); 898 pathB.moveTo(1,4); 899 pathB.cubicTo(0,6, 3,0, 2,1); 900 pathB.close(); 901 testPathOp(reporter, path, pathB, kDifference_PathOp); 902 } 903 904 static void cubicOp52d(skiatest::Reporter* reporter) { 905 SkPath path, pathB; 906 path.setFillType(SkPath::kWinding_FillType); 907 path.moveTo(0,2); 908 path.cubicTo(1,2, 5,4, 4,3); 909 path.close(); 910 pathB.setFillType(SkPath::kWinding_FillType); 911 pathB.moveTo(4,5); 912 pathB.cubicTo(3,4, 2,0, 2,1); 913 pathB.close(); 914 testPathOp(reporter, path, pathB, kDifference_PathOp); 915 } 916 917 static void cubicOp53d(skiatest::Reporter* reporter) { 918 SkPath path, pathB; 919 path.setFillType(SkPath::kWinding_FillType); 920 path.moveTo(0,3); 921 path.cubicTo(1,2, 5,3, 2,1); 922 path.close(); 923 pathB.setFillType(SkPath::kWinding_FillType); 924 pathB.moveTo(3,5); 925 pathB.cubicTo(1,2, 3,0, 2,1); 926 pathB.close(); 927 testPathOp(reporter, path, pathB, kDifference_PathOp); 928 } 929 930 static void cubicOp54d(skiatest::Reporter* reporter) { 931 SkPath path, pathB; 932 path.setFillType(SkPath::kWinding_FillType); 933 path.moveTo(0,4); 934 path.cubicTo(1,3, 5,4, 4,2); 935 path.close(); 936 pathB.setFillType(SkPath::kWinding_FillType); 937 pathB.moveTo(4,5); 938 pathB.cubicTo(2,4, 4,0, 3,1); 939 pathB.close(); 940 testPathOp(reporter, path, pathB, kDifference_PathOp); 941 } 942 943 static void cubicOp55d(skiatest::Reporter* reporter) { 944 SkPath path, pathB; 945 path.setFillType(SkPath::kWinding_FillType); 946 path.moveTo(0,5); 947 path.cubicTo(1,3, 3,2, 5,0); 948 path.close(); 949 pathB.setFillType(SkPath::kWinding_FillType); 950 pathB.moveTo(2,3); 951 pathB.cubicTo(0,5, 5,0, 3,1); 952 pathB.close(); 953 testPathOp(reporter, path, pathB, kDifference_PathOp); 954 } 955 956 static void cubicOp56d(skiatest::Reporter* reporter) { 957 SkPath path, pathB; 958 path.setFillType(SkPath::kWinding_FillType); 959 path.moveTo(0,1); 960 path.cubicTo(2,6, 5,0, 2,1); 961 path.close(); 962 pathB.setFillType(SkPath::kWinding_FillType); 963 pathB.moveTo(0,5); 964 pathB.cubicTo(1,2, 1,0, 6,2); 965 pathB.close(); 966 testPathOp(reporter, path, pathB, kDifference_PathOp); 967 } 968 969 static void cubicOp57d(skiatest::Reporter* reporter) { 970 SkPath path, pathB; 971 path.setFillType(SkPath::kWinding_FillType); 972 path.moveTo(0,5); 973 path.cubicTo(0,5, 5,4, 6,4); 974 path.close(); 975 pathB.setFillType(SkPath::kWinding_FillType); 976 pathB.moveTo(4,5); 977 pathB.cubicTo(4,6, 5,0, 5,0); 978 pathB.close(); 979 testPathOp(reporter, path, pathB, kDifference_PathOp); 980 } 981 982 static void cubicOp58d(skiatest::Reporter* reporter) { 983 SkPath path, pathB; 984 path.setFillType(SkPath::kWinding_FillType); 985 path.moveTo(0,5); 986 path.cubicTo(3,4, 6,5, 5,3); 987 path.close(); 988 pathB.setFillType(SkPath::kWinding_FillType); 989 pathB.moveTo(5,6); 990 pathB.cubicTo(3,5, 5,0, 4,3); 991 pathB.close(); 992 testPathOp(reporter, path, pathB, kDifference_PathOp); 993 } 994 995 static void cubicOp59d(skiatest::Reporter* reporter) { 996 SkPath path, pathB; 997 path.setFillType(SkPath::kWinding_FillType); 998 path.moveTo(0,1); 999 path.cubicTo(5,6, 4,0, 4,1); 1000 path.close(); 1001 pathB.setFillType(SkPath::kWinding_FillType); 1002 pathB.moveTo(0,4); 1003 pathB.cubicTo(1,4, 1,0, 6,5); 1004 pathB.close(); 1005 testPathOp(reporter, path, pathB, kDifference_PathOp); 1006 } 1007 1008 static void cubicOp60d(skiatest::Reporter* reporter) { 1009 SkPath path, pathB; 1010 path.setFillType(SkPath::kWinding_FillType); 1011 path.moveTo(0,2); 1012 path.cubicTo(4,6, 6,0, 5,2); 1013 path.close(); 1014 pathB.setFillType(SkPath::kWinding_FillType); 1015 pathB.moveTo(0,6); 1016 pathB.cubicTo(2,5, 2,0, 6,4); 1017 pathB.close(); 1018 testPathOp(reporter, path, pathB, kDifference_PathOp); 1019 } 1020 1021 static void cubicOp61d(skiatest::Reporter* reporter) { 1022 SkPath path, pathB; 1023 path.setFillType(SkPath::kWinding_FillType); 1024 path.moveTo(1,2); 1025 path.cubicTo(0,5, 3,2, 6,1); 1026 path.close(); 1027 pathB.setFillType(SkPath::kWinding_FillType); 1028 pathB.moveTo(2,3); 1029 pathB.cubicTo(1,6, 2,1, 5,0); 1030 pathB.close(); 1031 testPathOp(reporter, path, pathB, kDifference_PathOp); 1032 } 1033 1034 static void cubicOp62d(skiatest::Reporter* reporter) { 1035 SkPath path, pathB; 1036 path.setFillType(SkPath::kWinding_FillType); 1037 path.moveTo(1,3); 1038 path.cubicTo(5,6, 5,3, 5,4); 1039 path.close(); 1040 pathB.setFillType(SkPath::kWinding_FillType); 1041 pathB.moveTo(3,5); 1042 pathB.cubicTo(4,5, 3,1, 6,5); 1043 pathB.close(); 1044 testPathOp(reporter, path, pathB, kDifference_PathOp); 1045 } 1046 1047 static void cubicOp63d(skiatest::Reporter* reporter) { 1048 SkPath path, pathB; 1049 path.setFillType(SkPath::kWinding_FillType); 1050 path.moveTo(2,3); 1051 path.cubicTo(0,4, 3,2, 5,3); 1052 path.close(); 1053 pathB.setFillType(SkPath::kWinding_FillType); 1054 pathB.moveTo(2,3); 1055 pathB.cubicTo(3,5, 3,2, 4,0); 1056 pathB.close(); 1057 testPathOp(reporter, path, pathB, kDifference_PathOp); 1058 } 1059 1060 static void cubicOp64d(skiatest::Reporter* reporter) { 1061 SkPath path, pathB; 1062 path.moveTo(0,1); 1063 path.cubicTo(0,1, 1,0, 3,0); 1064 path.lineTo(0,1); 1065 path.close(); 1066 pathB.moveTo(0,1); 1067 pathB.cubicTo(0,3, 1,0, 1,0); 1068 pathB.lineTo(0,1); 1069 pathB.close(); 1070 testPathOp(reporter, path, pathB, kDifference_PathOp); 1071 } 1072 1073 static void cubicOp65d(skiatest::Reporter* reporter) { 1074 SkPath path, pathB; 1075 path.moveTo(0,1); 1076 path.cubicTo(1,5, 1,0, 1,0); 1077 path.lineTo(0,1); 1078 path.close(); 1079 pathB.moveTo(0,1); 1080 pathB.cubicTo(0,1, 1,0, 5,1); 1081 pathB.lineTo(0,1); 1082 pathB.close(); 1083 testPathOp(reporter, path, pathB, kDifference_PathOp); 1084 } 1085 1086 static void rectOp1d(skiatest::Reporter* reporter) { 1087 SkPath path, pathB; 1088 path.moveTo(0,1); 1089 path.cubicTo(0,1, 1,0, 3,0); 1090 path.lineTo(0,1); 1091 path.close(); 1092 pathB.moveTo(0,1); 1093 pathB.cubicTo(0,3, 1,0, 1,0); 1094 pathB.lineTo(0,1); 1095 pathB.close(); 1096 testPathOp(reporter, path, pathB, kDifference_PathOp); 1097 } 1098 1099 static void cubicOp66u(skiatest::Reporter* reporter) { 1100 SkPath path, pathB; 1101 path.setFillType(SkPath::kWinding_FillType); 1102 path.moveTo(0,1); 1103 path.cubicTo(2,6, 4,2, 5,3); 1104 path.close(); 1105 pathB.setFillType(SkPath::kWinding_FillType); 1106 pathB.moveTo(2,4); 1107 pathB.cubicTo(3,5, 1,0, 6,2); 1108 pathB.close(); 1109 testPathOp(reporter, path, pathB, kUnion_PathOp); 1110 } 1111 1112 static void cubicOp67u(skiatest::Reporter* reporter) { 1113 SkPath path, pathB; 1114 path.moveTo(3,5); 1115 path.cubicTo(1,6, 5,0, 3,1); 1116 path.lineTo(3,5); 1117 path.close(); 1118 pathB.moveTo(0,5); 1119 pathB.cubicTo(1,3, 5,3, 6,1); 1120 pathB.lineTo(0,5); 1121 pathB.close(); 1122 testPathOp(reporter, path, pathB, kUnion_PathOp); 1123 } 1124 1125 static void cubicOp68u(skiatest::Reporter* reporter) { 1126 SkPath path, pathB; 1127 path.moveTo(0,5); 1128 path.cubicTo(4,5, 4,1, 5,0); 1129 path.close(); 1130 pathB.moveTo(1,4); 1131 pathB.cubicTo(0,5, 5,0, 5,4); 1132 pathB.close(); 1133 testPathOp(reporter, path, pathB, kUnion_PathOp); 1134 } 1135 1136 static void cubicOp69d(skiatest::Reporter* reporter) { 1137 SkPath path, pathB; 1138 path.moveTo(1,3); 1139 path.cubicTo(0,1, 3,1, 2,0); 1140 path.close(); 1141 pathB.moveTo(1,3); 1142 pathB.cubicTo(0,2, 3,1, 1,0); 1143 pathB.close(); 1144 testPathOp(reporter, path, pathB, kDifference_PathOp); 1145 } 1146 1147 SkPathOp ops[] = { 1148 kUnion_PathOp, 1149 kXOR_PathOp, 1150 kReverseDifference_PathOp, 1151 kXOR_PathOp, 1152 kReverseDifference_PathOp, 1153 }; 1154 1155 static void rRect1(skiatest::Reporter* reporter) { 1156 SkScalar xA = SkFloatToScalar(0.65f); 1157 SkScalar xB = SkFloatToScalar(10.65f); 1158 SkScalar xC = SkFloatToScalar(20.65f); 1159 SkScalar xD = SkFloatToScalar(30.65f); 1160 SkScalar xE = SkFloatToScalar(40.65f); 1161 SkScalar xF = SkFloatToScalar(50.65f); 1162 1163 SkScalar yA = SkFloatToScalar(0.65f); 1164 SkScalar yB = SkFloatToScalar(10.65f); 1165 SkScalar yC = SkFloatToScalar(20.65f); 1166 SkScalar yD = SkFloatToScalar(30.65f); 1167 SkScalar yE = SkFloatToScalar(40.65f); 1168 SkScalar yF = SkFloatToScalar(50.65f); 1169 SkPath paths[5]; 1170 SkRect rects[5]; 1171 rects[0].set(xB, yB, xE, yE); 1172 paths[0].addRoundRect(rects[0], SkIntToScalar(5), SkIntToScalar(5)); // red 1173 rects[1].set(xA, yA, xD, yD); 1174 paths[1].addRoundRect(rects[1], SkIntToScalar(5), SkIntToScalar(5)); // green 1175 rects[2].set(xC, yA, xF, yD); 1176 paths[2].addRoundRect(rects[2], SkIntToScalar(5), SkIntToScalar(5)); // blue 1177 rects[3].set(xA, yC, xD, yF); 1178 paths[3].addRoundRect(rects[3], SkIntToScalar(5), SkIntToScalar(5)); // yellow 1179 rects[4].set(xC, yC, xF, yF); 1180 paths[4].addRoundRect(rects[4], SkIntToScalar(5), SkIntToScalar(5)); // cyan 1181 SkPath path; 1182 path.setFillType(SkPath::kInverseEvenOdd_FillType); 1183 for (int index = 0; index < 5; ++index) { 1184 testPathOp(reporter, path, paths[index], ops[index]); 1185 Op(path, paths[index], ops[index], &path); 1186 } 1187 } 1188 1189 static void skp1(skiatest::Reporter* reporter) { 1190 SkPath path; 1191 path.setFillType(SkPath::kEvenOdd_FillType); 1192 path.moveTo(189,7); 1193 path.cubicTo(189,5.34314585f, 190.34314f,4, 192,4); 1194 path.lineTo(243,4); 1195 path.cubicTo(244.65686f,4, 246,5.34314585f, 246,7); 1196 path.lineTo(246,21); 1197 path.cubicTo(246,22.6568546f, 244.65686f,24, 243,24); 1198 path.lineTo(192,24); 1199 path.cubicTo(190.34314f,24, 189,22.6568546f, 189,21); 1200 path.lineTo(189,7); 1201 path.close(); 1202 path.moveTo(191,8); 1203 path.cubicTo(191,6.89543009f, 191.895432f,6, 193,6); 1204 path.lineTo(242,6); 1205 path.cubicTo(243.104568f,6, 244,6.89543009f, 244,8); 1206 path.lineTo(244,20); 1207 path.cubicTo(244,21.1045704f, 243.104568f,22, 242,22); 1208 path.lineTo(193,22); 1209 path.cubicTo(191.895432f,22, 191,21.1045704f, 191,20); 1210 path.lineTo(191,8); 1211 path.close(); 1212 SkPath pathB; 1213 pathB.setFillType(SkPath::kWinding_FillType); 1214 pathB.moveTo(189,4); 1215 pathB.lineTo(199,14); 1216 pathB.lineTo(236,14); 1217 pathB.lineTo(246,4); 1218 pathB.lineTo(189,4); 1219 pathB.close(); 1220 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1221 } 1222 1223 static void skp2(skiatest::Reporter* reporter) { 1224 SkPath path; 1225 path.setFillType(SkPath::kEvenOdd_FillType); 1226 path.moveTo(253.000000f, 11757.0000f); 1227 path.lineTo(253.000000f, 222.000000f); 1228 path.lineTo(823.000000f, 222.000000f); 1229 path.lineTo(823.000000f, 11757.0000f); 1230 path.lineTo(253.000000f, 11757.0000f); 1231 path.close(); 1232 SkPath pathB; 1233 pathB.setFillType(SkPath::kWinding_FillType); 1234 pathB.moveTo(258.000000f, 1028.00000f); 1235 pathB.lineTo(258.000000f, 1027.00000f); 1236 pathB.lineTo(823.000000f, 1027.00000f); 1237 pathB.lineTo(823.000000f, 1028.00000f); 1238 pathB.lineTo(258.000000f, 1028.00000f); 1239 pathB.close(); 1240 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1241 } 1242 1243 static void skp3(skiatest::Reporter* reporter) { 1244 SkPath path; 1245 path.setFillType(SkPath::kEvenOdd_FillType); 1246 path.moveTo(717.000000f, 507.000000f); 1247 path.lineTo(717.000000f, 425.000000f); 1248 path.lineTo(973.000000f, 425.000000f); 1249 path.lineTo(973.000000f, 507.000000f); 1250 path.quadTo(973.000000f, 508.242645f, 972.121582f, 509.121613f); 1251 path.quadTo(971.242615f, 510.000000f, 970.000000f, 510.000000f); 1252 path.lineTo(720.000000f, 510.000000f); 1253 path.quadTo(718.757385f, 510.000000f, 717.878418f, 509.121613f); 1254 path.quadTo(717.000000f, 508.242645f, 717.000000f, 507.000000f); 1255 path.close(); 1256 path.moveTo(719.000000f, 426.000000f); 1257 path.lineTo(971.000000f, 426.000000f); 1258 path.lineTo(971.000000f, 506.000000f); 1259 path.cubicTo(971.000000f, 507.104584f, 970.104553f, 508.000000f, 969.000000f, 508.000000f); 1260 path.lineTo(721.000000f, 508.000000f); 1261 path.cubicTo(719.895447f, 508.000000f, 719.000000f, 507.104584f, 719.000000f, 506.000000f); 1262 path.lineTo(719.000000f, 426.000000f); 1263 path.close(); 1264 SkPath pathB; 1265 pathB.setFillType(SkPath::kWinding_FillType); 1266 pathB.moveTo(717.000000f, 510.000000f); 1267 pathB.lineTo(760.000000f, 467.000000f); 1268 pathB.lineTo(930.000000f, 467.000000f); 1269 pathB.lineTo(973.000000f, 510.000000f); 1270 pathB.lineTo(717.000000f, 510.000000f); 1271 pathB.close(); 1272 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1273 } 1274 1275 static void skp4(skiatest::Reporter* reporter) { 1276 SkPath path; 1277 path.setFillType(SkPath::kEvenOdd_FillType); 1278 path.moveTo(230.756805f, 591.756775f); 1279 path.quadTo(232.514725f, 590.000000f, 235.000000f, 590.000000f); 1280 path.lineTo(300.000000f, 590.000000f); 1281 path.quadTo(302.485291f, 590.000000f, 304.243195f, 591.756775f); 1282 path.quadTo(306.000000f, 593.514709f, 306.000000f, 596.000000f); 1283 path.lineTo(306.000000f, 617.000000f); 1284 path.lineTo(229.000000f, 617.000000f); 1285 path.lineTo(229.000000f, 596.000000f); 1286 path.quadTo(229.000000f, 593.514709f, 230.756805f, 591.756775f); 1287 path.close(); 1288 path.moveTo(231.000000f, 597.000000f); 1289 path.cubicTo(231.000000f, 594.238586f, 233.238571f, 592.000000f, 236.000000f, 592.000000f); 1290 path.lineTo(299.000000f, 592.000000f); 1291 path.cubicTo(301.761414f, 592.000000f, 304.000000f, 594.238586f, 304.000000f, 597.000000f); 1292 path.lineTo(304.000000f, 616.000000f); 1293 path.lineTo(231.000000f, 616.000000f); 1294 path.lineTo(231.000000f, 597.000000f); 1295 path.close(); 1296 SkPath pathB; 1297 pathB.setFillType(SkPath::kWinding_FillType); 1298 pathB.moveTo(306.000000f, 590.000000f); 1299 pathB.lineTo(292.000000f, 604.000000f); 1300 pathB.lineTo(305.000000f, 617.000000f); 1301 pathB.lineTo(306.000000f, 617.000000f); 1302 pathB.lineTo(306.000000f, 590.000000f); 1303 pathB.close(); 1304 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1305 } 1306 1307 static void skp5(skiatest::Reporter* reporter) { 1308 SkPath path; 1309 path.setFillType(SkPath::kEvenOdd_FillType); 1310 path.moveTo(18.0000000f, 226.000000f); 1311 path.quadTo(14.6862917f, 226.000000f, 12.3423996f, 228.342407f); 1312 path.quadTo(10.0000000f, 230.686295f, 10.0000000f, 234.000000f); 1313 path.lineTo(10.0000000f, 253.000000f); 1314 path.lineTo(1247.00000f, 253.000000f); 1315 path.lineTo(1247.00000f, 234.000000f); 1316 path.quadTo(1247.00000f, 230.686295f, 1244.65759f, 228.342407f); 1317 path.quadTo(1242.31372f, 226.000000f, 1239.00000f, 226.000000f); 1318 path.lineTo(18.0000000f, 226.000000f); 1319 path.close(); 1320 SkPath pathB; 1321 pathB.setFillType(SkPath::kInverseWinding_FillType); 1322 pathB.moveTo(18.0000000f, 226.000000f); 1323 pathB.lineTo(1239.00000f, 226.000000f); 1324 pathB.cubicTo(1243.41833f, 226.000000f, 1247.00000f, 229.581726f, 1247.00000f, 234.000000f); 1325 pathB.lineTo(1247.00000f, 252.000000f); 1326 pathB.lineTo(10.0000000f, 252.000000f); 1327 pathB.lineTo(10.0000000f, 234.000000f); 1328 pathB.cubicTo(10.0000000f, 229.581726f, 13.5817204f, 226.000000f, 18.0000000f, 226.000000f); 1329 pathB.close(); 1330 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1331 } 1332 1333 static void cubicOp70d(skiatest::Reporter* reporter) { 1334 SkPath path, pathB; 1335 path.setFillType(SkPath::kWinding_FillType); 1336 path.moveTo(0,1); 1337 path.cubicTo(0,5, 4,0, 5,0); 1338 path.close(); 1339 pathB.setFillType(SkPath::kWinding_FillType); 1340 pathB.moveTo(0,4); 1341 pathB.cubicTo(0,5, 1,0, 5,0); 1342 pathB.close(); 1343 testPathOp(reporter, path, pathB, kDifference_PathOp); 1344 } 1345 1346 static void cubicOp71d(skiatest::Reporter* reporter) { 1347 SkPath path, pathB; 1348 path.setFillType(SkPath::kWinding_FillType); 1349 path.moveTo(0,1); 1350 path.cubicTo(0,5, 4,1, 6,4); 1351 path.close(); 1352 pathB.setFillType(SkPath::kWinding_FillType); 1353 pathB.moveTo(1,4); 1354 pathB.cubicTo(4,6, 1,0, 5,0); 1355 pathB.close(); 1356 testPathOp(reporter, path, pathB, kDifference_PathOp); 1357 } 1358 1359 static void cubicOp72i(skiatest::Reporter* reporter) { 1360 SkPath path, pathB; 1361 path.setFillType(SkPath::kWinding_FillType); 1362 path.moveTo(0,1); 1363 path.cubicTo(0,5, 5,2, 5,4); 1364 path.close(); 1365 pathB.setFillType(SkPath::kWinding_FillType); 1366 pathB.moveTo(2,5); 1367 pathB.cubicTo(4,5, 1,0, 5,0); 1368 pathB.close(); 1369 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1370 } 1371 1372 static void cubicOp73d(skiatest::Reporter* reporter) { 1373 SkPath path, pathB; 1374 path.setFillType(SkPath::kWinding_FillType); 1375 path.moveTo(0,1); 1376 path.cubicTo(3,4, 4,0, 6,4); 1377 path.lineTo(0,1); 1378 path.close(); 1379 pathB.setFillType(SkPath::kWinding_FillType); 1380 pathB.moveTo(0,4); 1381 pathB.cubicTo(4,6, 1,0, 4,3); 1382 pathB.lineTo(0,4); 1383 pathB.close(); 1384 testPathOp(reporter, path, pathB, kDifference_PathOp); 1385 } 1386 1387 static void cubicOp74d(skiatest::Reporter* reporter) { 1388 SkPath path, pathB; 1389 path.setFillType(SkPath::kWinding_FillType); 1390 path.moveTo(0,1); 1391 path.cubicTo(1,5, 5,1, 5,1); 1392 path.lineTo(0,1); 1393 path.close(); 1394 pathB.setFillType(SkPath::kWinding_FillType); 1395 pathB.moveTo(1,5); 1396 pathB.cubicTo(1,5, 1,0, 5,1); 1397 pathB.lineTo(1,5); 1398 pathB.close(); 1399 testPathOp(reporter, path, pathB, kDifference_PathOp); 1400 } 1401 1402 static void cubicOp75d(skiatest::Reporter* reporter) { 1403 SkPath path, pathB; 1404 path.setFillType(SkPath::kWinding_FillType); 1405 path.moveTo(0,1); 1406 path.cubicTo(0,4, 5,1, 6,4); 1407 path.lineTo(0,1); 1408 path.close(); 1409 pathB.setFillType(SkPath::kWinding_FillType); 1410 pathB.moveTo(1,5); 1411 pathB.cubicTo(4,6, 1,0, 4,0); 1412 pathB.lineTo(1,5); 1413 pathB.close(); 1414 testPathOp(reporter, path, pathB, kDifference_PathOp); 1415 } 1416 1417 static void cubicOp76u(skiatest::Reporter* reporter) { 1418 SkPath path, pathB; 1419 path.setFillType(SkPath::kWinding_FillType); 1420 path.moveTo(0,1); 1421 path.cubicTo(0,2, 2,0, 5,3); 1422 path.close(); 1423 pathB.setFillType(SkPath::kWinding_FillType); 1424 pathB.moveTo(0,2); 1425 pathB.cubicTo(3,5, 1,0, 2,0); 1426 pathB.close(); 1427 testPathOp(reporter, path, pathB, kUnion_PathOp); 1428 } 1429 1430 static void cubicOp77i(skiatest::Reporter* reporter) { 1431 SkPath path, pathB; 1432 path.setFillType(SkPath::kEvenOdd_FillType); 1433 path.moveTo(0,1); 1434 path.cubicTo(1,3, 2,0, 3,2); 1435 path.lineTo(0,1); 1436 path.close(); 1437 pathB.setFillType(SkPath::kEvenOdd_FillType); 1438 pathB.moveTo(0,2); 1439 pathB.cubicTo(2,3, 1,0, 3,1); 1440 pathB.lineTo(0,2); 1441 pathB.close(); 1442 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1443 } 1444 1445 static void cubicOp78u(skiatest::Reporter* reporter) { 1446 SkPath path, pathB; 1447 path.setFillType(SkPath::kEvenOdd_FillType); 1448 path.moveTo(1,6); 1449 path.cubicTo(1,6, 5,0, 6,1); 1450 path.lineTo(1,6); 1451 path.close(); 1452 pathB.setFillType(SkPath::kEvenOdd_FillType); 1453 pathB.moveTo(0,5); 1454 pathB.cubicTo(1,6, 6,1, 6,1); 1455 pathB.lineTo(0,5); 1456 pathB.close(); 1457 testPathOp(reporter, path, pathB, kUnion_PathOp); 1458 } 1459 1460 static void cubicOp79u(skiatest::Reporter* reporter) { 1461 SkPath path, pathB; 1462 path.setFillType(SkPath::kWinding_FillType); 1463 path.moveTo(0,1); 1464 path.cubicTo(1,3, 1,0, 6,4); 1465 path.close(); 1466 pathB.setFillType(SkPath::kWinding_FillType); 1467 pathB.moveTo(0,1); 1468 pathB.cubicTo(4,6, 1,0, 3,1); 1469 pathB.close(); 1470 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1471 } 1472 1473 static void cubicOp80i(skiatest::Reporter* reporter) { 1474 SkPath path, pathB; 1475 path.setFillType(SkPath::kWinding_FillType); 1476 path.moveTo(0,1); 1477 path.cubicTo(2,3, 2,1, 4,3); 1478 path.lineTo(0,1); 1479 path.close(); 1480 pathB.setFillType(SkPath::kWinding_FillType); 1481 pathB.moveTo(1,2); 1482 pathB.cubicTo(3,4, 1,0, 3,2); 1483 pathB.lineTo(1,2); 1484 pathB.close(); 1485 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1486 } 1487 1488 static void cubicOp81d(skiatest::Reporter* reporter) { 1489 SkPath path, pathB; 1490 path.setFillType(SkPath::kWinding_FillType); 1491 path.moveTo(0,1); 1492 path.cubicTo(4,6, 4,3, 5,4); 1493 path.close(); 1494 pathB.setFillType(SkPath::kWinding_FillType); 1495 pathB.moveTo(3,4); 1496 pathB.cubicTo(4,5, 1,0, 6,4); 1497 pathB.close(); 1498 testPathOp(reporter, path, pathB, kDifference_PathOp); 1499 } 1500 1501 static void cubicOp82i(skiatest::Reporter* reporter) { 1502 SkPath path, pathB; 1503 path.setFillType(SkPath::kEvenOdd_FillType); 1504 path.moveTo(0,1); 1505 path.cubicTo(2,3, 5,2, 3,0); 1506 path.lineTo(0,1); 1507 path.close(); 1508 pathB.setFillType(SkPath::kWinding_FillType); 1509 pathB.moveTo(2,5); 1510 pathB.cubicTo(0,3, 1,0, 3,2); 1511 pathB.lineTo(2,5); 1512 pathB.close(); 1513 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1514 } 1515 1516 static void cubicOp83i(skiatest::Reporter* reporter) { 1517 SkPath path, pathB; 1518 path.setFillType(SkPath::kWinding_FillType); 1519 path.moveTo(0,1); 1520 path.cubicTo(0,3, 2,1, 4,1); 1521 path.lineTo(0,1); 1522 path.close(); 1523 pathB.setFillType(SkPath::kWinding_FillType); 1524 pathB.moveTo(1,2); 1525 pathB.cubicTo(1,4, 1,0, 3,0); 1526 pathB.lineTo(1,2); 1527 pathB.close(); 1528 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1529 } 1530 1531 static void cubicOp84d(skiatest::Reporter* reporter) { 1532 SkPath path, pathB; 1533 path.setFillType(SkPath::kWinding_FillType); 1534 path.moveTo(0,4); 1535 path.cubicTo(2,3, 6,3, 3,2); 1536 path.close(); 1537 pathB.setFillType(SkPath::kWinding_FillType); 1538 pathB.moveTo(3,6); 1539 pathB.cubicTo(2,3, 4,0, 3,2); 1540 pathB.close(); 1541 testPathOp(reporter, path, pathB, kDifference_PathOp); 1542 } 1543 1544 static void skpClip1(skiatest::Reporter* reporter) { 1545 SkPath path; 1546 path.setFillType(SkPath::kEvenOdd_FillType); 1547 path.moveTo(1126.17114f, 877.171204f); 1548 path.quadTo(1127.34314f, 876.000000f, 1129.00000f, 876.000000f); 1549 path.lineTo(1243.00000f, 876.000000f); 1550 path.quadTo(1244.65686f, 876.000000f, 1245.82886f, 877.171204f); 1551 path.quadTo(1247.00000f, 878.343140f, 1247.00000f, 880.000000f); 1552 path.lineTo(1247.00000f, 907.000000f); 1553 path.lineTo(1246.00000f, 907.000000f); 1554 path.lineTo(1246.00000f, 880.000000f); 1555 path.cubicTo(1246.00000f, 878.343140f, 1244.65686f, 877.000000f, 1243.00000f, 877.000000f); 1556 path.lineTo(1129.00000f, 877.000000f); 1557 path.cubicTo(1127.34314f, 877.000000f, 1126.00000f, 878.343140f, 1126.00000f, 880.000000f); 1558 path.lineTo(1126.00000f, 907.000000f); 1559 path.lineTo(1125.00000f, 907.000000f); 1560 path.lineTo(1125.00000f, 880.000000f); 1561 path.quadTo(1125.00000f, 878.343140f, 1126.17114f, 877.171204f); 1562 path.close(); 1563 SkPath pathB; 1564 pathB.setFillType(SkPath::kWinding_FillType); 1565 pathB.moveTo(1247.00000f, 876.000000f); 1566 pathB.lineTo(1231.00000f, 892.000000f); 1567 pathB.lineTo(1246.00000f, 907.000000f); 1568 pathB.lineTo(1247.00000f, 907.000000f); 1569 pathB.lineTo(1247.00000f, 876.000000f); 1570 pathB.close(); 1571 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1572 } 1573 1574 static void skpClip2(skiatest::Reporter* reporter) { 1575 SkPath path; 1576 path.setFillType(SkPath::kEvenOdd_FillType); 1577 path.moveTo(134.000000f, 11414.0000f); 1578 path.cubicTo(131.990234f, 11414.0000f, 130.326660f, 11415.4824f, 130.042755f, 11417.4131f); 1579 path.cubicTo(130.233124f, 11418.3193f, 131.037079f, 11419.0000f, 132.000000f, 11419.0000f); 1580 path.lineTo(806.000000f, 11419.0000f); 1581 path.cubicTo(806.962891f, 11419.0000f, 807.766907f, 11418.3193f, 807.957275f, 11417.4131f); 1582 path.cubicTo(807.673401f, 11415.4824f, 806.009766f, 11414.0000f, 804.000000f, 11414.0000f); 1583 path.lineTo(134.000000f, 11414.0000f); 1584 path.close(); 1585 SkPath pathB; 1586 pathB.setFillType(SkPath::kInverseWinding_FillType); 1587 pathB.moveTo(132.000000f, 11415.0000f); 1588 pathB.lineTo(806.000000f, 11415.0000f); 1589 pathB.cubicTo(807.104553f, 11415.0000f, 808.000000f, 11415.4473f, 808.000000f, 11416.0000f); 1590 pathB.lineTo(808.000000f, 11417.0000f); 1591 pathB.cubicTo(808.000000f, 11418.1045f, 807.104553f, 11419.0000f, 806.000000f, 11419.0000f); 1592 pathB.lineTo(132.000000f, 11419.0000f); 1593 pathB.cubicTo(130.895432f, 11419.0000f, 130.000000f, 11418.1045f, 130.000000f, 11417.0000f); 1594 pathB.lineTo(130.000000f, 11416.0000f); 1595 pathB.cubicTo(130.000000f, 11415.4473f, 130.895432f, 11415.0000f, 132.000000f, 11415.0000f); 1596 pathB.close(); 1597 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1598 } 1599 1600 static void skp96prezzi1(skiatest::Reporter* reporter) { 1601 SkPath path; 1602 path.setFillType(SkPath::kEvenOdd_FillType); 1603 path.moveTo(157.464005f, 670.463989f); 1604 path.quadTo(158.928925f, 669.000000f, 161.000000f, 669.000000f); 1605 path.lineTo(248.000000f, 669.000000f); 1606 path.quadTo(250.071075f, 669.000000f, 251.535995f, 670.463989f); 1607 path.quadTo(253.000000f, 671.928955f, 253.000000f, 674.000000f); 1608 path.lineTo(253.000000f, 706.000000f); 1609 path.lineTo(251.000000f, 706.000000f); 1610 path.lineTo(251.000000f, 675.000000f); 1611 path.cubicTo(251.000000f, 672.790833f, 249.209137f, 671.000000f, 247.000000f, 671.000000f); 1612 path.lineTo(162.000000f, 671.000000f); 1613 path.cubicTo(159.790863f, 671.000000f, 158.000000f, 672.790833f, 158.000000f, 675.000000f); 1614 path.lineTo(158.000000f, 706.000000f); 1615 path.lineTo(156.000000f, 706.000000f); 1616 path.lineTo(156.000000f, 674.000000f); 1617 path.quadTo(156.000000f, 671.928955f, 157.464005f, 670.463989f); 1618 path.close(); 1619 SkPath pathB; 1620 pathB.setFillType(SkPath::kWinding_FillType); 1621 pathB.moveTo(156.000000f, 669.000000f); 1622 pathB.lineTo(178.500000f, 691.500000f); 1623 pathB.lineTo(230.500000f, 691.500000f); 1624 pathB.lineTo(253.000000f, 669.000000f); 1625 pathB.lineTo(156.000000f, 669.000000f); 1626 pathB.close(); 1627 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1628 } 1629 1630 static void skpancestry_com1(skiatest::Reporter* reporter) { 1631 SkPath path; 1632 path.setFillType(SkPath::kEvenOdd_FillType); 1633 path.moveTo(161.000000f, 925.000000f); 1634 path.cubicTo(159.874390f, 925.000000f, 158.835663f, 925.371948f, 158.000000f, 925.999634f); 1635 path.lineTo(158.000000f, 926.000000f); 1636 path.lineTo(1108.00000f, 926.000000f); 1637 path.lineTo(1108.00000f, 925.999634f); 1638 path.cubicTo(1107.16443f, 925.371948f, 1106.12561f, 925.000000f, 1105.00000f, 925.000000f); 1639 path.lineTo(161.000000f, 925.000000f); 1640 path.close(); 1641 SkPath pathB; 1642 pathB.setFillType(SkPath::kEvenOdd_FillType); 1643 pathB.moveTo(161.000000f, 926.000000f); 1644 pathB.lineTo(1105.00000f, 926.000000f); 1645 pathB.cubicTo(1107.20911f, 926.000000f, 1109.00000f, 927.790833f, 1109.00000f, 930.000000f); 1646 pathB.lineTo(1109.00000f, 956.000000f); 1647 pathB.cubicTo(1109.00000f, 958.209167f, 1107.20911f, 960.000000f, 1105.00000f, 960.000000f); 1648 pathB.lineTo(161.000000f, 960.000000f); 1649 pathB.cubicTo(158.790863f, 960.000000f, 157.000000f, 958.209167f, 157.000000f, 956.000000f); 1650 pathB.lineTo(157.000000f, 930.000000f); 1651 pathB.cubicTo(157.000000f, 927.790833f, 158.790863f, 926.000000f, 161.000000f, 926.000000f); 1652 pathB.close(); 1653 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1654 } 1655 1656 static void skpeldorado_com_ua1(skiatest::Reporter* reporter) { 1657 SkPath path; 1658 path.setFillType(SkPath::kEvenOdd_FillType); 1659 path.moveTo(286.695129f, 291.000000f); 1660 path.lineTo(229.304855f, 561.000000f); 1661 path.lineTo(979.304871f, 561.000000f); 1662 path.lineTo(1036.69507f, 291.000000f); 1663 path.lineTo(286.695129f, 291.000000f); 1664 path.close(); 1665 SkPath pathB; 1666 pathB.setFillType(SkPath::kWinding_FillType); 1667 pathB.moveTo(1006.69513f, 291.000000f); 1668 pathB.cubicTo(1023.26367f, 291.000000f, 1033.84021f, 304.431458f, 1030.31836f, 321.000000f); 1669 pathB.lineTo(985.681519f, 531.000000f); 1670 pathB.cubicTo(982.159790f, 547.568542f, 965.873413f, 561.000000f, 949.304871f, 561.000000f); 1671 pathB.lineTo(259.304871f, 561.000000f); 1672 pathB.cubicTo(242.736313f, 561.000000f, 232.159805f, 547.568542f, 235.681549f, 531.000000f); 1673 pathB.lineTo(280.318420f, 321.000000f); 1674 pathB.cubicTo(283.840179f, 304.431458f, 300.126587f, 291.000000f, 316.695129f, 291.000000f); 1675 pathB.lineTo(1006.69513f, 291.000000f); 1676 pathB.close(); 1677 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1678 } 1679 1680 static void skpbyte_com1(skiatest::Reporter* reporter) { 1681 SkPath path; 1682 path.setFillType(SkPath::kEvenOdd_FillType); 1683 path.moveTo(968.000000f, 14.0000000f); 1684 path.cubicTo(965.238586f, 14.0000000f, 963.000000f, 16.2385769f, 963.000000f, 19.0000000f); 1685 path.lineTo(963.000000f, 32.0000000f); 1686 path.cubicTo(963.000000f, 34.7614250f, 965.238586f, 37.0000000f, 968.000000f, 37.0000000f); 1687 path.lineTo(1034.00000f, 37.0000000f); 1688 path.cubicTo(1036.76147f, 37.0000000f, 1039.00000f, 34.7614250f, 1039.00000f, 32.0000000f); 1689 path.lineTo(1039.00000f, 19.0000000f); 1690 path.cubicTo(1039.00000f, 16.2385769f, 1036.76147f, 14.0000000f, 1034.00000f, 14.0000000f); 1691 path.lineTo(968.000000f, 14.0000000f); 1692 path.close(); 1693 SkPath pathB; 1694 pathB.setFillType(SkPath::kInverseWinding_FillType); 1695 pathB.moveTo(968.000000f, 14.0000000f); 1696 pathB.lineTo(1034.00000f, 14.0000000f); 1697 pathB.cubicTo(1036.76147f, 14.0000000f, 1039.00000f, 16.2385750f, 1039.00000f, 19.0000000f); 1698 pathB.lineTo(1039.00000f, 32.0000000f); 1699 pathB.cubicTo(1039.00000f, 34.2091408f, 1036.76147f, 36.0000000f, 1034.00000f, 36.0000000f); 1700 pathB.lineTo(968.000000f, 36.0000000f); 1701 pathB.cubicTo(965.238586f, 36.0000000f, 963.000000f, 34.2091408f, 963.000000f, 32.0000000f); 1702 pathB.lineTo(963.000000f, 19.0000000f); 1703 pathB.cubicTo(963.000000f, 16.2385750f, 965.238586f, 14.0000000f, 968.000000f, 14.0000000f); 1704 pathB.close(); 1705 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1706 } 1707 1708 static void skphealth_com76(skiatest::Reporter* reporter) { 1709 SkPath path; 1710 path.setFillType(SkPath::kEvenOdd_FillType); 1711 path.moveTo(708.099182f, 7.09919119f); 1712 path.lineTo(708.099182f, 7.09920025f); 1713 path.quadTo(704.000000f, 11.2010098f, 704.000000f, 17.0000000f); 1714 path.lineTo(704.000000f, 33.0000000f); 1715 path.lineTo(705.000000f, 33.0000000f); 1716 path.lineTo(705.000000f, 17.0000000f); 1717 path.cubicTo(705.000000f, 13.4101496f, 706.455078f, 10.1601505f, 708.807617f, 7.80761385f); 1718 path.lineTo(708.099182f, 7.09919119f); 1719 path.close(); 1720 SkPath pathB; 1721 pathB.setFillType(SkPath::kWinding_FillType); 1722 pathB.moveTo(704.000000f, 3.00000000f); 1723 #if 0 1724 pathB.lineTo(719.500000f, 3.00000000f); 1725 pathB.lineTo(705.000000f, 33.0000000f); 1726 pathB.lineTo(704.000000f, 33.0000000f); 1727 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1728 #else 1729 pathB.lineTo(704.000000f, 33.0000000f); 1730 pathB.lineTo(705.000000f, 33.0000000f); 1731 pathB.lineTo(719.500000f, 3.00000000f); 1732 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1733 #endif 1734 } 1735 1736 static void skpahrefs_com88(skiatest::Reporter* reporter) { 1737 SkPath path; 1738 path.setFillType(SkPath::kEvenOdd_FillType); 1739 path.moveTo(1099.82886f, 7.17117119f); 1740 path.lineTo(1099.12134f, 7.87867832f); 1741 path.cubicTo(1099.66418f, 8.42157173f, 1100.00000f, 9.17157173f, 1100.00000f, 10.0000000f); 1742 path.lineTo(1100.00000f, 28.0000000f); 1743 path.cubicTo(1100.00000f, 29.6568546f, 1098.65686f, 31.0000000f, 1097.00000f, 31.0000000f); 1744 path.lineTo(1088.00000f, 31.0000000f); 1745 path.lineTo(1088.00000f, 32.0000000f); 1746 path.lineTo(1097.00000f, 32.0000000f); 1747 path.quadTo(1098.65686f, 32.0000000f, 1099.82886f, 30.8288002f); 1748 path.quadTo(1101.00000f, 29.6568546f, 1101.00000f, 28.0000000f); 1749 path.lineTo(1101.00000f, 10.0000000f); 1750 path.quadTo(1101.00000f, 8.34314537f, 1099.82886f, 7.17119980f); 1751 path.lineTo(1099.82886f, 7.17117119f); 1752 path.close(); 1753 SkPath pathB; 1754 pathB.setFillType(SkPath::kWinding_FillType); 1755 pathB.moveTo(1101.00000f, 6.00000000f); 1756 pathB.lineTo(1088.00000f, 6.00000000f); 1757 pathB.lineTo(1088.00000f, 19.0000000f); 1758 pathB.lineTo(1101.00000f, 32.0000000f); 1759 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1760 } 1761 1762 static void skpahrefs_com29(skiatest::Reporter* reporter) { 1763 SkPath path; 1764 path.setFillType(SkPath::kEvenOdd_FillType); 1765 path.moveTo(1037.17114f, 7.17119980f); 1766 path.quadTo(1038.34314f, 6.00000000f, 1040.00000f, 6.00000000f); 1767 path.lineTo(1074.00000f, 6.00000000f); 1768 path.lineTo(1074.00000f, 32.0000000f); 1769 path.lineTo(1040.00000f, 32.0000000f); 1770 path.quadTo(1038.34314f, 32.0000000f, 1037.17114f, 30.8288002f); 1771 path.quadTo(1036.00000f, 29.6568546f, 1036.00000f, 28.0000000f); 1772 path.lineTo(1036.00000f, 10.0000000f); 1773 path.quadTo(1036.00000f, 8.34314537f, 1037.17114f, 7.17119980f); 1774 path.close(); 1775 path.moveTo(1037.00000f, 10.0000000f); 1776 path.cubicTo(1037.00000f, 8.34314537f, 1038.34314f, 7.00000000f, 1040.00000f, 7.00000000f); 1777 path.lineTo(1073.00000f, 7.00000000f); 1778 path.lineTo(1073.00000f, 31.0000000f); 1779 path.lineTo(1040.00000f, 31.0000000f); 1780 path.cubicTo(1038.34314f, 31.0000000f, 1037.00000f, 29.6568546f, 1037.00000f, 28.0000000f); 1781 path.lineTo(1037.00000f, 10.0000000f); 1782 path.close(); 1783 SkPath pathB; 1784 pathB.setFillType(SkPath::kWinding_FillType); 1785 pathB.moveTo(1036.00000f, 32.0000000f); 1786 pathB.lineTo(1049.00000f, 19.0000000f); 1787 pathB.lineTo(1073.00000f, 31.0000000f); 1788 pathB.lineTo(1074.00000f, 32.0000000f); 1789 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1790 } 1791 1792 static void cubicOp85d(skiatest::Reporter* reporter) { 1793 SkPath path; 1794 path.setFillType(SkPath::kWinding_FillType); 1795 path.moveTo(0,1); 1796 path.cubicTo(1,6, 1,0, 6,2); 1797 path.close(); 1798 SkPath pathB; 1799 pathB.setFillType(SkPath::kWinding_FillType); 1800 pathB.moveTo(0,1); 1801 pathB.cubicTo(2,6, 1,0, 6,1); 1802 pathB.close(); 1803 testPathOp(reporter, path, pathB, kDifference_PathOp); 1804 } 1805 1806 // this fails because the pair of nearly coincident cubics intersect at the ends 1807 // but the line connected to one of the cubics at the same point does not intersect 1808 // the other 1809 static void skpkkiste_to98(skiatest::Reporter* reporter) { 1810 SkPath path; 1811 path.setFillType(SkPath::kEvenOdd_FillType); 1812 path.moveTo(96, 122); 1813 path.cubicTo(94.6192932f, 122, 93.3692932f, 122.559647f, 92.4644699f, 123.46447f); 1814 path.lineTo(94.1715698f, 125.17157f); 1815 path.cubicTo(94.8954315f, 124.447708f, 95.8954315f, 124, 97, 124); 1816 path.lineTo(257, 124); 1817 path.cubicTo(258.104553f, 124, 259.104584f, 124.447708f, 259.82843f, 125.17157f); 1818 path.lineTo(261.535522f, 123.46447f); 1819 path.cubicTo(260.630707f, 122.559647f, 259.380707f, 122, 258, 122); 1820 path.lineTo(96, 122); 1821 path.close(); 1822 SkPath pathB; 1823 pathB.setFillType(SkPath::kWinding_FillType); 1824 pathB.moveTo(258, 122); 1825 pathB.cubicTo(260.761414f, 122, 263, 124.238579f, 263, 127); 1826 pathB.lineTo(263, 284); 1827 pathB.cubicTo(263, 286.761414f, 260.761414f, 289, 258, 289); 1828 pathB.lineTo(96, 289); 1829 pathB.cubicTo(93.2385788f, 289, 91, 286.761414f, 91, 284); 1830 pathB.lineTo(91, 127); 1831 pathB.cubicTo(91, 124.238579f, 93.2385788f, 122, 96, 122); 1832 pathB.lineTo(258, 122); 1833 pathB.close(); 1834 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1835 } 1836 1837 #if 01 1838 static void issue1417(skiatest::Reporter* reporter) { 1839 SkPath path1; 1840 path1.moveTo(122.58908843994140625f, 82.2836456298828125f); 1841 path1.quadTo(129.8215789794921875f, 80, 138, 80); 1842 path1.quadTo(147.15692138671875f, 80, 155.1280364990234375f, 82.86279296875f); 1843 path1.lineTo(161.1764678955078125f, 100); 1844 path1.lineTo(161.1764678955078125f, 100); 1845 path1.lineTo(115.29412078857421875f, 100); 1846 path1.lineTo(115.29412078857421875f, 100); 1847 path1.lineTo(122.58908843994140625f, 82.2836456298828125f); 1848 path1.lineTo(122.58908843994140625f, 82.2836456298828125f); 1849 path1.close(); 1850 path1.moveTo(98.68194580078125f, 140.343841552734375f); 1851 path1.lineTo(115.29412078857421875f, 100); 1852 path1.lineTo(115.29412078857421875f, 100); 1853 path1.lineTo(97.9337615966796875f, 100); 1854 path1.lineTo(97.9337615966796875f, 100); 1855 path1.quadTo(88, 112.94264984130859375f, 88, 130); 1856 path1.quadTo(88, 131.544830322265625f, 88.08148956298828125f, 133.0560302734375f); 1857 path1.lineTo(98.68194580078125f, 140.343841552734375f); 1858 path1.lineTo(98.68194580078125f, 140.343841552734375f); 1859 path1.close(); 1860 path1.moveTo(136.969696044921875f, 166.6666717529296875f); 1861 path1.lineTo(98.68194580078125f, 140.343841552734375f); 1862 path1.lineTo(98.68194580078125f, 140.343841552734375f); 1863 path1.lineTo(93.45894622802734375f, 153.02825927734375f); 1864 path1.lineTo(93.45894622802734375f, 153.02825927734375f); 1865 path1.quadTo(96.94116973876953125f, 159.65185546875f, 102.64466094970703125f, 165.3553466796875f); 1866 path1.quadTo(110.7924652099609375f, 173.503143310546875f, 120.8179779052734375f, 177.1177825927734375f); 1867 path1.lineTo(136.969696044921875f, 166.6666717529296875f); 1868 path1.lineTo(136.969696044921875f, 166.6666717529296875f); 1869 path1.close(); 1870 path1.moveTo(175.8309783935546875f, 141.5211334228515625f); 1871 path1.lineTo(136.969696044921875f, 166.6666717529296875f); 1872 path1.lineTo(136.969696044921875f, 166.6666717529296875f); 1873 path1.lineTo(153.15728759765625f, 177.7956390380859375f); 1874 path1.lineTo(153.15728759765625f, 177.7956390380859375f); 1875 path1.quadTo(164.392425537109375f, 174.318267822265625f, 173.3553466796875f, 165.3553466796875f); 1876 path1.quadTo(177.805816650390625f, 160.9048614501953125f, 180.90380859375f, 155.8941650390625f); 1877 path1.lineTo(175.8309783935546875f, 141.5211334228515625f); 1878 path1.lineTo(175.8309783935546875f, 141.5211334228515625f); 1879 path1.close(); 1880 path1.moveTo(175.8309783935546875f, 141.5211334228515625f); 1881 path1.lineTo(187.8782806396484375f, 133.7258148193359375f); 1882 path1.lineTo(187.8782806396484375f, 133.7258148193359375f); 1883 path1.quadTo(188, 131.8880615234375f, 188, 130); 1884 path1.quadTo(188, 112.942657470703125f, 178.0662384033203125f, 100); 1885 path1.lineTo(161.1764678955078125f, 100); 1886 path1.lineTo(161.1764678955078125f, 100); 1887 path1.lineTo(175.8309783935546875f, 141.5211334228515625f); 1888 path1.lineTo(175.8309783935546875f, 141.5211334228515625f); 1889 path1.close(); 1890 1891 SkPath path2; 1892 path2.moveTo(174.117645263671875f, 100); 1893 path2.lineTo(161.1764678955078125f, 100); 1894 path2.lineTo(161.1764678955078125f, 100); 1895 path2.lineTo(155.1280364990234375f, 82.86279296875f); 1896 path2.lineTo(155.1280364990234375f, 82.86279296875f); 1897 path2.quadTo(153.14971923828125f, 82.15229034423828125f, 151.098419189453125f, 81.618133544921875f); 1898 path2.lineTo(143.5294189453125f, 100); 1899 path2.lineTo(143.5294189453125f, 100); 1900 path2.lineTo(161.1764678955078125f, 100); 1901 path2.lineTo(161.1764678955078125f, 100); 1902 path2.lineTo(168.23529052734375f, 120); 1903 path2.lineTo(168.23529052734375f, 120); 1904 path2.lineTo(181.1764678955078125f, 120); 1905 path2.lineTo(181.1764678955078125f, 120); 1906 path2.lineTo(186.3661956787109375f, 134.7042236328125f); 1907 path2.lineTo(186.3661956787109375f, 134.7042236328125f); 1908 path2.lineTo(187.8782806396484375f, 133.7258148193359375f); 1909 path2.lineTo(187.8782806396484375f, 133.7258148193359375f); 1910 path2.quadTo(188, 131.8880615234375f, 188, 130); 1911 path2.quadTo(188, 124.80947113037109375f, 187.080169677734375f, 120); 1912 path2.lineTo(181.1764678955078125f, 120); 1913 path2.lineTo(181.1764678955078125f, 120); 1914 path2.lineTo(174.117645263671875f, 100); 1915 path2.lineTo(174.117645263671875f, 100); 1916 path2.close(); 1917 path2.moveTo(88.91983795166015625f, 120); 1918 path2.lineTo(107.0588226318359375f, 120); 1919 path2.lineTo(107.0588226318359375f, 120); 1920 path2.lineTo(98.68194580078125f, 140.343841552734375f); 1921 path2.lineTo(98.68194580078125f, 140.343841552734375f); 1922 path2.lineTo(88.08148956298828125f, 133.0560302734375f); 1923 path2.lineTo(88.08148956298828125f, 133.0560302734375f); 1924 path2.quadTo(88, 131.544830322265625f, 88, 130); 1925 path2.quadTo(88, 124.80951690673828125f, 88.91983795166015625f, 120); 1926 path2.close(); 1927 path2.moveTo(96.67621612548828125f, 145.21490478515625f); 1928 path2.lineTo(98.68194580078125f, 140.343841552734375f); 1929 path2.lineTo(98.68194580078125f, 140.343841552734375f); 1930 path2.lineTo(120.68767547607421875f, 155.4727783203125f); 1931 path2.lineTo(120.68767547607421875f, 155.4727783203125f); 1932 path2.lineTo(118.68194580078125f, 160.343841552734375f); 1933 path2.lineTo(118.68194580078125f, 160.343841552734375f); 1934 path2.lineTo(96.67621612548828125f, 145.21490478515625f); 1935 path2.lineTo(96.67621612548828125f, 145.21490478515625f); 1936 path2.close(); 1937 path2.moveTo(113.232177734375f, 173.5789947509765625f); 1938 path2.quadTo(116.8802642822265625f, 175.69805908203125f, 120.8179779052734375f, 177.1177825927734375f); 1939 path2.lineTo(132.2864990234375f, 169.6969757080078125f); 1940 path2.lineTo(132.2864990234375f, 169.6969757080078125f); 1941 path2.lineTo(118.68194580078125f, 160.343841552734375f); 1942 path2.lineTo(118.68194580078125f, 160.343841552734375f); 1943 path2.lineTo(113.232177734375f, 173.5789947509765625f); 1944 path2.lineTo(113.232177734375f, 173.5789947509765625f); 1945 path2.close(); 1946 1947 testPathOp(reporter, path1, path2, kUnion_PathOp); 1948 } 1949 #endif 1950 1951 static void issue1418(skiatest::Reporter* reporter) { 1952 SkPath path1; 1953 path1.moveTo(0, 0); 1954 path1.lineTo(1, 0); 1955 path1.lineTo(1, 0); 1956 path1.lineTo(1, 1); 1957 path1.lineTo(1, 1); 1958 path1.lineTo(0, 1); 1959 path1.lineTo(0, 1); 1960 path1.lineTo(0, 0); 1961 path1.lineTo(0, 0); 1962 path1.close(); 1963 1964 SkPath path2; 1965 path2.moveTo(0.64644664525985717773f, -0.35355341434478759766f); 1966 path2.quadTo(0.79289329051971435547f, -0.50000005960464477539f, 1.0000001192092895508f, -0.50000005960464477539f); 1967 path2.quadTo(1.2071068286895751953f, -0.50000005960464477539f, 1.3535535335540771484f, -0.35355341434478759766f); 1968 path2.quadTo(1.5000001192092895508f, -0.20710679888725280762f, 1.5000001192092895508f, 0); 1969 path2.quadTo(1.5000001192092895508f, 0.20710679888725280762f, 1.3535535335540771484f, 0.35355341434478759766f); 1970 path2.quadTo(1.2071068286895751953f, 0.50000005960464477539f, 1.0000001192092895508f, 0.50000005960464477539f); 1971 path2.quadTo(0.79289329051971435547f, 0.50000005960464477539f, 0.64644664525985717773f, 0.35355341434478759766f); 1972 path2.quadTo(0.50000005960464477539f, 0.20710679888725280762f, 0.50000005960464477539f, 0); 1973 path2.quadTo(0.50000005960464477539f, -0.20710679888725280762f, 0.64644664525985717773f, -0.35355341434478759766f); 1974 testPathOp(reporter, path1, path2, kIntersect_PathOp); 1975 } 1976 1977 static void cubicOp85i(skiatest::Reporter* reporter) { 1978 SkPath path, pathB; 1979 path.setFillType(SkPath::kWinding_FillType); 1980 path.moveTo(3, 4); 1981 path.cubicTo(1, 5, 4, 3, 6, 4); 1982 path.close(); 1983 pathB.setFillType(SkPath::kWinding_FillType); 1984 pathB.moveTo(3, 4); 1985 pathB.cubicTo(4, 6, 4, 3, 5, 1); 1986 pathB.close(); 1987 testPathOp(reporter, path, pathB, kIntersect_PathOp); 1988 } 1989 1990 #if 0 1991 static void skpkkiste_to716(skiatest::Reporter* reporter) { 1992 SkPath path; 1993 path.setFillType(SkPath::kEvenOdd_FillType); 1994 path.moveTo(1173, 284); 1995 path.cubicTo(1173, 285.125824f, 1173.37207f, 286.164734f, 1174, 287.000488f); 1996 path.lineTo(1174, 123.999496f); 1997 path.cubicTo(1173.37207f, 124.835243f, 1173, 125.874168f, 1173, 127); 1998 path.lineTo(1173, 284); 1999 path.close(); 2000 SkPath pathB; 2001 pathB.setFillType(SkPath::kWinding_FillType); 2002 pathB.moveTo(1340, 122); 2003 pathB.cubicTo(1342.76147f, 122, 1345, 124.238579f, 1345, 127); 2004 pathB.lineTo(1345, 284); 2005 pathB.cubicTo(1345, 286.761414f, 1342.76147f, 289, 1340, 289); 2006 pathB.lineTo(1178, 289); 2007 pathB.cubicTo(1175.23853f, 289, 1173, 286.761414f, 1173, 284); 2008 pathB.lineTo(1173, 127); 2009 pathB.cubicTo(1173, 124.238579f, 1175.23853f, 122, 1178, 122); 2010 pathB.lineTo(1340, 122); 2011 pathB.close(); 2012 testPathOp(reporter, path, pathB, kIntersect_PathOp); 2013 } 2014 #endif 2015 2016 static void (*firstTest)(skiatest::Reporter* ) = 0; 2017 2018 static struct TestDesc tests[] = { 2019 // TEST(skpkkiste_to716), 2020 TEST(cubicOp85i), 2021 TEST(issue1417), 2022 TEST(issue1418), 2023 TEST(skpkkiste_to98), 2024 TEST(skpahrefs_com29), 2025 TEST(cubicOp85d), 2026 TEST(skpahrefs_com88), 2027 TEST(skphealth_com76), 2028 TEST(skpancestry_com1), 2029 TEST(skpbyte_com1), 2030 TEST(skpeldorado_com_ua1), 2031 TEST(skp96prezzi1), 2032 TEST(skpClip2), 2033 TEST(skpClip1), 2034 TEST(cubicOp84d), 2035 TEST(cubicOp83i), 2036 TEST(cubicOp82i), 2037 TEST(cubicOp81d), 2038 TEST(cubicOp80i), 2039 TEST(cubicOp79u), 2040 TEST(cubicOp78u), 2041 TEST(cubicOp77i), 2042 TEST(cubicOp76u), 2043 TEST(cubicOp75d), 2044 TEST(cubicOp74d), 2045 TEST(cubicOp73d), 2046 TEST(cubicOp72i), 2047 TEST(cubicOp71d), 2048 TEST(skp5), 2049 TEST(skp4), 2050 TEST(skp3), 2051 TEST(skp2), 2052 TEST(skp1), 2053 TEST(rRect1), 2054 TEST(cubicOp70d), 2055 TEST(cubicOp69d), 2056 TEST(cubicOp68u), 2057 TEST(cubicOp67u), 2058 TEST(cubicOp66u), 2059 TEST(rectOp1d), 2060 TEST(cubicOp65d), 2061 TEST(cubicOp64d), 2062 TEST(cubicOp63d), 2063 TEST(cubicOp62d), 2064 TEST(cubicOp61d), 2065 TEST(cubicOp60d), 2066 TEST(cubicOp59d), 2067 TEST(cubicOp58d), 2068 TEST(cubicOp57d), 2069 TEST(cubicOp56d), 2070 TEST(cubicOp55d), 2071 TEST(cubicOp54d), 2072 TEST(cubicOp53d), 2073 TEST(cubicOp52d), 2074 TEST(cubicOp51d), 2075 TEST(cubicOp50d), 2076 TEST(cubicOp49d), 2077 TEST(cubicOp48d), 2078 TEST(cubicOp47d), 2079 TEST(cubicOp46d), 2080 TEST(cubicOp45d), 2081 TEST(cubicOp44d), 2082 TEST(cubicOp43d), 2083 TEST(cubicOp42d), 2084 TEST(cubicOp41i), 2085 TEST(cubicOp40d), 2086 TEST(cubicOp39d), 2087 TEST(cubicOp38d), 2088 TEST(cubicOp37d), 2089 TEST(cubicOp36u), 2090 TEST(cubicOp35d), 2091 TEST(cubicOp34d), 2092 TEST(cubicOp33i), 2093 TEST(cubicOp32d), 2094 TEST(cubicOp31d), 2095 TEST(cubicOp31x), 2096 TEST(cubicOp31u), 2097 TEST(cubicOp30d), 2098 TEST(cubicOp29d), 2099 TEST(cubicOp28u), 2100 TEST(cubicOp27d), 2101 TEST(cubicOp26d), 2102 TEST(cubicOp25i), 2103 TEST(testOp8d), 2104 TEST(testDiff1), 2105 TEST(testIntersect1), 2106 TEST(testUnion1), 2107 TEST(testXor1), 2108 TEST(testDiff2), 2109 TEST(testIntersect2), 2110 TEST(testUnion2), 2111 TEST(testXor2), 2112 TEST(testOp1d), 2113 TEST(testOp2d), 2114 TEST(testOp3d), 2115 TEST(testOp1u), 2116 TEST(testOp4d), 2117 TEST(testOp5d), 2118 TEST(testOp6d), 2119 TEST(testOp7d), 2120 TEST(testOp2u), 2121 2122 TEST(cubicOp24d), 2123 TEST(cubicOp23d), 2124 TEST(cubicOp22d), 2125 TEST(cubicOp21d), 2126 TEST(cubicOp20d), 2127 TEST(cubicOp19i), 2128 TEST(cubicOp18d), 2129 TEST(cubicOp17d), 2130 TEST(cubicOp16d), 2131 TEST(cubicOp15d), 2132 TEST(cubicOp14d), 2133 TEST(cubicOp13d), 2134 TEST(cubicOp12d), 2135 TEST(cubicOp11d), 2136 TEST(cubicOp10d), 2137 TEST(cubicOp1i), 2138 TEST(cubicOp9d), 2139 TEST(quadOp9d), 2140 TEST(lineOp9d), 2141 TEST(cubicOp8d), 2142 TEST(cubicOp7d), 2143 TEST(cubicOp6d), 2144 TEST(cubicOp5d), 2145 TEST(cubicOp3d), 2146 TEST(cubicOp2d), 2147 TEST(cubicOp1d), 2148 }; 2149 2150 static const size_t testCount = SK_ARRAY_COUNT(tests); 2151 2152 static struct TestDesc subTests[] = { 2153 TEST(cubicOp6d), 2154 TEST(cubicOp8d), 2155 TEST(cubicOp70d), 2156 TEST(cubicOp16d), 2157 TEST(skp5), 2158 }; 2159 2160 static const size_t subTestCount = SK_ARRAY_COUNT(subTests); 2161 2162 static void (*firstSubTest)(skiatest::Reporter* ) = 0; 2163 2164 static bool runSubTestsFirst = false; 2165 static bool runReverse = false; 2166 static void (*stopTest)(skiatest::Reporter* ) = 0; 2167 2168 static void PathOpsOpTest(skiatest::Reporter* reporter) { 2169 #ifdef SK_DEBUG 2170 gDebugMaxWindSum = 4; 2171 gDebugMaxWindValue = 4; 2172 #endif 2173 #if DEBUG_SHOW_TEST_NAME 2174 strncpy(DEBUG_FILENAME_STRING, "", DEBUG_FILENAME_STRING_LENGTH); 2175 #endif 2176 if (runSubTestsFirst) { 2177 RunTestSet(reporter, subTests, subTestCount, firstSubTest, stopTest, runReverse); 2178 } 2179 RunTestSet(reporter, tests, testCount, firstTest, stopTest, runReverse); 2180 if (!runSubTestsFirst) { 2181 RunTestSet(reporter, subTests, subTestCount, firstSubTest, stopTest, runReverse); 2182 } 2183 #ifdef SK_DEBUG 2184 gDebugMaxWindSum = SK_MaxS32; 2185 gDebugMaxWindValue = SK_MaxS32; 2186 #endif 2187 } 2188 2189 #include "TestClassDef.h" 2190 DEFINE_TESTCLASS_SHORT(PathOpsOpTest) 2191