• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2012 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "GrPath.h"
9 #include "GrShape.h"
10 
write_style_key(uint32_t * key,const GrStyle & style)11 static inline void write_style_key(uint32_t* key, const GrStyle& style)  {
12     // Pass 1 for the scale since the GPU will apply the style not GrStyle::applyToPath().
13     GrStyle::WriteKey(key, style, GrStyle::Apply::kPathEffectAndStrokeRec, SK_Scalar1);
14 }
15 
16 
ComputeKey(const GrShape & shape,GrUniqueKey * key,bool * outIsVolatile)17 void GrPath::ComputeKey(const GrShape& shape, GrUniqueKey* key, bool* outIsVolatile) {
18     int geoCnt = shape.unstyledKeySize();
19     int styleCnt = GrStyle::KeySize(shape.style(), GrStyle::Apply::kPathEffectAndStrokeRec);
20     // This should only fail for an arbitrary path effect, and we should not have gotten
21     // here with anything other than a dash path effect.
22     SkASSERT(styleCnt >= 0);
23     if (geoCnt < 0) {
24         *outIsVolatile = true;
25         return;
26     }
27     static const GrUniqueKey::Domain kGeneralPathDomain = GrUniqueKey::GenerateDomain();
28     GrUniqueKey::Builder builder(key, kGeneralPathDomain, geoCnt + styleCnt, "Path");
29     shape.writeUnstyledKey(&builder[0]);
30     if (styleCnt) {
31         write_style_key(&builder[geoCnt], shape.style());
32     }
33     *outIsVolatile = false;
34 }
35 
36 #ifdef SK_DEBUG
isEqualTo(const SkPath & path,const GrStyle & style) const37 bool GrPath::isEqualTo(const SkPath& path, const GrStyle& style) const {
38     // Since this is only called in debug we don't care about performance.
39     int cnt0 = GrStyle::KeySize(fStyle, GrStyle::Apply::kPathEffectAndStrokeRec);
40     int cnt1 = GrStyle::KeySize(style, GrStyle::Apply::kPathEffectAndStrokeRec);
41     if (cnt0 < 0 || cnt1 < 0 || cnt0 != cnt1) {
42         return false;
43     }
44     if (cnt0) {
45         SkAutoTArray<uint32_t> key0(cnt0);
46         SkAutoTArray<uint32_t> key1(cnt0);
47         write_style_key(key0.get(), fStyle);
48         write_style_key(key1.get(), style);
49         if (0 != memcmp(key0.get(), key1.get(), cnt0)) {
50             return false;
51         }
52     }
53     return fSkPath == path;
54 }
55 #endif
56