// Copyright 2015 The Chromium 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 "sky/engine/core/painting/RSTransform.h"

#include "sky/engine/core/script/dom_dart_state.h"
#include "sky/engine/tonic/dart_error.h"
#include "sky/engine/tonic/dart_value.h"
#include "base/logging.h"

namespace blink {

// Convert dart_xform._value[0...3] ==> RSTransform
RSTransform DartConverter<RSTransform>::FromDart(Dart_Handle dart_xform) {
  RSTransform result;
  result.is_null = true;
  if (Dart_IsNull(dart_xform))
    return result;

  Dart_Handle value =
      Dart_GetField(dart_xform, DOMDartState::Current()->value_handle());
  if (Dart_IsNull(value))
    return result;

  Dart_TypedData_Type type;
  float* data = nullptr;
  intptr_t num_elements = 0;
  Dart_TypedDataAcquireData(
      value, &type, reinterpret_cast<void**>(&data), &num_elements);
  DCHECK(!LogIfError(value));
  ASSERT(type == Dart_TypedData_kFloat32 && num_elements == 4);

  SkScalar* dest[] = {
    &result.sk_xform.fSCos,
    &result.sk_xform.fSSin,
    &result.sk_xform.fTx,
    &result.sk_xform.fTy
  };
  for (intptr_t i = 0; i < 4; ++i)
    *dest[i] = data[i];

  Dart_TypedDataReleaseData(value);

  result.is_null = false;
  return result;
}

RSTransform DartConverter<RSTransform>::FromArgumentsWithNullCheck(Dart_NativeArguments args,
                                                     int index,
                                                     Dart_Handle& exception) {
  Dart_Handle dart_xform = Dart_GetNativeArgument(args, index);
  DCHECK(!LogIfError(dart_xform));
  return FromDart(dart_xform);
}

} // namespace blink
