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
11static 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
17void 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);
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
37bool 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