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