OLD | NEW |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #ifndef SkPath_DEFINED | 10 #ifndef SkPath_DEFINED |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
86 /** Returns true if the filltype is one of the Inverse variants */ | 86 /** Returns true if the filltype is one of the Inverse variants */ |
87 bool isInverseFillType() const { return IsInverseFillType((FillType)fFillTyp e); } | 87 bool isInverseFillType() const { return IsInverseFillType((FillType)fFillTyp e); } |
88 | 88 |
89 /** | 89 /** |
90 * Toggle between inverse and normal filltypes. This reverse the return | 90 * Toggle between inverse and normal filltypes. This reverse the return |
91 * value of isInverseFillType() | 91 * value of isInverseFillType() |
92 */ | 92 */ |
93 void toggleInverseFillType() { | 93 void toggleInverseFillType() { |
94 fFillType ^= 2; | 94 fFillType ^= 2; |
95 GEN_ID_INC; | 95 GEN_ID_INC; |
96 } | 96 } |
97 | 97 |
98 enum Convexity { | 98 enum Convexity { |
99 kUnknown_Convexity, | 99 kUnknown_Convexity = SkPathRef::kUnknown_Convexity, |
100 kConvex_Convexity, | 100 kConvex_Convexity = SkPathRef::kConvex_Convexity, |
101 kConcave_Convexity | 101 kConcave_Convexity = SkPathRef::kConcave_Convexity |
caryclark
2013/10/03 20:36:15
I don't agree with exposing the implementation in
bsalomon
2013/10/03 20:40:23
Would it make sense to promote Convexity to SkConv
| |
102 }; | 102 }; |
103 | 103 |
104 /** | 104 /** |
105 * Return the path's convexity, as stored in the path. If it is currently u nknown, | 105 * Return the path's convexity, as stored in the path. If it is currently u nknown, |
106 * then this function will attempt to compute the convexity (and cache the result). | 106 * then this function will attempt to compute the convexity (and cache the result). |
107 */ | 107 */ |
108 Convexity getConvexity() const { | 108 Convexity getConvexity() const { |
109 if (kUnknown_Convexity != fConvexity) { | 109 return static_cast<Convexity>(fPathRef->getConvexity()); |
110 return static_cast<Convexity>(fConvexity); | |
111 } else { | |
112 return this->internalGetConvexity(); | |
113 } | |
114 } | 110 } |
115 | 111 |
116 /** | 112 /** |
117 * Return the currently cached value for convexity, even if that is set to | 113 * Return the currently cached value for convexity, even if that is set to |
118 * kUnknown_Convexity. Note: getConvexity() will automatically call | 114 * kUnknown_Convexity. Note: getConvexity() will automatically call |
119 * ComputeConvexity and cache its return value if the current setting is | 115 * ComputeConvexity and cache its return value if the current setting is |
120 * kUnknown. | 116 * kUnknown. |
121 */ | 117 */ |
122 Convexity getConvexityOrUnknown() const { return (Convexity)fConvexity; } | 118 Convexity getConvexityOrUnknown() const { |
119 return static_cast<Convexity>(fPathRef->getConvexityOrUnknown()); | |
120 } | |
123 | 121 |
124 /** | 122 /** |
125 * Store a convexity setting in the path. There is no automatic check to | 123 * Store a convexity setting in the path. There is no automatic check to |
126 * see if this value actually agrees with the return value that would be | 124 * see if this value actually agrees with the return value that would be |
127 * computed by getConvexity(). | 125 * computed by getConvexity(). |
128 * | 126 * |
129 * Note: even if this is set to a "known" value, if the path is later | 127 * Note: even if this is set to a "known" value, if the path is later |
130 * changed (e.g. lineTo(), addRect(), etc.) then the cached value will be | 128 * changed (e.g. lineTo(), addRect(), etc.) then the cached value will be |
131 * reset to kUnknown_Convexity. | 129 * reset to kUnknown_Convexity. |
132 */ | 130 */ |
133 void setConvexity(Convexity); | 131 void setConvexity(Convexity); |
134 | 132 |
135 /** | 133 /** |
136 * DEPRECATED: use getConvexity() | 134 * DEPRECATED: use getConvexity() |
137 * Returns true if the path is flagged as being convex. This is not a | 135 * Returns true if the path is flagged as being convex. This is not a |
138 * confirmed by any analysis, it is just the value set earlier. | 136 * confirmed by any analysis, it is just the value set earlier. |
139 */ | 137 */ |
140 bool isConvex() const { | 138 bool isConvex() const { |
141 return kConvex_Convexity == this->getConvexity(); | 139 return SkPathRef::kConvex_Convexity == this->getConvexity(); |
caryclark
2013/10/03 20:36:15
why is this change needed? Isn't the contract that
| |
142 } | 140 } |
143 | 141 |
144 /** | 142 /** |
145 * DEPRECATED: use setConvexity() | 143 * DEPRECATED: use setConvexity() |
146 * Set the isConvex flag to true or false. Convex paths may draw faster if | 144 * Set the isConvex flag to true or false. Convex paths may draw faster if |
147 * this flag is set, though setting this to true on a path that is in fact | 145 * this flag is set, though setting this to true on a path that is in fact |
148 * not convex can give undefined results when drawn. Paths default to | 146 * not convex can give undefined results when drawn. Paths default to |
149 * isConvex == false | 147 * isConvex == false |
150 */ | 148 */ |
151 void setIsConvex(bool isConvex) { | 149 void setIsConvex(bool isConvex) { |
152 this->setConvexity(isConvex ? kConvex_Convexity : kConcave_Convexity); | 150 this->setConvexity(isConvex ? kConvex_Convexity : kConcave_Convexity); |
153 } | 151 } |
154 | 152 |
155 /** Returns true if the path is an oval. | 153 /** Returns true if the path is an oval. |
156 * | 154 * |
157 * @param rect returns the bounding rect of this oval. It's a circle | 155 * @param rect returns the bounding rect of this oval. It's a circle |
158 * if the height and width are the same. | 156 * if the height and width are the same. |
159 * | 157 * |
160 * @return true if this path is an oval. | 158 * @return true if this path is an oval. |
161 * Tracking whether a path is an oval is considered an | 159 * Tracking whether a path is an oval is considered an |
162 * optimization for performance and so some paths that are in | 160 * optimization for performance and so some paths that are in |
163 * fact ovals can report false. | 161 * fact ovals can report false. |
164 */ | 162 */ |
165 bool isOval(SkRect* rect) const; | 163 bool isOval(SkRect* rect) const { return fPathRef->isOval(rect); } |
166 | 164 |
167 /** Clear any lines and curves from the path, making it empty. This frees up | 165 /** Clear any lines and curves from the path, making it empty. This frees up |
168 internal storage associated with those segments. | 166 internal storage associated with those segments. |
169 On Android, does not change fSourcePath. | 167 On Android, does not change fSourcePath. |
170 */ | 168 */ |
171 void reset(); | 169 void reset(); |
172 | 170 |
173 /** Similar to reset(), in that all lines and curves are removed from the | 171 /** Similar to reset(), in that all lines and curves are removed from the |
174 path. However, any internal storage for those lines/curves is retained, | 172 path. However, any internal storage for those lines/curves is retained, |
175 making reuse of the path potentially faster. | 173 making reuse of the path potentially faster. |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
450 this contour, to specify the 1st control point of a cubic curve | 448 this contour, to specify the 1st control point of a cubic curve |
451 @param dx2 The amount to add to the x-coordinate of the last point on | 449 @param dx2 The amount to add to the x-coordinate of the last point on |
452 this contour, to specify the 2nd control point of a cubic curve | 450 this contour, to specify the 2nd control point of a cubic curve |
453 @param dy2 The amount to add to the y-coordinate of the last point on | 451 @param dy2 The amount to add to the y-coordinate of the last point on |
454 this contour, to specify the 2nd control point of a cubic curve | 452 this contour, to specify the 2nd control point of a cubic curve |
455 @param dx3 The amount to add to the x-coordinate of the last point on | 453 @param dx3 The amount to add to the x-coordinate of the last point on |
456 this contour, to specify the end point of a cubic curve | 454 this contour, to specify the end point of a cubic curve |
457 @param dy3 The amount to add to the y-coordinate of the last point on | 455 @param dy3 The amount to add to the y-coordinate of the last point on |
458 this contour, to specify the end point of a cubic curve | 456 this contour, to specify the end point of a cubic curve |
459 */ | 457 */ |
460 void rCubicTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2, | 458 void rCubicTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2, |
461 SkScalar x3, SkScalar y3); | 459 SkScalar x3, SkScalar y3); |
462 | 460 |
463 /** Append the specified arc to the path as a new contour. If the start of | 461 /** Append the specified arc to the path as a new contour. If the start of |
464 the path is different from the path's current last point, then an | 462 the path is different from the path's current last point, then an |
465 automatic lineTo() is added to connect the current contour to the start | 463 automatic lineTo() is added to connect the current contour to the start |
466 of the arc. However, if the path is empty, then we call moveTo() with | 464 of the arc. However, if the path is empty, then we call moveTo() with |
467 the first point of the arc. The sweep angle is treated mod 360. | 465 the first point of the arc. The sweep angle is treated mod 360. |
468 | 466 |
469 @param oval The bounding oval defining the shape and size of the arc | 467 @param oval The bounding oval defining the shape and size of the arc |
470 @param startAngle Starting angle (in degrees) where the arc begins | 468 @param startAngle Starting angle (in degrees) where the arc begins |
471 @param sweepAngle Sweep angle (in degrees) measured clockwise. This is | 469 @param sweepAngle Sweep angle (in degrees) measured clockwise. This is |
472 treated mod 360. | 470 treated mod 360. |
473 @param forceMoveTo If true, always begin a new contour with the arc | 471 @param forceMoveTo If true, always begin a new contour with the arc |
474 */ | 472 */ |
475 void arcTo(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle, | 473 void arcTo(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle, |
476 bool forceMoveTo); | 474 bool forceMoveTo); |
477 | 475 |
478 /** Append a line and arc to the current path. This is the same as the | 476 /** Append a line and arc to the current path. This is the same as the |
479 PostScript call "arct". | 477 PostScript call "arct". |
480 */ | 478 */ |
481 void arcTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2, | 479 void arcTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2, |
482 SkScalar radius); | 480 SkScalar radius); |
483 | 481 |
484 /** Append a line and arc to the current path. This is the same as the | 482 /** Append a line and arc to the current path. This is the same as the |
485 PostScript call "arct". | 483 PostScript call "arct". |
486 */ | 484 */ |
487 void arcTo(const SkPoint p1, const SkPoint p2, SkScalar radius) { | 485 void arcTo(const SkPoint p1, const SkPoint p2, SkScalar radius) { |
488 this->arcTo(p1.fX, p1.fY, p2.fX, p2.fY, radius); | 486 this->arcTo(p1.fX, p1.fY, p2.fX, p2.fY, radius); |
489 } | 487 } |
490 | 488 |
491 /** 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 |
492 first point of the contour, a line segment is automatically added. | 490 first point of the contour, a line segment is automatically added. |
493 */ | 491 */ |
494 void close(); | 492 void close(); |
495 | 493 |
496 enum Direction { | 494 enum Direction { |
497 /** Direction either has not been or could not be computed */ | 495 /** Direction either has not been or could not be computed */ |
498 kUnknown_Direction, | 496 kUnknown_Direction = SkPathRef::kUnknown_Direction, |
499 /** clockwise direction for adding closed contours */ | 497 /** clockwise direction for adding closed contours */ |
500 kCW_Direction, | 498 kCW_Direction = SkPathRef::kCW_Direction, |
501 /** counter-clockwise direction for adding closed contours */ | 499 /** counter-clockwise direction for adding closed contours */ |
502 kCCW_Direction, | 500 kCCW_Direction = SkPathRef::kCCW_Direction, |
caryclark
2013/10/03 20:36:15
same feedback as convexity change above; would pre
| |
503 }; | 501 }; |
504 | 502 |
505 /** | 503 /** |
506 * Return the opposite of the specified direction. kUnknown is its own | 504 * Return the opposite of the specified direction. kUnknown is its own |
507 * opposite. | 505 * opposite. |
508 */ | 506 */ |
509 static Direction OppositeDirection(Direction dir) { | 507 static Direction OppositeDirection(Direction dir) { |
510 static const Direction gOppositeDir[] = { | 508 return (Direction) SkPathRef::OppositeDirection((SkPathRef::Direction)di r); |
caryclark
2013/10/03 20:36:15
you have static casts in similar changes above
| |
511 kUnknown_Direction, kCCW_Direction, kCW_Direction | |
512 }; | |
513 return gOppositeDir[dir]; | |
514 } | 509 } |
515 | 510 |
516 /** | 511 /** |
517 * Returns whether or not a fill type is inverted | 512 * Returns whether or not a fill type is inverted |
518 * | 513 * |
519 * kWinding_FillType -> false | 514 * kWinding_FillType -> false |
520 * kEvenOdd_FillType -> false | 515 * kEvenOdd_FillType -> false |
521 * kInverseWinding_FillType -> true | 516 * kInverseWinding_FillType -> true |
522 * kInverseEvenOdd_FillType -> true | 517 * kInverseEvenOdd_FillType -> true |
523 */ | 518 */ |
(...skipping 21 matching lines...) Expand all Loading... | |
545 return (FillType)(fill & 1); | 540 return (FillType)(fill & 1); |
546 } | 541 } |
547 | 542 |
548 /** | 543 /** |
549 * Tries to quickly compute the direction of the first non-degenerate | 544 * Tries to quickly compute the direction of the first non-degenerate |
550 * contour. If it can be computed, return true and set dir to that | 545 * contour. If it can be computed, return true and set dir to that |
551 * direction. If it cannot be (quickly) determined, return false and ignore | 546 * direction. If it cannot be (quickly) determined, return false and ignore |
552 * the dir parameter. If the direction was determined, it is cached to make | 547 * the dir parameter. If the direction was determined, it is cached to make |
553 * subsequent calls return quickly. | 548 * subsequent calls return quickly. |
554 */ | 549 */ |
555 bool cheapComputeDirection(Direction* dir) const; | 550 bool cheapComputeDirection(Direction* dir) const { |
551 return fPathRef->cheapComputeDirection((SkPathRef::Direction*) dir); | |
caryclark
2013/10/03 20:36:15
static cast
| |
552 } | |
556 | 553 |
557 /** | 554 /** |
558 * Returns true if the path's direction can be computed via | 555 * Returns true if the path's direction can be computed via |
559 * cheapComputDirection() and if that computed direction matches the | 556 * cheapComputDirection() and if that computed direction matches the |
560 * specified direction. If dir is kUnknown, returns true if the direction | 557 * specified direction. If dir is kUnknown, returns true if the direction |
561 * cannot be computed. | 558 * cannot be computed. |
562 */ | 559 */ |
563 bool cheapIsDirection(Direction dir) const { | 560 bool cheapIsDirection(Direction dir) const { |
564 Direction computedDir = kUnknown_Direction; | 561 Direction computedDir = kUnknown_Direction; |
565 (void)this->cheapComputeDirection(&computedDir); | 562 (void)this->cheapComputeDirection(&computedDir); |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
771 /** Set the last point on the path. If no points have been added, moveTo(p) | 768 /** Set the last point on the path. If no points have been added, moveTo(p) |
772 is automatically called. | 769 is automatically called. |
773 | 770 |
774 @param p The new location for the last point | 771 @param p The new location for the last point |
775 */ | 772 */ |
776 void setLastPt(const SkPoint& p) { | 773 void setLastPt(const SkPoint& p) { |
777 this->setLastPt(p.fX, p.fY); | 774 this->setLastPt(p.fX, p.fY); |
778 } | 775 } |
779 | 776 |
780 enum SegmentMask { | 777 enum SegmentMask { |
781 kLine_SegmentMask = 1 << 0, | 778 kLine_SegmentMask = SkPathRef::kLine_SegmentMask, |
782 kQuad_SegmentMask = 1 << 1, | 779 kQuad_SegmentMask = SkPathRef::kQuad_SegmentMask, |
783 kConic_SegmentMask = 1 << 2, | 780 kConic_SegmentMask = SkPathRef::kConic_SegmentMask, |
784 kCubic_SegmentMask = 1 << 3, | 781 kCubic_SegmentMask = SkPathRef::kCubic_SegmentMask, |
caryclark
2013/10/03 20:36:15
Additionally, this change makes Skia harder to use
| |
785 }; | 782 }; |
786 | 783 |
787 /** | 784 /** |
788 * Returns a mask, where each bit corresponding to a SegmentMask is | 785 * Returns a mask, where each bit corresponding to a SegmentMask is |
789 * set if the path contains 1 or more segments of that type. | 786 * set if the path contains 1 or more segments of that type. |
790 * Returns 0 for an empty path (no segments). | 787 * Returns 0 for an empty path (no segments). |
791 */ | 788 */ |
792 uint32_t getSegmentMasks() const { return fSegmentMask; } | 789 uint32_t getSegmentMasks() const { return fPathRef->getSegmentMasks(); } |
793 | 790 |
794 enum Verb { | 791 enum Verb { |
795 kMove_Verb, //!< iter.next returns 1 point | 792 kMove_Verb = SkPathRef::kMove_Verb, //!< iter.next returns 1 point |
796 kLine_Verb, //!< iter.next returns 2 points | 793 kLine_Verb = SkPathRef::kLine_Verb, //!< iter.next returns 2 points |
797 kQuad_Verb, //!< iter.next returns 3 points | 794 kQuad_Verb = SkPathRef::kQuad_Verb, //!< iter.next returns 3 points |
798 kConic_Verb, //!< iter.next returns 3 points + iter.conicWeight() | 795 kConic_Verb = SkPathRef::kConic_Verb, //!< iter.next returns 3 points + iter.conicWeight() |
799 kCubic_Verb, //!< iter.next returns 4 points | 796 kCubic_Verb = SkPathRef::kCubic_Verb, //!< iter.next returns 4 points |
800 kClose_Verb, //!< iter.next returns 1 point (contour's moveTo pt) | 797 kClose_Verb = SkPathRef::kClose_Verb, //!< iter.next returns 1 point (co ntour's moveTo pt) |
801 kDone_Verb, //!< iter.next returns 0 points | 798 kDone_Verb = SkPathRef::kDone_Verb, //!< iter.next returns 0 points |
caryclark
2013/10/03 20:36:15
another place to have compile time asserts
| |
802 }; | 799 }; |
803 | 800 |
804 /** Iterate through all of the segments (lines, quadratics, cubics) of | 801 /** Iterate through all of the segments (lines, quadratics, cubics) of |
805 each contours in a path. | 802 each contours in a path. |
806 | 803 |
807 The iterator cleans up the segments along the way, removing degenerate | 804 The iterator cleans up the segments along the way, removing degenerate |
808 segments and adding close verbs where necessary. When the forceClose | 805 segments and adding close verbs where necessary. When the forceClose |
809 argument is provided, each contour (as defined by a new starting | 806 argument is provided, each contour (as defined by a new starting |
810 move command) will be completed with a close verb regardless of the | 807 move command) will be completed with a close verb regardless of the |
811 contour's contents. | 808 contour's contents. |
812 */ | 809 */ |
813 class SK_API Iter { | 810 class SK_API Iter { |
814 public: | 811 public: |
815 Iter(); | 812 Iter(); |
816 Iter(const SkPath&, bool forceClose); | 813 Iter(const SkPath&, bool forceClose); |
814 Iter(const SkPathRef*, bool forceClose); | |
817 | 815 |
818 void setPath(const SkPath&, bool forceClose); | 816 void setPath(const SkPath&, bool forceClose); |
817 void setPathRef(const SkPathRef*, bool forceClose); | |
819 | 818 |
820 /** Return the next verb in this iteration of the path. When all | 819 /** Return the next verb in this iteration of the path. When all |
821 segments have been visited, return kDone_Verb. | 820 segments have been visited, return kDone_Verb. |
822 | 821 |
823 @param pts The points representing the current verb and/or segment | 822 @param pts The points representing the current verb and/or segment |
824 @param doConsumeDegerates If true, first scan for segments that are | 823 @param doConsumeDegerates If true, first scan for segments that are |
825 deemed degenerate (too short) and skip those. | 824 deemed degenerate (too short) and skip those. |
826 @return The verb for the current segment | 825 @return The verb for the current segment |
827 */ | 826 */ |
828 Verb next(SkPoint pts[4], bool doConsumeDegerates = true) { | 827 Verb next(SkPoint pts[4], bool doConsumeDegerates = true) { |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
925 const SkPath* getSourcePath() const; | 924 const SkPath* getSourcePath() const; |
926 void setSourcePath(const SkPath* path); | 925 void setSourcePath(const SkPath* path); |
927 #endif | 926 #endif |
928 | 927 |
929 SkDEBUGCODE(void validate() const;) | 928 SkDEBUGCODE(void validate() const;) |
930 | 929 |
931 private: | 930 private: |
932 enum SerializationOffsets { | 931 enum SerializationOffsets { |
933 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO O | 932 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO O |
934 kNewFormat_SerializationShift = 28, // requires 1 bit | 933 kNewFormat_SerializationShift = 28, // requires 1 bit |
934 kOldDirection_SerializationShift = 26, // requires 2 bits | |
935 kOldIsFinite_SerializationShift = 25, // 1 bit | |
936 kOldIsOval_SerializationShift = 24, // requires 1 bit | |
937 kOldConvexity_SerializationShift = 16, // requires 8 bits | |
938 #endif | |
939 // TODO: make this shift be 0 | |
940 kFillType_SerializationShift = 8, // requires 8 bits | |
941 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO O | |
942 kOldSegmentMask_SerializationShift = 0 // requires 4 bits | |
935 #endif | 943 #endif |
936 kDirection_SerializationShift = 26, // requires 2 bits | |
937 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO O | |
938 // rename to kUnused_SerializationShift | |
939 kOldIsFinite_SerializationShift = 25, // 1 bit | |
940 #endif | |
941 kIsOval_SerializationShift = 24, // requires 1 bit | |
942 kConvexity_SerializationShift = 16, // requires 8 bits | |
943 kFillType_SerializationShift = 8, // requires 8 bits | |
944 kSegmentMask_SerializationShift = 0 // requires 4 bits | |
945 }; | 944 }; |
946 | 945 |
947 SkAutoTUnref<SkPathRef> fPathRef; | 946 SkAutoTUnref<SkPathRef> fPathRef; |
948 | 947 |
949 int fLastMoveToIndex; | |
950 uint8_t fFillType; | 948 uint8_t fFillType; |
951 uint8_t fSegmentMask; | |
952 mutable uint8_t fConvexity; | |
953 mutable uint8_t fDirection; | |
954 mutable SkBool8 fIsOval; | |
955 #ifdef SK_BUILD_FOR_ANDROID | 949 #ifdef SK_BUILD_FOR_ANDROID |
956 uint32_t fGenerationID; | 950 uint32_t fGenerationID; |
957 const SkPath* fSourcePath; | 951 const SkPath* fSourcePath; |
958 #endif | 952 #endif |
959 | 953 |
960 /** Resets all fields other than fPathRef to their initial 'empty' values. | 954 /** Resets all fields other than fPathRef to their initial 'empty' values. |
961 * Assumes the caller has already emptied fPathRef. | 955 * Assumes the caller has already emptied fPathRef. |
962 * On Android increments fGenerationID without reseting it. | 956 * On Android increments fGenerationID without reseting it. |
963 */ | 957 */ |
964 void resetFields(); | 958 void resetFields(); |
(...skipping 12 matching lines...) Expand all Loading... | |
977 automatically set to (0,0). | 971 automatically set to (0,0). |
978 */ | 972 */ |
979 void pathTo(const SkPath& path); | 973 void pathTo(const SkPath& path); |
980 | 974 |
981 /* Append, in reverse order, the first contour of path, ignoring path's | 975 /* Append, in reverse order, the first contour of path, ignoring path's |
982 last point. If no moveTo() call has been made for this contour, the | 976 last point. If no moveTo() call has been made for this contour, the |
983 first point is automatically set to (0,0). | 977 first point is automatically set to (0,0). |
984 */ | 978 */ |
985 void reversePathTo(const SkPath&); | 979 void reversePathTo(const SkPath&); |
986 | 980 |
987 // called before we add points for lineTo, quadTo, cubicTo, checking to see | |
988 // if we need to inject a leading moveTo first | |
989 // | |
990 // SkPath path; path.lineTo(...); <--- need a leading moveTo(0, 0) | |
991 // SkPath path; ... path.close(); path.lineTo(...) <-- need a moveTo(previou s moveTo) | |
992 // | |
993 inline void injectMoveToIfNeeded(); | |
994 | |
995 inline bool hasOnlyMoveTos() const; | 981 inline bool hasOnlyMoveTos() const; |
996 | 982 |
997 Convexity internalGetConvexity() const; | |
998 | |
999 bool isRectContour(bool allowPartial, int* currVerb, const SkPoint** pts, | 983 bool isRectContour(bool allowPartial, int* currVerb, const SkPoint** pts, |
1000 bool* isClosed, Direction* direction) const; | 984 bool* isClosed, Direction* direction) const; |
1001 | 985 |
1002 /** Returns if the path can return a bound at no cost (true) or will have to | 986 /** Returns if the path can return a bound at no cost (true) or will have to |
1003 perform some computation (false). | 987 perform some computation (false). |
1004 */ | 988 */ |
1005 bool hasComputedBounds() const { | 989 bool hasComputedBounds() const { |
1006 SkDEBUGCODE(this->validate();) | 990 SkDEBUGCODE(this->validate();) |
1007 return fPathRef->hasComputedBounds(); | 991 return fPathRef->hasComputedBounds(); |
1008 } | 992 } |
1009 | 993 |
1010 | 994 |
1011 // 'rect' needs to be sorted | 995 // 'rect' needs to be sorted |
1012 void setBounds(const SkRect& rect) { | 996 void setBounds(const SkRect& rect) { |
1013 fPathRef->setBounds(rect); | 997 fPathRef->setBounds(rect); |
1014 } | 998 } |
1015 | 999 |
1000 Direction getDirection() const { | |
1001 return static_cast<Direction>(fPathRef->getDirection()); | |
1002 } | |
1003 void setDirection(Direction dir) { | |
1004 fPathRef->setDirection(static_cast<SkPathRef::Direction>(dir)); | |
1005 } | |
1006 | |
1007 void setIsOval(bool isOval) { fPathRef->setIsOval(isOval); } | |
1008 | |
1016 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO O | 1009 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO O |
1017 friend class SkPathRef; // just for SerializationOffsets | 1010 friend class SkPathRef; // just for SerializationOffsets |
1018 #endif | 1011 #endif |
1019 friend class SkAutoPathBoundsUpdate; | 1012 friend class SkAutoPathBoundsUpdate; |
1020 friend class SkAutoDisableOvalCheck; | |
1021 friend class SkAutoDisableDirectionCheck; | |
1022 friend class SkBench_AddPathTest; // perf test pathTo/reversePathTo | 1013 friend class SkBench_AddPathTest; // perf test pathTo/reversePathTo |
1023 }; | 1014 }; |
1024 | 1015 |
1025 #endif | 1016 #endif |
OLD | NEW |