| Index: src/gpu/GrPath.cpp
|
| diff --git a/src/gpu/GrPath.cpp b/src/gpu/GrPath.cpp
|
| index 91a245d854383579168af01eeb764769ec76e913..27fbf21a9da4394e30c6a4789372a3b2e0cd5868 100644
|
| --- a/src/gpu/GrPath.cpp
|
| +++ b/src/gpu/GrPath.cpp
|
| @@ -6,9 +6,8 @@
|
| */
|
|
|
| #include "GrPath.h"
|
| -#include "GrStyle.h"
|
| +#include "GrShape.h"
|
|
|
| -namespace {
|
| // Verb count limit for generating path key from content of a volatile path.
|
| // The value should accomodate at least simple rects and rrects.
|
| static const int kSimpleVolatilePathVerbLimit = 10;
|
| @@ -26,58 +25,14 @@ static inline void write_style_key(uint32_t* dst, const GrStyle& style) {
|
| GrStyle::WriteKey(dst, style, GrStyle::Apply::kPathEffectAndStrokeRec, SK_Scalar1);
|
| }
|
|
|
| -
|
| -inline static bool compute_key_for_line_path(const SkPath& path, const GrStyle& style,
|
| - GrUniqueKey* key) {
|
| - SkPoint pts[2];
|
| - if (!path.isLine(pts)) {
|
| - return false;
|
| - }
|
| - static_assert((sizeof(pts) % sizeof(uint32_t)) == 0 && sizeof(pts) > sizeof(uint32_t),
|
| - "pts_needs_padding");
|
| - int styleDataCnt = style_data_cnt(style);
|
| -
|
| - const int kBaseData32Cnt = 1 + sizeof(pts) / sizeof(uint32_t);
|
| - static const GrUniqueKey::Domain kOvalPathDomain = GrUniqueKey::GenerateDomain();
|
| - GrUniqueKey::Builder builder(key, kOvalPathDomain, kBaseData32Cnt + styleDataCnt);
|
| - builder[0] = path.getFillType();
|
| - memcpy(&builder[1], &pts, sizeof(pts));
|
| - if (styleDataCnt > 0) {
|
| - write_style_key(&builder[kBaseData32Cnt], style);
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -inline static bool compute_key_for_oval_path(const SkPath& path, const GrStyle& style,
|
| - GrUniqueKey* key) {
|
| - SkRect rect;
|
| - // Point order is significant when dashing, so we cannot devolve to a rect key.
|
| - if (style.pathEffect() || !path.isOval(&rect)) {
|
| - return false;
|
| - }
|
| - static_assert((sizeof(rect) % sizeof(uint32_t)) == 0 && sizeof(rect) > sizeof(uint32_t),
|
| - "rect_needs_padding");
|
| -
|
| - const int kBaseData32Cnt = 1 + sizeof(rect) / sizeof(uint32_t);
|
| - int styleDataCnt = style_data_cnt(style);
|
| - static const GrUniqueKey::Domain kOvalPathDomain = GrUniqueKey::GenerateDomain();
|
| - GrUniqueKey::Builder builder(key, kOvalPathDomain, kBaseData32Cnt + styleDataCnt);
|
| - builder[0] = path.getFillType();
|
| - memcpy(&builder[1], &rect, sizeof(rect));
|
| - if (styleDataCnt > 0) {
|
| - write_style_key(&builder[kBaseData32Cnt], style);
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -// 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 GrStyle& style,
|
| - GrUniqueKey* key) {
|
| - if (!path.isVolatile()) {
|
| +// Encodes the full path data to the unique key for very small paths that wouldn't otherwise have a
|
| +// key. This is typically hit when clipping stencils the clip stack.
|
| +inline static bool compute_key_for_simple_path(const GrShape& shape, GrUniqueKey* key) {
|
| + if (shape.hasUnstyledKey()) {
|
| return false;
|
| }
|
| + SkPath path;
|
| + shape.asPath(&path);
|
| // The check below should take care of negative values casted positive.
|
| const int verbCnt = path.countVerbs();
|
| if (verbCnt > kSimpleVolatilePathVerbLimit) {
|
| @@ -124,7 +79,7 @@ inline static bool compute_key_for_simple_path(const SkPath& path, const GrStyle
|
| // 2) stroke data (varying size)
|
|
|
| const int baseData32Cnt = 2 + verbData32Cnt + pointData32Cnt + conicWeightData32Cnt;
|
| - const int styleDataCnt = style_data_cnt(style);
|
| + const int styleDataCnt = style_data_cnt(shape.style());
|
| static const GrUniqueKey::Domain kSimpleVolatilePathDomain = GrUniqueKey::GenerateDomain();
|
| GrUniqueKey::Builder builder(key, kSimpleVolatilePathDomain, baseData32Cnt + styleDataCnt);
|
| int i = 0;
|
| @@ -169,45 +124,33 @@ inline static bool compute_key_for_simple_path(const SkPath& path, const GrStyle
|
| }
|
| SkASSERT(i == baseData32Cnt);
|
| if (styleDataCnt > 0) {
|
| - write_style_key(&builder[baseData32Cnt], style);
|
| + write_style_key(&builder[baseData32Cnt], shape.style());
|
| }
|
| return true;
|
| }
|
|
|
| -inline static void compute_key_for_general_path(const SkPath& path, const GrStyle& style,
|
| - GrUniqueKey* key) {
|
| - const int kBaseData32Cnt = 2;
|
| - int styleDataCnt = style_data_cnt(style);
|
| +inline static bool compute_key_for_general_shape(const GrShape& shape, GrUniqueKey* key) {
|
| + int geoCnt = shape.unstyledKeySize();
|
| + int styleCnt = style_data_cnt(shape.style());
|
| + if (styleCnt < 0 || geoCnt < 0) {
|
| + return false;
|
| + }
|
| static const GrUniqueKey::Domain kGeneralPathDomain = GrUniqueKey::GenerateDomain();
|
| - GrUniqueKey::Builder builder(key, kGeneralPathDomain, kBaseData32Cnt + styleDataCnt);
|
| - builder[0] = path.getGenerationID();
|
| - builder[1] = path.getFillType();
|
| - if (styleDataCnt > 0) {
|
| - write_style_key(&builder[kBaseData32Cnt], style);
|
| + GrUniqueKey::Builder builder(key, kGeneralPathDomain, geoCnt + styleCnt);
|
| + shape.writeUnstyledKey(&builder[0]);
|
| + if (styleCnt) {
|
| + write_style_key(&builder[geoCnt], shape.style());
|
| }
|
| + return true;
|
| }
|
|
|
| -}
|
| -
|
| -void GrPath::ComputeKey(const SkPath& path, const GrStyle& style, GrUniqueKey* key,
|
| - bool* outIsVolatile) {
|
| - if (compute_key_for_line_path(path, style, key)) {
|
| - *outIsVolatile = false;
|
| - return;
|
| - }
|
| -
|
| - if (compute_key_for_oval_path(path, style, key)) {
|
| - *outIsVolatile = false;
|
| - return;
|
| - }
|
| +void GrPath::ComputeKey(const GrShape& shape, GrUniqueKey* key, bool* outIsVolatile) {
|
|
|
| - if (compute_key_for_simple_path(path, style, key)) {
|
| + if (compute_key_for_simple_path(shape, key)) {
|
| *outIsVolatile = false;
|
| return;
|
| }
|
| -
|
| - compute_key_for_general_path(path, style, key);
|
| - *outIsVolatile = path.isVolatile();
|
| + *outIsVolatile = !compute_key_for_general_shape(shape, key);
|
| }
|
|
|
| #ifdef SK_DEBUG
|
|
|