// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FLUTTER_LIB_WEB_UI_SKWASM_HELPERS_H_
#define FLUTTER_LIB_WEB_UI_SKWASM_HELPERS_H_

#include "third_party/skia/include/core/SkMatrix.h"
#include "third_party/skia/include/core/SkRRect.h"
#include "third_party/skia/include/core/SkSamplingOptions.h"

namespace Skwasm {

inline SkMatrix createMatrix(const SkScalar* f) {
  return SkMatrix::MakeAll(f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7],
                           f[8]);
}

inline SkRRect createRRect(const SkScalar* f) {
  const SkRect* rect = reinterpret_cast<const SkRect*>(f);
  const SkVector* radiiValues = reinterpret_cast<const SkVector*>(f + 4);

  SkRRect rr;
  rr.setRectRadii(*rect, radiiValues);
  return rr;
}

// This needs to be kept in sync with the "FilterQuality" enum in dart:ui
enum class FilterQuality {
  none,
  low,
  medium,
  high,
};

inline SkFilterMode filterModeForQuality(FilterQuality quality) {
  switch (quality) {
    case FilterQuality::none:
    case FilterQuality::low:
      return SkFilterMode::kNearest;
    case FilterQuality::medium:
    case FilterQuality::high:
      return SkFilterMode::kLinear;
  }
}

inline SkSamplingOptions samplingOptionsForQuality(FilterQuality quality) {
  switch (quality) {
    case FilterQuality::none:
      return SkSamplingOptions(SkFilterMode::kNearest, SkMipmapMode::kNone);
    case FilterQuality::low:
      return SkSamplingOptions(SkFilterMode::kNearest, SkMipmapMode::kNearest);
    case FilterQuality::medium:
      return SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kLinear);
    case FilterQuality::high:
      // Cubic equation coefficients recommended by Mitchell & Netravali
      // in their paper on cubic interpolation.
      return SkSamplingOptions(SkCubicResampler::Mitchell());
  }
}
}  // namespace Skwasm

#endif  // FLUTTER_LIB_WEB_UI_SKWASM_HELPERS_H_
