/* * Copyright 2019 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "GrSamplePatternDictionary.h" bool GrSamplePatternDictionary::LessThan::operator()( const SkTArray<SkPoint>& a, const SkTArray<SkPoint>& b) const { if (a.count() != b.count()) { return a.count() < b.count(); } for (int i = 0; i < a.count(); ++i) { // This doesn't have geometric meaning. We just need to define an ordering for std::map. if (a[i].x() != b[i].x()) { return a[i].x() < b[i].x(); } if (a[i].y() != b[i].y()) { return a[i].y() < b[i].y(); } } return false; // Both sample patterns are equal, therefore, "a < b" is false. } int GrSamplePatternDictionary::findOrAssignSamplePatternKey( const SkTArray<SkPoint>& sampleLocations) { if (std::numeric_limits<int>::max() == fSampleLocationsArray.count()) { return 0; } const auto& insertResult = fSamplePatternKeyMap.insert( {sampleLocations, fSampleLocationsArray.count()}); if (insertResult.second) { // This means the "insert" call did not find the pattern in the key map already, and // therefore an actual insertion took place. (We don't expect to see many unique sample // patterns.) const SkTArray<SkPoint>& sampleLocations = insertResult.first->first; fSampleLocationsArray.push_back(&sampleLocations); } return insertResult.first->second; // Return the new sample pattern key. }