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 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
406 this contour, to specify the control point of a quadratic curve | 406 this contour, to specify the control point of a quadratic curve |
407 @param dy1 The amount to add to the y-coordinate of the last point on | 407 @param dy1 The amount to add to the y-coordinate of the last point on |
408 this contour, to specify the control point of a quadratic curve | 408 this contour, to specify the control point of a quadratic curve |
409 @param dx2 The amount to add to the x-coordinate of the last point on | 409 @param dx2 The amount to add to the x-coordinate of the last point on |
410 this contour, to specify the end point of a quadratic curve | 410 this contour, to specify the end point of a quadratic curve |
411 @param dy2 The amount to add to the y-coordinate of the last point on | 411 @param dy2 The amount to add to the y-coordinate of the last point on |
412 this contour, to specify the end point of a quadratic curve | 412 this contour, to specify the end point of a quadratic curve |
413 */ | 413 */ |
414 void rQuadTo(SkScalar dx1, SkScalar dy1, SkScalar dx2, SkScalar dy2); | 414 void rQuadTo(SkScalar dx1, SkScalar dy1, SkScalar dx2, SkScalar dy2); |
415 | 415 |
| 416 void conicTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2, |
| 417 SkScalar w); |
| 418 void conicTo(const SkPoint& p1, const SkPoint& p2, SkScalar w) { |
| 419 this->conicTo(p1.fX, p1.fY, p2.fX, p2.fY, w); |
| 420 } |
| 421 void rConicTo(SkScalar dx1, SkScalar dy1, SkScalar dx2, SkScalar dy2, |
| 422 SkScalar w); |
| 423 |
416 /** Add a cubic bezier from the last point, approaching control points | 424 /** Add a cubic bezier from the last point, approaching control points |
417 (x1,y1) and (x2,y2), and ending at (x3,y3). If no moveTo() call has been | 425 (x1,y1) and (x2,y2), and ending at (x3,y3). If no moveTo() call has been |
418 made for this contour, the first point is automatically set to (0,0). | 426 made for this contour, the first point is automatically set to (0,0). |
419 | 427 |
420 @param x1 The x-coordinate of the 1st control point on a cubic curve | 428 @param x1 The x-coordinate of the 1st control point on a cubic curve |
421 @param y1 The y-coordinate of the 1st control point on a cubic curve | 429 @param y1 The y-coordinate of the 1st control point on a cubic curve |
422 @param x2 The x-coordinate of the 2nd control point on a cubic curve | 430 @param x2 The x-coordinate of the 2nd control point on a cubic curve |
423 @param y2 The y-coordinate of the 2nd control point on a cubic curve | 431 @param y2 The y-coordinate of the 2nd control point on a cubic curve |
424 @param x3 The x-coordinate of the end point on a cubic curve | 432 @param x3 The x-coordinate of the end point on a cubic curve |
425 @param y3 The y-coordinate of the end point on a cubic curve | 433 @param y3 The y-coordinate of the end point on a cubic curve |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
772 | 780 |
773 @param p The new location for the last point | 781 @param p The new location for the last point |
774 */ | 782 */ |
775 void setLastPt(const SkPoint& p) { | 783 void setLastPt(const SkPoint& p) { |
776 this->setLastPt(p.fX, p.fY); | 784 this->setLastPt(p.fX, p.fY); |
777 } | 785 } |
778 | 786 |
779 enum SegmentMask { | 787 enum SegmentMask { |
780 kLine_SegmentMask = 1 << 0, | 788 kLine_SegmentMask = 1 << 0, |
781 kQuad_SegmentMask = 1 << 1, | 789 kQuad_SegmentMask = 1 << 1, |
782 kCubic_SegmentMask = 1 << 2 | 790 kConic_SegmentMask = 1 << 2, |
| 791 kCubic_SegmentMask = 1 << 3, |
783 }; | 792 }; |
784 | 793 |
785 /** | 794 /** |
786 * Returns a mask, where each bit corresponding to a SegmentMask is | 795 * Returns a mask, where each bit corresponding to a SegmentMask is |
787 * set if the path contains 1 or more segments of that type. | 796 * set if the path contains 1 or more segments of that type. |
788 * Returns 0 for an empty path (no segments). | 797 * Returns 0 for an empty path (no segments). |
789 */ | 798 */ |
790 uint32_t getSegmentMasks() const { return fSegmentMask; } | 799 uint32_t getSegmentMasks() const { return fSegmentMask; } |
791 | 800 |
792 enum Verb { | 801 enum Verb { |
793 kMove_Verb, //!< iter.next returns 1 point | 802 kMove_Verb, //!< iter.next returns 1 point |
794 kLine_Verb, //!< iter.next returns 2 points | 803 kLine_Verb, //!< iter.next returns 2 points |
795 kQuad_Verb, //!< iter.next returns 3 points | 804 kQuad_Verb, //!< iter.next returns 3 points |
| 805 kConic_Verb, //!< iter.next returns 3 points + iter.conicWeight() |
796 kCubic_Verb, //!< iter.next returns 4 points | 806 kCubic_Verb, //!< iter.next returns 4 points |
797 kClose_Verb, //!< iter.next returns 1 point (contour's moveTo pt) | 807 kClose_Verb, //!< iter.next returns 1 point (contour's moveTo pt) |
798 kDone_Verb //!< iter.next returns 0 points | 808 kDone_Verb, //!< iter.next returns 0 points |
799 }; | 809 }; |
800 | 810 |
801 /** Iterate through all of the segments (lines, quadratics, cubics) of | 811 /** Iterate through all of the segments (lines, quadratics, cubics) of |
802 each contours in a path. | 812 each contours in a path. |
803 | 813 |
804 The iterator cleans up the segments along the way, removing degenerate | 814 The iterator cleans up the segments along the way, removing degenerate |
805 segments and adding close verbs where necessary. When the forceClose | 815 segments and adding close verbs where necessary. When the forceClose |
806 argument is provided, each contour (as defined by a new starting | 816 argument is provided, each contour (as defined by a new starting |
807 move command) will be completed with a close verb regardless of the | 817 move command) will be completed with a close verb regardless of the |
808 contour's contents. | 818 contour's contents. |
(...skipping 13 matching lines...) Expand all Loading... |
822 deemed degenerate (too short) and skip those. | 832 deemed degenerate (too short) and skip those. |
823 @return The verb for the current segment | 833 @return The verb for the current segment |
824 */ | 834 */ |
825 Verb next(SkPoint pts[4], bool doConsumeDegerates = true) { | 835 Verb next(SkPoint pts[4], bool doConsumeDegerates = true) { |
826 if (doConsumeDegerates) { | 836 if (doConsumeDegerates) { |
827 this->consumeDegenerateSegments(); | 837 this->consumeDegenerateSegments(); |
828 } | 838 } |
829 return this->doNext(pts); | 839 return this->doNext(pts); |
830 } | 840 } |
831 | 841 |
| 842 /** |
| 843 * Return the weight for the current conic. Only valid if the current |
| 844 * segment return by next() was a conic. |
| 845 */ |
| 846 SkScalar conicWeight() const { return *fConicWeights; } |
| 847 |
832 /** If next() returns kLine_Verb, then this query returns true if the | 848 /** If next() returns kLine_Verb, then this query returns true if the |
833 line was the result of a close() command (i.e. the end point is the | 849 line was the result of a close() command (i.e. the end point is the |
834 initial moveto for this contour). If next() returned a different | 850 initial moveto for this contour). If next() returned a different |
835 verb, this returns an undefined value. | 851 verb, this returns an undefined value. |
836 | 852 |
837 @return If the last call to next() returned kLine_Verb, return true | 853 @return If the last call to next() returned kLine_Verb, return true |
838 if it was the result of an explicit close command. | 854 if it was the result of an explicit close command. |
839 */ | 855 */ |
840 bool isCloseLine() const { return SkToBool(fCloseLine); } | 856 bool isCloseLine() const { return SkToBool(fCloseLine); } |
841 | 857 |
842 /** Returns true if the current contour is closed (has a kClose_Verb) | 858 /** Returns true if the current contour is closed (has a kClose_Verb) |
843 @return true if the current contour is closed (has a kClose_Verb) | 859 @return true if the current contour is closed (has a kClose_Verb) |
844 */ | 860 */ |
845 bool isClosedContour() const; | 861 bool isClosedContour() const; |
846 | 862 |
847 private: | 863 private: |
848 const SkPoint* fPts; | 864 const SkPoint* fPts; |
849 const uint8_t* fVerbs; | 865 const uint8_t* fVerbs; |
850 const uint8_t* fVerbStop; | 866 const uint8_t* fVerbStop; |
| 867 const SkScalar* fConicWeights; |
851 SkPoint fMoveTo; | 868 SkPoint fMoveTo; |
852 SkPoint fLastPt; | 869 SkPoint fLastPt; |
853 SkBool8 fForceClose; | 870 SkBool8 fForceClose; |
854 SkBool8 fNeedClose; | 871 SkBool8 fNeedClose; |
855 SkBool8 fCloseLine; | 872 SkBool8 fCloseLine; |
856 SkBool8 fSegmentState; | 873 SkBool8 fSegmentState; |
857 | 874 |
858 inline const SkPoint& cons_moveTo(); | 875 inline const SkPoint& cons_moveTo(); |
859 Verb autoClose(SkPoint pts[2]); | 876 Verb autoClose(SkPoint pts[2]); |
860 void consumeDegenerateSegments(); | 877 void consumeDegenerateSegments(); |
(...skipping 11 matching lines...) Expand all Loading... |
872 | 889 |
873 /** Return the next verb in this iteration of the path. When all | 890 /** Return the next verb in this iteration of the path. When all |
874 segments have been visited, return kDone_Verb. | 891 segments have been visited, return kDone_Verb. |
875 | 892 |
876 @param pts The points representing the current verb and/or segment | 893 @param pts The points representing the current verb and/or segment |
877 This must not be NULL. | 894 This must not be NULL. |
878 @return The verb for the current segment | 895 @return The verb for the current segment |
879 */ | 896 */ |
880 Verb next(SkPoint pts[4]); | 897 Verb next(SkPoint pts[4]); |
881 | 898 |
| 899 SkScalar conicWeight() const { return *fConicWeights; } |
| 900 |
882 private: | 901 private: |
883 const SkPoint* fPts; | 902 const SkPoint* fPts; |
884 const uint8_t* fVerbs; | 903 const uint8_t* fVerbs; |
885 const uint8_t* fVerbStop; | 904 const uint8_t* fVerbStop; |
| 905 const SkScalar* fConicWeights; |
886 SkPoint fMoveTo; | 906 SkPoint fMoveTo; |
887 SkPoint fLastPt; | 907 SkPoint fLastPt; |
888 }; | 908 }; |
889 | 909 |
890 /** | 910 /** |
891 * Returns true if the point { x, y } is contained by the path, taking into | 911 * Returns true if the point { x, y } is contained by the path, taking into |
892 * account the FillType. | 912 * account the FillType. |
893 */ | 913 */ |
894 bool contains(SkScalar x, SkScalar y) const; | 914 bool contains(SkScalar x, SkScalar y) const; |
895 | 915 |
(...skipping 19 matching lines...) Expand all Loading... |
915 | 935 |
916 SkDEBUGCODE(void validate() const;) | 936 SkDEBUGCODE(void validate() const;) |
917 | 937 |
918 private: | 938 private: |
919 enum SerializationOffsets { | 939 enum SerializationOffsets { |
920 kDirection_SerializationShift = 26, // requires 2 bits | 940 kDirection_SerializationShift = 26, // requires 2 bits |
921 kIsFinite_SerializationShift = 25, // requires 1 bit | 941 kIsFinite_SerializationShift = 25, // requires 1 bit |
922 kIsOval_SerializationShift = 24, // requires 1 bit | 942 kIsOval_SerializationShift = 24, // requires 1 bit |
923 kConvexity_SerializationShift = 16, // requires 2 bits | 943 kConvexity_SerializationShift = 16, // requires 2 bits |
924 kFillType_SerializationShift = 8, // requires 2 bits | 944 kFillType_SerializationShift = 8, // requires 2 bits |
925 kSegmentMask_SerializationShift = 0 // requires 3 bits | 945 kSegmentMask_SerializationShift = 0 // requires 4 bits |
926 }; | 946 }; |
927 | 947 |
928 #if SK_DEBUG_PATH_REF | 948 #if SK_DEBUG_PATH_REF |
929 public: | 949 public: |
930 /** Debugging wrapper for SkAutoTUnref<SkPathRef> used to track owners (SkPa
ths) | 950 /** Debugging wrapper for SkAutoTUnref<SkPathRef> used to track owners (SkPa
ths) |
931 of SkPathRefs */ | 951 of SkPathRefs */ |
932 class PathRefDebugRef { | 952 class PathRefDebugRef { |
933 public: | 953 public: |
934 PathRefDebugRef(SkPath* owner); | 954 PathRefDebugRef(SkPath* owner); |
935 PathRefDebugRef(SkPathRef* pr, SkPath* owner); | 955 PathRefDebugRef(SkPathRef* pr, SkPath* owner); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
997 bool isRectContour(bool allowPartial, int* currVerb, const SkPoint** pts, | 1017 bool isRectContour(bool allowPartial, int* currVerb, const SkPoint** pts, |
998 bool* isClosed, Direction* direction) const; | 1018 bool* isClosed, Direction* direction) const; |
999 | 1019 |
1000 friend class SkAutoPathBoundsUpdate; | 1020 friend class SkAutoPathBoundsUpdate; |
1001 friend class SkAutoDisableOvalCheck; | 1021 friend class SkAutoDisableOvalCheck; |
1002 friend class SkAutoDisableDirectionCheck; | 1022 friend class SkAutoDisableDirectionCheck; |
1003 friend class SkBench_AddPathTest; // perf test pathTo/reversePathTo | 1023 friend class SkBench_AddPathTest; // perf test pathTo/reversePathTo |
1004 }; | 1024 }; |
1005 | 1025 |
1006 #endif | 1026 #endif |
OLD | NEW |