| Index: src/gpu/GrPath.cpp
|
| diff --git a/src/gpu/GrPath.cpp b/src/gpu/GrPath.cpp
|
| index 71c13af30656e21ed3181549b08a43c7987dd2e3..aa406aaa605d5b77e9c33b91d658c64d9f746801 100644
|
| --- a/src/gpu/GrPath.cpp
|
| +++ b/src/gpu/GrPath.cpp
|
| @@ -58,13 +58,14 @@ inline static bool compute_key_for_oval_path(const SkPath& path, const GrStrokeI
|
| // Encodes the full path data to the unique key for very small, volatile paths. This is typically
|
| // hit when clipping stencils the clip stack. Intention is that this handles rects too, since
|
| // SkPath::isRect seems to do non-trivial amount of work.
|
| -inline static bool compute_key_for_simple_path(const SkPath& path, const GrStrokeInfo& stroke,
|
| - GrUniqueKey* key) {
|
| +inline static bool compute_key_for_simple_path(const SkPath& path, const SkPathRef* pathRef,
|
| + const GrStrokeInfo& stroke, GrUniqueKey* key) {
|
| if (!path.isVolatile()) {
|
| return false;
|
| }
|
| - // The check below should take care of negative values casted positive.
|
| +
|
| const int verbCnt = path.countVerbs();
|
| + SkASSERT(verbCnt >= 0);
|
| if (verbCnt > kSimpleVolatilePathVerbLimit) {
|
| return false;
|
| }
|
| @@ -74,23 +75,10 @@ inline static bool compute_key_for_simple_path(const SkPath& path, const GrStrok
|
| "big_simple_volatile_path_verb_limit_may_cause_overflow");
|
|
|
| const int pointCnt = path.countPoints();
|
| - if (pointCnt < 0) {
|
| - SkASSERT(false);
|
| - return false;
|
| - }
|
| - SkSTArray<16, SkScalar, true> conicWeights(16);
|
| - if ((path.getSegmentMasks() & SkPath::kConic_SegmentMask) != 0) {
|
| - SkPath::RawIter iter(path);
|
| - SkPath::Verb verb;
|
| - SkPoint points[4];
|
| - while ((verb = iter.next(points)) != SkPath::kDone_Verb) {
|
| - if (verb == SkPath::kConic_Verb) {
|
| - conicWeights.push_back(iter.conicWeight());
|
| - }
|
| - }
|
| - }
|
| + SkASSERT(pointCnt >= 0);
|
|
|
| - const int conicWeightCnt = conicWeights.count();
|
| + const int conicWeightCnt = pathRef ? pathRef->countWeights() : 0;
|
| + SkASSERT(conicWeightCnt >= 0);
|
|
|
| // Construct counts that align as uint32_t counts.
|
| #define ARRAY_DATA32_COUNT(array_type, count) \
|
| @@ -126,7 +114,7 @@ inline static bool compute_key_for_simple_path(const SkPath& path, const GrStrok
|
| // Unambiguous fragment 1 establishes unambiguous fragment 2, since the length of the message
|
| // has been established.
|
|
|
| - builder[i++] = SkToU32(verbCnt); // The path limit is compile-asserted above, so the cast is ok.
|
| + builder[i++] = SkToU32(verbCnt); // The verb limit is asserted above, so the cast is ok.
|
|
|
| // Fill the last uint32_t with 0 first, since the last uint8_ts of the uint32_t may be
|
| // uninitialized. This does not produce ambiguous verb data, since we have serialized the exact
|
| @@ -149,7 +137,7 @@ inline static bool compute_key_for_simple_path(const SkPath& path, const GrStrok
|
| (conicWeightCnt * sizeof(SkScalar) / sizeof(uint32_t)))) {
|
| builder[i + conicWeightData32Cnt - 1] = 0;
|
| }
|
| - memcpy(&builder[i], conicWeights.begin(), conicWeightCnt * sizeof(SkScalar));
|
| + memcpy(&builder[i], pathRef->conicWeights(), conicWeightCnt * sizeof(SkScalar));
|
| SkDEBUGCODE(i += conicWeightData32Cnt);
|
| }
|
| SkASSERT(i == baseData32Cnt);
|
| @@ -186,7 +174,7 @@ void GrPath::ComputeKey(const SkPath& path, const GrStrokeInfo& stroke, GrUnique
|
| return;
|
| }
|
|
|
| - if (compute_key_for_simple_path(path, stroke, key)) {
|
| + if (compute_key_for_simple_path(path, path.fPathRef, stroke, key)) {
|
| *outIsVolatile = false;
|
| return;
|
| }
|
|
|