Lines Matching refs:stack
25 // Build up a clip stack with a path, an empty clip, and a rect.
124 static void assert_count(skiatest::Reporter* reporter, const SkClipStack& stack,
126 SkClipStack::B2TIter iter(stack);
137 SkClipStack stack;
148 stack.clipDevRect(gRects[i], SkRegion::kUnion_Op, false);
151 assert_count(reporter, stack, 4);
157 SkClipStack::B2TIter iter(stack);
172 SkClipStack::Iter iter(stack, SkClipStack::Iter::kTop_IterStart);
187 SkClipStack::Iter iter(stack, SkClipStack::Iter::kBottom_IterStart);
247 SkClipStack stack;
256 stack.save();
266 stack.clipDevRect(rectA, SkRegion::kIntersect_Op, false);
267 stack.clipDevRect(rectB, gOps[op], false);
269 stack.clipDevPath(clipA, SkRegion::kIntersect_Op, false);
270 stack.clipDevPath(clipB, gOps[op], false);
273 REPORTER_ASSERT(reporter, !stack.isWideOpen());
275 stack.getConservativeBounds(0, 0, 100, 100, &devClipBound,
289 stack.restore();
302 // Stack should initially be wide open
304 SkClipStack stack;
306 REPORTER_ASSERT(reporter, stack.isWideOpen());
311 SkClipStack stack;
321 stack.clipDevPath(clipA, SkRegion::kReplace_Op, false);
322 stack.clipDevPath(clipB, SkRegion::kUnion_Op, false);
324 REPORTER_ASSERT(reporter, stack.isWideOpen());
329 SkClipStack stack;
331 stack.clipDevRect(rectA, SkRegion::kUnion_Op, false);
333 REPORTER_ASSERT(reporter, stack.isWideOpen());
338 SkClipStack stack;
343 stack.clipDevRect(emptyRect, SkRegion::kDifference_Op, false);
345 REPORTER_ASSERT(reporter, stack.isWideOpen());
350 SkClipStack stack;
352 stack.save();
354 stack.clipDevRect(rectA, SkRegion::kReplace_Op, false);
356 REPORTER_ASSERT(reporter, !stack.isWideOpen());
358 stack.restore();
360 REPORTER_ASSERT(reporter, stack.isWideOpen());
364 static int count(const SkClipStack& stack) {
366 SkClipStack::Iter iter(stack, SkClipStack::Iter::kTop_IterStart);
385 SkClipStack stack;
386 stack.clipDevPath(path, SkRegion::kIntersect_Op, false);
390 stack.getBounds(&bounds, &boundsType);
411 SkClipStack stack;
413 stack.clipDevRect(overlapLeft, SkRegion::kReplace_Op, false);
415 stack.clipDevRect(overlapRight, SkRegion::kIntersect_Op, false);
417 REPORTER_ASSERT(reporter, 1 == count(stack));
419 stack.getBounds(&bound, &type, &isIntersectionOfRects);
426 SkClipStack stack;
428 stack.clipDevRect(overlapLeft, SkRegion::kReplace_Op, true);
430 stack.clipDevRect(overlapRight, SkRegion::kIntersect_Op, true);
432 REPORTER_ASSERT(reporter, 1 == count(stack));
434 stack.getBounds(&bound, &type, &isIntersectionOfRects);
441 SkClipStack stack;
443 stack.clipDevRect(overlapLeft, SkRegion::kReplace_Op, true);
445 stack.clipDevRect(overlapRight, SkRegion::kIntersect_Op, false);
447 REPORTER_ASSERT(reporter, 2 == count(stack));
449 stack.getBounds(&bound, &type, &isIntersectionOfRects);
456 SkClipStack stack;
458 stack.clipDevRect(nestedParent, SkRegion::kReplace_Op, true);
460 stack.clipDevRect(nestedChild, SkRegion::kIntersect_Op, false);
462 REPORTER_ASSERT(reporter, 1 == count(stack));
464 stack.getBounds(&bound, &type, &isIntersectionOfRects);
471 SkClipStack stack;
473 stack.clipDevRect(nestedParent, SkRegion::kReplace_Op, false);
475 stack.clipDevRect(nestedChild, SkRegion::kIntersect_Op, true);
477 REPORTER_ASSERT(reporter, 1 == count(stack));
479 stack.getBounds(&bound, &type, &isIntersectionOfRects);
486 SkClipStack stack;
488 stack.clipDevRect(nestedChild, SkRegion::kReplace_Op, false);
490 stack.clipDevRect(nestedParent, SkRegion::kIntersect_Op, true);
492 REPORTER_ASSERT(reporter, 2 == count(stack));
494 stack.getBounds(&bound, &type, &isIntersectionOfRects);
517 SkClipStack stack;
518 stack.clipDevRect(outsideRect, SkRegion::kDifference_Op, false);
520 REPORTER_ASSERT(reporter, false == stack.quickContains(testRect));
525 SkClipStack stack;
526 stack.clipDevRect(outsideRect, SkRegion::kReplace_Op, false);
527 REPORTER_ASSERT(reporter, true == stack.quickContains(testRect));
531 SkClipStack stack;
532 stack.clipDevRect(insideRect, SkRegion::kIntersect_Op, false);
533 stack.save(); // To prevent in-place substitution by replace OP
534 stack.clipDevRect(outsideRect, SkRegion::kReplace_Op, false);
535 REPORTER_ASSERT(reporter, true == stack.quickContains(testRect));
536 stack.restore();
540 SkClipStack stack;
541 stack.clipDevRect(outsideRect, SkRegion::kIntersect_Op, false);
542 stack.save(); // To prevent in-place substitution by replace OP
543 stack.clipDevRect(insideRect, SkRegion::kReplace_Op, false);
544 REPORTER_ASSERT(reporter, false == stack.quickContains(testRect));
545 stack.restore();
550 SkClipStack stack;
551 stack.clipDevRect(insideRect, SkRegion::kIntersect_Op, false);
553 stack
554 REPORTER_ASSERT(reporter, false == stack.quickContains(testRect));
559 SkClipStack stack;
560 stack.clipDevRect(outsideRect, SkRegion::kIntersect_Op, false);
561 REPORTER_ASSERT(reporter, true == stack.quickContains(testRect));
565 SkClipStack stack;
566 stack.clipDevRect(insideRect, SkRegion::kIntersect_Op, false);
567 REPORTER_ASSERT(reporter, false == stack.quickContains(testRect));
571 SkClipStack stack;
572 stack.clipDevRect(intersectingRect, SkRegion::kIntersect_Op, false);
573 REPORTER_ASSERT(reporter, false == stack.quickContains(testRect));
577 SkClipStack stack;
578 stack.clipDevRect(nonIntersectingRect, SkRegion::kIntersect_Op, false);
579 REPORTER_ASSERT(reporter, false == stack.quickContains(testRect));
584 SkClipStack stack;
585 stack.clipDevPath(outsideCircle, SkRegion::kIntersect_Op, false);
586 REPORTER_ASSERT(reporter, true == stack.quickContains(testRect));
590 SkClipStack stack;
591 stack.clipDevPath(insideCircle, SkRegion::kIntersect_Op, false);
592 REPORTER_ASSERT(reporter, false == stack.quickContains(testRect));
596 SkClipStack stack;
597 stack.clipDevPath(intersectingCircle, SkRegion::kIntersect_Op, false);
598 REPORTER_ASSERT(reporter, false == stack.quickContains(testRect));
602 SkClipStack stack;
603 stack.clipDevPath(nonIntersectingCircle, SkRegion::kIntersect_Op, false);
604 REPORTER_ASSERT(reporter, false == stack.quickContains(testRect));
609 SkClipStack stack;
613 stack.clipDevPath(path, SkRegion::kIntersect_Op, false);
614 REPORTER_ASSERT(reporter, false == stack.quickContains(testRect));
618 SkClipStack stack;
622 stack.clipDevPath(path, SkRegion::kIntersect_Op, false);
623 REPORTER_ASSERT(reporter, false == stack.quickContains(testRect));
627 SkClipStack stack;
631 stack.clipDevPath(path, SkRegion::kIntersect_Op, false);
632 REPORTER_ASSERT(reporter, false == stack.quickContains(testRect));
636 SkClipStack stack;
640 stack.clipDevPath(path, SkRegion::kIntersect_Op, false);
641 REPORTER_ASSERT(reporter, true == stack.quickContains(testRect));
646 SkClipStack stack;
649 stack.clipDevPath(path, SkRegion::kIntersect_Op, false);
650 REPORTER_ASSERT(reporter, false == stack.quickContains(testRect));
654 SkClipStack stack;
657 stack.clipDevPath(path, SkRegion::kIntersect_Op, false);
658 REPORTER_ASSERT(reporter, false == stack.quickContains(testRect));
662 SkClipStack stack;
665 stack.clipDevPath(path, SkRegion::kIntersect_Op, false);
666 REPORTER_ASSERT(reporter, false == stack.quickContains(testRect));
670 SkClipStack stack;
673 stack.clipDevPath(path, SkRegion::kIntersect_Op, false);
674 REPORTER_ASSERT(reporter, true == stack.quickContains(testRect));
681 // Functions that add a shape to the clip stack. The shape is computed from a rectangle.
682 // AA is always disabled since the clip stack reducer can cause changes in aa rasterization of the
683 // stack. A fractional edge repeated in different elements may be rasterized fewer times using the
684 // reduced stack.
688 SkClipStack* stack);
690 static void add_round_rect(const SkRect& rect, bool invert, SkRegion::Op op, SkClipStack* stack) {
698 stack->clipDevPath(path, op, false);
701 static void add_rect(const SkRect& rect, bool invert, SkRegion::Op op, SkClipStack* stack) {
706 stack->clipDevPath(path, op, false);
708 stack->clipDevRect(rect, op, false);
712 static void add_oval(const SkRect& rect, bool invert, SkRegion::Op op, SkClipStack* stack) {
718 stack->clipDevPath(path, op, false);
721 static void add_elem_to_stack(const SkClipStack::Element& element, SkClipStack* stack) {
724 stack->clipDevRect(element.getRect(), element.getOp(), element.isAA());
727 stack->clipDevPath(element.getPath(), element.getOp(), element.isAA());
731 stack->clipEmpty();
760 // This can assist with debugging the clip stack reduction code when the test below fails.
826 // Randomly generate a clip stack.
827 SkClipStack stack;
838 // saves can change the clip stack behavior when an element is added.
851 kElementFuncs[r.nextULessThan(SK_ARRAY_COUNT(kElementFuncs))](rect, invert, op, &stack);
853 stack.save();
863 // Get the reduced version of the stack.
869 GrReducedClip::ReduceClipStack(stack,
875 // Build a new clip stack based on the reduced clip elements
890 // convert both the original stack and reduced stack to SkRegions and see if they're equal
896 SkClipStack::Iter iter(stack, SkClipStack::Iter::kBottom_IterStart);
915 SkClipStack stack;
917 REPORTER_ASSERT(reporter, 0 == stack.getSaveCount());
918 assert_count(reporter, stack, 0);
927 stack.clipDevRect(gRects[i], SkRegion::kIntersect_Op);
931 SkClipStack::B2TIter iter(stack);
943 stack.reset();
944 REPORTER_ASSERT(reporter, 0 == stack.getSaveCount());
945 assert_count(reporter, stack, 0);