Chromium Code Reviews| Index: include/core/SkPath.h |
| =================================================================== |
| --- include/core/SkPath.h (revision 11578) |
| +++ include/core/SkPath.h (working copy) |
| @@ -93,12 +93,12 @@ |
| void toggleInverseFillType() { |
| fFillType ^= 2; |
| GEN_ID_INC; |
| - } |
| + } |
| enum Convexity { |
| - kUnknown_Convexity, |
| - kConvex_Convexity, |
| - kConcave_Convexity |
| + kUnknown_Convexity = SkPathRef::kUnknown_Convexity, |
| + kConvex_Convexity = SkPathRef::kConvex_Convexity, |
| + 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
|
| }; |
| /** |
| @@ -106,11 +106,7 @@ |
| * then this function will attempt to compute the convexity (and cache the result). |
| */ |
| Convexity getConvexity() const { |
| - if (kUnknown_Convexity != fConvexity) { |
| - return static_cast<Convexity>(fConvexity); |
| - } else { |
| - return this->internalGetConvexity(); |
| - } |
| + return static_cast<Convexity>(fPathRef->getConvexity()); |
| } |
| /** |
| @@ -119,7 +115,9 @@ |
| * ComputeConvexity and cache its return value if the current setting is |
| * kUnknown. |
| */ |
| - Convexity getConvexityOrUnknown() const { return (Convexity)fConvexity; } |
| + Convexity getConvexityOrUnknown() const { |
| + return static_cast<Convexity>(fPathRef->getConvexityOrUnknown()); |
| + } |
| /** |
| * Store a convexity setting in the path. There is no automatic check to |
| @@ -138,7 +136,7 @@ |
| * confirmed by any analysis, it is just the value set earlier. |
| */ |
| bool isConvex() const { |
| - return kConvex_Convexity == this->getConvexity(); |
| + return SkPathRef::kConvex_Convexity == this->getConvexity(); |
|
caryclark
2013/10/03 20:36:15
why is this change needed? Isn't the contract that
|
| } |
| /** |
| @@ -162,7 +160,7 @@ |
| * optimization for performance and so some paths that are in |
| * fact ovals can report false. |
| */ |
| - bool isOval(SkRect* rect) const; |
| + bool isOval(SkRect* rect) const { return fPathRef->isOval(rect); } |
| /** Clear any lines and curves from the path, making it empty. This frees up |
| internal storage associated with those segments. |
| @@ -457,8 +455,8 @@ |
| @param dy3 The amount to add to the y-coordinate of the last point on |
| this contour, to specify the end point of a cubic curve |
| */ |
| - void rCubicTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2, |
| - SkScalar x3, SkScalar y3); |
| + void rCubicTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2, |
| + SkScalar x3, SkScalar y3); |
| /** Append the specified arc to the path as a new contour. If the start of |
| the path is different from the path's current last point, then an |
| @@ -472,8 +470,8 @@ |
| treated mod 360. |
| @param forceMoveTo If true, always begin a new contour with the arc |
| */ |
| - void arcTo(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle, |
| - bool forceMoveTo); |
| + void arcTo(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle, |
| + bool forceMoveTo); |
| /** Append a line and arc to the current path. This is the same as the |
| PostScript call "arct". |
| @@ -495,11 +493,11 @@ |
| enum Direction { |
| /** Direction either has not been or could not be computed */ |
| - kUnknown_Direction, |
| + kUnknown_Direction = SkPathRef::kUnknown_Direction, |
| /** clockwise direction for adding closed contours */ |
| - kCW_Direction, |
| + kCW_Direction = SkPathRef::kCW_Direction, |
| /** counter-clockwise direction for adding closed contours */ |
| - kCCW_Direction, |
| + kCCW_Direction = SkPathRef::kCCW_Direction, |
|
caryclark
2013/10/03 20:36:15
same feedback as convexity change above; would pre
|
| }; |
| /** |
| @@ -507,10 +505,7 @@ |
| * opposite. |
| */ |
| static Direction OppositeDirection(Direction dir) { |
| - static const Direction gOppositeDir[] = { |
| - kUnknown_Direction, kCCW_Direction, kCW_Direction |
| - }; |
| - return gOppositeDir[dir]; |
| + return (Direction) SkPathRef::OppositeDirection((SkPathRef::Direction)dir); |
|
caryclark
2013/10/03 20:36:15
you have static casts in similar changes above
|
| } |
| /** |
| @@ -552,7 +547,9 @@ |
| * the dir parameter. If the direction was determined, it is cached to make |
| * subsequent calls return quickly. |
| */ |
| - bool cheapComputeDirection(Direction* dir) const; |
| + bool cheapComputeDirection(Direction* dir) const { |
| + return fPathRef->cheapComputeDirection((SkPathRef::Direction*) dir); |
|
caryclark
2013/10/03 20:36:15
static cast
|
| + } |
| /** |
| * Returns true if the path's direction can be computed via |
| @@ -778,10 +775,10 @@ |
| } |
| enum SegmentMask { |
| - kLine_SegmentMask = 1 << 0, |
| - kQuad_SegmentMask = 1 << 1, |
| - kConic_SegmentMask = 1 << 2, |
| - kCubic_SegmentMask = 1 << 3, |
| + kLine_SegmentMask = SkPathRef::kLine_SegmentMask, |
| + kQuad_SegmentMask = SkPathRef::kQuad_SegmentMask, |
| + kConic_SegmentMask = SkPathRef::kConic_SegmentMask, |
| + kCubic_SegmentMask = SkPathRef::kCubic_SegmentMask, |
|
caryclark
2013/10/03 20:36:15
Additionally, this change makes Skia harder to use
|
| }; |
| /** |
| @@ -789,16 +786,16 @@ |
| * set if the path contains 1 or more segments of that type. |
| * Returns 0 for an empty path (no segments). |
| */ |
| - uint32_t getSegmentMasks() const { return fSegmentMask; } |
| + uint32_t getSegmentMasks() const { return fPathRef->getSegmentMasks(); } |
| enum Verb { |
| - kMove_Verb, //!< iter.next returns 1 point |
| - kLine_Verb, //!< iter.next returns 2 points |
| - kQuad_Verb, //!< iter.next returns 3 points |
| - kConic_Verb, //!< iter.next returns 3 points + iter.conicWeight() |
| - kCubic_Verb, //!< iter.next returns 4 points |
| - kClose_Verb, //!< iter.next returns 1 point (contour's moveTo pt) |
| - kDone_Verb, //!< iter.next returns 0 points |
| + kMove_Verb = SkPathRef::kMove_Verb, //!< iter.next returns 1 point |
| + kLine_Verb = SkPathRef::kLine_Verb, //!< iter.next returns 2 points |
| + kQuad_Verb = SkPathRef::kQuad_Verb, //!< iter.next returns 3 points |
| + kConic_Verb = SkPathRef::kConic_Verb, //!< iter.next returns 3 points + iter.conicWeight() |
| + kCubic_Verb = SkPathRef::kCubic_Verb, //!< iter.next returns 4 points |
| + kClose_Verb = SkPathRef::kClose_Verb, //!< iter.next returns 1 point (contour's moveTo pt) |
| + kDone_Verb = SkPathRef::kDone_Verb, //!< iter.next returns 0 points |
|
caryclark
2013/10/03 20:36:15
another place to have compile time asserts
|
| }; |
| /** Iterate through all of the segments (lines, quadratics, cubics) of |
| @@ -814,8 +811,10 @@ |
| public: |
| Iter(); |
| Iter(const SkPath&, bool forceClose); |
| + Iter(const SkPathRef*, bool forceClose); |
| void setPath(const SkPath&, bool forceClose); |
| + void setPathRef(const SkPathRef*, bool forceClose); |
| /** Return the next verb in this iteration of the path. When all |
| segments have been visited, return kDone_Verb. |
| @@ -932,26 +931,21 @@ |
| enum SerializationOffsets { |
| #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TOO |
| kNewFormat_SerializationShift = 28, // requires 1 bit |
| -#endif |
| - kDirection_SerializationShift = 26, // requires 2 bits |
| -#ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TOO |
| - // rename to kUnused_SerializationShift |
| + kOldDirection_SerializationShift = 26, // requires 2 bits |
| kOldIsFinite_SerializationShift = 25, // 1 bit |
| -#endif |
| - kIsOval_SerializationShift = 24, // requires 1 bit |
| - kConvexity_SerializationShift = 16, // requires 8 bits |
| + kOldIsOval_SerializationShift = 24, // requires 1 bit |
| + kOldConvexity_SerializationShift = 16, // requires 8 bits |
| +#endif |
| + // TODO: make this shift be 0 |
| kFillType_SerializationShift = 8, // requires 8 bits |
| - kSegmentMask_SerializationShift = 0 // requires 4 bits |
| +#ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TOO |
| + kOldSegmentMask_SerializationShift = 0 // requires 4 bits |
| +#endif |
| }; |
| SkAutoTUnref<SkPathRef> fPathRef; |
| - int fLastMoveToIndex; |
| uint8_t fFillType; |
| - uint8_t fSegmentMask; |
| - mutable uint8_t fConvexity; |
| - mutable uint8_t fDirection; |
| - mutable SkBool8 fIsOval; |
| #ifdef SK_BUILD_FOR_ANDROID |
| uint32_t fGenerationID; |
| const SkPath* fSourcePath; |
| @@ -984,18 +978,8 @@ |
| */ |
| void reversePathTo(const SkPath&); |
| - // called before we add points for lineTo, quadTo, cubicTo, checking to see |
| - // if we need to inject a leading moveTo first |
| - // |
| - // SkPath path; path.lineTo(...); <--- need a leading moveTo(0, 0) |
| - // SkPath path; ... path.close(); path.lineTo(...) <-- need a moveTo(previous moveTo) |
| - // |
| - inline void injectMoveToIfNeeded(); |
| - |
| inline bool hasOnlyMoveTos() const; |
| - Convexity internalGetConvexity() const; |
| - |
| bool isRectContour(bool allowPartial, int* currVerb, const SkPoint** pts, |
| bool* isClosed, Direction* direction) const; |
| @@ -1013,12 +997,19 @@ |
| fPathRef->setBounds(rect); |
| } |
| + Direction getDirection() const { |
| + return static_cast<Direction>(fPathRef->getDirection()); |
| + } |
| + void setDirection(Direction dir) { |
| + fPathRef->setDirection(static_cast<SkPathRef::Direction>(dir)); |
| + } |
| + |
| + void setIsOval(bool isOval) { fPathRef->setIsOval(isOval); } |
| + |
| #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TOO |
| friend class SkPathRef; // just for SerializationOffsets |
| #endif |
| friend class SkAutoPathBoundsUpdate; |
| - friend class SkAutoDisableOvalCheck; |
| - friend class SkAutoDisableDirectionCheck; |
| friend class SkBench_AddPathTest; // perf test pathTo/reversePathTo |
| }; |