blob: 7b14b6dcb855896540d4f56f974f7743b0245e29 [file] [log] [blame]
// 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 DlRoundRect 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;
}
// The Flutter rect may be inverted (upside down, backward, or both)
// Historically, Skia would normalize such rects but we will do that
// manually below when we construct the Impeller RoundRect
flutter::DlRect raw_rect =
flutter::DlRect::MakeLTRB(buffer[0], buffer[1], buffer[2], buffer[3]);
// Flutter has radii in TL,TR,BR,BL (clockwise) order,
// but Impeller uses TL,TR,BL,BR (zig-zag) order
impeller::RoundingRadii radii = {
.top_left = flutter::DlSize(buffer[4], buffer[5]),
.top_right = flutter::DlSize(buffer[6], buffer[7]),
.bottom_left = flutter::DlSize(buffer[10], buffer[11]),
.bottom_right = flutter::DlSize(buffer[8], buffer[9]),
};
result.rrect =
flutter::DlRoundRect::MakeRectRadii(raw_rect.GetPositive(), 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(!CheckAndHandleError(value));
return FromDart(value);
}
} // namespace tonic