/*
 * 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.
}
