blob: 59c810a56e31ad42a98f559eed9ec657c4993b05 [file] [log] [blame]
reed8e474782014-10-06 11:00:51 -07001/*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
reed73c25012014-11-17 06:15:42 -08008#include "sk_canvas.h"
reedb2a5d7e2014-12-25 14:16:21 -08009#include "sk_data.h"
reed73c25012014-11-17 06:15:42 -080010#include "sk_image.h"
11#include "sk_paint.h"
12#include "sk_path.h"
reed938dfba2014-10-06 06:08:16 -070013#include "sk_surface.h"
14
15#include "SkCanvas.h"
reedb2a5d7e2014-12-25 14:16:21 -080016#include "SkData.h"
reed938dfba2014-10-06 06:08:16 -070017#include "SkImage.h"
reed0eafc9b2014-12-23 14:11:11 -080018#include "SkMaskFilter.h"
reed938dfba2014-10-06 06:08:16 -070019#include "SkMatrix.h"
20#include "SkPaint.h"
21#include "SkPath.h"
reede3719892014-12-22 17:46:00 -080022#include "SkPictureRecorder.h"
reed938dfba2014-10-06 06:08:16 -070023#include "SkSurface.h"
24
reede3323962014-10-24 11:16:19 -070025const struct {
26 sk_colortype_t fC;
27 SkColorType fSK;
28} gColorTypeMap[] = {
29 { UNKNOWN_SK_COLORTYPE, kUnknown_SkColorType },
30 { RGBA_8888_SK_COLORTYPE, kRGBA_8888_SkColorType },
31 { BGRA_8888_SK_COLORTYPE, kBGRA_8888_SkColorType },
32 { ALPHA_8_SK_COLORTYPE, kAlpha_8_SkColorType },
33};
34
35const struct {
36 sk_alphatype_t fC;
37 SkAlphaType fSK;
38} gAlphaTypeMap[] = {
39 { OPAQUE_SK_ALPHATYPE, kOpaque_SkAlphaType },
40 { PREMUL_SK_ALPHATYPE, kPremul_SkAlphaType },
41 { UNPREMUL_SK_ALPHATYPE, kUnpremul_SkAlphaType },
42};
43
44static bool from_c_colortype(sk_colortype_t cCT, SkColorType* skCT) {
45 for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypeMap); ++i) {
46 if (gColorTypeMap[i].fC == cCT) {
47 if (skCT) {
48 *skCT = gColorTypeMap[i].fSK;
49 }
50 return true;
51 }
52 }
53 return false;
54}
55
56static bool to_c_colortype(SkColorType skCT, sk_colortype_t* cCT) {
57 for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypeMap); ++i) {
58 if (gColorTypeMap[i].fSK == skCT) {
59 if (cCT) {
60 *cCT = gColorTypeMap[i].fC;
61 }
62 return true;
63 }
64 }
65 return false;
66}
67
68static bool from_c_alphatype(sk_alphatype_t cAT, SkAlphaType* skAT) {
69 for (size_t i = 0; i < SK_ARRAY_COUNT(gAlphaTypeMap); ++i) {
70 if (gAlphaTypeMap[i].fC == cAT) {
71 if (skAT) {
72 *skAT = gAlphaTypeMap[i].fSK;
73 }
74 return true;
75 }
76 }
77 return false;
78}
79
80static bool from_c_info(const sk_imageinfo_t& cinfo, SkImageInfo* info) {
81 SkColorType ct;
82 SkAlphaType at;
83
84 if (!from_c_colortype(cinfo.colorType, &ct)) {
85 // optionally report error to client?
86 return false;
87 }
88 if (!from_c_alphatype(cinfo.alphaType, &at)) {
89 // optionally report error to client?
90 return false;
91 }
92 if (info) {
93 *info = SkImageInfo::Make(cinfo.width, cinfo.height, ct, at);
94 }
95 return true;
reed938dfba2014-10-06 06:08:16 -070096}
97
abarth9503ac72014-12-02 15:47:33 -080098static void from_c_matrix(const sk_matrix_t* cmatrix, SkMatrix* matrix) {
99 matrix->setAll(cmatrix->mat[0], cmatrix->mat[1], cmatrix->mat[2],
100 cmatrix->mat[3], cmatrix->mat[4], cmatrix->mat[5],
101 cmatrix->mat[6], cmatrix->mat[7], cmatrix->mat[8]);
102}
103
reed73c25012014-11-17 06:15:42 -0800104const struct {
105 sk_path_direction_t fC;
106 SkPath::Direction fSk;
107} gPathDirMap[] = {
108 { CW_SK_PATH_DIRECTION, SkPath::kCW_Direction },
109 { CCW_SK_PATH_DIRECTION, SkPath::kCCW_Direction },
110};
111
112static bool from_c_path_direction(sk_path_direction_t cdir, SkPath::Direction* dir) {
113 for (size_t i = 0; i < SK_ARRAY_COUNT(gPathDirMap); ++i) {
114 if (gPathDirMap[i].fC == cdir) {
115 if (dir) {
116 *dir = gPathDirMap[i].fSk;
117 }
118 return true;
119 }
120 }
121 return false;
122}
123
reedb2a5d7e2014-12-25 14:16:21 -0800124static SkData* AsData(const sk_data_t* cdata) {
125 return reinterpret_cast<SkData*>(const_cast<sk_data_t*>(cdata));
126}
127
128static sk_data_t* ToData(SkData* data) {
129 return reinterpret_cast<sk_data_t*>(data);
130}
131
reede3719892014-12-22 17:46:00 -0800132static sk_rect_t ToRect(const SkRect& rect) {
133 return reinterpret_cast<const sk_rect_t&>(rect);
134}
135
reed8e474782014-10-06 11:00:51 -0700136static const SkRect& AsRect(const sk_rect_t& crect) {
137 return reinterpret_cast<const SkRect&>(crect);
138}
139
reede3719892014-12-22 17:46:00 -0800140static const SkRect* AsRect(const sk_rect_t* crect) {
141 return reinterpret_cast<const SkRect*>(crect);
reed73c25012014-11-17 06:15:42 -0800142}
143
reed8e474782014-10-06 11:00:51 -0700144static const SkPath& AsPath(const sk_path_t& cpath) {
145 return reinterpret_cast<const SkPath&>(cpath);
146}
147
robertphillipsa624e872014-10-08 06:04:35 -0700148static SkPath* as_path(sk_path_t* cpath) {
149 return reinterpret_cast<SkPath*>(cpath);
150}
151
reed8e474782014-10-06 11:00:51 -0700152static const SkImage* AsImage(const sk_image_t* cimage) {
153 return reinterpret_cast<const SkImage*>(cimage);
154}
reed938dfba2014-10-06 06:08:16 -0700155
reedb2a5d7e2014-12-25 14:16:21 -0800156static sk_image_t* ToImage(SkImage* cimage) {
157 return reinterpret_cast<sk_image_t*>(cimage);
158}
159
reed938dfba2014-10-06 06:08:16 -0700160static const SkPaint& AsPaint(const sk_paint_t& cpaint) {
reed8e474782014-10-06 11:00:51 -0700161 return reinterpret_cast<const SkPaint&>(cpaint);
reed938dfba2014-10-06 06:08:16 -0700162}
163
164static const SkPaint* AsPaint(const sk_paint_t* cpaint) {
reed8e474782014-10-06 11:00:51 -0700165 return reinterpret_cast<const SkPaint*>(cpaint);
reed938dfba2014-10-06 06:08:16 -0700166}
167
reed8e474782014-10-06 11:00:51 -0700168static SkPaint* AsPaint(sk_paint_t* cpaint) {
169 return reinterpret_cast<SkPaint*>(cpaint);
170}
171
reede3719892014-12-22 17:46:00 -0800172static sk_canvas_t* ToCanvas(SkCanvas* canvas) {
173 return reinterpret_cast<sk_canvas_t*>(canvas);
174}
175
reed8e474782014-10-06 11:00:51 -0700176static SkCanvas* AsCanvas(sk_canvas_t* ccanvas) {
177 return reinterpret_cast<SkCanvas*>(ccanvas);
178}
179
reed0eafc9b2014-12-23 14:11:11 -0800180static SkMaskFilter* AsMaskFilter(sk_maskfilter_t* cfilter) {
181 return reinterpret_cast<SkMaskFilter*>(cfilter);
182}
183
184static sk_maskfilter_t* ToMaskFilter(SkMaskFilter* filter) {
185 return reinterpret_cast<sk_maskfilter_t*>(filter);
186}
187
reedafa278e2014-11-24 19:11:48 -0800188static SkShader* AsShader(sk_shader_t* cshader) {
189 return reinterpret_cast<SkShader*>(cshader);
190}
191
reede3719892014-12-22 17:46:00 -0800192static SkPictureRecorder* AsPictureRecorder(sk_picture_recorder_t* crec) {
193 return reinterpret_cast<SkPictureRecorder*>(crec);
194}
195
196static sk_picture_recorder_t* ToPictureRecorder(SkPictureRecorder* rec) {
197 return reinterpret_cast<sk_picture_recorder_t*>(rec);
198}
199
200static const SkPicture* AsPicture(const sk_picture_t* cpic) {
201 return reinterpret_cast<const SkPicture*>(cpic);
202}
203
204static SkPicture* AsPicture(sk_picture_t* cpic) {
205 return reinterpret_cast<SkPicture*>(cpic);
206}
207
208static sk_picture_t* ToPicture(SkPicture* pic) {
209 return reinterpret_cast<sk_picture_t*>(pic);
210}
211
reed8e474782014-10-06 11:00:51 -0700212///////////////////////////////////////////////////////////////////////////////////////////
213
reede3323962014-10-24 11:16:19 -0700214sk_colortype_t sk_colortype_get_default_8888() {
215 sk_colortype_t ct;
216 if (!to_c_colortype(kN32_SkColorType, &ct)) {
217 ct = UNKNOWN_SK_COLORTYPE;
218 }
219 return ct;
220}
221
222///////////////////////////////////////////////////////////////////////////////////////////
223
reed8e474782014-10-06 11:00:51 -0700224sk_image_t* sk_image_new_raster_copy(const sk_imageinfo_t* cinfo, const void* pixels,
225 size_t rowBytes) {
reede3323962014-10-24 11:16:19 -0700226 SkImageInfo info;
227 if (!from_c_info(*cinfo, &info)) {
228 return NULL;
229 }
230 return (sk_image_t*)SkImage::NewRasterCopy(info, pixels, rowBytes);
reed8e474782014-10-06 11:00:51 -0700231}
232
reedb2a5d7e2014-12-25 14:16:21 -0800233#include "SkDecodingImageGenerator.h"
234
235sk_image_t* sk_image_new_from_data(const sk_data_t* cdata) {
236 SkImageGenerator* gen = SkDecodingImageGenerator::Create(AsData(cdata),
237 SkDecodingImageGenerator::Options());
238 if (NULL == gen) {
239 return NULL;
240 }
241 return ToImage(SkImage::NewFromGenerator(gen));
242}
243
244sk_data_t* sk_image_encode(const sk_image_t* cimage) {
245 return ToData(AsImage(cimage)->encode());
246}
247
reed8e474782014-10-06 11:00:51 -0700248void sk_image_ref(const sk_image_t* cimage) {
249 AsImage(cimage)->ref();
250}
251
252void sk_image_unref(const sk_image_t* cimage) {
253 AsImage(cimage)->unref();
254}
255
256int sk_image_get_width(const sk_image_t* cimage) {
257 return AsImage(cimage)->width();
258}
259
260int sk_image_get_height(const sk_image_t* cimage) {
261 return AsImage(cimage)->height();
262}
263
264uint32_t sk_image_get_unique_id(const sk_image_t* cimage) {
265 return AsImage(cimage)->uniqueID();
266}
267
268///////////////////////////////////////////////////////////////////////////////////////////
269
270sk_paint_t* sk_paint_new() {
271 return (sk_paint_t*)SkNEW(SkPaint);
272}
273
274void sk_paint_delete(sk_paint_t* cpaint) {
275 SkDELETE(AsPaint(cpaint));
276}
277
278bool sk_paint_is_antialias(const sk_paint_t* cpaint) {
279 return AsPaint(*cpaint).isAntiAlias();
280}
281
282void sk_paint_set_antialias(sk_paint_t* cpaint, bool aa) {
283 AsPaint(cpaint)->setAntiAlias(aa);
284}
285
286sk_color_t sk_paint_get_color(const sk_paint_t* cpaint) {
287 return AsPaint(*cpaint).getColor();
288}
289
290void sk_paint_set_color(sk_paint_t* cpaint, sk_color_t c) {
291 AsPaint(cpaint)->setColor(c);
292}
reed938dfba2014-10-06 06:08:16 -0700293
reedafa278e2014-11-24 19:11:48 -0800294void sk_paint_set_shader(sk_paint_t* cpaint, sk_shader_t* cshader) {
295 AsPaint(cpaint)->setShader(AsShader(cshader));
296}
297
reed0eafc9b2014-12-23 14:11:11 -0800298void sk_paint_set_maskfilter(sk_paint_t* cpaint, sk_maskfilter_t* cfilter) {
299 AsPaint(cpaint)->setMaskFilter(AsMaskFilter(cfilter));
300}
301
reed938dfba2014-10-06 06:08:16 -0700302///////////////////////////////////////////////////////////////////////////////////////////
303
robertphillipsa624e872014-10-08 06:04:35 -0700304sk_path_t* sk_path_new() {
305 return (sk_path_t*)SkNEW(SkPath);
306}
307
308void sk_path_delete(sk_path_t* cpath) {
309 SkDELETE(as_path(cpath));
310}
311
312void sk_path_move_to(sk_path_t* cpath, float x, float y) {
313 as_path(cpath)->moveTo(x, y);
314}
315
316void sk_path_line_to(sk_path_t* cpath, float x, float y) {
317 as_path(cpath)->lineTo(x, y);
318}
319
320void sk_path_quad_to(sk_path_t* cpath, float x0, float y0, float x1, float y1) {
321 as_path(cpath)->quadTo(x0, y0, x1, y1);
322}
323
reed73c25012014-11-17 06:15:42 -0800324void sk_path_conic_to(sk_path_t* cpath, float x0, float y0, float x1, float y1, float w) {
325 as_path(cpath)->conicTo(x0, y0, x1, y1, w);
326}
327
328void sk_path_cubic_to(sk_path_t* cpath, float x0, float y0, float x1, float y1, float x2, float y2) {
329 as_path(cpath)->cubicTo(x0, y0, x1, y1, x2, y2);
330}
331
robertphillipsa624e872014-10-08 06:04:35 -0700332void sk_path_close(sk_path_t* cpath) {
333 as_path(cpath)->close();
334}
335
reed73c25012014-11-17 06:15:42 -0800336void sk_path_add_rect(sk_path_t* cpath, const sk_rect_t* crect, sk_path_direction_t cdir) {
337 SkPath::Direction dir;
338 if (!from_c_path_direction(cdir, &dir)) {
339 return;
340 }
341 as_path(cpath)->addRect(AsRect(*crect), dir);
342}
343
344void sk_path_add_oval(sk_path_t* cpath, const sk_rect_t* crect, sk_path_direction_t cdir) {
345 SkPath::Direction dir;
346 if (!from_c_path_direction(cdir, &dir)) {
347 return;
348 }
349 as_path(cpath)->addOval(AsRect(*crect), dir);
350}
351
352bool sk_path_get_bounds(const sk_path_t* cpath, sk_rect_t* crect) {
353 const SkPath& path = AsPath(*cpath);
reed73c25012014-11-17 06:15:42 -0800354
355 if (path.isEmpty()) {
reede3719892014-12-22 17:46:00 -0800356 if (crect) {
357 *crect = ToRect(SkRect::MakeEmpty());
reed73c25012014-11-17 06:15:42 -0800358 }
359 return false;
360 }
reede3719892014-12-22 17:46:00 -0800361
362 if (crect) {
363 *crect = ToRect(path.getBounds());
364 }
reed73c25012014-11-17 06:15:42 -0800365 return true;
366}
367
robertphillipsa624e872014-10-08 06:04:35 -0700368///////////////////////////////////////////////////////////////////////////////////////////
369
reed938dfba2014-10-06 06:08:16 -0700370void sk_canvas_save(sk_canvas_t* ccanvas) {
371 AsCanvas(ccanvas)->save();
372}
373
374void sk_canvas_save_layer(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {
375 AsCanvas(ccanvas)->drawRect(AsRect(*crect), AsPaint(*cpaint));
376}
377
378void sk_canvas_restore(sk_canvas_t* ccanvas) {
379 AsCanvas(ccanvas)->restore();
380}
381
382void sk_canvas_translate(sk_canvas_t* ccanvas, float dx, float dy) {
383 AsCanvas(ccanvas)->translate(dx, dy);
384}
385
386void sk_canvas_scale(sk_canvas_t* ccanvas, float sx, float sy) {
reed8e474782014-10-06 11:00:51 -0700387 AsCanvas(ccanvas)->scale(sx, sy);
reed938dfba2014-10-06 06:08:16 -0700388}
389
abarth2fc6ea62014-12-01 14:04:03 -0800390void sk_canvas_rotate_degress(sk_canvas_t* ccanvas, float degrees) {
391 AsCanvas(ccanvas)->rotate(degrees);
392}
393
394void sk_canvas_rotate_radians(sk_canvas_t* ccanvas, float radians) {
395 AsCanvas(ccanvas)->rotate(SkRadiansToDegrees(radians));
396}
397
398void sk_canvas_skew(sk_canvas_t* ccanvas, float sx, float sy) {
399 AsCanvas(ccanvas)->skew(sx, sy);
400}
401
reede3719892014-12-22 17:46:00 -0800402void sk_canvas_concat(sk_canvas_t* ccanvas, const sk_matrix_t* cmatrix) {
abarth9503ac72014-12-02 15:47:33 -0800403 SkASSERT(cmatrix);
404 SkMatrix matrix;
405 from_c_matrix(cmatrix, &matrix);
406 AsCanvas(ccanvas)->concat(matrix);
407}
408
reede3719892014-12-22 17:46:00 -0800409void sk_canvas_clip_rect(sk_canvas_t* ccanvas, const sk_rect_t* crect) {
410 AsCanvas(ccanvas)->clipRect(AsRect(*crect));
411}
412
413void sk_canvas_clip_path(sk_canvas_t* ccanvas, const sk_path_t* cpath) {
414 AsCanvas(ccanvas)->clipPath(AsPath(*cpath));
415}
416
reed938dfba2014-10-06 06:08:16 -0700417void sk_canvas_draw_paint(sk_canvas_t* ccanvas, const sk_paint_t* cpaint) {
418 AsCanvas(ccanvas)->drawPaint(AsPaint(*cpaint));
419}
420
421void sk_canvas_draw_rect(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {
422 AsCanvas(ccanvas)->drawRect(AsRect(*crect), AsPaint(*cpaint));
423}
424
425void sk_canvas_draw_oval(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {
426 AsCanvas(ccanvas)->drawOval(AsRect(*crect), AsPaint(*cpaint));
427}
428
429void sk_canvas_draw_path(sk_canvas_t* ccanvas, const sk_path_t* cpath, const sk_paint_t* cpaint) {
430 AsCanvas(ccanvas)->drawPath(AsPath(*cpath), AsPaint(*cpaint));
431}
432
433void sk_canvas_draw_image(sk_canvas_t* ccanvas, const sk_image_t* cimage, float x, float y,
434 const sk_paint_t* cpaint) {
435 AsCanvas(ccanvas)->drawImage(AsImage(cimage), x, y, AsPaint(cpaint));
436}
437
reede3719892014-12-22 17:46:00 -0800438void sk_canvas_draw_image_rect(sk_canvas_t* ccanvas, const sk_image_t* cimage,
439 const sk_rect_t* csrcR, const sk_rect_t* cdstR,
440 const sk_paint_t* cpaint) {
441 AsCanvas(ccanvas)->drawImageRect(AsImage(cimage), AsRect(csrcR), AsRect(*cdstR), AsPaint(cpaint));
442}
443
444void sk_canvas_draw_picture(sk_canvas_t* ccanvas, const sk_picture_t* cpicture,
445 const sk_matrix_t* cmatrix, const sk_paint_t* cpaint) {
446 const SkMatrix* matrixPtr = NULL;
447 SkMatrix matrix;
448 if (cmatrix) {
449 from_c_matrix(cmatrix, &matrix);
450 matrixPtr = &matrix;
451 }
452 AsCanvas(ccanvas)->drawPicture(AsPicture(cpicture), matrixPtr, AsPaint(cpaint));
453}
454
reed938dfba2014-10-06 06:08:16 -0700455///////////////////////////////////////////////////////////////////////////////////////////
456
reed8e474782014-10-06 11:00:51 -0700457sk_surface_t* sk_surface_new_raster(const sk_imageinfo_t* cinfo) {
reede3323962014-10-24 11:16:19 -0700458 SkImageInfo info;
459 if (!from_c_info(*cinfo, &info)) {
460 return NULL;
461 }
462 return (sk_surface_t*)SkSurface::NewRaster(info);
reed938dfba2014-10-06 06:08:16 -0700463}
464
reed8e474782014-10-06 11:00:51 -0700465sk_surface_t* sk_surface_new_raster_direct(const sk_imageinfo_t* cinfo, void* pixels,
reed938dfba2014-10-06 06:08:16 -0700466 size_t rowBytes) {
reede3323962014-10-24 11:16:19 -0700467 SkImageInfo info;
468 if (!from_c_info(*cinfo, &info)) {
469 return NULL;
470 }
471 return (sk_surface_t*)SkSurface::NewRasterDirect(info, pixels, rowBytes);
reed938dfba2014-10-06 06:08:16 -0700472}
473
reedafa278e2014-11-24 19:11:48 -0800474void sk_surface_unref(sk_surface_t* csurf) {
475 SkSafeUnref((SkSurface*)csurf);
reed938dfba2014-10-06 06:08:16 -0700476}
477
478sk_canvas_t* sk_surface_get_canvas(sk_surface_t* csurf) {
479 SkSurface* surf = (SkSurface*)csurf;
reed8e474782014-10-06 11:00:51 -0700480 return (sk_canvas_t*)surf->getCanvas();
reed938dfba2014-10-06 06:08:16 -0700481}
482
483sk_image_t* sk_surface_new_image_snapshot(sk_surface_t* csurf) {
484 SkSurface* surf = (SkSurface*)csurf;
reed8e474782014-10-06 11:00:51 -0700485 return (sk_image_t*)surf->newImageSnapshot();
reed938dfba2014-10-06 06:08:16 -0700486}
487
reedafa278e2014-11-24 19:11:48 -0800488///////////////////////////////////////////////////////////////////////////////////////////
reed938dfba2014-10-06 06:08:16 -0700489
reede3719892014-12-22 17:46:00 -0800490sk_picture_recorder_t* sk_picture_recorder_new() {
491 return ToPictureRecorder(new SkPictureRecorder);
492}
493
494void sk_picture_recorder_delete(sk_picture_recorder_t* crec) {
495 delete AsPictureRecorder(crec);
496}
497
498sk_canvas_t* sk_picture_recorder_begin_recording(sk_picture_recorder_t* crec,
499 const sk_rect_t* cbounds) {
500 return ToCanvas(AsPictureRecorder(crec)->beginRecording(AsRect(*cbounds)));
501}
502
503sk_picture_t* sk_picture_recorder_end_recording(sk_picture_recorder_t* crec) {
504 return ToPicture(AsPictureRecorder(crec)->endRecording());
505}
506
507void sk_picture_ref(sk_picture_t* cpic) {
508 SkSafeRef(AsPicture(cpic));
509}
510
511void sk_picture_unref(sk_picture_t* cpic) {
512 SkSafeUnref(AsPicture(cpic));
513}
514
515uint32_t sk_picture_get_unique_id(sk_picture_t* cpic) {
516 return AsPicture(cpic)->uniqueID();
517}
518
519sk_rect_t sk_picture_get_bounds(sk_picture_t* cpic) {
520 return ToRect(AsPicture(cpic)->cullRect());
521}
522
523///////////////////////////////////////////////////////////////////////////////////////////
524
reedafa278e2014-11-24 19:11:48 -0800525#include "../../include/effects/SkGradientShader.h"
526#include "sk_shader.h"
527
528const struct {
529 sk_shader_tilemode_t fC;
530 SkShader::TileMode fSK;
531} gTileModeMap[] = {
532 { CLAMP_SK_SHADER_TILEMODE, SkShader::kClamp_TileMode },
533 { REPEAT_SK_SHADER_TILEMODE, SkShader::kRepeat_TileMode },
534 { MIRROR_SK_SHADER_TILEMODE, SkShader::kMirror_TileMode },
535};
536
537static bool from_c_tilemode(sk_shader_tilemode_t cMode, SkShader::TileMode* skMode) {
538 for (size_t i = 0; i < SK_ARRAY_COUNT(gTileModeMap); ++i) {
539 if (cMode == gTileModeMap[i].fC) {
540 if (skMode) {
541 *skMode = gTileModeMap[i].fSK;
542 }
543 return true;
544 }
545 }
546 return false;
547}
548
549void sk_shader_ref(sk_shader_t* cshader) {
550 SkSafeRef(AsShader(cshader));
551}
552
553void sk_shader_unref(sk_shader_t* cshader) {
554 SkSafeUnref(AsShader(cshader));
555}
556
557sk_shader_t* sk_shader_new_linear_gradient(const sk_point_t pts[2],
558 const sk_color_t colors[],
559 const float colorPos[],
560 int colorCount,
561 sk_shader_tilemode_t cmode,
562 const sk_matrix_t* cmatrix) {
563 SkShader::TileMode mode;
564 if (!from_c_tilemode(cmode, &mode)) {
565 return NULL;
566 }
567 SkMatrix matrix;
568 if (cmatrix) {
abarth9503ac72014-12-02 15:47:33 -0800569 from_c_matrix(cmatrix, &matrix);
reedafa278e2014-11-24 19:11:48 -0800570 } else {
571 matrix.setIdentity();
572 }
573 SkShader* s = SkGradientShader::CreateLinear(reinterpret_cast<const SkPoint*>(pts),
574 reinterpret_cast<const SkColor*>(colors),
575 colorPos, colorCount, mode, 0, &matrix);
576 return (sk_shader_t*)s;
577}
578
579///////////////////////////////////////////////////////////////////////////////////////////
reed0eafc9b2014-12-23 14:11:11 -0800580
581#include "../../include/effects/SkBlurMaskFilter.h"
582#include "sk_maskfilter.h"
583
584const struct {
585 sk_blurstyle_t fC;
586 SkBlurStyle fSk;
587} gBlurStylePairs[] = {
588 { NORMAL_SK_BLUR_STYLE, kNormal_SkBlurStyle },
589 { SOLID_SK_BLUR_STYLE, kSolid_SkBlurStyle },
590 { OUTER_SK_BLUR_STYLE, kOuter_SkBlurStyle },
591 { INNER_SK_BLUR_STYLE, kInner_SkBlurStyle },
592};
593
594static bool find_blurstyle(sk_blurstyle_t csrc, SkBlurStyle* dst) {
595 for (size_t i = 0; i < SK_ARRAY_COUNT(gBlurStylePairs); ++i) {
596 if (gBlurStylePairs[i].fC == csrc) {
597 if (dst) {
598 *dst = gBlurStylePairs[i].fSk;
599 }
600 return true;
601 }
602 }
603 return false;
604}
605
606void sk_maskfilter_ref(sk_maskfilter_t* cfilter) {
607 SkSafeRef(AsMaskFilter(cfilter));
608}
609
610void sk_maskfilter_unref(sk_maskfilter_t* cfilter) {
611 SkSafeUnref(AsMaskFilter(cfilter));
612}
613
614sk_maskfilter_t* sk_maskfilter_new_blur(sk_blurstyle_t cstyle, float sigma) {
615 SkBlurStyle style;
616 if (!find_blurstyle(cstyle, &style)) {
617 return NULL;
618 }
619 return ToMaskFilter(SkBlurMaskFilter::Create(style, sigma));
620}
621
622///////////////////////////////////////////////////////////////////////////////////////////
reedb2a5d7e2014-12-25 14:16:21 -0800623
624sk_data_t* sk_data_new_with_copy(const void* src, size_t length) {
625 return ToData(SkData::NewWithCopy(src, length));
626}
627
628sk_data_t* sk_data_new_from_malloc(const void* memory, size_t length) {
629 return ToData(SkData::NewFromMalloc(memory, length));
630}
631
632sk_data_t* sk_data_new_subset(const sk_data_t* csrc, size_t offset, size_t length) {
633 return ToData(SkData::NewSubset(AsData(csrc), offset, length));
634}
635
636void sk_data_ref(const sk_data_t* cdata) {
637 SkSafeRef(AsData(cdata));
638}
639
640void sk_data_unref(const sk_data_t* cdata) {
641 SkSafeUnref(AsData(cdata));
642}
643
644size_t sk_data_get_size(const sk_data_t* cdata) {
645 return AsData(cdata)->size();
646}
647
648const void* sk_data_get_data(const sk_data_t* cdata) {
649 return AsData(cdata)->data();
650}
651
652///////////////////////////////////////////////////////////////////////////////////////////
reedafa278e2014-11-24 19:11:48 -0800653///////////////////////////////////////////////////////////////////////////////////////////
reed8e474782014-10-06 11:00:51 -0700654
655void sk_test_capi(SkCanvas* canvas) {
656 sk_imageinfo_t cinfo;
657 cinfo.width = 100;
658 cinfo.height = 100;
659 cinfo.colorType = (sk_colortype_t)kN32_SkColorType;
660 cinfo.alphaType = (sk_alphatype_t)kPremul_SkAlphaType;
661
662 sk_surface_t* csurface = sk_surface_new_raster(&cinfo);
663 sk_canvas_t* ccanvas = sk_surface_get_canvas(csurface);
664
665 sk_paint_t* cpaint = sk_paint_new();
666 sk_paint_set_antialias(cpaint, true);
667 sk_paint_set_color(cpaint, 0xFFFF0000);
668
669 sk_rect_t cr = { 5, 5, 95, 95 };
670 sk_canvas_draw_oval(ccanvas, &cr, cpaint);
671
672 cr.left += 25;
673 cr.top += 25;
674 cr.right -= 25;
675 cr.bottom -= 25;
676 sk_paint_set_color(cpaint, 0xFF00FF00);
677 sk_canvas_draw_rect(ccanvas, &cr, cpaint);
678
robertphillipsa624e872014-10-08 06:04:35 -0700679 sk_path_t* cpath = sk_path_new();
680 sk_path_move_to(cpath, 50, 50);
681 sk_path_line_to(cpath, 100, 100);
682 sk_path_line_to(cpath, 50, 100);
683 sk_path_close(cpath);
684
685 sk_canvas_draw_path(ccanvas, cpath, cpaint);
686
reed8e474782014-10-06 11:00:51 -0700687 sk_image_t* cimage = sk_surface_new_image_snapshot(csurface);
688
689 // HERE WE CROSS THE C..C++ boundary
690 canvas->drawImage((const SkImage*)cimage, 20, 20, NULL);
691
robertphillipsa624e872014-10-08 06:04:35 -0700692 sk_path_delete(cpath);
reed8e474782014-10-06 11:00:51 -0700693 sk_paint_delete(cpaint);
694 sk_image_unref(cimage);
reedafa278e2014-11-24 19:11:48 -0800695 sk_surface_unref(csurface);
reed8e474782014-10-06 11:00:51 -0700696}