1 | /* |
---|---|
2 | * Copyright 2019 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 "src/gpu/GrSamplePatternDictionary.h" |
9 | |
10 | bool GrSamplePatternDictionary::LessThan::operator()( |
11 | const SkTArray<SkPoint>& a, const SkTArray<SkPoint>& b) const { |
12 | if (a.count() != b.count()) { |
13 | return a.count() < b.count(); |
14 | } |
15 | for (int i = 0; i < a.count(); ++i) { |
16 | // This doesn't have geometric meaning. We just need to define an ordering for std::map. |
17 | if (a[i].x() != b[i].x()) { |
18 | return a[i].x() < b[i].x(); |
19 | } |
20 | if (a[i].y() != b[i].y()) { |
21 | return a[i].y() < b[i].y(); |
22 | } |
23 | } |
24 | return false; // Both sample patterns are equal, therefore, "a < b" is false. |
25 | } |
26 | |
27 | int GrSamplePatternDictionary::findOrAssignSamplePatternKey( |
28 | const SkTArray<SkPoint>& sampleLocations) { |
29 | if (std::numeric_limits<int>::max() == fSampleLocationsArray.count()) { |
30 | return 0; |
31 | } |
32 | const auto& insertResult = fSamplePatternKeyMap.insert( |
33 | {sampleLocations, fSampleLocationsArray.count()}); |
34 | if (insertResult.second) { |
35 | // This means the "insert" call did not find the pattern in the key map already, and |
36 | // therefore an actual insertion took place. (We don't expect to see many unique sample |
37 | // patterns.) |
38 | const SkTArray<SkPoint>& sampleLocations = insertResult.first->first; |
39 | fSampleLocationsArray.push_back(&sampleLocations); |
40 | } |
41 | return insertResult.first->second; // Return the new sample pattern key. |
42 | } |
43 |