aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gm/cgm.c40
-rw-r--r--include/c/sk_data.h31
-rw-r--r--include/c/sk_image.h12
-rw-r--r--include/c/sk_types.h3
-rw-r--r--src/c/sk_surface.cpp59
5 files changed, 137 insertions, 8 deletions
diff --git a/gm/cgm.c b/gm/cgm.c
index cddb2c14e2..5a20a7d1bf 100644
--- a/gm/cgm.c
+++ b/gm/cgm.c
@@ -9,6 +9,8 @@
// DO NOT USE -- FOR INTERNAL TESTING ONLY
#include "sk_canvas.h"
+#include "sk_data.h"
+#include "sk_image.h"
#include "sk_paint.h"
#include "sk_shader.h"
#include "sk_surface.h"
@@ -24,25 +26,49 @@ static sk_shader_t* make_shader() {
return sk_shader_new_linear_gradient(pts, colors, NULL, 2, CLAMP_SK_SHADER_TILEMODE, NULL);
}
-void sk_test_c_api(sk_canvas_t* canvas) {
+static void do_draw(sk_canvas_t* canvas) {
sk_paint_t* paint = sk_paint_new();
sk_paint_set_antialias(paint, true);
-
+
sk_paint_set_color(paint, 0xFFFFFFFF);
sk_canvas_draw_paint(canvas, paint);
-
+
sk_rect_t r = { 10, 10, W - 10, H - 10 };
-
+
sk_paint_set_color(paint, 0xFFFF0000);
sk_canvas_draw_rect(canvas, &r, paint);
-
+
sk_shader_t* shader = make_shader();
sk_paint_set_shader(paint, shader);
sk_shader_unref(shader);
-
+
sk_canvas_draw_oval(canvas, &r, paint);
-
+
sk_paint_delete(paint);
}
+void sk_test_c_api(sk_canvas_t* canvas) {
+ do_draw(canvas);
+
+ sk_imageinfo_t info = {
+ W, H, sk_colortype_get_default_8888(), OPAQUE_SK_ALPHATYPE
+ };
+ sk_surface_t* surf = sk_surface_new_raster(&info);
+ do_draw(sk_surface_get_canvas(surf));
+
+ sk_image_t* img0 = sk_surface_new_image_snapshot(surf);
+ sk_surface_unref(surf);
+
+ sk_canvas_draw_image(canvas, img0, W + 10, 10, NULL);
+
+ sk_data_t* data = sk_image_encode(img0);
+ sk_image_unref(img0);
+
+ sk_image_t* img1 = sk_image_new_from_data(data);
+ sk_data_unref(data);
+
+ sk_canvas_draw_image(canvas, img1, W/2, H/2, NULL);
+ sk_image_unref(img1);
+}
+
diff --git a/include/c/sk_data.h b/include/c/sk_data.h
new file mode 100644
index 0000000000..90863ee889
--- /dev/null
+++ b/include/c/sk_data.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+// EXPERIMENTAL EXPERIMENTAL EXPERIMENTAL EXPERIMENTAL
+// DO NOT USE -- FOR INTERNAL TESTING ONLY
+
+#ifndef sk_data_DEFINED
+#define sk_data_DEFINED
+
+#include "sk_types.h"
+
+SK_C_PLUS_PLUS_BEGIN_GUARD
+
+sk_data_t* sk_data_new_empty();
+sk_data_t* sk_data_new_with_copy(const void* src, size_t length);
+sk_data_t* sk_data_new_from_malloc(const void* memory, size_t length);
+sk_data_t* sk_data_new_subset(const sk_data_t* src, size_t offset, size_t length);
+
+void sk_data_ref(const sk_data_t*);
+void sk_data_unref(const sk_data_t*);
+
+size_t sk_data_get_size(const sk_data_t*);
+const void* sk_data_get_data(const sk_data_t*);
+
+SK_C_PLUS_PLUS_END_GUARD
+
+#endif
diff --git a/include/c/sk_image.h b/include/c/sk_image.h
index 244956399c..34682c72d3 100644
--- a/include/c/sk_image.h
+++ b/include/c/sk_image.h
@@ -20,6 +20,18 @@ SK_C_PLUS_PLUS_BEGIN_GUARD
* Balance with a call to sk_image_unref().
*/
sk_image_t* sk_image_new_raster_copy(const sk_imageinfo_t*, const void* pixels, size_t rowBytes);
+
+/**
+ * If the specified data can be interpreted as a compressed image (e.g. PNG or JPEG) then this
+ * returns an image. If the encoded data is not supported, returns NULL.
+ *
+ * On success, the encoded data may be processed immediately, or it may be ref()'d for later
+ * use.
+ */
+sk_image_t* sk_image_new_from_data(const sk_data_t* encoded);
+
+sk_data_t* sk_image_encode(const sk_image_t*);
+
void sk_image_ref(const sk_image_t*);
void sk_image_unref(const sk_image_t*);
int sk_image_get_width(const sk_image_t*);
diff --git a/include/c/sk_types.h b/include/c/sk_types.h
index 67a29dcb5e..dc530f374b 100644
--- a/include/c/sk_types.h
+++ b/include/c/sk_types.h
@@ -79,12 +79,13 @@ typedef struct {
} sk_matrix_t;
typedef struct sk_canvas_t sk_canvas_t;
+typedef struct sk_data_t sk_data_t;
typedef struct sk_image_t sk_image_t;
typedef struct sk_maskfilter_t sk_maskfilter_t;
typedef struct sk_paint_t sk_paint_t;
+typedef struct sk_path_t sk_path_t;
typedef struct sk_picture_t sk_picture_t;
typedef struct sk_picture_recorder_t sk_picture_recorder_t;
-typedef struct sk_path_t sk_path_t;
typedef struct sk_shader_t sk_shader_t;
typedef struct sk_surface_t sk_surface_t;
diff --git a/src/c/sk_surface.cpp b/src/c/sk_surface.cpp
index 6653a298c4..59c810a56e 100644
--- a/src/c/sk_surface.cpp
+++ b/src/c/sk_surface.cpp
@@ -6,12 +6,14 @@
*/
#include "sk_canvas.h"
+#include "sk_data.h"
#include "sk_image.h"
#include "sk_paint.h"
#include "sk_path.h"
#include "sk_surface.h"
#include "SkCanvas.h"
+#include "SkData.h"
#include "SkImage.h"
#include "SkMaskFilter.h"
#include "SkMatrix.h"
@@ -119,6 +121,14 @@ static bool from_c_path_direction(sk_path_direction_t cdir, SkPath::Direction* d
return false;
}
+static SkData* AsData(const sk_data_t* cdata) {
+ return reinterpret_cast<SkData*>(const_cast<sk_data_t*>(cdata));
+}
+
+static sk_data_t* ToData(SkData* data) {
+ return reinterpret_cast<sk_data_t*>(data);
+}
+
static sk_rect_t ToRect(const SkRect& rect) {
return reinterpret_cast<const sk_rect_t&>(rect);
}
@@ -143,6 +153,10 @@ static const SkImage* AsImage(const sk_image_t* cimage) {
return reinterpret_cast<const SkImage*>(cimage);
}
+static sk_image_t* ToImage(SkImage* cimage) {
+ return reinterpret_cast<sk_image_t*>(cimage);
+}
+
static const SkPaint& AsPaint(const sk_paint_t& cpaint) {
return reinterpret_cast<const SkPaint&>(cpaint);
}
@@ -216,6 +230,21 @@ sk_image_t* sk_image_new_raster_copy(const sk_imageinfo_t* cinfo, const void* pi
return (sk_image_t*)SkImage::NewRasterCopy(info, pixels, rowBytes);
}
+#include "SkDecodingImageGenerator.h"
+
+sk_image_t* sk_image_new_from_data(const sk_data_t* cdata) {
+ SkImageGenerator* gen = SkDecodingImageGenerator::Create(AsData(cdata),
+ SkDecodingImageGenerator::Options());
+ if (NULL == gen) {
+ return NULL;
+ }
+ return ToImage(SkImage::NewFromGenerator(gen));
+}
+
+sk_data_t* sk_image_encode(const sk_image_t* cimage) {
+ return ToData(AsImage(cimage)->encode());
+}
+
void sk_image_ref(const sk_image_t* cimage) {
AsImage(cimage)->ref();
}
@@ -591,6 +620,36 @@ sk_maskfilter_t* sk_maskfilter_new_blur(sk_blurstyle_t cstyle, float sigma) {
}
///////////////////////////////////////////////////////////////////////////////////////////
+
+sk_data_t* sk_data_new_with_copy(const void* src, size_t length) {
+ return ToData(SkData::NewWithCopy(src, length));
+}
+
+sk_data_t* sk_data_new_from_malloc(const void* memory, size_t length) {
+ return ToData(SkData::NewFromMalloc(memory, length));
+}
+
+sk_data_t* sk_data_new_subset(const sk_data_t* csrc, size_t offset, size_t length) {
+ return ToData(SkData::NewSubset(AsData(csrc), offset, length));
+}
+
+void sk_data_ref(const sk_data_t* cdata) {
+ SkSafeRef(AsData(cdata));
+}
+
+void sk_data_unref(const sk_data_t* cdata) {
+ SkSafeUnref(AsData(cdata));
+}
+
+size_t sk_data_get_size(const sk_data_t* cdata) {
+ return AsData(cdata)->size();
+}
+
+const void* sk_data_get_data(const sk_data_t* cdata) {
+ return AsData(cdata)->data();
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
void sk_test_capi(SkCanvas* canvas) {