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 |
11 #define SkPath_DEFINED | 11 #define SkPath_DEFINED |
12 | 12 |
13 #include "SkInstCnt.h" | 13 #include "SkInstCnt.h" |
14 #include "SkMatrix.h" | 14 #include "SkMatrix.h" |
15 #include "SkPathRef.h" | 15 #include "SkPathRef.h" |
16 #include "SkTDArray.h" | 16 #include "SkTDArray.h" |
17 #include "SkRefCnt.h" | 17 #include "SkRefCnt.h" |
18 | 18 |
19 #ifdef SK_BUILD_FOR_ANDROID | |
20 #define GEN_ID_INC fGenerationID++ | |
21 #define GEN_ID_PTR_INC(ptr) (ptr)->fGenerationID++ | |
22 #else | |
23 #define GEN_ID_INC | |
24 #define GEN_ID_PTR_INC(ptr) | |
25 #endif | |
26 | |
27 class SkReader32; | 19 class SkReader32; |
28 class SkWriter32; | 20 class SkWriter32; |
29 class SkAutoPathBoundsUpdate; | 21 class SkAutoPathBoundsUpdate; |
30 class SkString; | 22 class SkString; |
31 class SkRRect; | 23 class SkRRect; |
32 | 24 |
33 /** \class SkPath | 25 /** \class SkPath |
34 | 26 |
35 The SkPath class encapsulates compound (multiple contour) geometric paths | 27 The SkPath class encapsulates compound (multiple contour) geometric paths |
36 consisting of straight line segments, quadratic curves, and cubic curves. | 28 consisting of straight line segments, quadratic curves, and cubic curves. |
37 */ | 29 */ |
38 class SK_API SkPath { | 30 class SK_API SkPath { |
39 public: | 31 public: |
40 SK_DECLARE_INST_COUNT_ROOT(SkPath); | 32 SK_DECLARE_INST_COUNT_ROOT(SkPath); |
41 | 33 |
42 SkPath(); | 34 SkPath(); |
43 SkPath(const SkPath&); // Copies fGenerationID on Android. | 35 SkPath(const SkPath&); |
44 ~SkPath(); | 36 ~SkPath(); |
45 | 37 |
46 SkPath& operator=(const SkPath&); // Increments fGenerationID on Android. | 38 SkPath& operator=(const SkPath&); |
47 friend SK_API bool operator==(const SkPath&, const SkPath&); | 39 friend SK_API bool operator==(const SkPath&, const SkPath&); |
48 friend bool operator!=(const SkPath& a, const SkPath& b) { | 40 friend bool operator!=(const SkPath& a, const SkPath& b) { |
49 return !(a == b); | 41 return !(a == b); |
50 } | 42 } |
51 | 43 |
52 enum FillType { | 44 enum FillType { |
53 /** Specifies that "inside" is computed by a non-zero sum of signed | 45 /** Specifies that "inside" is computed by a non-zero sum of signed |
54 edge crossings | 46 edge crossings |
55 */ | 47 */ |
56 kWinding_FillType, | 48 kWinding_FillType, |
(...skipping 16 matching lines...) Expand all Loading... |
73 */ | 65 */ |
74 FillType getFillType() const { return (FillType)fFillType; } | 66 FillType getFillType() const { return (FillType)fFillType; } |
75 | 67 |
76 /** Set the path's fill type. This is used to define how "inside" is | 68 /** Set the path's fill type. This is used to define how "inside" is |
77 computed. The default value is kWinding_FillType. | 69 computed. The default value is kWinding_FillType. |
78 | 70 |
79 @param ft The new fill type for this path | 71 @param ft The new fill type for this path |
80 */ | 72 */ |
81 void setFillType(FillType ft) { | 73 void setFillType(FillType ft) { |
82 fFillType = SkToU8(ft); | 74 fFillType = SkToU8(ft); |
83 GEN_ID_INC; | |
84 } | 75 } |
85 | 76 |
86 /** Returns true if the filltype is one of the Inverse variants */ | 77 /** Returns true if the filltype is one of the Inverse variants */ |
87 bool isInverseFillType() const { return IsInverseFillType((FillType)fFillTyp
e); } | 78 bool isInverseFillType() const { return IsInverseFillType((FillType)fFillTyp
e); } |
88 | 79 |
89 /** | 80 /** |
90 * Toggle between inverse and normal filltypes. This reverse the return | 81 * Toggle between inverse and normal filltypes. This reverse the return |
91 * value of isInverseFillType() | 82 * value of isInverseFillType() |
92 */ | 83 */ |
93 void toggleInverseFillType() { | 84 void toggleInverseFillType() { |
94 fFillType ^= 2; | 85 fFillType ^= 2; |
95 GEN_ID_INC; | |
96 } | 86 } |
97 | 87 |
98 enum Convexity { | 88 enum Convexity { |
99 kUnknown_Convexity, | 89 kUnknown_Convexity, |
100 kConvex_Convexity, | 90 kConvex_Convexity, |
101 kConcave_Convexity | 91 kConcave_Convexity |
102 }; | 92 }; |
103 | 93 |
104 /** | 94 /** |
105 * Return the path's convexity, as stored in the path. If it is currently u
nknown, | 95 * Return the path's convexity, as stored in the path. If it is currently u
nknown, |
(...skipping 801 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
907 bool contains(SkScalar x, SkScalar y) const; | 897 bool contains(SkScalar x, SkScalar y) const; |
908 | 898 |
909 void dump(bool forceClose, const char title[] = NULL) const; | 899 void dump(bool forceClose, const char title[] = NULL) const; |
910 void dump() const; | 900 void dump() const; |
911 | 901 |
912 /** | 902 /** |
913 * Write the region to the buffer, and return the number of bytes written. | 903 * Write the region to the buffer, and return the number of bytes written. |
914 * If buffer is NULL, it still returns the number of bytes. | 904 * If buffer is NULL, it still returns the number of bytes. |
915 */ | 905 */ |
916 uint32_t writeToMemory(void* buffer) const; | 906 uint32_t writeToMemory(void* buffer) const; |
| 907 |
917 /** | 908 /** |
918 * Initialized the region from the buffer, returning the number | 909 * Initialized the region from the buffer, returning the number |
919 * of bytes actually read. | 910 * of bytes actually read. |
920 */ | 911 */ |
921 uint32_t readFromMemory(const void* buffer); | 912 uint32_t readFromMemory(const void* buffer); |
922 | 913 |
| 914 /** Returns a non-zero, globally unique value corresponding to the set of ve
rbs |
| 915 and points in the path (but not the fill type [except on Android skbug.c
om/1762]). |
| 916 Each time the path is modified, a different generation ID will be return
ed. |
| 917 */ |
| 918 uint32_t getGenerationID() const; |
| 919 |
923 #ifdef SK_BUILD_FOR_ANDROID | 920 #ifdef SK_BUILD_FOR_ANDROID |
924 uint32_t getGenerationID() const; | 921 static const int kPathRefGenIDBitCnt = 30; // leave room for the fill type (
skbug.com/1762) |
925 const SkPath* getSourcePath() const; | 922 const SkPath* getSourcePath() const; |
926 void setSourcePath(const SkPath* path); | 923 void setSourcePath(const SkPath* path); |
| 924 #else |
| 925 static const int kPathRefGenIDBitCnt = 32; |
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 |
935 #endif | 934 #endif |
936 kDirection_SerializationShift = 26, // requires 2 bits | 935 kDirection_SerializationShift = 26, // requires 2 bits |
937 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO
O | 936 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO
O |
938 // rename to kUnused_SerializationShift | 937 // rename to kUnused_SerializationShift |
939 kOldIsFinite_SerializationShift = 25, // 1 bit | 938 kOldIsFinite_SerializationShift = 25, // 1 bit |
940 #endif | 939 #endif |
941 kIsOval_SerializationShift = 24, // requires 1 bit | 940 kIsOval_SerializationShift = 24, // requires 1 bit |
942 kConvexity_SerializationShift = 16, // requires 8 bits | 941 kConvexity_SerializationShift = 16, // requires 8 bits |
943 kFillType_SerializationShift = 8, // requires 8 bits | 942 kFillType_SerializationShift = 8, // requires 8 bits |
944 kSegmentMask_SerializationShift = 0 // requires 4 bits | 943 kSegmentMask_SerializationShift = 0 // requires 4 bits |
945 }; | 944 }; |
946 | 945 |
947 SkAutoTUnref<SkPathRef> fPathRef; | 946 SkAutoTUnref<SkPathRef> fPathRef; |
948 | 947 |
949 int fLastMoveToIndex; | 948 int fLastMoveToIndex; |
950 uint8_t fFillType; | 949 uint8_t fFillType; |
951 uint8_t fSegmentMask; | 950 uint8_t fSegmentMask; |
952 mutable uint8_t fConvexity; | 951 mutable uint8_t fConvexity; |
953 mutable uint8_t fDirection; | 952 mutable uint8_t fDirection; |
954 mutable SkBool8 fIsOval; | 953 mutable SkBool8 fIsOval; |
955 #ifdef SK_BUILD_FOR_ANDROID | 954 #ifdef SK_BUILD_FOR_ANDROID |
956 uint32_t fGenerationID; | |
957 const SkPath* fSourcePath; | 955 const SkPath* fSourcePath; |
958 #endif | 956 #endif |
959 | 957 |
960 /** Resets all fields other than fPathRef to their initial 'empty' values. | 958 /** Resets all fields other than fPathRef to their initial 'empty' values. |
961 * Assumes the caller has already emptied fPathRef. | 959 * Assumes the caller has already emptied fPathRef. |
962 * On Android increments fGenerationID without reseting it. | 960 * On Android increments fGenerationID without reseting it. |
963 */ | 961 */ |
964 void resetFields(); | 962 void resetFields(); |
965 | 963 |
966 /** Sets all fields other than fPathRef to the values in 'that'. | 964 /** Sets all fields other than fPathRef to the values in 'that'. |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO
O | 1014 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO
O |
1017 friend class SkPathRef; // just for SerializationOffsets | 1015 friend class SkPathRef; // just for SerializationOffsets |
1018 #endif | 1016 #endif |
1019 friend class SkAutoPathBoundsUpdate; | 1017 friend class SkAutoPathBoundsUpdate; |
1020 friend class SkAutoDisableOvalCheck; | 1018 friend class SkAutoDisableOvalCheck; |
1021 friend class SkAutoDisableDirectionCheck; | 1019 friend class SkAutoDisableDirectionCheck; |
1022 friend class SkBench_AddPathTest; // perf test pathTo/reversePathTo | 1020 friend class SkBench_AddPathTest; // perf test pathTo/reversePathTo |
1023 }; | 1021 }; |
1024 | 1022 |
1025 #endif | 1023 #endif |
OLD | NEW |