| Index: src/gpu/GrPath.cpp
|
| diff --git a/src/gpu/GrPath.cpp b/src/gpu/GrPath.cpp
|
| index adb3fe6333a7020f8cc98e89351151da556bbb89..5426e498f0cdd5b841d5d497b2f83bd6bdb01835 100644
|
| --- a/src/gpu/GrPath.cpp
|
| +++ b/src/gpu/GrPath.cpp
|
| @@ -7,25 +7,54 @@
|
|
|
| #include "GrPath.h"
|
|
|
| +template<int NumBits> static uint64_t get_top_n_float_bits(float f) {
|
| + char* floatData = reinterpret_cast<char*>(&f);
|
| + uint32_t floatBits = *reinterpret_cast<uint32_t*>(floatData);
|
| + return floatBits >> (32 - NumBits);
|
| +}
|
| +
|
| GrResourceKey GrPath::ComputeKey(const SkPath& path, const SkStrokeRec& stroke) {
|
| static const GrResourceKey::ResourceType gPathResourceType = GrResourceKey::GenerateResourceType();
|
| static const GrCacheID::Domain gPathDomain = GrCacheID::GenerateDomain();
|
|
|
| GrCacheID::Key key;
|
| - uint32_t* keyData = key.fData32;
|
| + uint64_t* keyData = key.fData64;
|
| keyData[0] = path.getGenerationID();
|
| + keyData[1] = ComputeStrokeKey(stroke);
|
| +
|
| + return GrResourceKey(GrCacheID(gPathDomain, key), gPathResourceType, 0);
|
| +}
|
| +
|
| +uint64_t GrPath::ComputeStrokeKey(const SkStrokeRec& stroke) {
|
| + enum {
|
| + kStyleBits = 2,
|
| + kJoinBits = 2,
|
| + kCapBits = 2,
|
| + kWidthBits = 29,
|
| + kMiterBits = 29,
|
|
|
| - SK_COMPILE_ASSERT(SkPaint::kJoinCount <= 3, cap_shift_will_be_wrong);
|
| - keyData[1] = stroke.needToApply();
|
| - if (0 != keyData[1]) {
|
| - keyData[1] |= stroke.getJoin() << 1;
|
| - keyData[1] |= stroke.getCap() << 3;
|
| - keyData[2] = static_cast<uint32_t>(stroke.getMiter());
|
| - keyData[3] = static_cast<uint32_t>(stroke.getWidth());
|
| - } else {
|
| - keyData[2] = 0;
|
| - keyData[3] = 0;
|
| + kJoinShift = kStyleBits,
|
| + kCapShift = kJoinShift + kJoinBits,
|
| + kWidthShift = kCapShift + kCapBits,
|
| + kMiterShift = kWidthShift + kWidthBits,
|
| +
|
| + kBitCount = kMiterShift + kMiterBits
|
| + };
|
| +
|
| + SK_COMPILE_ASSERT(SkStrokeRec::kStyleCount <= (1 << kStyleBits), style_shift_will_be_wrong);
|
| + SK_COMPILE_ASSERT(SkPaint::kJoinCount <= (1 << kJoinBits), cap_shift_will_be_wrong);
|
| + SK_COMPILE_ASSERT(SkPaint::kCapCount <= (1 << kCapBits), miter_shift_will_be_wrong);
|
| + SK_COMPILE_ASSERT(kBitCount == 64, wrong_stroke_key_size);
|
| +
|
| + if (!stroke.needToApply()) {
|
| + return SkStrokeRec::kFill_Style;
|
| }
|
|
|
| - return GrResourceKey(GrCacheID(gPathDomain, key), gPathResourceType, 0);
|
| + uint64_t key = stroke.getStyle();
|
| + key |= stroke.getJoin() << kJoinShift;
|
| + key |= stroke.getCap() << kCapShift;
|
| + key |= get_top_n_float_bits<kWidthBits>(stroke.getWidth()) << kWidthShift;
|
| + key |= get_top_n_float_bits<kMiterBits>(stroke.getMiter()) << kMiterShift;
|
| +
|
| + return key;
|
| }
|
|
|