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

#include "flutter/lib/ui/painting/rrect.h"

#include "flutter/fml/logging.h"
#include "third_party/tonic/logging/dart_error.h"
#include "third_party/tonic/typed_data/typed_list.h"

using flutter::RRect;

namespace tonic {

// Construct an SkRRect from a Dart RRect object.
// The Dart RRect is a Float32List containing
//   [left, top, right, bottom, xRadius, yRadius]
RRect DartConverter<flutter::RRect>::FromDart(Dart_Handle value) {
  Float32List buffer(value);

  RRect result;
  result.is_null = true;
  if (buffer.data() == nullptr) {
    return result;
  }

  SkVector radii[4] = {{buffer[4], buffer[5]},
                       {buffer[6], buffer[7]},
                       {buffer[8], buffer[9]},
                       {buffer[10], buffer[11]}};

  result.sk_rrect.setRectRadii(
      SkRect::MakeLTRB(buffer[0], buffer[1], buffer[2], buffer[3]), radii);

  result.is_null = false;
  return result;
}

RRect DartConverter<flutter::RRect>::FromArguments(Dart_NativeArguments args,
                                                   int index,
                                                   Dart_Handle& exception) {
  Dart_Handle value = Dart_GetNativeArgument(args, index);
  FML_DCHECK(!LogIfError(value));
  return FromDart(value);
}

}  // namespace tonic
