Added bindings for SkRRect
authorMatthew Leibowitz <mattleibow@live.com>
Tue, 29 May 2018 01:41:41 +0000 (03:41 +0200)
committerMatthew Leibowitz <mattleibow@live.com>
Tue, 29 May 2018 01:41:41 +0000 (03:41 +0200)
gn/core.gni
include/c/sk_canvas.h
include/c/sk_path.h
include/c/sk_rrect.h [new file with mode: 0644]
include/c/sk_types.h
src/c/sk_canvas.cpp
src/c/sk_enums.cpp
src/c/sk_path.cpp
src/c/sk_rrect.cpp [new file with mode: 0644]
src/c/sk_types_priv.h
src/xamarin/SkiaKeeper.c

index 55d1112..c56bc28 100644 (file)
@@ -27,6 +27,7 @@ skia_core_sources = [
   "$_include/c/sk_pixmap.h",
   "$_include/c/sk_pixelserializer.h",
   "$_include/c/sk_region.h",
+  "$_include/c/sk_rrect.h",
   "$_include/c/sk_shader.h",
   "$_include/c/sk_stream.h",
   "$_include/c/sk_string.h",
@@ -58,6 +59,7 @@ skia_core_sources = [
   "$_src/c/sk_pixmap.cpp",
   "$_src/c/sk_pixelserializer.cpp",
   "$_src/c/sk_region.cpp",
+  "$_src/c/sk_rrect.cpp",
   "$_src/c/sk_shader.cpp",
   "$_src/c/sk_stream.cpp",
   "$_src/c/sk_string.cpp",
index 1ec1c11..5046531 100644 (file)
@@ -30,6 +30,7 @@ SK_C_API void sk_canvas_clip_region(sk_canvas_t* canvas, const sk_region_t* regi
 SK_C_API void sk_canvas_clip_path(sk_canvas_t*, const sk_path_t*);
 SK_C_API void sk_canvas_draw_paint(sk_canvas_t*, const sk_paint_t*);
 SK_C_API void sk_canvas_draw_rect(sk_canvas_t*, const sk_rect_t*, const sk_paint_t*);
+SK_C_API void sk_canvas_draw_rrect(sk_canvas_t*, const sk_rrect_t*, const sk_paint_t*);
 SK_C_API void sk_canvas_draw_region(sk_canvas_t*, const sk_region_t*, const sk_paint_t*);
 SK_C_API void sk_canvas_draw_circle(sk_canvas_t*, float cx, float cy, float rad, const sk_paint_t*);
 SK_C_API void sk_canvas_draw_oval(sk_canvas_t*, const sk_rect_t*, const sk_paint_t*);
@@ -56,6 +57,7 @@ SK_C_API void sk_canvas_get_total_matrix(sk_canvas_t* ccanvas, sk_matrix_t* matr
 SK_C_API void sk_canvas_draw_round_rect(sk_canvas_t*, const sk_rect_t*, float rx, float ry, const sk_paint_t*);
 SK_C_API void sk_canvas_clip_rect_with_operation(sk_canvas_t* t, const sk_rect_t* crect, sk_clipop_t op, bool doAA);
 SK_C_API void sk_canvas_clip_path_with_operation(sk_canvas_t* t, const sk_path_t* crect, sk_clipop_t op, bool doAA);
+SK_C_API void sk_canvas_clip_rrect_with_operation(sk_canvas_t* t, const sk_rrect_t* crect, sk_clipop_t op, bool doAA);
 SK_C_API bool sk_canvas_get_local_clip_bounds(sk_canvas_t* t, sk_rect_t* cbounds);
 SK_C_API bool sk_canvas_get_device_clip_bounds(sk_canvas_t* t, sk_irect_t* cbounds);
 SK_C_API void sk_canvas_flush(sk_canvas_t* ccanvas);
index cd0c5ca..8174a2e 100644 (file)
@@ -28,6 +28,8 @@ SK_C_API void sk_path_arc_to_with_oval(sk_path_t*, const sk_rect_t* oval, float
 SK_C_API void sk_path_arc_to_with_points(sk_path_t*, float x1, float y1, float x2, float y2, float radius);
 SK_C_API void sk_path_close(sk_path_t*);
 SK_C_API void sk_path_add_rect(sk_path_t*, const sk_rect_t*, sk_path_direction_t);
+SK_C_API void sk_path_add_rrect(sk_path_t*, const sk_rrect_t*, sk_path_direction_t);
+SK_C_API void sk_path_add_rrect_start(sk_path_t*, const sk_rrect_t*, sk_path_direction_t, uint32_t);
 SK_C_API void sk_path_add_rounded_rect(sk_path_t*, const sk_rect_t*, float, float, sk_path_direction_t);
 SK_C_API void sk_path_add_oval(sk_path_t*, const sk_rect_t*, sk_path_direction_t);
 SK_C_API void sk_path_add_circle(sk_path_t*, float x, float y, float radius, sk_path_direction_t dir);
diff --git a/include/c/sk_rrect.h b/include/c/sk_rrect.h
new file mode 100644 (file)
index 0000000..af26580
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2014 Google Inc.
+ * Copyright 2016 Xamarin Inc.
+ * Copyright 2018 Microsoft Corporation. All rights reserved.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef sk_rrect_DEFINED
+#define sk_rrect_DEFINED
+
+#include "sk_types.h"
+
+SK_C_PLUS_PLUS_BEGIN_GUARD
+
+SK_C_API sk_rrect_t* sk_rrect_new(void);
+SK_C_API sk_rrect_t* sk_rrect_new_copy(const sk_rrect_t* rrect);
+SK_C_API void sk_rrect_delete(const sk_rrect_t* rrect);
+SK_C_API sk_rrect_type_t sk_rrect_get_type(const sk_rrect_t* rrect);
+SK_C_API void sk_rrect_get_rect(const sk_rrect_t* rrect, sk_rect_t* rect);
+SK_C_API void sk_rrect_get_radii(const sk_rrect_t* rrect, sk_rrect_corner_t corner, sk_vector_t* radii);
+SK_C_API bool sk_rrect_all_corners_circular(const sk_rrect_t* rrect, float tolerance);
+SK_C_API float sk_rrect_get_width(const sk_rrect_t* rrect);
+SK_C_API float sk_rrect_get_height(const sk_rrect_t* rrect);
+SK_C_API void sk_rrect_set_empty(sk_rrect_t* rrect);
+SK_C_API void sk_rrect_set_rect(sk_rrect_t* rrect, const sk_rect_t* rect);
+SK_C_API void sk_rrect_set_oval(sk_rrect_t* rrect, const sk_rect_t* rect);
+SK_C_API void sk_rrect_set_rect_xy(sk_rrect_t* rrect, const sk_rect_t* rect, float xRad, float yRad);
+SK_C_API void sk_rrect_set_nine_patch(sk_rrect_t* rrect, const sk_rect_t* rect, float leftRad, float topRad, float rightRad, float bottomRad);
+SK_C_API void sk_rrect_set_rect_radii(sk_rrect_t* rrect, const sk_rect_t* rect, const sk_vector_t* radii);
+SK_C_API void sk_rrect_inset(sk_rrect_t* rrect, float dx, float dy);
+SK_C_API void sk_rrect_outset(sk_rrect_t* rrect, float dx, float dy);
+SK_C_API void sk_rrect_offset(sk_rrect_t* rrect, float dx, float dy);
+SK_C_API bool sk_rrect_contains(const sk_rrect_t* rrect, const sk_rect_t* rect);
+SK_C_API bool sk_rrect_is_valid(const sk_rrect_t* rrect);
+SK_C_API bool sk_rrect_transform(sk_rrect_t* rrect, const sk_matrix_t* matrix, sk_rrect_t* dest);
+
+SK_C_PLUS_PLUS_END_GUARD
+
+#endif
index dfe144d..6f4d4fa 100644 (file)
@@ -973,6 +973,23 @@ typedef struct {
     float fQuality;
     sk_transfer_function_behavior_t fUnpremulBehavior;
 } sk_webpencoder_options_t;
+typedef struct sk_rrect_t sk_rrect_t;
+
+typedef enum {
+    EMPTY_SK_RRECT_TYPE,
+    RECT_SK_RRECT_TYPE,
+    OVAL_SK_RRECT_TYPE,
+    SIMPLE_SK_RRECT_TYPE,
+    NINE_PATCH_SK_RRECT_TYPE,
+    COMPLEX_SK_RRECT_TYPE,
+} sk_rrect_type_t;
+
+typedef enum {
+    UPPER_LEFT_SK_RRECT_CORNER,
+    UPPER_RIGHT_SK_RRECT_CORNER,
+    LOWER_RIGHT_SK_RRECT_CORNER,
+    LOWER_LEFT_SK_RRECT_CORNER,
+} sk_rrect_corner_t;
 
 SK_C_PLUS_PLUS_END_GUARD
 
index b1f175a..8acf2d6 100644 (file)
@@ -123,6 +123,10 @@ void sk_canvas_clip_path_with_operation(sk_canvas_t* ccanvas, const sk_path_t* c
     AsCanvas(ccanvas)->clipPath(AsPath(*cpath), (SkClipOp)op, doAA);
 }
 
+void sk_canvas_clip_rrect_with_operation(sk_canvas_t* ccanvas, const sk_rrect_t* crect, sk_clipop_t op, bool doAA) {
+    AsCanvas(ccanvas)->clipRRect(AsRRect(*crect), (SkClipOp)op, doAA);
+}
+
 bool sk_canvas_get_local_clip_bounds(sk_canvas_t* ccanvas, sk_rect_t* cbounds) {
     return AsCanvas(ccanvas)->getLocalClipBounds(AsRect(cbounds));
 }
@@ -198,6 +202,10 @@ void sk_canvas_draw_rect(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_
     AsCanvas(ccanvas)->drawRect(AsRect(*crect), AsPaint(*cpaint));
 }
 
+void sk_canvas_draw_rrect(sk_canvas_t* ccanvas, const sk_rrect_t* crect, const sk_paint_t* cpaint) {
+    AsCanvas(ccanvas)->drawRRect(AsRRect(*crect), AsPaint(*cpaint));
+}
+
 void sk_canvas_draw_circle(sk_canvas_t* ccanvas, float cx, float cy, float rad,
                            const sk_paint_t* cpaint) {
     AsCanvas(ccanvas)->drawCircle(cx, cy, rad, AsPaint(*cpaint));
index 3c44da2..eda9a9e 100644 (file)
@@ -401,6 +401,20 @@ static_assert ((int)SkJpegEncoder::AlphaOption::kBlendOnBlack   == (int)BLEND_ON
 static_assert ((int)SkWebpEncoder::Compression::kLossy      == (int)LOSSY_SK_WEBPENCODER_COMPTRESSION,      ASSERT_MSG(SkWebpEncoder::Compression, sk_webpencoder_compression_t));
 static_assert ((int)SkWebpEncoder::Compression::kLossless   == (int)LOSSLESS_SK_WEBPENCODER_COMPTRESSION,   ASSERT_MSG(SkWebpEncoder::Compression, sk_webpencoder_compression_t));
 
+// sk_rrect_type_t
+static_assert ((int)SkRRect::Type::kEmpty_Type       == (int)EMPTY_SK_RRECT_TYPE,        ASSERT_MSG(SkRRect::Type, sk_rrect_type_t));
+static_assert ((int)SkRRect::Type::kRect_Type        == (int)RECT_SK_RRECT_TYPE,         ASSERT_MSG(SkRRect::Type, sk_rrect_type_t));
+static_assert ((int)SkRRect::Type::kOval_Type        == (int)OVAL_SK_RRECT_TYPE,         ASSERT_MSG(SkRRect::Type, sk_rrect_type_t));
+static_assert ((int)SkRRect::Type::kSimple_Type      == (int)SIMPLE_SK_RRECT_TYPE,       ASSERT_MSG(SkRRect::Type, sk_rrect_type_t));
+static_assert ((int)SkRRect::Type::kNinePatch_Type   == (int)NINE_PATCH_SK_RRECT_TYPE,   ASSERT_MSG(SkRRect::Type, sk_rrect_type_t));
+static_assert ((int)SkRRect::Type::kComplex_Type     == (int)COMPLEX_SK_RRECT_TYPE,      ASSERT_MSG(SkRRect::Type, sk_rrect_type_t));
+
+// sk_rrect_corner_t
+static_assert ((int)SkRRect::Corner::kUpperLeft_Corner    == (int)UPPER_LEFT_SK_RRECT_CORNER,    ASSERT_MSG(SkRRect::Corner, sk_rrect_corner_t));
+static_assert ((int)SkRRect::Corner::kUpperRight_Corner   == (int)UPPER_RIGHT_SK_RRECT_CORNER,   ASSERT_MSG(SkRRect::Corner, sk_rrect_corner_t));
+static_assert ((int)SkRRect::Corner::kLowerRight_Corner   == (int)LOWER_RIGHT_SK_RRECT_CORNER,   ASSERT_MSG(SkRRect::Corner, sk_rrect_corner_t));
+static_assert ((int)SkRRect::Corner::kLowerLeft_Corner    == (int)LOWER_LEFT_SK_RRECT_CORNER,    ASSERT_MSG(SkRRect::Corner, sk_rrect_corner_t));
+
 #if SK_SUPPORT_GPU
 
 // gr_surfaceorigin_t
index f1688fd..2e4a0c3 100644 (file)
@@ -209,6 +209,14 @@ void sk_path_add_rect(sk_path_t* cpath, const sk_rect_t* crect, sk_path_directio
     AsPath(cpath)->addRect(AsRect(*crect), (SkPath::Direction)cdir);
 }
 
+void sk_path_add_rrect(sk_path_t* cpath, const sk_rrect_t* crect, sk_path_direction_t cdir) {
+    AsPath(cpath)->addRRect(AsRRect(*crect), (SkPath::Direction)cdir);
+}
+
+void sk_path_add_rrect_start(sk_path_t* cpath, const sk_rrect_t* crect, sk_path_direction_t cdir, uint32_t start) {
+    AsPath(cpath)->addRRect(AsRRect(*crect), (SkPath::Direction)cdir, start);
+}
+
 void sk_path_add_rounded_rect(sk_path_t* cpath, const sk_rect_t* crect, float rx, float ry, sk_path_direction_t cdir) {
     AsPath(cpath)->addRoundRect(AsRect(*crect), rx, ry, (SkPath::Direction)cdir);
 }
diff --git a/src/c/sk_rrect.cpp b/src/c/sk_rrect.cpp
new file mode 100644 (file)
index 0000000..1cdce38
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2014 Google Inc.
+ * Copyright 2016 Xamarin Inc.
+ * Copyright 2018 Microsoft Corporation. All rights reserved.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkRRect.h"
+#include "sk_rrect.h"
+#include "sk_types_priv.h"
+
+
+sk_rrect_t* sk_rrect_new(void) {
+    return ToRRect(new SkRRect());
+}
+
+sk_rrect_t* sk_rrect_new_copy(const sk_rrect_t* rrect) {
+    return ToRRect(new SkRRect(AsRRect(*rrect)));
+}
+
+void sk_rrect_delete(const sk_rrect_t* rrect) {
+  delete AsRRect(rrect);
+}
+
+sk_rrect_type_t sk_rrect_get_type(const sk_rrect_t* rrect) {
+    return (sk_rrect_type_t)AsRRect(rrect)->getType();
+}
+
+void sk_rrect_get_rect(const sk_rrect_t* rrect, sk_rect_t* rect) {
+    if (rect) {
+        *rect = ToRect(AsRRect(rrect)->rect());
+    }
+}
+
+void sk_rrect_get_radii(const sk_rrect_t* rrect, sk_rrect_corner_t corner, sk_vector_t* radii) {
+    if (radii) {
+        *radii = ToPoint(AsRRect(rrect)->radii((SkRRect::Corner)corner));
+    }
+}
+
+bool sk_rrect_all_corners_circular(const sk_rrect_t* rrect, float tolerance) {
+    return AsRRect(rrect)->allCornersCircular(tolerance);
+}
+
+float sk_rrect_get_width(const sk_rrect_t* rrect) {
+    return AsRRect(rrect)->width();
+}
+
+float sk_rrect_get_height(const sk_rrect_t* rrect) {
+    return AsRRect(rrect)->height();
+}
+
+void sk_rrect_set_empty(sk_rrect_t* rrect) {
+    AsRRect(rrect)->setEmpty();
+}
+
+void sk_rrect_set_rect(sk_rrect_t* rrect, const sk_rect_t* rect) {
+    AsRRect(rrect)->setRect(AsRect(*rect));
+}
+
+void sk_rrect_set_oval(sk_rrect_t* rrect, const sk_rect_t* rect) {
+    AsRRect(rrect)->setOval(AsRect(*rect));
+}
+
+void sk_rrect_set_rect_xy(sk_rrect_t* rrect, const sk_rect_t* rect, float xRad, float yRad) {
+    AsRRect(rrect)->setRectXY(AsRect(*rect), xRad, yRad);
+}
+
+void sk_rrect_set_nine_patch(sk_rrect_t* rrect, const sk_rect_t* rect, float leftRad, float topRad, float rightRad, float bottomRad) {
+    AsRRect(rrect)->setNinePatch(AsRect(*rect), leftRad, topRad, rightRad, bottomRad);
+}
+
+void sk_rrect_set_rect_radii(sk_rrect_t* rrect, const sk_rect_t* rect, const sk_vector_t* radii) {
+    AsRRect(rrect)->setRectRadii(AsRect(*rect), AsPoint(radii));
+}
+
+void sk_rrect_inset(sk_rrect_t* rrect, float dx, float dy) {
+    AsRRect(rrect)->inset(dx, dy);
+}
+
+void sk_rrect_outset(sk_rrect_t* rrect, float dx, float dy) {
+    AsRRect(rrect)->outset(dx, dy);
+}
+
+void sk_rrect_offset(sk_rrect_t* rrect, float dx, float dy) {
+    AsRRect(rrect)->offset(dx, dy);
+}
+
+bool sk_rrect_contains(const sk_rrect_t* rrect, const sk_rect_t* rect) {
+    return AsRRect(rrect)->contains(AsRect(*rect));
+}
+
+bool sk_rrect_is_valid(const sk_rrect_t* rrect) {
+    return AsRRect(rrect)->isValid();
+}
+
+bool sk_rrect_transform(sk_rrect_t* rrect, const sk_matrix_t* matrix, sk_rrect_t* dest) {
+    SkMatrix skmatrix;
+    from_c(matrix, &skmatrix);
+    return AsRRect(rrect)->transform(skmatrix, AsRRect(dest));
+}
index a8375e3..3480b36 100644 (file)
@@ -87,6 +87,7 @@ DEF_CLASS_MAP(SkPictureRecorder, sk_picture_recorder_t, PictureRecorder)
 DEF_CLASS_MAP(SkPixelSerializer, sk_pixelserializer_t, PixelSerializer)
 DEF_CLASS_MAP(SkPixmap, sk_pixmap_t, Pixmap)
 DEF_CLASS_MAP(SkRegion, sk_region_t, Region)
+DEF_CLASS_MAP(SkRRect, sk_rrect_t, RRect)
 DEF_CLASS_MAP(SkShader, sk_shader_t, Shader)
 DEF_CLASS_MAP(SkStream, sk_stream_t, Stream)
 DEF_CLASS_MAP(SkStreamAsset, sk_stream_asset_t, StreamAsset)
index fee9ef9..ff098e8 100644 (file)
@@ -30,6 +30,7 @@
 #include "sk_pixmap.h"
 #include "sk_pixelserializer.h"
 #include "sk_region.h"
+#include "sk_rrect.h"
 #include "sk_shader.h"
 #include "sk_stream.h"
 #include "sk_string.h"
@@ -71,6 +72,7 @@ void** KeepSkiaCSymbols (void)
         (void*)sk_pixmap_destructor,
         (void*)sk_pixelserializer_unref,
         (void*)sk_region_new,
+        (void*)sk_rrect_new,
         (void*)sk_shader_ref,
         (void*)sk_stream_asset_destroy,
         (void*)sk_string_new_empty,