blob: b60596008f8abecd87dfaabc2f107ca37acc99d9 [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) {
reed2906d4a2014-12-25 20:41:13 -0800236 SkImageGenerator* gen = NULL;
237#if 0
238 // enable this when SkDecodingImageGenerator is available in chrome (decode codecs)
239 gen = SkDecodingImageGenerator::Create(AsData(cdata), SkDecodingImageGenerator::Options());
240#endif
reedb2a5d7e2014-12-25 14:16:21 -0800241 if (NULL == gen) {
242 return NULL;
243 }
244 return ToImage(SkImage::NewFromGenerator(gen));
245}
246
247sk_data_t* sk_image_encode(const sk_image_t* cimage) {
248 return ToData(AsImage(cimage)->encode());
249}
250
reed8e474782014-10-06 11:00:51 -0700251void sk_image_ref(const sk_image_t* cimage) {
252 AsImage(cimage)->ref();
253}
254
255void sk_image_unref(const sk_image_t* cimage) {
256 AsImage(cimage)->unref();
257}
258
259int sk_image_get_width(const sk_image_t* cimage) {
260 return AsImage(cimage)->width();
261}
262
263int sk_image_get_height(const sk_image_t* cimage) {
264 return AsImage(cimage)->height();
265}
266
267uint32_t sk_image_get_unique_id(const sk_image_t* cimage) {
268 return AsImage(cimage)->uniqueID();
269}
270
271///////////////////////////////////////////////////////////////////////////////////////////
272
273sk_paint_t* sk_paint_new() {
274 return (sk_paint_t*)SkNEW(SkPaint);
275}
276
277void sk_paint_delete(sk_paint_t* cpaint) {
278 SkDELETE(AsPaint(cpaint));
279}
280
281bool sk_paint_is_antialias(const sk_paint_t* cpaint) {
282 return AsPaint(*cpaint).isAntiAlias();
283}
284
285void sk_paint_set_antialias(sk_paint_t* cpaint, bool aa) {
286 AsPaint(cpaint)->setAntiAlias(aa);
287}
288
289sk_color_t sk_paint_get_color(const sk_paint_t* cpaint) {
290 return AsPaint(*cpaint).getColor();
291}
292
293void sk_paint_set_color(sk_paint_t* cpaint, sk_color_t c) {
294 AsPaint(cpaint)->setColor(c);
295}
reed938dfba2014-10-06 06:08:16 -0700296
reedafa278e2014-11-24 19:11:48 -0800297void sk_paint_set_shader(sk_paint_t* cpaint, sk_shader_t* cshader) {
298 AsPaint(cpaint)->setShader(AsShader(cshader));
299}
300
reed0eafc9b2014-12-23 14:11:11 -0800301void sk_paint_set_maskfilter(sk_paint_t* cpaint, sk_maskfilter_t* cfilter) {
302 AsPaint(cpaint)->setMaskFilter(AsMaskFilter(cfilter));
303}
304
reed938dfba2014-10-06 06:08:16 -0700305///////////////////////////////////////////////////////////////////////////////////////////
306
robertphillipsa624e872014-10-08 06:04:35 -0700307sk_path_t* sk_path_new() {
308 return (sk_path_t*)SkNEW(SkPath);
309}
310
311void sk_path_delete(sk_path_t* cpath) {
312 SkDELETE(as_path(cpath));
313}
314
315void sk_path_move_to(sk_path_t* cpath, float x, float y) {
316 as_path(cpath)->moveTo(x, y);
317}
318
319void sk_path_line_to(sk_path_t* cpath, float x, float y) {
320 as_path(cpath)->lineTo(x, y);
321}
322
323void sk_path_quad_to(sk_path_t* cpath, float x0, float y0, float x1, float y1) {
324 as_path(cpath)->quadTo(x0, y0, x1, y1);
325}
326
reed73c25012014-11-17 06:15:42 -0800327void sk_path_conic_to(sk_path_t* cpath, float x0, float y0, float x1, float y1, float w) {
328 as_path(cpath)->conicTo(x0, y0, x1, y1, w);
329}
330
331void sk_path_cubic_to(sk_path_t* cpath, float x0, float y0, float x1, float y1, float x2, float y2) {
332 as_path(cpath)->cubicTo(x0, y0, x1, y1, x2, y2);
333}
334
robertphillipsa624e872014-10-08 06:04:35 -0700335void sk_path_close(sk_path_t* cpath) {
336 as_path(cpath)->close();
337}
338
reed73c25012014-11-17 06:15:42 -0800339void sk_path_add_rect(sk_path_t* cpath, const sk_rect_t* crect, sk_path_direction_t cdir) {
340 SkPath::Direction dir;
341 if (!from_c_path_direction(cdir, &dir)) {
342 return;
343 }
344 as_path(cpath)->addRect(AsRect(*crect), dir);
345}
346
347void sk_path_add_oval(sk_path_t* cpath, const sk_rect_t* crect, sk_path_direction_t cdir) {
348 SkPath::Direction dir;
349 if (!from_c_path_direction(cdir, &dir)) {
350 return;
351 }
352 as_path(cpath)->addOval(AsRect(*crect), dir);
353}
354
355bool sk_path_get_bounds(const sk_path_t* cpath, sk_rect_t* crect) {
356 const SkPath& path = AsPath(*cpath);
reed73c25012014-11-17 06:15:42 -0800357
358 if (path.isEmpty()) {
reede3719892014-12-22 17:46:00 -0800359 if (crect) {
360 *crect = ToRect(SkRect::MakeEmpty());
reed73c25012014-11-17 06:15:42 -0800361 }
362 return false;
363 }
reede3719892014-12-22 17:46:00 -0800364
365 if (crect) {
366 *crect = ToRect(path.getBounds());
367 }
reed73c25012014-11-17 06:15:42 -0800368 return true;
369}
370
robertphillipsa624e872014-10-08 06:04:35 -0700371///////////////////////////////////////////////////////////////////////////////////////////
372
reed938dfba2014-10-06 06:08:16 -0700373void sk_canvas_save(sk_canvas_t* ccanvas) {
374 AsCanvas(ccanvas)->save();
375}
376
377void sk_canvas_save_layer(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {
378 AsCanvas(ccanvas)->drawRect(AsRect(*crect), AsPaint(*cpaint));
379}
380
381void sk_canvas_restore(sk_canvas_t* ccanvas) {
382 AsCanvas(ccanvas)->restore();
383}
384
385void sk_canvas_translate(sk_canvas_t* ccanvas, float dx, float dy) {
386 AsCanvas(ccanvas)->translate(dx, dy);
387}
388
389void sk_canvas_scale(sk_canvas_t* ccanvas, float sx, float sy) {
reed8e474782014-10-06 11:00:51 -0700390 AsCanvas(ccanvas)->scale(sx, sy);
reed938dfba2014-10-06 06:08:16 -0700391}
392
abarth2fc6ea62014-12-01 14:04:03 -0800393void sk_canvas_rotate_degress(sk_canvas_t* ccanvas, float degrees) {
394 AsCanvas(ccanvas)->rotate(degrees);
395}
396
397void sk_canvas_rotate_radians(sk_canvas_t* ccanvas, float radians) {
398 AsCanvas(ccanvas)->rotate(SkRadiansToDegrees(radians));
399}
400
401void sk_canvas_skew(sk_canvas_t* ccanvas, float sx, float sy) {
402 AsCanvas(ccanvas)->skew(sx, sy);
403}
404
reede3719892014-12-22 17:46:00 -0800405void sk_canvas_concat(sk_canvas_t* ccanvas, const sk_matrix_t* cmatrix) {
abarth9503ac72014-12-02 15:47:33 -0800406 SkASSERT(cmatrix);
407 SkMatrix matrix;
408 from_c_matrix(cmatrix, &matrix);
409 AsCanvas(ccanvas)->concat(matrix);
410}
411
reede3719892014-12-22 17:46:00 -0800412void sk_canvas_clip_rect(sk_canvas_t* ccanvas, const sk_rect_t* crect) {
413 AsCanvas(ccanvas)->clipRect(AsRect(*crect));
414}
415
416void sk_canvas_clip_path(sk_canvas_t* ccanvas, const sk_path_t* cpath) {
417 AsCanvas(ccanvas)->clipPath(AsPath(*cpath));
418}
419
reed938dfba2014-10-06 06:08:16 -0700420void sk_canvas_draw_paint(sk_canvas_t* ccanvas, const sk_paint_t* cpaint) {
421 AsCanvas(ccanvas)->drawPaint(AsPaint(*cpaint));
422}
423
424void sk_canvas_draw_rect(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {
425 AsCanvas(ccanvas)->drawRect(AsRect(*crect), AsPaint(*cpaint));
426}
427
428void sk_canvas_draw_oval(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {
429 AsCanvas(ccanvas)->drawOval(AsRect(*crect), AsPaint(*cpaint));
430}
431
432void sk_canvas_draw_path(sk_canvas_t* ccanvas, const sk_path_t* cpath, const sk_paint_t* cpaint) {
433 AsCanvas(ccanvas)->drawPath(AsPath(*cpath), AsPaint(*cpaint));
434}
435
436void sk_canvas_draw_image(sk_canvas_t* ccanvas, const sk_image_t* cimage, float x, float y,
437 const sk_paint_t* cpaint) {
438 AsCanvas(ccanvas)->drawImage(AsImage(cimage), x, y, AsPaint(cpaint));
439}
440
reede3719892014-12-22 17:46:00 -0800441void sk_canvas_draw_image_rect(sk_canvas_t* ccanvas, const sk_image_t* cimage,
442 const sk_rect_t* csrcR, const sk_rect_t* cdstR,
443 const sk_paint_t* cpaint) {
444 AsCanvas(ccanvas)->drawImageRect(AsImage(cimage), AsRect(csrcR), AsRect(*cdstR), AsPaint(cpaint));
445}
446
447void sk_canvas_draw_picture(sk_canvas_t* ccanvas, const sk_picture_t* cpicture,
448 const sk_matrix_t* cmatrix, const sk_paint_t* cpaint) {
449 const SkMatrix* matrixPtr = NULL;
450 SkMatrix matrix;
451 if (cmatrix) {
452 from_c_matrix(cmatrix, &matrix);
453 matrixPtr = &matrix;
454 }
455 AsCanvas(ccanvas)->drawPicture(AsPicture(cpicture), matrixPtr, AsPaint(cpaint));
456}
457
reed938dfba2014-10-06 06:08:16 -0700458///////////////////////////////////////////////////////////////////////////////////////////
459
reed8e474782014-10-06 11:00:51 -0700460sk_surface_t* sk_surface_new_raster(const sk_imageinfo_t* cinfo) {
reede3323962014-10-24 11:16:19 -0700461 SkImageInfo info;
462 if (!from_c_info(*cinfo, &info)) {
463 return NULL;
464 }
465 return (sk_surface_t*)SkSurface::NewRaster(info);
reed938dfba2014-10-06 06:08:16 -0700466}
467
reed8e474782014-10-06 11:00:51 -0700468sk_surface_t* sk_surface_new_raster_direct(const sk_imageinfo_t* cinfo, void* pixels,
reed938dfba2014-10-06 06:08:16 -0700469 size_t rowBytes) {
reede3323962014-10-24 11:16:19 -0700470 SkImageInfo info;
471 if (!from_c_info(*cinfo, &info)) {
472 return NULL;
473 }
474 return (sk_surface_t*)SkSurface::NewRasterDirect(info, pixels, rowBytes);
reed938dfba2014-10-06 06:08:16 -0700475}
476
reedafa278e2014-11-24 19:11:48 -0800477void sk_surface_unref(sk_surface_t* csurf) {
478 SkSafeUnref((SkSurface*)csurf);
reed938dfba2014-10-06 06:08:16 -0700479}
480
481sk_canvas_t* sk_surface_get_canvas(sk_surface_t* csurf) {
482 SkSurface* surf = (SkSurface*)csurf;
reed8e474782014-10-06 11:00:51 -0700483 return (sk_canvas_t*)surf->getCanvas();
reed938dfba2014-10-06 06:08:16 -0700484}
485
486sk_image_t* sk_surface_new_image_snapshot(sk_surface_t* csurf) {
487 SkSurface* surf = (SkSurface*)csurf;
reed8e474782014-10-06 11:00:51 -0700488 return (sk_image_t*)surf->newImageSnapshot();
reed938dfba2014-10-06 06:08:16 -0700489}
490
reedafa278e2014-11-24 19:11:48 -0800491///////////////////////////////////////////////////////////////////////////////////////////
reed938dfba2014-10-06 06:08:16 -0700492
reede3719892014-12-22 17:46:00 -0800493sk_picture_recorder_t* sk_picture_recorder_new() {
494 return ToPictureRecorder(new SkPictureRecorder);
495}
496
497void sk_picture_recorder_delete(sk_picture_recorder_t* crec) {
498 delete AsPictureRecorder(crec);
499}
500
501sk_canvas_t* sk_picture_recorder_begin_recording(sk_picture_recorder_t* crec,
502 const sk_rect_t* cbounds) {
503 return ToCanvas(AsPictureRecorder(crec)->beginRecording(AsRect(*cbounds)));
504}
505
506sk_picture_t* sk_picture_recorder_end_recording(sk_picture_recorder_t* crec) {
507 return ToPicture(AsPictureRecorder(crec)->endRecording());
508}
509
510void sk_picture_ref(sk_picture_t* cpic) {
511 SkSafeRef(AsPicture(cpic));
512}
513
514void sk_picture_unref(sk_picture_t* cpic) {
515 SkSafeUnref(AsPicture(cpic));
516}
517
518uint32_t sk_picture_get_unique_id(sk_picture_t* cpic) {
519 return AsPicture(cpic)->uniqueID();
520}
521
522sk_rect_t sk_picture_get_bounds(sk_picture_t* cpic) {
523 return ToRect(AsPicture(cpic)->cullRect());
524}
525
526///////////////////////////////////////////////////////////////////////////////////////////
527
reedafa278e2014-11-24 19:11:48 -0800528#include "../../include/effects/SkGradientShader.h"
529#include "sk_shader.h"
530
531const struct {
532 sk_shader_tilemode_t fC;
533 SkShader::TileMode fSK;
534} gTileModeMap[] = {
535 { CLAMP_SK_SHADER_TILEMODE, SkShader::kClamp_TileMode },
536 { REPEAT_SK_SHADER_TILEMODE, SkShader::kRepeat_TileMode },
537 { MIRROR_SK_SHADER_TILEMODE, SkShader::kMirror_TileMode },
538};
539
540static bool from_c_tilemode(sk_shader_tilemode_t cMode, SkShader::TileMode* skMode) {
541 for (size_t i = 0; i < SK_ARRAY_COUNT(gTileModeMap); ++i) {
542 if (cMode == gTileModeMap[i].fC) {
543 if (skMode) {
544 *skMode = gTileModeMap[i].fSK;
545 }
546 return true;
547 }
548 }
549 return false;
550}
551
552void sk_shader_ref(sk_shader_t* cshader) {
553 SkSafeRef(AsShader(cshader));
554}
555
556void sk_shader_unref(sk_shader_t* cshader) {
557 SkSafeUnref(AsShader(cshader));
558}
559
560sk_shader_t* sk_shader_new_linear_gradient(const sk_point_t pts[2],
561 const sk_color_t colors[],
562 const float colorPos[],
563 int colorCount,
564 sk_shader_tilemode_t cmode,
565 const sk_matrix_t* cmatrix) {
566 SkShader::TileMode mode;
567 if (!from_c_tilemode(cmode, &mode)) {
568 return NULL;
569 }
570 SkMatrix matrix;
571 if (cmatrix) {
abarth9503ac72014-12-02 15:47:33 -0800572 from_c_matrix(cmatrix, &matrix);
reedafa278e2014-11-24 19:11:48 -0800573 } else {
574 matrix.setIdentity();
575 }
576 SkShader* s = SkGradientShader::CreateLinear(reinterpret_cast<const SkPoint*>(pts),
577 reinterpret_cast<const SkColor*>(colors),
578 colorPos, colorCount, mode, 0, &matrix);
579 return (sk_shader_t*)s;
580}
581
582///////////////////////////////////////////////////////////////////////////////////////////
reed0eafc9b2014-12-23 14:11:11 -0800583
584#include "../../include/effects/SkBlurMaskFilter.h"
585#include "sk_maskfilter.h"
586
587const struct {
588 sk_blurstyle_t fC;
589 SkBlurStyle fSk;
590} gBlurStylePairs[] = {
591 { NORMAL_SK_BLUR_STYLE, kNormal_SkBlurStyle },
592 { SOLID_SK_BLUR_STYLE, kSolid_SkBlurStyle },
593 { OUTER_SK_BLUR_STYLE, kOuter_SkBlurStyle },
594 { INNER_SK_BLUR_STYLE, kInner_SkBlurStyle },
595};
596
597static bool find_blurstyle(sk_blurstyle_t csrc, SkBlurStyle* dst) {
598 for (size_t i = 0; i < SK_ARRAY_COUNT(gBlurStylePairs); ++i) {
599 if (gBlurStylePairs[i].fC == csrc) {
600 if (dst) {
601 *dst = gBlurStylePairs[i].fSk;
602 }
603 return true;
604 }
605 }
606 return false;
607}
608
609void sk_maskfilter_ref(sk_maskfilter_t* cfilter) {
610 SkSafeRef(AsMaskFilter(cfilter));
611}
612
613void sk_maskfilter_unref(sk_maskfilter_t* cfilter) {
614 SkSafeUnref(AsMaskFilter(cfilter));
615}
616
617sk_maskfilter_t* sk_maskfilter_new_blur(sk_blurstyle_t cstyle, float sigma) {
618 SkBlurStyle style;
619 if (!find_blurstyle(cstyle, &style)) {
620 return NULL;
621 }
622 return ToMaskFilter(SkBlurMaskFilter::Create(style, sigma));
623}
624
625///////////////////////////////////////////////////////////////////////////////////////////
reedb2a5d7e2014-12-25 14:16:21 -0800626
627sk_data_t* sk_data_new_with_copy(const void* src, size_t length) {
628 return ToData(SkData::NewWithCopy(src, length));
629}
630
631sk_data_t* sk_data_new_from_malloc(const void* memory, size_t length) {
632 return ToData(SkData::NewFromMalloc(memory, length));
633}
634
635sk_data_t* sk_data_new_subset(const sk_data_t* csrc, size_t offset, size_t length) {
636 return ToData(SkData::NewSubset(AsData(csrc), offset, length));
637}
638
639void sk_data_ref(const sk_data_t* cdata) {
640 SkSafeRef(AsData(cdata));
641}
642
643void sk_data_unref(const sk_data_t* cdata) {
644 SkSafeUnref(AsData(cdata));
645}
646
647size_t sk_data_get_size(const sk_data_t* cdata) {
648 return AsData(cdata)->size();
649}
650
651const void* sk_data_get_data(const sk_data_t* cdata) {
652 return AsData(cdata)->data();
653}
654
655///////////////////////////////////////////////////////////////////////////////////////////
reedafa278e2014-11-24 19:11:48 -0800656///////////////////////////////////////////////////////////////////////////////////////////
reed8e474782014-10-06 11:00:51 -0700657
658void sk_test_capi(SkCanvas* canvas) {
659 sk_imageinfo_t cinfo;
660 cinfo.width = 100;
661 cinfo.height = 100;
662 cinfo.colorType = (sk_colortype_t)kN32_SkColorType;
663 cinfo.alphaType = (sk_alphatype_t)kPremul_SkAlphaType;
664
665 sk_surface_t* csurface = sk_surface_new_raster(&cinfo);
666 sk_canvas_t* ccanvas = sk_surface_get_canvas(csurface);
667
668 sk_paint_t* cpaint = sk_paint_new();
669 sk_paint_set_antialias(cpaint, true);
670 sk_paint_set_color(cpaint, 0xFFFF0000);
671
672 sk_rect_t cr = { 5, 5, 95, 95 };
673 sk_canvas_draw_oval(ccanvas, &cr, cpaint);
674
675 cr.left += 25;
676 cr.top += 25;
677 cr.right -= 25;
678 cr.bottom -= 25;
679 sk_paint_set_color(cpaint, 0xFF00FF00);
680 sk_canvas_draw_rect(ccanvas, &cr, cpaint);
681
robertphillipsa624e872014-10-08 06:04:35 -0700682 sk_path_t* cpath = sk_path_new();
683 sk_path_move_to(cpath, 50, 50);
684 sk_path_line_to(cpath, 100, 100);
685 sk_path_line_to(cpath, 50, 100);
686 sk_path_close(cpath);
687
688 sk_canvas_draw_path(ccanvas, cpath, cpaint);
689
reed8e474782014-10-06 11:00:51 -0700690 sk_image_t* cimage = sk_surface_new_image_snapshot(csurface);
691
692 // HERE WE CROSS THE C..C++ boundary
693 canvas->drawImage((const SkImage*)cimage, 20, 20, NULL);
694
robertphillipsa624e872014-10-08 06:04:35 -0700695 sk_path_delete(cpath);
reed8e474782014-10-06 11:00:51 -0700696 sk_paint_delete(cpaint);
697 sk_image_unref(cimage);
reedafa278e2014-11-24 19:11:48 -0800698 sk_surface_unref(csurface);
reed8e474782014-10-06 11:00:51 -0700699}