Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(134)

Side by Side Diff: include/core/SkPath.h

Issue 1176953002: move SkPath direction-as-computed into SkPathPriv (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
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 7
8 #ifndef SkPath_DEFINED 8 #ifndef SkPath_DEFINED
9 #define SkPath_DEFINED 9 #define SkPath_DEFINED
10 10
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 void arcTo(const SkPoint p1, const SkPoint p2, SkScalar radius) { 485 void arcTo(const SkPoint p1, const SkPoint p2, SkScalar radius) {
486 this->arcTo(p1.fX, p1.fY, p2.fX, p2.fY, radius); 486 this->arcTo(p1.fX, p1.fY, p2.fX, p2.fY, radius);
487 } 487 }
488 488
489 /** Close the current contour. If the current point is not equal to the 489 /** Close the current contour. If the current point is not equal to the
490 first point of the contour, a line segment is automatically added. 490 first point of the contour, a line segment is automatically added.
491 */ 491 */
492 void close(); 492 void close();
493 493
494 enum Direction { 494 enum Direction {
495 /** Direction either has not been or could not be computed */
496 kUnknown_Direction,
497 /** clockwise direction for adding closed contours */ 495 /** clockwise direction for adding closed contours */
498 kCW_Direction, 496 kCW_Direction,
499 /** counter-clockwise direction for adding closed contours */ 497 /** counter-clockwise direction for adding closed contours */
500 kCCW_Direction, 498 kCCW_Direction,
501 }; 499 };
502 500
503 /** 501 /**
504 * Return the opposite of the specified direction. kUnknown is its own
505 * opposite.
506 */
507 static Direction OppositeDirection(Direction dir) {
508 static const Direction gOppositeDir[] = {
509 kUnknown_Direction, kCCW_Direction, kCW_Direction
510 };
511 return gOppositeDir[dir];
512 }
513
514 /**
515 * Returns whether or not a fill type is inverted 502 * Returns whether or not a fill type is inverted
516 * 503 *
517 * kWinding_FillType -> false 504 * kWinding_FillType -> false
518 * kEvenOdd_FillType -> false 505 * kEvenOdd_FillType -> false
519 * kInverseWinding_FillType -> true 506 * kInverseWinding_FillType -> true
520 * kInverseEvenOdd_FillType -> true 507 * kInverseEvenOdd_FillType -> true
521 */ 508 */
522 static bool IsInverseFillType(FillType fill) { 509 static bool IsInverseFillType(FillType fill) {
523 SK_COMPILE_ASSERT(0 == kWinding_FillType, fill_type_mismatch); 510 SK_COMPILE_ASSERT(0 == kWinding_FillType, fill_type_mismatch);
524 SK_COMPILE_ASSERT(1 == kEvenOdd_FillType, fill_type_mismatch); 511 SK_COMPILE_ASSERT(1 == kEvenOdd_FillType, fill_type_mismatch);
(...skipping 12 matching lines...) Expand all
537 */ 524 */
538 static FillType ConvertToNonInverseFillType(FillType fill) { 525 static FillType ConvertToNonInverseFillType(FillType fill) {
539 SK_COMPILE_ASSERT(0 == kWinding_FillType, fill_type_mismatch); 526 SK_COMPILE_ASSERT(0 == kWinding_FillType, fill_type_mismatch);
540 SK_COMPILE_ASSERT(1 == kEvenOdd_FillType, fill_type_mismatch); 527 SK_COMPILE_ASSERT(1 == kEvenOdd_FillType, fill_type_mismatch);
541 SK_COMPILE_ASSERT(2 == kInverseWinding_FillType, fill_type_mismatch); 528 SK_COMPILE_ASSERT(2 == kInverseWinding_FillType, fill_type_mismatch);
542 SK_COMPILE_ASSERT(3 == kInverseEvenOdd_FillType, fill_type_mismatch); 529 SK_COMPILE_ASSERT(3 == kInverseEvenOdd_FillType, fill_type_mismatch);
543 return (FillType)(fill & 1); 530 return (FillType)(fill & 1);
544 } 531 }
545 532
546 /** 533 /**
547 * Tries to quickly compute the direction of the first non-degenerate
548 * contour. If it can be computed, return true and set dir to that
549 * direction. If it cannot be (quickly) determined, return false and ignore
550 * the dir parameter. If the direction was determined, it is cached to make
551 * subsequent calls return quickly.
552 */
553 bool cheapComputeDirection(Direction* dir) const;
554
555 /**
556 * Returns true if the path's direction can be computed via
557 * cheapComputDirection() and if that computed direction matches the
558 * specified direction. If dir is kUnknown, returns true if the direction
559 * cannot be computed.
560 */
561 bool cheapIsDirection(Direction dir) const {
562 Direction computedDir = kUnknown_Direction;
563 (void)this->cheapComputeDirection(&computedDir);
564 return computedDir == dir;
565 }
566
567 /**
568 * Returns true if the path specifies a rectangle. 534 * Returns true if the path specifies a rectangle.
569 * 535 *
570 * If this returns false, then all output parameters are ignored, and left 536 * If this returns false, then all output parameters are ignored, and left
571 * unchanged. If this returns true, then each of the output parameters 537 * unchanged. If this returns true, then each of the output parameters
572 * are checked for NULL. If they are not, they return their value. 538 * are checked for NULL. If they are not, they return their value.
573 * 539 *
574 * @param rect If not null, set to the bounds of the rectangle. 540 * @param rect If not null, set to the bounds of the rectangle.
575 * Note : this bounds may be smaller than the path's bounds, si nce it is just 541 * Note : this bounds may be smaller than the path's bounds, si nce it is just
576 * the bounds of the "drawable" parts of the path. e.g. a trail ing MoveTo would 542 * the bounds of the "drawable" parts of the path. e.g. a trail ing MoveTo would
577 * be ignored in this rect, but not by the path's bounds 543 * be ignored in this rect, but not by the path's bounds
(...skipping 13 matching lines...) Expand all
591 557
592 @param rect If not null, returns the path as a pair of nested rectangles 558 @param rect If not null, returns the path as a pair of nested rectangles
593 @param dirs If not null, returns the direction of the rects 559 @param dirs If not null, returns the direction of the rects
594 @return true if the path describes a pair of nested rectangles 560 @return true if the path describes a pair of nested rectangles
595 */ 561 */
596 bool isNestedFillRects(SkRect rect[2], Direction dirs[2] = NULL) const; 562 bool isNestedFillRects(SkRect rect[2], Direction dirs[2] = NULL) const;
597 563
598 /** 564 /**
599 * Add a closed rectangle contour to the path 565 * Add a closed rectangle contour to the path
600 * @param rect The rectangle to add as a closed contour to the path 566 * @param rect The rectangle to add as a closed contour to the path
601 * @param dir The direction to wind the rectangle's contour. Cannot be 567 * @param dir The direction to wind the rectangle's contour.
602 * kUnknown_Direction.
603 */ 568 */
604 void addRect(const SkRect& rect, Direction dir = kCW_Direction); 569 void addRect(const SkRect& rect, Direction dir = kCW_Direction);
605 570
606 /** 571 /**
607 * Add a closed rectangle contour to the path 572 * Add a closed rectangle contour to the path
608 * 573 *
609 * @param left The left side of a rectangle to add as a closed contour 574 * @param left The left side of a rectangle to add as a closed contour
610 * to the path 575 * to the path
611 * @param top The top of a rectangle to add as a closed contour to the 576 * @param top The top of a rectangle to add as a closed contour to the
612 * path 577 * path
613 * @param right The right side of a rectangle to add as a closed contour 578 * @param right The right side of a rectangle to add as a closed contour
614 * to the path 579 * to the path
615 * @param bottom The bottom of a rectangle to add as a closed contour to 580 * @param bottom The bottom of a rectangle to add as a closed contour to
616 * the path 581 * the path
617 * @param dir The direction to wind the rectangle's contour. Cannot be 582 * @param dir The direction to wind the rectangle's contour.
618 * kUnknown_Direction.
619 */ 583 */
620 void addRect(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom, 584 void addRect(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom,
621 Direction dir = kCW_Direction); 585 Direction dir = kCW_Direction);
622 586
623 /** 587 /**
624 * Add a closed oval contour to the path 588 * Add a closed oval contour to the path
625 * 589 *
626 * @param oval The bounding oval to add as a closed contour to the path 590 * @param oval The bounding oval to add as a closed contour to the path
627 * @param dir The direction to wind the oval's contour. Cannot be 591 * @param dir The direction to wind the oval's contour.
628 * kUnknown_Direction.
629 */ 592 */
630 void addOval(const SkRect& oval, Direction dir = kCW_Direction); 593 void addOval(const SkRect& oval, Direction dir = kCW_Direction);
631 594
632 /** 595 /**
633 * Add a closed circle contour to the path 596 * Add a closed circle contour to the path
634 * 597 *
635 * @param x The x-coordinate of the center of a circle to add as a 598 * @param x The x-coordinate of the center of a circle to add as a
636 * closed contour to the path 599 * closed contour to the path
637 * @param y The y-coordinate of the center of a circle to add as a 600 * @param y The y-coordinate of the center of a circle to add as a
638 * closed contour to the path 601 * closed contour to the path
639 * @param radius The radius of a circle to add as a closed contour to the 602 * @param radius The radius of a circle to add as a closed contour to the
640 * path 603 * path
641 * @param dir The direction to wind the circle's contour. Cannot be 604 * @param dir The direction to wind the circle's contour.
642 * kUnknown_Direction.
643 */ 605 */
644 void addCircle(SkScalar x, SkScalar y, SkScalar radius, 606 void addCircle(SkScalar x, SkScalar y, SkScalar radius,
645 Direction dir = kCW_Direction); 607 Direction dir = kCW_Direction);
646 608
647 /** Add the specified arc to the path as a new contour. 609 /** Add the specified arc to the path as a new contour.
648 610
649 @param oval The bounds of oval used to define the size of the arc 611 @param oval The bounds of oval used to define the size of the arc
650 @param startAngle Starting angle (in degrees) where the arc begins 612 @param startAngle Starting angle (in degrees) where the arc begins
651 @param sweepAngle Sweep angle (in degrees) measured clockwise 613 @param sweepAngle Sweep angle (in degrees) measured clockwise
652 */ 614 */
653 void addArc(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle); 615 void addArc(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle);
654 616
655 /** 617 /**
656 * Add a closed round-rectangle contour to the path 618 * Add a closed round-rectangle contour to the path
657 * @param rect The bounds of a round-rectangle to add as a closed contour 619 * @param rect The bounds of a round-rectangle to add as a closed contour
658 * @param rx The x-radius of the rounded corners on the round-rectangle 620 * @param rx The x-radius of the rounded corners on the round-rectangle
659 * @param ry The y-radius of the rounded corners on the round-rectangle 621 * @param ry The y-radius of the rounded corners on the round-rectangle
660 * @param dir The direction to wind the rectangle's contour. Cannot be 622 * @param dir The direction to wind the rectangle's contour.
661 * kUnknown_Direction.
662 */ 623 */
663 void addRoundRect(const SkRect& rect, SkScalar rx, SkScalar ry, 624 void addRoundRect(const SkRect& rect, SkScalar rx, SkScalar ry,
664 Direction dir = kCW_Direction); 625 Direction dir = kCW_Direction);
665 626
666 /** 627 /**
667 * Add a closed round-rectangle contour to the path. Each corner receives 628 * Add a closed round-rectangle contour to the path. Each corner receives
668 * two radius values [X, Y]. The corners are ordered top-left, top-right, 629 * two radius values [X, Y]. The corners are ordered top-left, top-right,
669 * bottom-right, bottom-left. 630 * bottom-right, bottom-left.
670 * @param rect The bounds of a round-rectangle to add as a closed contour 631 * @param rect The bounds of a round-rectangle to add as a closed contour
671 * @param radii Array of 8 scalars, 4 [X,Y] pairs for each corner 632 * @param radii Array of 8 scalars, 4 [X,Y] pairs for each corner
672 * @param dir The direction to wind the rectangle's contour. Cannot be 633 * @param dir The direction to wind the rectangle's contour.
673 * kUnknown_Direction.
674 * Note: The radii here now go through the same constraint handling as the 634 * Note: The radii here now go through the same constraint handling as the
675 * SkRRect radii (i.e., either radii at a corner being 0 implies a 635 * SkRRect radii (i.e., either radii at a corner being 0 implies a
676 * sqaure corner and oversized radii are proportionally scaled down). 636 * sqaure corner and oversized radii are proportionally scaled down).
677 */ 637 */
678 void addRoundRect(const SkRect& rect, const SkScalar radii[], 638 void addRoundRect(const SkRect& rect, const SkScalar radii[],
679 Direction dir = kCW_Direction); 639 Direction dir = kCW_Direction);
680 640
681 /** 641 /**
682 * Add an SkRRect contour to the path 642 * Add an SkRRect contour to the path
683 * @param rrect The rounded rect to add as a closed contour 643 * @param rrect The rounded rect to add as a closed contour
684 * @param dir The winding direction for the new contour. Cannot be 644 * @param dir The winding direction for the new contour.
685 * kUnknown_Direction.
686 */ 645 */
687 void addRRect(const SkRRect& rrect, Direction dir = kCW_Direction); 646 void addRRect(const SkRRect& rrect, Direction dir = kCW_Direction);
688 647
689 /** 648 /**
690 * Add a new contour made of just lines. This is just a fast version of 649 * Add a new contour made of just lines. This is just a fast version of
691 * the following: 650 * the following:
692 * this->moveTo(pts[0]); 651 * this->moveTo(pts[0]);
693 * for (int i = 1; i < count; ++i) { 652 * for (int i = 1; i < count; ++i) {
694 * this->lineTo(pts[i]); 653 * this->lineTo(pts[i]);
695 * } 654 * }
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
969 kConvexity_SerializationShift = 16, // requires 8 bits 928 kConvexity_SerializationShift = 16, // requires 8 bits
970 kFillType_SerializationShift = 8, // requires 8 bits 929 kFillType_SerializationShift = 8, // requires 8 bits
971 // 8 free bits at 0 930 // 8 free bits at 0
972 }; 931 };
973 932
974 SkAutoTUnref<SkPathRef> fPathRef; 933 SkAutoTUnref<SkPathRef> fPathRef;
975 934
976 int fLastMoveToIndex; 935 int fLastMoveToIndex;
977 uint8_t fFillType; 936 uint8_t fFillType;
978 mutable uint8_t fConvexity; 937 mutable uint8_t fConvexity;
979 mutable uint8_t fDirection; 938 mutable uint8_t fFirstDirection; // SkPathPriv::FirstDirection
980 mutable SkBool8 fIsVolatile; 939 mutable SkBool8 fIsVolatile;
981 940
982 /** Resets all fields other than fPathRef to their initial 'empty' values. 941 /** Resets all fields other than fPathRef to their initial 'empty' values.
983 * Assumes the caller has already emptied fPathRef. 942 * Assumes the caller has already emptied fPathRef.
984 * On Android increments fGenerationID without reseting it. 943 * On Android increments fGenerationID without reseting it.
985 */ 944 */
986 void resetFields(); 945 void resetFields();
987 946
988 /** Sets all fields other than fPathRef to the values in 'that'. 947 /** Sets all fields other than fPathRef to the values in 'that'.
989 * Assumes the caller has already set fPathRef. 948 * Assumes the caller has already set fPathRef.
990 * Doesn't change fGenerationID or fSourcePath on Android. 949 * Doesn't change fGenerationID or fSourcePath on Android.
991 */ 950 */
992 void copyFields(const SkPath& that); 951 void copyFields(const SkPath& that);
993 952
994 friend class Iter; 953 friend class Iter;
995 954 friend class SkPathPriv;
996 friend class SkPathStroker; 955 friend class SkPathStroker;
997 956
998 /* Append, in reverse order, the first contour of path, ignoring path's 957 /* Append, in reverse order, the first contour of path, ignoring path's
999 last point. If no moveTo() call has been made for this contour, the 958 last point. If no moveTo() call has been made for this contour, the
1000 first point is automatically set to (0,0). 959 first point is automatically set to (0,0).
1001 */ 960 */
1002 void reversePathTo(const SkPath&); 961 void reversePathTo(const SkPath&);
1003 962
1004 // called before we add points for lineTo, quadTo, cubicTo, checking to see 963 // called before we add points for lineTo, quadTo, cubicTo, checking to see
1005 // if we need to inject a leading moveTo first 964 // if we need to inject a leading moveTo first
(...skipping 29 matching lines...) Expand all
1035 void setPt(int index, SkScalar x, SkScalar y); 994 void setPt(int index, SkScalar x, SkScalar y);
1036 995
1037 friend class SkAutoPathBoundsUpdate; 996 friend class SkAutoPathBoundsUpdate;
1038 friend class SkAutoDisableOvalCheck; 997 friend class SkAutoDisableOvalCheck;
1039 friend class SkAutoDisableDirectionCheck; 998 friend class SkAutoDisableDirectionCheck;
1040 friend class SkBench_AddPathTest; // perf test reversePathTo 999 friend class SkBench_AddPathTest; // perf test reversePathTo
1041 friend class PathTest_Private; // unit test reversePathTo 1000 friend class PathTest_Private; // unit test reversePathTo
1042 }; 1001 };
1043 1002
1044 #endif 1003 #endif
OLDNEW
« no previous file with comments | « gm/strokefill.cpp ('k') | src/core/SkPath.cpp » ('j') | src/core/SkPath.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698