diff options
-rw-r--r-- | gm/cgm.c | 40 | ||||
-rw-r--r-- | include/c/sk_data.h | 31 | ||||
-rw-r--r-- | include/c/sk_image.h | 12 | ||||
-rw-r--r-- | include/c/sk_types.h | 3 | ||||
-rw-r--r-- | src/c/sk_surface.cpp | 59 |
5 files changed, 137 insertions, 8 deletions
@@ -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) { |