diff --git a/sky/engine/bindings/scripts/dart_types.py b/sky/engine/bindings/scripts/dart_types.py index 4ff0c83b08d..60440f0bb44 100644 --- a/sky/engine/bindings/scripts/dart_types.py +++ b/sky/engine/bindings/scripts/dart_types.py @@ -125,6 +125,7 @@ CPP_SPECIAL_CONVERSION_RULES = { 'Paint': 'Paint', 'Point': 'Point', 'Rect': 'Rect', + 'RRect': 'RRect', 'Size': 'Size', 'MojoDataPipeConsumer': 'mojo::ScopedDataPipeConsumerHandle', 'TileMode': 'SkShader::TileMode', @@ -385,6 +386,7 @@ DART_TO_CPP_VALUE = { 'Offset': pass_by_value_format('Offset'), 'Paint': pass_by_value_format('Paint'), 'Point': pass_by_value_format('Point'), + 'RRect': pass_by_value_format('RRect'), 'RSTransform': pass_by_value_format('RSTransform'), 'Rect': pass_by_value_format('Rect'), 'Size': pass_by_value_format('Size'), diff --git a/sky/engine/core/compositing/SceneBuilder.cpp b/sky/engine/core/compositing/SceneBuilder.cpp index 8addd63e8c4..862ef888533 100644 --- a/sky/engine/core/compositing/SceneBuilder.cpp +++ b/sky/engine/core/compositing/SceneBuilder.cpp @@ -46,10 +46,10 @@ void SceneBuilder::pushClipRect(const Rect& rect) addLayer(std::move(layer)); } -void SceneBuilder::pushClipRRect(const RRect* rrect, const Rect& bounds) +void SceneBuilder::pushClipRRect(const RRect& rrect, const Rect& bounds) { std::unique_ptr layer(new sky::compositor::ClipRRectLayer()); - layer->set_clip_rrect(rrect->rrect()); + layer->set_clip_rrect(rrect.sk_rrect); addLayer(std::move(layer)); } diff --git a/sky/engine/core/compositing/SceneBuilder.h b/sky/engine/core/compositing/SceneBuilder.h index 50dfe5178fe..1691ba4259b 100644 --- a/sky/engine/core/compositing/SceneBuilder.h +++ b/sky/engine/core/compositing/SceneBuilder.h @@ -37,7 +37,7 @@ public: void pushTransform(const Float64List& matrix4, ExceptionState&); void pushClipRect(const Rect& rect); - void pushClipRRect(const RRect* rrect, const Rect& bounds); + void pushClipRRect(const RRect& rrect, const Rect& bounds); void pushClipPath(const CanvasPath* path, const Rect& bounds); void pushOpacity(int alpha, const Rect& bounds); void pushColorFilter(SkColor color, SkXfermode::Mode transferMode, const Rect& bounds); diff --git a/sky/engine/core/core.gni b/sky/engine/core/core.gni index 218441aa6b4..bc409ee49c7 100644 --- a/sky/engine/core/core.gni +++ b/sky/engine/core/core.gni @@ -272,7 +272,6 @@ core_idl_files = get_path_info([ "painting/Path.idl", "painting/Picture.idl", "painting/PictureRecorder.idl", - "painting/RRect.idl", "painting/Shader.idl", "text/Paragraph.idl", "text/ParagraphBuilder.idl", @@ -300,6 +299,7 @@ core_dart_files = get_path_info([ "painting/PaintingStyle.dart", "painting/Point.dart", "painting/Rect.dart", + "painting/RRect.dart", "painting/RSTransform.dart", "painting/Size.dart", "painting/TransferMode.dart", diff --git a/sky/engine/core/painting/Canvas.cpp b/sky/engine/core/painting/Canvas.cpp index 4d15c83f293..7c8bfb32339 100644 --- a/sky/engine/core/painting/Canvas.cpp +++ b/sky/engine/core/painting/Canvas.cpp @@ -118,11 +118,11 @@ void Canvas::clipRect(const Rect& rect) m_canvas->clipRect(rect.sk_rect); } -void Canvas::clipRRect(const RRect* rrect) +void Canvas::clipRRect(const RRect& rrect) { if (!m_canvas) return; - m_canvas->clipRRect(rrect->rrect(), SkRegion::kIntersect_Op, true); + m_canvas->clipRRect(rrect.sk_rrect, SkRegion::kIntersect_Op, true); } void Canvas::clipPath(const CanvasPath* path) @@ -160,21 +160,18 @@ void Canvas::drawRect(const Rect& rect, const Paint& paint) m_canvas->drawRect(rect.sk_rect, paint.sk_paint); } -void Canvas::drawRRect(const RRect* rrect, const Paint& paint) +void Canvas::drawRRect(const RRect& rrect, const Paint& paint) { if (!m_canvas) return; - ASSERT(rrect); - m_canvas->drawRRect(rrect->rrect(), paint.sk_paint); + m_canvas->drawRRect(rrect.sk_rrect, paint.sk_paint); } -void Canvas::drawDRRect(const RRect* outer, const RRect* inner, const Paint& paint) +void Canvas::drawDRRect(const RRect& outer, const RRect& inner, const Paint& paint) { if (!m_canvas) return; - ASSERT(outer); - ASSERT(inner); - m_canvas->drawDRRect(outer->rrect(), inner->rrect(), paint.sk_paint); + m_canvas->drawDRRect(outer.sk_rrect, inner.sk_rrect, paint.sk_paint); } void Canvas::drawOval(const Rect& rect, const Paint& paint) diff --git a/sky/engine/core/painting/Canvas.h b/sky/engine/core/painting/Canvas.h index f297acdb582..8349f4717ff 100644 --- a/sky/engine/core/painting/Canvas.h +++ b/sky/engine/core/painting/Canvas.h @@ -74,15 +74,15 @@ public: Float64List getTotalMatrix() const; void clipRect(const Rect& rect); - void clipRRect(const RRect* rrect); + void clipRRect(const RRect& rrect); void clipPath(const CanvasPath* path); void drawColor(SkColor color, SkXfermode::Mode transferMode); void drawLine(const Point& p1, const Point& p2, const Paint& paint); void drawPaint(const Paint& paint); void drawRect(const Rect& rect, const Paint& paint); - void drawRRect(const RRect* rrect, const Paint& paint); - void drawDRRect(const RRect* outer, const RRect* inner, const Paint& paint); + void drawRRect(const RRect& rrect, const Paint& paint); + void drawDRRect(const RRect& outer, const RRect& inner, const Paint& paint); void drawOval(const Rect& rect, const Paint& paint); void drawCircle(const Point& c, float radius, const Paint& paint); void drawPath(const CanvasPath* path, const Paint& paint); diff --git a/sky/engine/core/painting/RRect.cpp b/sky/engine/core/painting/RRect.cpp index 7aa2f47bc26..b5f138b485c 100644 --- a/sky/engine/core/painting/RRect.cpp +++ b/sky/engine/core/painting/RRect.cpp @@ -4,26 +4,50 @@ #include "sky/engine/core/painting/RRect.h" +#include "sky/engine/core/script/dom_dart_state.h" +#include "sky/engine/tonic/dart_error.h" +#include "sky/engine/tonic/dart_value.h" + namespace blink { -RRect::RRect() -{ +// Construct an SkRRect from a Dart RRect object. +// The Dart RRect has a _value field which is a Float32List containing +// [left, top, right, bottom, xRad, yRad] +RRect DartConverter::FromDart(Dart_Handle dart_rrect) { + RRect result; + result.is_null = true; + if (Dart_IsNull(dart_rrect)) + return result; + + Dart_Handle value = + Dart_GetField(dart_rrect, 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(&data), &num_elements); + DCHECK(!LogIfError(value)); + ASSERT(type == Dart_TypedData_kFloat32 && num_elements == 6); + + result.sk_rrect.setRectXY( + SkRect::MakeLTRB(data[0], data[1], data[2], data[3]), + data[4], data[5]); + + Dart_TypedDataReleaseData(value); + + result.is_null = false; + return result; } -RRect::~RRect() -{ -} - -void RRect::setRectXY(const Rect& rect, float xRad, float yRad) -{ - m_rrect.setRectXY(rect.sk_rect, xRad, yRad); -} - -PassRefPtr RRect::shift(const Offset& offset) { - RefPtr rrect = RRect::create(); - rrect->m_rrect = m_rrect; - rrect->m_rrect.offset(offset.sk_size.width(), offset.sk_size.height()); - return rrect.release(); +RRect DartConverter::FromArgumentsWithNullCheck(Dart_NativeArguments args, + int index, + Dart_Handle& exception) { + Dart_Handle dart_rrect = Dart_GetNativeArgument(args, index); + DCHECK(!LogIfError(dart_rrect)); + return FromDart(dart_rrect); } } // namespace blink diff --git a/sky/engine/core/painting/RRect.dart b/sky/engine/core/painting/RRect.dart new file mode 100644 index 00000000000..9adac3cd342 --- /dev/null +++ b/sky/engine/core/painting/RRect.dart @@ -0,0 +1,37 @@ +part of dart_ui; + +// A rounded rectangle. +class RRect { + RRect(); + + /// Initialize with the same radii for all four corners. + RRect.fromRectXY(Rect rect, double xRadius, double yRadius) { + setRectXY(rect, xRadius, yRadius); + } + + final Float32List _value = new Float32List(6); + + // TODO(jsimmons): remove this so this class will be immutable. + void setRectXY(Rect rect, double xRadius, double yRadius) { + _value + ..[0] = rect.left + ..[1] = rect.top + ..[2] = rect.right + ..[3] = rect.bottom + ..[4] = xRadius + ..[5] = yRadius; + } + + /// Returns a new RRect translated by the given offset. + RRect shift(Offset offset) { + result = new RRect(); + result._value + ..[0] = _value[0] + offset.dx + ..[1] = _value[1] + offset.dy + ..[2] = _value[2] + offset.dx + ..[3] = _value[3] + offset.dy + ..[4] = _value[4] + ..[5] = _value[5]; + return result; + } +} diff --git a/sky/engine/core/painting/RRect.h b/sky/engine/core/painting/RRect.h index 7d46dceb7a1..5357972709e 100644 --- a/sky/engine/core/painting/RRect.h +++ b/sky/engine/core/painting/RRect.h @@ -5,35 +5,24 @@ #ifndef SKY_ENGINE_CORE_PAINTING_RRECT_H_ #define SKY_ENGINE_CORE_PAINTING_RRECT_H_ -#include "sky/engine/core/painting/Offset.h" -#include "sky/engine/core/painting/Rect.h" -#include "sky/engine/tonic/dart_wrappable.h" -#include "sky/engine/wtf/PassRefPtr.h" -#include "sky/engine/wtf/RefCounted.h" +#include "dart/runtime/include/dart_api.h" +#include "sky/engine/tonic/dart_converter.h" #include "third_party/skia/include/core/SkRRect.h" namespace blink { -class RRect : public RefCounted, public DartWrappable { - DEFINE_WRAPPERTYPEINFO(); -public: - ~RRect() override; - static PassRefPtr create() - { - return adoptRef(new RRect); - } +class RRect { + public: + SkRRect sk_rrect; + bool is_null; +}; - void setRectXY(const Rect& rect, float xRad, float yRad); - - const SkRRect& rrect() const { return m_rrect; } - void setRRect(const SkRRect& rrect) { m_rrect = rrect; } - - PassRefPtr shift(const Offset& offset); - -private: - RRect(); - - SkRRect m_rrect; +template <> +struct DartConverter { + static RRect FromDart(Dart_Handle handle); + static RRect FromArgumentsWithNullCheck(Dart_NativeArguments args, + int index, + Dart_Handle& exception); }; } // namespace blink diff --git a/sky/engine/core/painting/RRect.idl b/sky/engine/core/painting/RRect.idl deleted file mode 100644 index f57d13a1e6c..00000000000 --- a/sky/engine/core/painting/RRect.idl +++ /dev/null @@ -1,11 +0,0 @@ -// 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. - -[ - Constructor(), -] interface RRect { - void setRectXY(Rect rect, float xRad, float yRad); - - RRect shift(Offset offset); -};