blob: 6653a298c44c3352f6405584d333057e5e768fea [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"
9#include "sk_image.h"
10#include "sk_paint.h"
11#include "sk_path.h"
reed938dfba2014-10-06 06:08:16 -070012#include "sk_surface.h"
13
14#include "SkCanvas.h"
15#include "SkImage.h"
reed0eafc9b2014-12-23 14:11:11 -080016#include "SkMaskFilter.h"
reed938dfba2014-10-06 06:08:16 -070017#include "SkMatrix.h"
18#include "SkPaint.h"
19#include "SkPath.h"
reede3719892014-12-22 17:46:00 -080020#include "SkPictureRecorder.h"
reed938dfba2014-10-06 06:08:16 -070021#include "SkSurface.h"
22
reede3323962014-10-24 11:16:19 -070023const struct {
24 sk_colortype_t fC;
25 SkColorType fSK;
26} gColorTypeMap[] = {
27 { UNKNOWN_SK_COLORTYPE, kUnknown_SkColorType },
28 { RGBA_8888_SK_COLORTYPE, kRGBA_8888_SkColorType },
29 { BGRA_8888_SK_COLORTYPE, kBGRA_8888_SkColorType },
30 { ALPHA_8_SK_COLORTYPE, kAlpha_8_SkColorType },
31};
32
33const struct {
34 sk_alphatype_t fC;
35 SkAlphaType fSK;
36} gAlphaTypeMap[] = {
37 { OPAQUE_SK_ALPHATYPE, kOpaque_SkAlphaType },
38 { PREMUL_SK_ALPHATYPE, kPremul_SkAlphaType },
39 { UNPREMUL_SK_ALPHATYPE, kUnpremul_SkAlphaType },
40};
41
42static bool from_c_colortype(sk_colortype_t cCT, SkColorType* skCT) {
43 for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypeMap); ++i) {
44 if (gColorTypeMap[i].fC == cCT) {
45 if (skCT) {
46 *skCT = gColorTypeMap[i].fSK;
47 }
48 return true;
49 }
50 }
51 return false;
52}
53
54static bool to_c_colortype(SkColorType skCT, sk_colortype_t* cCT) {
55 for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypeMap); ++i) {
56 if (gColorTypeMap[i].fSK == skCT) {
57 if (cCT) {
58 *cCT = gColorTypeMap[i].fC;
59 }
60 return true;
61 }
62 }
63 return false;
64}
65
66static bool from_c_alphatype(sk_alphatype_t cAT, SkAlphaType* skAT) {
67 for (size_t i = 0; i < SK_ARRAY_COUNT(gAlphaTypeMap); ++i) {
68 if (gAlphaTypeMap[i].fC == cAT) {
69 if (skAT) {
70 *skAT = gAlphaTypeMap[i].fSK;
71 }
72 return true;
73 }
74 }
75 return false;
76}
77
78static bool from_c_info(const sk_imageinfo_t& cinfo, SkImageInfo* info) {
79 SkColorType ct;
80 SkAlphaType at;
81
82 if (!from_c_colortype(cinfo.colorType, &ct)) {
83 // optionally report error to client?
84 return false;
85 }
86 if (!from_c_alphatype(cinfo.alphaType, &at)) {
87 // optionally report error to client?
88 return false;
89 }
90 if (info) {
91 *info = SkImageInfo::Make(cinfo.width, cinfo.height, ct, at);
92 }
93 return true;
reed938dfba2014-10-06 06:08:16 -070094}
95
abarth9503ac72014-12-02 15:47:33 -080096static void from_c_matrix(const sk_matrix_t* cmatrix, SkMatrix* matrix) {
97 matrix->setAll(cmatrix->mat[0], cmatrix->mat[1], cmatrix->mat[2],
98 cmatrix->mat[3], cmatrix->mat[4], cmatrix->mat[5],
99 cmatrix->mat[6], cmatrix->mat[7], cmatrix->mat[8]);
100}
101
reed73c25012014-11-17 06:15:42 -0800102const struct {
103 sk_path_direction_t fC;
104 SkPath::Direction fSk;
105} gPathDirMap[] = {
106 { CW_SK_PATH_DIRECTION, SkPath::kCW_Direction },
107 { CCW_SK_PATH_DIRECTION, SkPath::kCCW_Direction },
108};
109
110static bool from_c_path_direction(sk_path_direction_t cdir, SkPath::Direction* dir) {
111 for (size_t i = 0; i < SK_ARRAY_COUNT(gPathDirMap); ++i) {
112 if (gPathDirMap[i].fC == cdir) {
113 if (dir) {
114 *dir = gPathDirMap[i].fSk;
115 }
116 return true;
117 }
118 }
119 return false;
120}
121
reede3719892014-12-22 17:46:00 -0800122static sk_rect_t ToRect(const SkRect& rect) {
123 return reinterpret_cast<const sk_rect_t&>(rect);
124}
125
reed8e474782014-10-06 11:00:51 -0700126static const SkRect& AsRect(const sk_rect_t& crect) {
127 return reinterpret_cast<const SkRect&>(crect);
128}
129
reede3719892014-12-22 17:46:00 -0800130static const SkRect* AsRect(const sk_rect_t* crect) {
131 return reinterpret_cast<const SkRect*>(crect);
reed73c25012014-11-17 06:15:42 -0800132}
133
reed8e474782014-10-06 11:00:51 -0700134static const SkPath& AsPath(const sk_path_t& cpath) {
135 return reinterpret_cast<const SkPath&>(cpath);
136}
137
robertphillipsa624e872014-10-08 06:04:35 -0700138static SkPath* as_path(sk_path_t* cpath) {
139 return reinterpret_cast<SkPath*>(cpath);
140}
141
reed8e474782014-10-06 11:00:51 -0700142static const SkImage* AsImage(const sk_image_t* cimage) {
143 return reinterpret_cast<const SkImage*>(cimage);
144}
reed938dfba2014-10-06 06:08:16 -0700145
146static const SkPaint& AsPaint(const sk_paint_t& cpaint) {
reed8e474782014-10-06 11:00:51 -0700147 return reinterpret_cast<const SkPaint&>(cpaint);
reed938dfba2014-10-06 06:08:16 -0700148}
149
150static const SkPaint* AsPaint(const sk_paint_t* cpaint) {
reed8e474782014-10-06 11:00:51 -0700151 return reinterpret_cast<const SkPaint*>(cpaint);
reed938dfba2014-10-06 06:08:16 -0700152}
153
reed8e474782014-10-06 11:00:51 -0700154static SkPaint* AsPaint(sk_paint_t* cpaint) {
155 return reinterpret_cast<SkPaint*>(cpaint);
156}
157
reede3719892014-12-22 17:46:00 -0800158static sk_canvas_t* ToCanvas(SkCanvas* canvas) {
159 return reinterpret_cast<sk_canvas_t*>(canvas);
160}
161
reed8e474782014-10-06 11:00:51 -0700162static SkCanvas* AsCanvas(sk_canvas_t* ccanvas) {
163 return reinterpret_cast<SkCanvas*>(ccanvas);
164}
165
reed0eafc9b2014-12-23 14:11:11 -0800166static SkMaskFilter* AsMaskFilter(sk_maskfilter_t* cfilter) {
167 return reinterpret_cast<SkMaskFilter*>(cfilter);
168}
169
170static sk_maskfilter_t* ToMaskFilter(SkMaskFilter* filter) {
171 return reinterpret_cast<sk_maskfilter_t*>(filter);
172}
173
reedafa278e2014-11-24 19:11:48 -0800174static SkShader* AsShader(sk_shader_t* cshader) {
175 return reinterpret_cast<SkShader*>(cshader);
176}
177
reede3719892014-12-22 17:46:00 -0800178static SkPictureRecorder* AsPictureRecorder(sk_picture_recorder_t* crec) {
179 return reinterpret_cast<SkPictureRecorder*>(crec);
180}
181
182static sk_picture_recorder_t* ToPictureRecorder(SkPictureRecorder* rec) {
183 return reinterpret_cast<sk_picture_recorder_t*>(rec);
184}
185
186static const SkPicture* AsPicture(const sk_picture_t* cpic) {
187 return reinterpret_cast<const SkPicture*>(cpic);
188}
189
190static SkPicture* AsPicture(sk_picture_t* cpic) {
191 return reinterpret_cast<SkPicture*>(cpic);
192}
193
194static sk_picture_t* ToPicture(SkPicture* pic) {
195 return reinterpret_cast<sk_picture_t*>(pic);
196}
197
reed8e474782014-10-06 11:00:51 -0700198///////////////////////////////////////////////////////////////////////////////////////////
199
reede3323962014-10-24 11:16:19 -0700200sk_colortype_t sk_colortype_get_default_8888() {
201 sk_colortype_t ct;
202 if (!to_c_colortype(kN32_SkColorType, &ct)) {
203 ct = UNKNOWN_SK_COLORTYPE;
204 }
205 return ct;
206}
207
208///////////////////////////////////////////////////////////////////////////////////////////
209
reed8e474782014-10-06 11:00:51 -0700210sk_image_t* sk_image_new_raster_copy(const sk_imageinfo_t* cinfo, const void* pixels,
211 size_t rowBytes) {
reede3323962014-10-24 11:16:19 -0700212 SkImageInfo info;
213 if (!from_c_info(*cinfo, &info)) {
214 return NULL;
215 }
216 return (sk_image_t*)SkImage::NewRasterCopy(info, pixels, rowBytes);
reed8e474782014-10-06 11:00:51 -0700217}
218
219void sk_image_ref(const sk_image_t* cimage) {
220 AsImage(cimage)->ref();
221}
222
223void sk_image_unref(const sk_image_t* cimage) {
224 AsImage(cimage)->unref();
225}
226
227int sk_image_get_width(const sk_image_t* cimage) {
228 return AsImage(cimage)->width();
229}
230
231int sk_image_get_height(const sk_image_t* cimage) {
232 return AsImage(cimage)->height();
233}
234
235uint32_t sk_image_get_unique_id(const sk_image_t* cimage) {
236 return AsImage(cimage)->uniqueID();
237}
238
239///////////////////////////////////////////////////////////////////////////////////////////
240
241sk_paint_t* sk_paint_new() {
242 return (sk_paint_t*)SkNEW(SkPaint);
243}
244
245void sk_paint_delete(sk_paint_t* cpaint) {
246 SkDELETE(AsPaint(cpaint));
247}
248
249bool sk_paint_is_antialias(const sk_paint_t* cpaint) {
250 return AsPaint(*cpaint).isAntiAlias();
251}
252
253void sk_paint_set_antialias(sk_paint_t* cpaint, bool aa) {
254 AsPaint(cpaint)->setAntiAlias(aa);
255}
256
257sk_color_t sk_paint_get_color(const sk_paint_t* cpaint) {
258 return AsPaint(*cpaint).getColor();
259}
260
261void sk_paint_set_color(sk_paint_t* cpaint, sk_color_t c) {
262 AsPaint(cpaint)->setColor(c);
263}
reed938dfba2014-10-06 06:08:16 -0700264
reedafa278e2014-11-24 19:11:48 -0800265void sk_paint_set_shader(sk_paint_t* cpaint, sk_shader_t* cshader) {
266 AsPaint(cpaint)->setShader(AsShader(cshader));
267}
268
reed0eafc9b2014-12-23 14:11:11 -0800269void sk_paint_set_maskfilter(sk_paint_t* cpaint, sk_maskfilter_t* cfilter) {
270 AsPaint(cpaint)->setMaskFilter(AsMaskFilter(cfilter));
271}
272
reed938dfba2014-10-06 06:08:16 -0700273///////////////////////////////////////////////////////////////////////////////////////////
274
robertphillipsa624e872014-10-08 06:04:35 -0700275sk_path_t* sk_path_new() {
276 return (sk_path_t*)SkNEW(SkPath);
277}
278
279void sk_path_delete(sk_path_t* cpath) {
280 SkDELETE(as_path(cpath));
281}
282
283void sk_path_move_to(sk_path_t* cpath, float x, float y) {
284 as_path(cpath)->moveTo(x, y);
285}
286
287void sk_path_line_to(sk_path_t* cpath, float x, float y) {
288 as_path(cpath)->lineTo(x, y);
289}
290
291void sk_path_quad_to(sk_path_t* cpath, float x0, float y0, float x1, float y1) {
292 as_path(cpath)->quadTo(x0, y0, x1, y1);
293}
294
reed73c25012014-11-17 06:15:42 -0800295void sk_path_conic_to(sk_path_t* cpath, float x0, float y0, float x1, float y1, float w) {
296 as_path(cpath)->conicTo(x0, y0, x1, y1, w);
297}
298
299void sk_path_cubic_to(sk_path_t* cpath, float x0, float y0, float x1, float y1, float x2, float y2) {
300 as_path(cpath)->cubicTo(x0, y0, x1, y1, x2, y2);
301}
302
robertphillipsa624e872014-10-08 06:04:35 -0700303void sk_path_close(sk_path_t* cpath) {
304 as_path(cpath)->close();
305}
306
reed73c25012014-11-17 06:15:42 -0800307void sk_path_add_rect(sk_path_t* cpath, const sk_rect_t* crect, sk_path_direction_t cdir) {
308 SkPath::Direction dir;
309 if (!from_c_path_direction(cdir, &dir)) {
310 return;
311 }
312 as_path(cpath)->addRect(AsRect(*crect), dir);
313}
314
315void sk_path_add_oval(sk_path_t* cpath, const sk_rect_t* crect, sk_path_direction_t cdir) {
316 SkPath::Direction dir;
317 if (!from_c_path_direction(cdir, &dir)) {
318 return;
319 }
320 as_path(cpath)->addOval(AsRect(*crect), dir);
321}
322
323bool sk_path_get_bounds(const sk_path_t* cpath, sk_rect_t* crect) {
324 const SkPath& path = AsPath(*cpath);
reed73c25012014-11-17 06:15:42 -0800325
326 if (path.isEmpty()) {
reede3719892014-12-22 17:46:00 -0800327 if (crect) {
328 *crect = ToRect(SkRect::MakeEmpty());
reed73c25012014-11-17 06:15:42 -0800329 }
330 return false;
331 }
reede3719892014-12-22 17:46:00 -0800332
333 if (crect) {
334 *crect = ToRect(path.getBounds());
335 }
reed73c25012014-11-17 06:15:42 -0800336 return true;
337}
338
robertphillipsa624e872014-10-08 06:04:35 -0700339///////////////////////////////////////////////////////////////////////////////////////////
340
reed938dfba2014-10-06 06:08:16 -0700341void sk_canvas_save(sk_canvas_t* ccanvas) {
342 AsCanvas(ccanvas)->save();
343}
344
345void sk_canvas_save_layer(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {
346 AsCanvas(ccanvas)->drawRect(AsRect(*crect), AsPaint(*cpaint));
347}
348
349void sk_canvas_restore(sk_canvas_t* ccanvas) {
350 AsCanvas(ccanvas)->restore();
351}
352
353void sk_canvas_translate(sk_canvas_t* ccanvas, float dx, float dy) {
354 AsCanvas(ccanvas)->translate(dx, dy);
355}
356
357void sk_canvas_scale(sk_canvas_t* ccanvas, float sx, float sy) {
reed8e474782014-10-06 11:00:51 -0700358 AsCanvas(ccanvas)->scale(sx, sy);
reed938dfba2014-10-06 06:08:16 -0700359}
360
abarth2fc6ea62014-12-01 14:04:03 -0800361void sk_canvas_rotate_degress(sk_canvas_t* ccanvas, float degrees) {
362 AsCanvas(ccanvas)->rotate(degrees);
363}
364
365void sk_canvas_rotate_radians(sk_canvas_t* ccanvas, float radians) {
366 AsCanvas(ccanvas)->rotate(SkRadiansToDegrees(radians));
367}
368
369void sk_canvas_skew(sk_canvas_t* ccanvas, float sx, float sy) {
370 AsCanvas(ccanvas)->skew(sx, sy);
371}
372
reede3719892014-12-22 17:46:00 -0800373void sk_canvas_concat(sk_canvas_t* ccanvas, const sk_matrix_t* cmatrix) {
abarth9503ac72014-12-02 15:47:33 -0800374 SkASSERT(cmatrix);
375 SkMatrix matrix;
376 from_c_matrix(cmatrix, &matrix);
377 AsCanvas(ccanvas)->concat(matrix);
378}
379
reede3719892014-12-22 17:46:00 -0800380void sk_canvas_clip_rect(sk_canvas_t* ccanvas, const sk_rect_t* crect) {
381 AsCanvas(ccanvas)->clipRect(AsRect(*crect));
382}
383
384void sk_canvas_clip_path(sk_canvas_t* ccanvas, const sk_path_t* cpath) {
385 AsCanvas(ccanvas)->clipPath(AsPath(*cpath));
386}
387
reed938dfba2014-10-06 06:08:16 -0700388void sk_canvas_draw_paint(sk_canvas_t* ccanvas, const sk_paint_t* cpaint) {
389 AsCanvas(ccanvas)->drawPaint(AsPaint(*cpaint));
390}
391
392void sk_canvas_draw_rect(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {
393 AsCanvas(ccanvas)->drawRect(AsRect(*crect), AsPaint(*cpaint));
394}
395
396void sk_canvas_draw_oval(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {
397 AsCanvas(ccanvas)->drawOval(AsRect(*crect), AsPaint(*cpaint));
398}
399
400void sk_canvas_draw_path(sk_canvas_t* ccanvas, const sk_path_t* cpath, const sk_paint_t* cpaint) {
401 AsCanvas(ccanvas)->drawPath(AsPath(*cpath), AsPaint(*cpaint));
402}
403
404void sk_canvas_draw_image(sk_canvas_t* ccanvas, const sk_image_t* cimage, float x, float y,
405 const sk_paint_t* cpaint) {
406 AsCanvas(ccanvas)->drawImage(AsImage(cimage), x, y, AsPaint(cpaint));
407}
408
reede3719892014-12-22 17:46:00 -0800409void sk_canvas_draw_image_rect(sk_canvas_t* ccanvas, const sk_image_t* cimage,
410 const sk_rect_t* csrcR, const sk_rect_t* cdstR,
411 const sk_paint_t* cpaint) {
412 AsCanvas(ccanvas)->drawImageRect(AsImage(cimage), AsRect(csrcR), AsRect(*cdstR), AsPaint(cpaint));
413}
414
415void sk_canvas_draw_picture(sk_canvas_t* ccanvas, const sk_picture_t* cpicture,
416 const sk_matrix_t* cmatrix, const sk_paint_t* cpaint) {
417 const SkMatrix* matrixPtr = NULL;
418 SkMatrix matrix;
419 if (cmatrix) {
420 from_c_matrix(cmatrix, &matrix);
421 matrixPtr = &matrix;
422 }
423 AsCanvas(ccanvas)->drawPicture(AsPicture(cpicture), matrixPtr, AsPaint(cpaint));
424}
425
reed938dfba2014-10-06 06:08:16 -0700426///////////////////////////////////////////////////////////////////////////////////////////
427
reed8e474782014-10-06 11:00:51 -0700428sk_surface_t* sk_surface_new_raster(const sk_imageinfo_t* cinfo) {
reede3323962014-10-24 11:16:19 -0700429 SkImageInfo info;
430 if (!from_c_info(*cinfo, &info)) {
431 return NULL;
432 }
433 return (sk_surface_t*)SkSurface::NewRaster(info);
reed938dfba2014-10-06 06:08:16 -0700434}
435
reed8e474782014-10-06 11:00:51 -0700436sk_surface_t* sk_surface_new_raster_direct(const sk_imageinfo_t* cinfo, void* pixels,
reed938dfba2014-10-06 06:08:16 -0700437 size_t rowBytes) {
reede3323962014-10-24 11:16:19 -0700438 SkImageInfo info;
439 if (!from_c_info(*cinfo, &info)) {
440 return NULL;
441 }
442 return (sk_surface_t*)SkSurface::NewRasterDirect(info, pixels, rowBytes);
reed938dfba2014-10-06 06:08:16 -0700443}
444
reedafa278e2014-11-24 19:11:48 -0800445void sk_surface_unref(sk_surface_t* csurf) {
446 SkSafeUnref((SkSurface*)csurf);
reed938dfba2014-10-06 06:08:16 -0700447}
448
449sk_canvas_t* sk_surface_get_canvas(sk_surface_t* csurf) {
450 SkSurface* surf = (SkSurface*)csurf;
reed8e474782014-10-06 11:00:51 -0700451 return (sk_canvas_t*)surf->getCanvas();
reed938dfba2014-10-06 06:08:16 -0700452}
453
454sk_image_t* sk_surface_new_image_snapshot(sk_surface_t* csurf) {
455 SkSurface* surf = (SkSurface*)csurf;
reed8e474782014-10-06 11:00:51 -0700456 return (sk_image_t*)surf->newImageSnapshot();
reed938dfba2014-10-06 06:08:16 -0700457}
458
reedafa278e2014-11-24 19:11:48 -0800459///////////////////////////////////////////////////////////////////////////////////////////
reed938dfba2014-10-06 06:08:16 -0700460
reede3719892014-12-22 17:46:00 -0800461sk_picture_recorder_t* sk_picture_recorder_new() {
462 return ToPictureRecorder(new SkPictureRecorder);
463}
464
465void sk_picture_recorder_delete(sk_picture_recorder_t* crec) {
466 delete AsPictureRecorder(crec);
467}
468
469sk_canvas_t* sk_picture_recorder_begin_recording(sk_picture_recorder_t* crec,
470 const sk_rect_t* cbounds) {
471 return ToCanvas(AsPictureRecorder(crec)->beginRecording(AsRect(*cbounds)));
472}
473
474sk_picture_t* sk_picture_recorder_end_recording(sk_picture_recorder_t* crec) {
475 return ToPicture(AsPictureRecorder(crec)->endRecording());
476}
477
478void sk_picture_ref(sk_picture_t* cpic) {
479 SkSafeRef(AsPicture(cpic));
480}
481
482void sk_picture_unref(sk_picture_t* cpic) {
483 SkSafeUnref(AsPicture(cpic));
484}
485
486uint32_t sk_picture_get_unique_id(sk_picture_t* cpic) {
487 return AsPicture(cpic)->uniqueID();
488}
489
490sk_rect_t sk_picture_get_bounds(sk_picture_t* cpic) {
491 return ToRect(AsPicture(cpic)->cullRect());
492}
493
494///////////////////////////////////////////////////////////////////////////////////////////
495
reedafa278e2014-11-24 19:11:48 -0800496#include "../../include/effects/SkGradientShader.h"
497#include "sk_shader.h"
498
499const struct {
500 sk_shader_tilemode_t fC;
501 SkShader::TileMode fSK;
502} gTileModeMap[] = {
503 { CLAMP_SK_SHADER_TILEMODE, SkShader::kClamp_TileMode },
504 { REPEAT_SK_SHADER_TILEMODE, SkShader::kRepeat_TileMode },
505 { MIRROR_SK_SHADER_TILEMODE, SkShader::kMirror_TileMode },
506};
507
508static bool from_c_tilemode(sk_shader_tilemode_t cMode, SkShader::TileMode* skMode) {
509 for (size_t i = 0; i < SK_ARRAY_COUNT(gTileModeMap); ++i) {
510 if (cMode == gTileModeMap[i].fC) {
511 if (skMode) {
512 *skMode = gTileModeMap[i].fSK;
513 }
514 return true;
515 }
516 }
517 return false;
518}
519
520void sk_shader_ref(sk_shader_t* cshader) {
521 SkSafeRef(AsShader(cshader));
522}
523
524void sk_shader_unref(sk_shader_t* cshader) {
525 SkSafeUnref(AsShader(cshader));
526}
527
528sk_shader_t* sk_shader_new_linear_gradient(const sk_point_t pts[2],
529 const sk_color_t colors[],
530 const float colorPos[],
531 int colorCount,
532 sk_shader_tilemode_t cmode,
533 const sk_matrix_t* cmatrix) {
534 SkShader::TileMode mode;
535 if (!from_c_tilemode(cmode, &mode)) {
536 return NULL;
537 }
538 SkMatrix matrix;
539 if (cmatrix) {
abarth9503ac72014-12-02 15:47:33 -0800540 from_c_matrix(cmatrix, &matrix);
reedafa278e2014-11-24 19:11:48 -0800541 } else {
542 matrix.setIdentity();
543 }
544 SkShader* s = SkGradientShader::CreateLinear(reinterpret_cast<const SkPoint*>(pts),
545 reinterpret_cast<const SkColor*>(colors),
546 colorPos, colorCount, mode, 0, &matrix);
547 return (sk_shader_t*)s;
548}
549
550///////////////////////////////////////////////////////////////////////////////////////////
reed0eafc9b2014-12-23 14:11:11 -0800551
552#include "../../include/effects/SkBlurMaskFilter.h"
553#include "sk_maskfilter.h"
554
555const struct {
556 sk_blurstyle_t fC;
557 SkBlurStyle fSk;
558} gBlurStylePairs[] = {
559 { NORMAL_SK_BLUR_STYLE, kNormal_SkBlurStyle },
560 { SOLID_SK_BLUR_STYLE, kSolid_SkBlurStyle },
561 { OUTER_SK_BLUR_STYLE, kOuter_SkBlurStyle },
562 { INNER_SK_BLUR_STYLE, kInner_SkBlurStyle },
563};
564
565static bool find_blurstyle(sk_blurstyle_t csrc, SkBlurStyle* dst) {
566 for (size_t i = 0; i < SK_ARRAY_COUNT(gBlurStylePairs); ++i) {
567 if (gBlurStylePairs[i].fC == csrc) {
568 if (dst) {
569 *dst = gBlurStylePairs[i].fSk;
570 }
571 return true;
572 }
573 }
574 return false;
575}
576
577void sk_maskfilter_ref(sk_maskfilter_t* cfilter) {
578 SkSafeRef(AsMaskFilter(cfilter));
579}
580
581void sk_maskfilter_unref(sk_maskfilter_t* cfilter) {
582 SkSafeUnref(AsMaskFilter(cfilter));
583}
584
585sk_maskfilter_t* sk_maskfilter_new_blur(sk_blurstyle_t cstyle, float sigma) {
586 SkBlurStyle style;
587 if (!find_blurstyle(cstyle, &style)) {
588 return NULL;
589 }
590 return ToMaskFilter(SkBlurMaskFilter::Create(style, sigma));
591}
592
593///////////////////////////////////////////////////////////////////////////////////////////
reedafa278e2014-11-24 19:11:48 -0800594///////////////////////////////////////////////////////////////////////////////////////////
reed8e474782014-10-06 11:00:51 -0700595
596void sk_test_capi(SkCanvas* canvas) {
597 sk_imageinfo_t cinfo;
598 cinfo.width = 100;
599 cinfo.height = 100;
600 cinfo.colorType = (sk_colortype_t)kN32_SkColorType;
601 cinfo.alphaType = (sk_alphatype_t)kPremul_SkAlphaType;
602
603 sk_surface_t* csurface = sk_surface_new_raster(&cinfo);
604 sk_canvas_t* ccanvas = sk_surface_get_canvas(csurface);
605
606 sk_paint_t* cpaint = sk_paint_new();
607 sk_paint_set_antialias(cpaint, true);
608 sk_paint_set_color(cpaint, 0xFFFF0000);
609
610 sk_rect_t cr = { 5, 5, 95, 95 };
611 sk_canvas_draw_oval(ccanvas, &cr, cpaint);
612
613 cr.left += 25;
614 cr.top += 25;
615 cr.right -= 25;
616 cr.bottom -= 25;
617 sk_paint_set_color(cpaint, 0xFF00FF00);
618 sk_canvas_draw_rect(ccanvas, &cr, cpaint);
619
robertphillipsa624e872014-10-08 06:04:35 -0700620 sk_path_t* cpath = sk_path_new();
621 sk_path_move_to(cpath, 50, 50);
622 sk_path_line_to(cpath, 100, 100);
623 sk_path_line_to(cpath, 50, 100);
624 sk_path_close(cpath);
625
626 sk_canvas_draw_path(ccanvas, cpath, cpaint);
627
reed8e474782014-10-06 11:00:51 -0700628 sk_image_t* cimage = sk_surface_new_image_snapshot(csurface);
629
630 // HERE WE CROSS THE C..C++ boundary
631 canvas->drawImage((const SkImage*)cimage, 20, 20, NULL);
632
robertphillipsa624e872014-10-08 06:04:35 -0700633 sk_path_delete(cpath);
reed8e474782014-10-06 11:00:51 -0700634 sk_paint_delete(cpaint);
635 sk_image_unref(cimage);
reedafa278e2014-11-24 19:11:48 -0800636 sk_surface_unref(csurface);
reed8e474782014-10-06 11:00:51 -0700637}