18e47478333bb77d3ba273432fcfe089a2a1384bereed/*
28e47478333bb77d3ba273432fcfe089a2a1384bereed * Copyright 2014 Google Inc.
38e47478333bb77d3ba273432fcfe089a2a1384bereed *
48e47478333bb77d3ba273432fcfe089a2a1384bereed * Use of this source code is governed by a BSD-style license that can be
58e47478333bb77d3ba273432fcfe089a2a1384bereed * found in the LICENSE file.
68e47478333bb77d3ba273432fcfe089a2a1384bereed */
78e47478333bb77d3ba273432fcfe089a2a1384bereed
873c250112026b84b38e6dc8c93e0cfc31918dc9dreed#include "sk_canvas.h"
9b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed#include "sk_data.h"
1073c250112026b84b38e6dc8c93e0cfc31918dc9dreed#include "sk_image.h"
1173c250112026b84b38e6dc8c93e0cfc31918dc9dreed#include "sk_paint.h"
1273c250112026b84b38e6dc8c93e0cfc31918dc9dreed#include "sk_path.h"
13938dfba51d0be03fa81866d99214447dac359e83reed#include "sk_surface.h"
14f5872d2f416b17db405f501a910ca0a4bd96f6e2reed#include "sk_types_priv.h"
15938dfba51d0be03fa81866d99214447dac359e83reed
16938dfba51d0be03fa81866d99214447dac359e83reed#include "SkCanvas.h"
17b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed#include "SkData.h"
18938dfba51d0be03fa81866d99214447dac359e83reed#include "SkImage.h"
190eafc9b06cbfd47e9c3471c82580790cef0fdae5reed#include "SkMaskFilter.h"
20938dfba51d0be03fa81866d99214447dac359e83reed#include "SkMatrix.h"
21938dfba51d0be03fa81866d99214447dac359e83reed#include "SkPaint.h"
22938dfba51d0be03fa81866d99214447dac359e83reed#include "SkPath.h"
23e371989c92eba394ea048419debcb9febadae17breed#include "SkPictureRecorder.h"
24938dfba51d0be03fa81866d99214447dac359e83reed#include "SkSurface.h"
25938dfba51d0be03fa81866d99214447dac359e83reed
26e332396d2fabb84894c816ff3999cf1c6262fd9dreedconst struct {
27e332396d2fabb84894c816ff3999cf1c6262fd9dreed    sk_colortype_t  fC;
28e332396d2fabb84894c816ff3999cf1c6262fd9dreed    SkColorType     fSK;
29e332396d2fabb84894c816ff3999cf1c6262fd9dreed} gColorTypeMap[] = {
30e332396d2fabb84894c816ff3999cf1c6262fd9dreed    { UNKNOWN_SK_COLORTYPE,     kUnknown_SkColorType    },
31e332396d2fabb84894c816ff3999cf1c6262fd9dreed    { RGBA_8888_SK_COLORTYPE,   kRGBA_8888_SkColorType  },
32e332396d2fabb84894c816ff3999cf1c6262fd9dreed    { BGRA_8888_SK_COLORTYPE,   kBGRA_8888_SkColorType  },
33e332396d2fabb84894c816ff3999cf1c6262fd9dreed    { ALPHA_8_SK_COLORTYPE,     kAlpha_8_SkColorType    },
34e332396d2fabb84894c816ff3999cf1c6262fd9dreed};
35e332396d2fabb84894c816ff3999cf1c6262fd9dreed
36e332396d2fabb84894c816ff3999cf1c6262fd9dreedconst struct {
37e332396d2fabb84894c816ff3999cf1c6262fd9dreed    sk_alphatype_t  fC;
38e332396d2fabb84894c816ff3999cf1c6262fd9dreed    SkAlphaType     fSK;
39e332396d2fabb84894c816ff3999cf1c6262fd9dreed} gAlphaTypeMap[] = {
40e332396d2fabb84894c816ff3999cf1c6262fd9dreed    { OPAQUE_SK_ALPHATYPE,      kOpaque_SkAlphaType     },
41e332396d2fabb84894c816ff3999cf1c6262fd9dreed    { PREMUL_SK_ALPHATYPE,      kPremul_SkAlphaType     },
42e332396d2fabb84894c816ff3999cf1c6262fd9dreed    { UNPREMUL_SK_ALPHATYPE,    kUnpremul_SkAlphaType   },
43e332396d2fabb84894c816ff3999cf1c6262fd9dreed};
44e332396d2fabb84894c816ff3999cf1c6262fd9dreed
45e332396d2fabb84894c816ff3999cf1c6262fd9dreedstatic bool from_c_colortype(sk_colortype_t cCT, SkColorType* skCT) {
46e332396d2fabb84894c816ff3999cf1c6262fd9dreed    for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypeMap); ++i) {
47e332396d2fabb84894c816ff3999cf1c6262fd9dreed        if (gColorTypeMap[i].fC == cCT) {
48e332396d2fabb84894c816ff3999cf1c6262fd9dreed            if (skCT) {
49e332396d2fabb84894c816ff3999cf1c6262fd9dreed                *skCT = gColorTypeMap[i].fSK;
50e332396d2fabb84894c816ff3999cf1c6262fd9dreed            }
51e332396d2fabb84894c816ff3999cf1c6262fd9dreed            return true;
52e332396d2fabb84894c816ff3999cf1c6262fd9dreed        }
53e332396d2fabb84894c816ff3999cf1c6262fd9dreed    }
54e332396d2fabb84894c816ff3999cf1c6262fd9dreed    return false;
55e332396d2fabb84894c816ff3999cf1c6262fd9dreed}
56e332396d2fabb84894c816ff3999cf1c6262fd9dreed
57e332396d2fabb84894c816ff3999cf1c6262fd9dreedstatic bool to_c_colortype(SkColorType skCT, sk_colortype_t* cCT) {
58e332396d2fabb84894c816ff3999cf1c6262fd9dreed    for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypeMap); ++i) {
59e332396d2fabb84894c816ff3999cf1c6262fd9dreed        if (gColorTypeMap[i].fSK == skCT) {
60e332396d2fabb84894c816ff3999cf1c6262fd9dreed            if (cCT) {
61e332396d2fabb84894c816ff3999cf1c6262fd9dreed                *cCT = gColorTypeMap[i].fC;
62e332396d2fabb84894c816ff3999cf1c6262fd9dreed            }
63e332396d2fabb84894c816ff3999cf1c6262fd9dreed            return true;
64e332396d2fabb84894c816ff3999cf1c6262fd9dreed        }
65e332396d2fabb84894c816ff3999cf1c6262fd9dreed    }
66e332396d2fabb84894c816ff3999cf1c6262fd9dreed    return false;
67e332396d2fabb84894c816ff3999cf1c6262fd9dreed}
68e332396d2fabb84894c816ff3999cf1c6262fd9dreed
69e332396d2fabb84894c816ff3999cf1c6262fd9dreedstatic bool from_c_alphatype(sk_alphatype_t cAT, SkAlphaType* skAT) {
70e332396d2fabb84894c816ff3999cf1c6262fd9dreed    for (size_t i = 0; i < SK_ARRAY_COUNT(gAlphaTypeMap); ++i) {
71e332396d2fabb84894c816ff3999cf1c6262fd9dreed        if (gAlphaTypeMap[i].fC == cAT) {
72e332396d2fabb84894c816ff3999cf1c6262fd9dreed            if (skAT) {
73e332396d2fabb84894c816ff3999cf1c6262fd9dreed                *skAT = gAlphaTypeMap[i].fSK;
74e332396d2fabb84894c816ff3999cf1c6262fd9dreed            }
75e332396d2fabb84894c816ff3999cf1c6262fd9dreed            return true;
76e332396d2fabb84894c816ff3999cf1c6262fd9dreed        }
77e332396d2fabb84894c816ff3999cf1c6262fd9dreed    }
78e332396d2fabb84894c816ff3999cf1c6262fd9dreed    return false;
79e332396d2fabb84894c816ff3999cf1c6262fd9dreed}
80e332396d2fabb84894c816ff3999cf1c6262fd9dreed
81e332396d2fabb84894c816ff3999cf1c6262fd9dreedstatic bool from_c_info(const sk_imageinfo_t& cinfo, SkImageInfo* info) {
82e332396d2fabb84894c816ff3999cf1c6262fd9dreed    SkColorType ct;
83e332396d2fabb84894c816ff3999cf1c6262fd9dreed    SkAlphaType at;
84e332396d2fabb84894c816ff3999cf1c6262fd9dreed
85e332396d2fabb84894c816ff3999cf1c6262fd9dreed    if (!from_c_colortype(cinfo.colorType, &ct)) {
86e332396d2fabb84894c816ff3999cf1c6262fd9dreed        // optionally report error to client?
87e332396d2fabb84894c816ff3999cf1c6262fd9dreed        return false;
88e332396d2fabb84894c816ff3999cf1c6262fd9dreed    }
89e332396d2fabb84894c816ff3999cf1c6262fd9dreed    if (!from_c_alphatype(cinfo.alphaType, &at)) {
90e332396d2fabb84894c816ff3999cf1c6262fd9dreed        // optionally report error to client?
91e332396d2fabb84894c816ff3999cf1c6262fd9dreed        return false;
92e332396d2fabb84894c816ff3999cf1c6262fd9dreed    }
93e332396d2fabb84894c816ff3999cf1c6262fd9dreed    if (info) {
94e332396d2fabb84894c816ff3999cf1c6262fd9dreed        *info = SkImageInfo::Make(cinfo.width, cinfo.height, ct, at);
95e332396d2fabb84894c816ff3999cf1c6262fd9dreed    }
96e332396d2fabb84894c816ff3999cf1c6262fd9dreed    return true;
97938dfba51d0be03fa81866d99214447dac359e83reed}
98938dfba51d0be03fa81866d99214447dac359e83reed
999503ac7a3cc98327a88eff59c71c451fbdd7e043abarthstatic void from_c_matrix(const sk_matrix_t* cmatrix, SkMatrix* matrix) {
1009503ac7a3cc98327a88eff59c71c451fbdd7e043abarth    matrix->setAll(cmatrix->mat[0], cmatrix->mat[1], cmatrix->mat[2],
1019503ac7a3cc98327a88eff59c71c451fbdd7e043abarth                   cmatrix->mat[3], cmatrix->mat[4], cmatrix->mat[5],
1029503ac7a3cc98327a88eff59c71c451fbdd7e043abarth                   cmatrix->mat[6], cmatrix->mat[7], cmatrix->mat[8]);
1039503ac7a3cc98327a88eff59c71c451fbdd7e043abarth}
1049503ac7a3cc98327a88eff59c71c451fbdd7e043abarth
10573c250112026b84b38e6dc8c93e0cfc31918dc9dreedconst struct {
10673c250112026b84b38e6dc8c93e0cfc31918dc9dreed    sk_path_direction_t fC;
10773c250112026b84b38e6dc8c93e0cfc31918dc9dreed    SkPath::Direction   fSk;
10873c250112026b84b38e6dc8c93e0cfc31918dc9dreed} gPathDirMap[] = {
10973c250112026b84b38e6dc8c93e0cfc31918dc9dreed    { CW_SK_PATH_DIRECTION,  SkPath::kCW_Direction },
11073c250112026b84b38e6dc8c93e0cfc31918dc9dreed    { CCW_SK_PATH_DIRECTION, SkPath::kCCW_Direction },
11173c250112026b84b38e6dc8c93e0cfc31918dc9dreed};
11273c250112026b84b38e6dc8c93e0cfc31918dc9dreed
11373c250112026b84b38e6dc8c93e0cfc31918dc9dreedstatic bool from_c_path_direction(sk_path_direction_t cdir, SkPath::Direction* dir) {
11473c250112026b84b38e6dc8c93e0cfc31918dc9dreed    for (size_t i = 0; i < SK_ARRAY_COUNT(gPathDirMap); ++i) {
11573c250112026b84b38e6dc8c93e0cfc31918dc9dreed        if (gPathDirMap[i].fC == cdir) {
11673c250112026b84b38e6dc8c93e0cfc31918dc9dreed            if (dir) {
11773c250112026b84b38e6dc8c93e0cfc31918dc9dreed                *dir = gPathDirMap[i].fSk;
11873c250112026b84b38e6dc8c93e0cfc31918dc9dreed            }
11973c250112026b84b38e6dc8c93e0cfc31918dc9dreed            return true;
12073c250112026b84b38e6dc8c93e0cfc31918dc9dreed        }
12173c250112026b84b38e6dc8c93e0cfc31918dc9dreed    }
12273c250112026b84b38e6dc8c93e0cfc31918dc9dreed    return false;
12373c250112026b84b38e6dc8c93e0cfc31918dc9dreed}
12473c250112026b84b38e6dc8c93e0cfc31918dc9dreed
125b2a5d7e02fd588d343baf6a7433c483f7af9fd43reedstatic SkData* AsData(const sk_data_t* cdata) {
126b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed    return reinterpret_cast<SkData*>(const_cast<sk_data_t*>(cdata));
127b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed}
128b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed
129b2a5d7e02fd588d343baf6a7433c483f7af9fd43reedstatic sk_data_t* ToData(SkData* data) {
130b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed    return reinterpret_cast<sk_data_t*>(data);
131b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed}
132b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed
133e371989c92eba394ea048419debcb9febadae17breedstatic sk_rect_t ToRect(const SkRect& rect) {
134e371989c92eba394ea048419debcb9febadae17breed    return reinterpret_cast<const sk_rect_t&>(rect);
135e371989c92eba394ea048419debcb9febadae17breed}
136e371989c92eba394ea048419debcb9febadae17breed
1378e47478333bb77d3ba273432fcfe089a2a1384bereedstatic const SkRect& AsRect(const sk_rect_t& crect) {
1388e47478333bb77d3ba273432fcfe089a2a1384bereed    return reinterpret_cast<const SkRect&>(crect);
1398e47478333bb77d3ba273432fcfe089a2a1384bereed}
1408e47478333bb77d3ba273432fcfe089a2a1384bereed
141e371989c92eba394ea048419debcb9febadae17breedstatic const SkRect* AsRect(const sk_rect_t* crect) {
142e371989c92eba394ea048419debcb9febadae17breed    return reinterpret_cast<const SkRect*>(crect);
14373c250112026b84b38e6dc8c93e0cfc31918dc9dreed}
14473c250112026b84b38e6dc8c93e0cfc31918dc9dreed
1458e47478333bb77d3ba273432fcfe089a2a1384bereedstatic const SkPath& AsPath(const sk_path_t& cpath) {
1468e47478333bb77d3ba273432fcfe089a2a1384bereed    return reinterpret_cast<const SkPath&>(cpath);
1478e47478333bb77d3ba273432fcfe089a2a1384bereed}
1488e47478333bb77d3ba273432fcfe089a2a1384bereed
149a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillipsstatic SkPath* as_path(sk_path_t* cpath) {
150a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips    return reinterpret_cast<SkPath*>(cpath);
151a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips}
152a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips
1538e47478333bb77d3ba273432fcfe089a2a1384bereedstatic const SkImage* AsImage(const sk_image_t* cimage) {
1548e47478333bb77d3ba273432fcfe089a2a1384bereed    return reinterpret_cast<const SkImage*>(cimage);
1558e47478333bb77d3ba273432fcfe089a2a1384bereed}
156938dfba51d0be03fa81866d99214447dac359e83reed
157b2a5d7e02fd588d343baf6a7433c483f7af9fd43reedstatic sk_image_t* ToImage(SkImage* cimage) {
158b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed    return reinterpret_cast<sk_image_t*>(cimage);
159b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed}
160b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed
161e371989c92eba394ea048419debcb9febadae17breedstatic sk_canvas_t* ToCanvas(SkCanvas* canvas) {
162e371989c92eba394ea048419debcb9febadae17breed    return reinterpret_cast<sk_canvas_t*>(canvas);
163e371989c92eba394ea048419debcb9febadae17breed}
164e371989c92eba394ea048419debcb9febadae17breed
1658e47478333bb77d3ba273432fcfe089a2a1384bereedstatic SkCanvas* AsCanvas(sk_canvas_t* ccanvas) {
1668e47478333bb77d3ba273432fcfe089a2a1384bereed    return reinterpret_cast<SkCanvas*>(ccanvas);
1678e47478333bb77d3ba273432fcfe089a2a1384bereed}
1688e47478333bb77d3ba273432fcfe089a2a1384bereed
169e371989c92eba394ea048419debcb9febadae17breedstatic SkPictureRecorder* AsPictureRecorder(sk_picture_recorder_t* crec) {
170e371989c92eba394ea048419debcb9febadae17breed    return reinterpret_cast<SkPictureRecorder*>(crec);
171e371989c92eba394ea048419debcb9febadae17breed}
172e371989c92eba394ea048419debcb9febadae17breed
173e371989c92eba394ea048419debcb9febadae17breedstatic sk_picture_recorder_t* ToPictureRecorder(SkPictureRecorder* rec) {
174e371989c92eba394ea048419debcb9febadae17breed    return reinterpret_cast<sk_picture_recorder_t*>(rec);
175e371989c92eba394ea048419debcb9febadae17breed}
176e371989c92eba394ea048419debcb9febadae17breed
177e371989c92eba394ea048419debcb9febadae17breedstatic const SkPicture* AsPicture(const sk_picture_t* cpic) {
178e371989c92eba394ea048419debcb9febadae17breed    return reinterpret_cast<const SkPicture*>(cpic);
179e371989c92eba394ea048419debcb9febadae17breed}
180e371989c92eba394ea048419debcb9febadae17breed
181e371989c92eba394ea048419debcb9febadae17breedstatic SkPicture* AsPicture(sk_picture_t* cpic) {
182e371989c92eba394ea048419debcb9febadae17breed    return reinterpret_cast<SkPicture*>(cpic);
183e371989c92eba394ea048419debcb9febadae17breed}
184e371989c92eba394ea048419debcb9febadae17breed
185e371989c92eba394ea048419debcb9febadae17breedstatic sk_picture_t* ToPicture(SkPicture* pic) {
186e371989c92eba394ea048419debcb9febadae17breed    return reinterpret_cast<sk_picture_t*>(pic);
187e371989c92eba394ea048419debcb9febadae17breed}
188e371989c92eba394ea048419debcb9febadae17breed
1898e47478333bb77d3ba273432fcfe089a2a1384bereed///////////////////////////////////////////////////////////////////////////////////////////
1908e47478333bb77d3ba273432fcfe089a2a1384bereed
191e332396d2fabb84894c816ff3999cf1c6262fd9dreedsk_colortype_t sk_colortype_get_default_8888() {
192e332396d2fabb84894c816ff3999cf1c6262fd9dreed    sk_colortype_t ct;
193e332396d2fabb84894c816ff3999cf1c6262fd9dreed    if (!to_c_colortype(kN32_SkColorType, &ct)) {
194e332396d2fabb84894c816ff3999cf1c6262fd9dreed        ct = UNKNOWN_SK_COLORTYPE;
195e332396d2fabb84894c816ff3999cf1c6262fd9dreed    }
196e332396d2fabb84894c816ff3999cf1c6262fd9dreed    return ct;
197e332396d2fabb84894c816ff3999cf1c6262fd9dreed}
198e332396d2fabb84894c816ff3999cf1c6262fd9dreed
199e332396d2fabb84894c816ff3999cf1c6262fd9dreed///////////////////////////////////////////////////////////////////////////////////////////
200e332396d2fabb84894c816ff3999cf1c6262fd9dreed
2018e47478333bb77d3ba273432fcfe089a2a1384bereedsk_image_t* sk_image_new_raster_copy(const sk_imageinfo_t* cinfo, const void* pixels,
2028e47478333bb77d3ba273432fcfe089a2a1384bereed                                     size_t rowBytes) {
203e332396d2fabb84894c816ff3999cf1c6262fd9dreed    SkImageInfo info;
204e332396d2fabb84894c816ff3999cf1c6262fd9dreed    if (!from_c_info(*cinfo, &info)) {
205e332396d2fabb84894c816ff3999cf1c6262fd9dreed        return NULL;
206e332396d2fabb84894c816ff3999cf1c6262fd9dreed    }
207e332396d2fabb84894c816ff3999cf1c6262fd9dreed    return (sk_image_t*)SkImage::NewRasterCopy(info, pixels, rowBytes);
2088e47478333bb77d3ba273432fcfe089a2a1384bereed}
2098e47478333bb77d3ba273432fcfe089a2a1384bereed
210b2a5d7e02fd588d343baf6a7433c483f7af9fd43reedsk_image_t* sk_image_new_from_data(const sk_data_t* cdata) {
2115965c8ae4ee960275da4bc40189bdba85aab8b5ereed    return ToImage(SkImage::NewFromData(AsData(cdata)));
212b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed}
213b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed
214b2a5d7e02fd588d343baf6a7433c483f7af9fd43reedsk_data_t* sk_image_encode(const sk_image_t* cimage) {
215b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed    return ToData(AsImage(cimage)->encode());
216b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed}
217b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed
2188e47478333bb77d3ba273432fcfe089a2a1384bereedvoid sk_image_ref(const sk_image_t* cimage) {
2198e47478333bb77d3ba273432fcfe089a2a1384bereed    AsImage(cimage)->ref();
2208e47478333bb77d3ba273432fcfe089a2a1384bereed}
2218e47478333bb77d3ba273432fcfe089a2a1384bereed
2228e47478333bb77d3ba273432fcfe089a2a1384bereedvoid sk_image_unref(const sk_image_t* cimage) {
2238e47478333bb77d3ba273432fcfe089a2a1384bereed    AsImage(cimage)->unref();
2248e47478333bb77d3ba273432fcfe089a2a1384bereed}
2258e47478333bb77d3ba273432fcfe089a2a1384bereed
2268e47478333bb77d3ba273432fcfe089a2a1384bereedint sk_image_get_width(const sk_image_t* cimage) {
2278e47478333bb77d3ba273432fcfe089a2a1384bereed    return AsImage(cimage)->width();
2288e47478333bb77d3ba273432fcfe089a2a1384bereed}
2298e47478333bb77d3ba273432fcfe089a2a1384bereed
2308e47478333bb77d3ba273432fcfe089a2a1384bereedint sk_image_get_height(const sk_image_t* cimage) {
2318e47478333bb77d3ba273432fcfe089a2a1384bereed    return AsImage(cimage)->height();
232938dfba51d0be03fa81866d99214447dac359e83reed}
233938dfba51d0be03fa81866d99214447dac359e83reed
2348e47478333bb77d3ba273432fcfe089a2a1384bereeduint32_t sk_image_get_unique_id(const sk_image_t* cimage) {
2358e47478333bb77d3ba273432fcfe089a2a1384bereed    return AsImage(cimage)->uniqueID();
2368e47478333bb77d3ba273432fcfe089a2a1384bereed}
2378e47478333bb77d3ba273432fcfe089a2a1384bereed
2388e47478333bb77d3ba273432fcfe089a2a1384bereed///////////////////////////////////////////////////////////////////////////////////////////
2398e47478333bb77d3ba273432fcfe089a2a1384bereed
240a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillipssk_path_t* sk_path_new() {
241a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips    return (sk_path_t*)SkNEW(SkPath);
242a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips}
243a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips
244a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillipsvoid sk_path_delete(sk_path_t* cpath) {
245a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips    SkDELETE(as_path(cpath));
246a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips}
247a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips
248a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillipsvoid sk_path_move_to(sk_path_t* cpath, float x, float y) {
249a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips    as_path(cpath)->moveTo(x, y);
250a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips}
251a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips
252a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillipsvoid sk_path_line_to(sk_path_t* cpath, float x, float y) {
253a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips    as_path(cpath)->lineTo(x, y);
254a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips}
255a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips
256a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillipsvoid sk_path_quad_to(sk_path_t* cpath, float x0, float y0, float x1, float y1) {
257a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips    as_path(cpath)->quadTo(x0, y0, x1, y1);
258a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips}
259a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips
26073c250112026b84b38e6dc8c93e0cfc31918dc9dreedvoid sk_path_conic_to(sk_path_t* cpath, float x0, float y0, float x1, float y1, float w) {
26173c250112026b84b38e6dc8c93e0cfc31918dc9dreed    as_path(cpath)->conicTo(x0, y0, x1, y1, w);
26273c250112026b84b38e6dc8c93e0cfc31918dc9dreed}
26373c250112026b84b38e6dc8c93e0cfc31918dc9dreed
26473c250112026b84b38e6dc8c93e0cfc31918dc9dreedvoid sk_path_cubic_to(sk_path_t* cpath, float x0, float y0, float x1, float y1, float x2, float y2) {
26573c250112026b84b38e6dc8c93e0cfc31918dc9dreed    as_path(cpath)->cubicTo(x0, y0, x1, y1, x2, y2);
26673c250112026b84b38e6dc8c93e0cfc31918dc9dreed}
26773c250112026b84b38e6dc8c93e0cfc31918dc9dreed
268a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillipsvoid sk_path_close(sk_path_t* cpath) {
269a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips    as_path(cpath)->close();
270a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips}
271a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips
27273c250112026b84b38e6dc8c93e0cfc31918dc9dreedvoid sk_path_add_rect(sk_path_t* cpath, const sk_rect_t* crect, sk_path_direction_t cdir) {
27373c250112026b84b38e6dc8c93e0cfc31918dc9dreed    SkPath::Direction dir;
27473c250112026b84b38e6dc8c93e0cfc31918dc9dreed    if (!from_c_path_direction(cdir, &dir)) {
27573c250112026b84b38e6dc8c93e0cfc31918dc9dreed        return;
27673c250112026b84b38e6dc8c93e0cfc31918dc9dreed    }
27773c250112026b84b38e6dc8c93e0cfc31918dc9dreed    as_path(cpath)->addRect(AsRect(*crect), dir);
27873c250112026b84b38e6dc8c93e0cfc31918dc9dreed}
27973c250112026b84b38e6dc8c93e0cfc31918dc9dreed
28073c250112026b84b38e6dc8c93e0cfc31918dc9dreedvoid sk_path_add_oval(sk_path_t* cpath, const sk_rect_t* crect, sk_path_direction_t cdir) {
28173c250112026b84b38e6dc8c93e0cfc31918dc9dreed    SkPath::Direction dir;
28273c250112026b84b38e6dc8c93e0cfc31918dc9dreed    if (!from_c_path_direction(cdir, &dir)) {
28373c250112026b84b38e6dc8c93e0cfc31918dc9dreed        return;
28473c250112026b84b38e6dc8c93e0cfc31918dc9dreed    }
28573c250112026b84b38e6dc8c93e0cfc31918dc9dreed    as_path(cpath)->addOval(AsRect(*crect), dir);
28673c250112026b84b38e6dc8c93e0cfc31918dc9dreed}
28773c250112026b84b38e6dc8c93e0cfc31918dc9dreed
28873c250112026b84b38e6dc8c93e0cfc31918dc9dreedbool sk_path_get_bounds(const sk_path_t* cpath, sk_rect_t* crect) {
28973c250112026b84b38e6dc8c93e0cfc31918dc9dreed    const SkPath& path = AsPath(*cpath);
29073c250112026b84b38e6dc8c93e0cfc31918dc9dreed
29173c250112026b84b38e6dc8c93e0cfc31918dc9dreed    if (path.isEmpty()) {
292e371989c92eba394ea048419debcb9febadae17breed        if (crect) {
293e371989c92eba394ea048419debcb9febadae17breed            *crect = ToRect(SkRect::MakeEmpty());
29473c250112026b84b38e6dc8c93e0cfc31918dc9dreed        }
29573c250112026b84b38e6dc8c93e0cfc31918dc9dreed        return false;
29673c250112026b84b38e6dc8c93e0cfc31918dc9dreed    }
297e371989c92eba394ea048419debcb9febadae17breed
298e371989c92eba394ea048419debcb9febadae17breed    if (crect) {
299e371989c92eba394ea048419debcb9febadae17breed        *crect = ToRect(path.getBounds());
300e371989c92eba394ea048419debcb9febadae17breed    }
30173c250112026b84b38e6dc8c93e0cfc31918dc9dreed    return true;
30273c250112026b84b38e6dc8c93e0cfc31918dc9dreed}
30373c250112026b84b38e6dc8c93e0cfc31918dc9dreed
304a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips///////////////////////////////////////////////////////////////////////////////////////////
305a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips
306938dfba51d0be03fa81866d99214447dac359e83reedvoid sk_canvas_save(sk_canvas_t* ccanvas) {
307938dfba51d0be03fa81866d99214447dac359e83reed    AsCanvas(ccanvas)->save();
308938dfba51d0be03fa81866d99214447dac359e83reed}
309938dfba51d0be03fa81866d99214447dac359e83reed
310938dfba51d0be03fa81866d99214447dac359e83reedvoid sk_canvas_save_layer(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {
311938dfba51d0be03fa81866d99214447dac359e83reed    AsCanvas(ccanvas)->drawRect(AsRect(*crect), AsPaint(*cpaint));
312938dfba51d0be03fa81866d99214447dac359e83reed}
313938dfba51d0be03fa81866d99214447dac359e83reed
314938dfba51d0be03fa81866d99214447dac359e83reedvoid sk_canvas_restore(sk_canvas_t* ccanvas) {
315938dfba51d0be03fa81866d99214447dac359e83reed    AsCanvas(ccanvas)->restore();
316938dfba51d0be03fa81866d99214447dac359e83reed}
317938dfba51d0be03fa81866d99214447dac359e83reed
318938dfba51d0be03fa81866d99214447dac359e83reedvoid sk_canvas_translate(sk_canvas_t* ccanvas, float dx, float dy) {
319938dfba51d0be03fa81866d99214447dac359e83reed    AsCanvas(ccanvas)->translate(dx, dy);
320938dfba51d0be03fa81866d99214447dac359e83reed}
321938dfba51d0be03fa81866d99214447dac359e83reed
322938dfba51d0be03fa81866d99214447dac359e83reedvoid sk_canvas_scale(sk_canvas_t* ccanvas, float sx, float sy) {
3238e47478333bb77d3ba273432fcfe089a2a1384bereed    AsCanvas(ccanvas)->scale(sx, sy);
324938dfba51d0be03fa81866d99214447dac359e83reed}
325938dfba51d0be03fa81866d99214447dac359e83reed
3262fc6ea62ce61c3a2b2d9b74a3fbe6b388b5d7558abarthvoid sk_canvas_rotate_degress(sk_canvas_t* ccanvas, float degrees) {
3272fc6ea62ce61c3a2b2d9b74a3fbe6b388b5d7558abarth    AsCanvas(ccanvas)->rotate(degrees);
3282fc6ea62ce61c3a2b2d9b74a3fbe6b388b5d7558abarth}
3292fc6ea62ce61c3a2b2d9b74a3fbe6b388b5d7558abarth
3302fc6ea62ce61c3a2b2d9b74a3fbe6b388b5d7558abarthvoid sk_canvas_rotate_radians(sk_canvas_t* ccanvas, float radians) {
3312fc6ea62ce61c3a2b2d9b74a3fbe6b388b5d7558abarth    AsCanvas(ccanvas)->rotate(SkRadiansToDegrees(radians));
3322fc6ea62ce61c3a2b2d9b74a3fbe6b388b5d7558abarth}
3332fc6ea62ce61c3a2b2d9b74a3fbe6b388b5d7558abarth
3342fc6ea62ce61c3a2b2d9b74a3fbe6b388b5d7558abarthvoid sk_canvas_skew(sk_canvas_t* ccanvas, float sx, float sy) {
3352fc6ea62ce61c3a2b2d9b74a3fbe6b388b5d7558abarth    AsCanvas(ccanvas)->skew(sx, sy);
3362fc6ea62ce61c3a2b2d9b74a3fbe6b388b5d7558abarth}
3372fc6ea62ce61c3a2b2d9b74a3fbe6b388b5d7558abarth
338e371989c92eba394ea048419debcb9febadae17breedvoid sk_canvas_concat(sk_canvas_t* ccanvas, const sk_matrix_t* cmatrix) {
3399503ac7a3cc98327a88eff59c71c451fbdd7e043abarth    SkASSERT(cmatrix);
3409503ac7a3cc98327a88eff59c71c451fbdd7e043abarth    SkMatrix matrix;
3419503ac7a3cc98327a88eff59c71c451fbdd7e043abarth    from_c_matrix(cmatrix, &matrix);
3429503ac7a3cc98327a88eff59c71c451fbdd7e043abarth    AsCanvas(ccanvas)->concat(matrix);
3439503ac7a3cc98327a88eff59c71c451fbdd7e043abarth}
3449503ac7a3cc98327a88eff59c71c451fbdd7e043abarth
345e371989c92eba394ea048419debcb9febadae17breedvoid sk_canvas_clip_rect(sk_canvas_t* ccanvas, const sk_rect_t* crect) {
346e371989c92eba394ea048419debcb9febadae17breed    AsCanvas(ccanvas)->clipRect(AsRect(*crect));
347e371989c92eba394ea048419debcb9febadae17breed}
348e371989c92eba394ea048419debcb9febadae17breed
349e371989c92eba394ea048419debcb9febadae17breedvoid sk_canvas_clip_path(sk_canvas_t* ccanvas, const sk_path_t* cpath) {
350e371989c92eba394ea048419debcb9febadae17breed    AsCanvas(ccanvas)->clipPath(AsPath(*cpath));
351e371989c92eba394ea048419debcb9febadae17breed}
352e371989c92eba394ea048419debcb9febadae17breed
353938dfba51d0be03fa81866d99214447dac359e83reedvoid sk_canvas_draw_paint(sk_canvas_t* ccanvas, const sk_paint_t* cpaint) {
354938dfba51d0be03fa81866d99214447dac359e83reed    AsCanvas(ccanvas)->drawPaint(AsPaint(*cpaint));
355938dfba51d0be03fa81866d99214447dac359e83reed}
356938dfba51d0be03fa81866d99214447dac359e83reed
357938dfba51d0be03fa81866d99214447dac359e83reedvoid sk_canvas_draw_rect(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {
358938dfba51d0be03fa81866d99214447dac359e83reed    AsCanvas(ccanvas)->drawRect(AsRect(*crect), AsPaint(*cpaint));
359938dfba51d0be03fa81866d99214447dac359e83reed}
360938dfba51d0be03fa81866d99214447dac359e83reed
361938dfba51d0be03fa81866d99214447dac359e83reedvoid sk_canvas_draw_oval(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {
362938dfba51d0be03fa81866d99214447dac359e83reed    AsCanvas(ccanvas)->drawOval(AsRect(*crect), AsPaint(*cpaint));
363938dfba51d0be03fa81866d99214447dac359e83reed}
364938dfba51d0be03fa81866d99214447dac359e83reed
365938dfba51d0be03fa81866d99214447dac359e83reedvoid sk_canvas_draw_path(sk_canvas_t* ccanvas, const sk_path_t* cpath, const sk_paint_t* cpaint) {
366938dfba51d0be03fa81866d99214447dac359e83reed    AsCanvas(ccanvas)->drawPath(AsPath(*cpath), AsPaint(*cpaint));
367938dfba51d0be03fa81866d99214447dac359e83reed}
368938dfba51d0be03fa81866d99214447dac359e83reed
369938dfba51d0be03fa81866d99214447dac359e83reedvoid sk_canvas_draw_image(sk_canvas_t* ccanvas, const sk_image_t* cimage, float x, float y,
370938dfba51d0be03fa81866d99214447dac359e83reed                          const sk_paint_t* cpaint) {
371938dfba51d0be03fa81866d99214447dac359e83reed    AsCanvas(ccanvas)->drawImage(AsImage(cimage), x, y, AsPaint(cpaint));
372938dfba51d0be03fa81866d99214447dac359e83reed}
373938dfba51d0be03fa81866d99214447dac359e83reed
374e371989c92eba394ea048419debcb9febadae17breedvoid sk_canvas_draw_image_rect(sk_canvas_t* ccanvas, const sk_image_t* cimage,
375e371989c92eba394ea048419debcb9febadae17breed                               const sk_rect_t* csrcR, const sk_rect_t* cdstR,
376e371989c92eba394ea048419debcb9febadae17breed                               const sk_paint_t* cpaint) {
377e371989c92eba394ea048419debcb9febadae17breed    AsCanvas(ccanvas)->drawImageRect(AsImage(cimage), AsRect(csrcR), AsRect(*cdstR), AsPaint(cpaint));
378e371989c92eba394ea048419debcb9febadae17breed}
379e371989c92eba394ea048419debcb9febadae17breed
380e371989c92eba394ea048419debcb9febadae17breedvoid sk_canvas_draw_picture(sk_canvas_t* ccanvas, const sk_picture_t* cpicture,
381e371989c92eba394ea048419debcb9febadae17breed                            const sk_matrix_t* cmatrix, const sk_paint_t* cpaint) {
382e371989c92eba394ea048419debcb9febadae17breed    const SkMatrix* matrixPtr = NULL;
383e371989c92eba394ea048419debcb9febadae17breed    SkMatrix matrix;
384e371989c92eba394ea048419debcb9febadae17breed    if (cmatrix) {
385e371989c92eba394ea048419debcb9febadae17breed        from_c_matrix(cmatrix, &matrix);
386e371989c92eba394ea048419debcb9febadae17breed        matrixPtr = &matrix;
387e371989c92eba394ea048419debcb9febadae17breed    }
388e371989c92eba394ea048419debcb9febadae17breed    AsCanvas(ccanvas)->drawPicture(AsPicture(cpicture), matrixPtr, AsPaint(cpaint));
389e371989c92eba394ea048419debcb9febadae17breed}
390e371989c92eba394ea048419debcb9febadae17breed
391938dfba51d0be03fa81866d99214447dac359e83reed///////////////////////////////////////////////////////////////////////////////////////////
392938dfba51d0be03fa81866d99214447dac359e83reed
3938e47478333bb77d3ba273432fcfe089a2a1384bereedsk_surface_t* sk_surface_new_raster(const sk_imageinfo_t* cinfo) {
394e332396d2fabb84894c816ff3999cf1c6262fd9dreed    SkImageInfo info;
395e332396d2fabb84894c816ff3999cf1c6262fd9dreed    if (!from_c_info(*cinfo, &info)) {
396e332396d2fabb84894c816ff3999cf1c6262fd9dreed        return NULL;
397e332396d2fabb84894c816ff3999cf1c6262fd9dreed    }
398e332396d2fabb84894c816ff3999cf1c6262fd9dreed    return (sk_surface_t*)SkSurface::NewRaster(info);
399938dfba51d0be03fa81866d99214447dac359e83reed}
400938dfba51d0be03fa81866d99214447dac359e83reed
4018e47478333bb77d3ba273432fcfe089a2a1384bereedsk_surface_t* sk_surface_new_raster_direct(const sk_imageinfo_t* cinfo, void* pixels,
402938dfba51d0be03fa81866d99214447dac359e83reed                                           size_t rowBytes) {
403e332396d2fabb84894c816ff3999cf1c6262fd9dreed    SkImageInfo info;
404e332396d2fabb84894c816ff3999cf1c6262fd9dreed    if (!from_c_info(*cinfo, &info)) {
405e332396d2fabb84894c816ff3999cf1c6262fd9dreed        return NULL;
406e332396d2fabb84894c816ff3999cf1c6262fd9dreed    }
407e332396d2fabb84894c816ff3999cf1c6262fd9dreed    return (sk_surface_t*)SkSurface::NewRasterDirect(info, pixels, rowBytes);
408938dfba51d0be03fa81866d99214447dac359e83reed}
409938dfba51d0be03fa81866d99214447dac359e83reed
410afa278e250034186497722b1bc49ced885770249reedvoid sk_surface_unref(sk_surface_t* csurf) {
411afa278e250034186497722b1bc49ced885770249reed    SkSafeUnref((SkSurface*)csurf);
412938dfba51d0be03fa81866d99214447dac359e83reed}
413938dfba51d0be03fa81866d99214447dac359e83reed
414938dfba51d0be03fa81866d99214447dac359e83reedsk_canvas_t* sk_surface_get_canvas(sk_surface_t* csurf) {
415938dfba51d0be03fa81866d99214447dac359e83reed    SkSurface* surf = (SkSurface*)csurf;
4168e47478333bb77d3ba273432fcfe089a2a1384bereed    return (sk_canvas_t*)surf->getCanvas();
417938dfba51d0be03fa81866d99214447dac359e83reed}
418938dfba51d0be03fa81866d99214447dac359e83reed
419938dfba51d0be03fa81866d99214447dac359e83reedsk_image_t* sk_surface_new_image_snapshot(sk_surface_t* csurf) {
420938dfba51d0be03fa81866d99214447dac359e83reed    SkSurface* surf = (SkSurface*)csurf;
4218e47478333bb77d3ba273432fcfe089a2a1384bereed    return (sk_image_t*)surf->newImageSnapshot();
4228e47478333bb77d3ba273432fcfe089a2a1384bereed}
4238e47478333bb77d3ba273432fcfe089a2a1384bereed
424afa278e250034186497722b1bc49ced885770249reed///////////////////////////////////////////////////////////////////////////////////////////
425afa278e250034186497722b1bc49ced885770249reed
426e371989c92eba394ea048419debcb9febadae17breedsk_picture_recorder_t* sk_picture_recorder_new() {
427e371989c92eba394ea048419debcb9febadae17breed    return ToPictureRecorder(new SkPictureRecorder);
428e371989c92eba394ea048419debcb9febadae17breed}
429e371989c92eba394ea048419debcb9febadae17breed
430e371989c92eba394ea048419debcb9febadae17breedvoid sk_picture_recorder_delete(sk_picture_recorder_t* crec) {
431e371989c92eba394ea048419debcb9febadae17breed    delete AsPictureRecorder(crec);
432e371989c92eba394ea048419debcb9febadae17breed}
433e371989c92eba394ea048419debcb9febadae17breed
434e371989c92eba394ea048419debcb9febadae17breedsk_canvas_t* sk_picture_recorder_begin_recording(sk_picture_recorder_t* crec,
435e371989c92eba394ea048419debcb9febadae17breed                                                 const sk_rect_t* cbounds) {
436e371989c92eba394ea048419debcb9febadae17breed    return ToCanvas(AsPictureRecorder(crec)->beginRecording(AsRect(*cbounds)));
437e371989c92eba394ea048419debcb9febadae17breed}
438e371989c92eba394ea048419debcb9febadae17breed
439e371989c92eba394ea048419debcb9febadae17breedsk_picture_t* sk_picture_recorder_end_recording(sk_picture_recorder_t* crec) {
440e371989c92eba394ea048419debcb9febadae17breed    return ToPicture(AsPictureRecorder(crec)->endRecording());
441e371989c92eba394ea048419debcb9febadae17breed}
442e371989c92eba394ea048419debcb9febadae17breed
443e371989c92eba394ea048419debcb9febadae17breedvoid sk_picture_ref(sk_picture_t* cpic) {
444e371989c92eba394ea048419debcb9febadae17breed    SkSafeRef(AsPicture(cpic));
445e371989c92eba394ea048419debcb9febadae17breed}
446e371989c92eba394ea048419debcb9febadae17breed
447e371989c92eba394ea048419debcb9febadae17breedvoid sk_picture_unref(sk_picture_t* cpic) {
448e371989c92eba394ea048419debcb9febadae17breed    SkSafeUnref(AsPicture(cpic));
449e371989c92eba394ea048419debcb9febadae17breed}
450e371989c92eba394ea048419debcb9febadae17breed
451e371989c92eba394ea048419debcb9febadae17breeduint32_t sk_picture_get_unique_id(sk_picture_t* cpic) {
452e371989c92eba394ea048419debcb9febadae17breed    return AsPicture(cpic)->uniqueID();
453e371989c92eba394ea048419debcb9febadae17breed}
454e371989c92eba394ea048419debcb9febadae17breed
455e371989c92eba394ea048419debcb9febadae17breedsk_rect_t sk_picture_get_bounds(sk_picture_t* cpic) {
456e371989c92eba394ea048419debcb9febadae17breed    return ToRect(AsPicture(cpic)->cullRect());
457e371989c92eba394ea048419debcb9febadae17breed}
458e371989c92eba394ea048419debcb9febadae17breed
459e371989c92eba394ea048419debcb9febadae17breed///////////////////////////////////////////////////////////////////////////////////////////
460e371989c92eba394ea048419debcb9febadae17breed
461afa278e250034186497722b1bc49ced885770249reed#include "../../include/effects/SkGradientShader.h"
462afa278e250034186497722b1bc49ced885770249reed#include "sk_shader.h"
463afa278e250034186497722b1bc49ced885770249reed
464afa278e250034186497722b1bc49ced885770249reedconst struct {
465afa278e250034186497722b1bc49ced885770249reed    sk_shader_tilemode_t    fC;
466afa278e250034186497722b1bc49ced885770249reed    SkShader::TileMode      fSK;
467afa278e250034186497722b1bc49ced885770249reed} gTileModeMap[] = {
468afa278e250034186497722b1bc49ced885770249reed    { CLAMP_SK_SHADER_TILEMODE,     SkShader::kClamp_TileMode },
469afa278e250034186497722b1bc49ced885770249reed    { REPEAT_SK_SHADER_TILEMODE,    SkShader::kRepeat_TileMode },
470afa278e250034186497722b1bc49ced885770249reed    { MIRROR_SK_SHADER_TILEMODE,    SkShader::kMirror_TileMode  },
471afa278e250034186497722b1bc49ced885770249reed};
472afa278e250034186497722b1bc49ced885770249reed
473afa278e250034186497722b1bc49ced885770249reedstatic bool from_c_tilemode(sk_shader_tilemode_t cMode, SkShader::TileMode* skMode) {
474afa278e250034186497722b1bc49ced885770249reed    for (size_t i = 0; i < SK_ARRAY_COUNT(gTileModeMap); ++i) {
475afa278e250034186497722b1bc49ced885770249reed        if (cMode == gTileModeMap[i].fC) {
476afa278e250034186497722b1bc49ced885770249reed            if (skMode) {
477afa278e250034186497722b1bc49ced885770249reed                *skMode = gTileModeMap[i].fSK;
478afa278e250034186497722b1bc49ced885770249reed            }
479afa278e250034186497722b1bc49ced885770249reed            return true;
480afa278e250034186497722b1bc49ced885770249reed        }
481afa278e250034186497722b1bc49ced885770249reed    }
482afa278e250034186497722b1bc49ced885770249reed    return false;
483afa278e250034186497722b1bc49ced885770249reed}
484afa278e250034186497722b1bc49ced885770249reed
485afa278e250034186497722b1bc49ced885770249reedvoid sk_shader_ref(sk_shader_t* cshader) {
486afa278e250034186497722b1bc49ced885770249reed    SkSafeRef(AsShader(cshader));
487afa278e250034186497722b1bc49ced885770249reed}
488afa278e250034186497722b1bc49ced885770249reed
489afa278e250034186497722b1bc49ced885770249reedvoid sk_shader_unref(sk_shader_t* cshader) {
490afa278e250034186497722b1bc49ced885770249reed    SkSafeUnref(AsShader(cshader));
491afa278e250034186497722b1bc49ced885770249reed}
492afa278e250034186497722b1bc49ced885770249reed
493afa278e250034186497722b1bc49ced885770249reedsk_shader_t* sk_shader_new_linear_gradient(const sk_point_t pts[2],
494afa278e250034186497722b1bc49ced885770249reed                                           const sk_color_t colors[],
495afa278e250034186497722b1bc49ced885770249reed                                           const float colorPos[],
496afa278e250034186497722b1bc49ced885770249reed                                           int colorCount,
497afa278e250034186497722b1bc49ced885770249reed                                           sk_shader_tilemode_t cmode,
498afa278e250034186497722b1bc49ced885770249reed                                           const sk_matrix_t* cmatrix) {
499afa278e250034186497722b1bc49ced885770249reed    SkShader::TileMode mode;
500afa278e250034186497722b1bc49ced885770249reed    if (!from_c_tilemode(cmode, &mode)) {
501afa278e250034186497722b1bc49ced885770249reed        return NULL;
502afa278e250034186497722b1bc49ced885770249reed    }
503afa278e250034186497722b1bc49ced885770249reed    SkMatrix matrix;
504afa278e250034186497722b1bc49ced885770249reed    if (cmatrix) {
5059503ac7a3cc98327a88eff59c71c451fbdd7e043abarth        from_c_matrix(cmatrix, &matrix);
506afa278e250034186497722b1bc49ced885770249reed    } else {
507afa278e250034186497722b1bc49ced885770249reed        matrix.setIdentity();
508afa278e250034186497722b1bc49ced885770249reed    }
509afa278e250034186497722b1bc49ced885770249reed    SkShader* s = SkGradientShader::CreateLinear(reinterpret_cast<const SkPoint*>(pts),
510afa278e250034186497722b1bc49ced885770249reed                                                 reinterpret_cast<const SkColor*>(colors),
511afa278e250034186497722b1bc49ced885770249reed                                                 colorPos, colorCount, mode, 0, &matrix);
512afa278e250034186497722b1bc49ced885770249reed    return (sk_shader_t*)s;
513afa278e250034186497722b1bc49ced885770249reed}
5148e47478333bb77d3ba273432fcfe089a2a1384bereed
515afa278e250034186497722b1bc49ced885770249reed///////////////////////////////////////////////////////////////////////////////////////////
5160eafc9b06cbfd47e9c3471c82580790cef0fdae5reed
5170eafc9b06cbfd47e9c3471c82580790cef0fdae5reed#include "../../include/effects/SkBlurMaskFilter.h"
5180eafc9b06cbfd47e9c3471c82580790cef0fdae5reed#include "sk_maskfilter.h"
5190eafc9b06cbfd47e9c3471c82580790cef0fdae5reed
5200eafc9b06cbfd47e9c3471c82580790cef0fdae5reedconst struct {
5210eafc9b06cbfd47e9c3471c82580790cef0fdae5reed    sk_blurstyle_t  fC;
5220eafc9b06cbfd47e9c3471c82580790cef0fdae5reed    SkBlurStyle     fSk;
5230eafc9b06cbfd47e9c3471c82580790cef0fdae5reed} gBlurStylePairs[] = {
5240eafc9b06cbfd47e9c3471c82580790cef0fdae5reed    { NORMAL_SK_BLUR_STYLE, kNormal_SkBlurStyle },
5250eafc9b06cbfd47e9c3471c82580790cef0fdae5reed    { SOLID_SK_BLUR_STYLE,  kSolid_SkBlurStyle },
5260eafc9b06cbfd47e9c3471c82580790cef0fdae5reed    { OUTER_SK_BLUR_STYLE,  kOuter_SkBlurStyle },
5270eafc9b06cbfd47e9c3471c82580790cef0fdae5reed    { INNER_SK_BLUR_STYLE,  kInner_SkBlurStyle },
5280eafc9b06cbfd47e9c3471c82580790cef0fdae5reed};
5290eafc9b06cbfd47e9c3471c82580790cef0fdae5reed
5300eafc9b06cbfd47e9c3471c82580790cef0fdae5reedstatic bool find_blurstyle(sk_blurstyle_t csrc, SkBlurStyle* dst) {
5310eafc9b06cbfd47e9c3471c82580790cef0fdae5reed    for (size_t i = 0; i < SK_ARRAY_COUNT(gBlurStylePairs); ++i) {
5320eafc9b06cbfd47e9c3471c82580790cef0fdae5reed        if (gBlurStylePairs[i].fC == csrc) {
5330eafc9b06cbfd47e9c3471c82580790cef0fdae5reed            if (dst) {
5340eafc9b06cbfd47e9c3471c82580790cef0fdae5reed                *dst = gBlurStylePairs[i].fSk;
5350eafc9b06cbfd47e9c3471c82580790cef0fdae5reed            }
5360eafc9b06cbfd47e9c3471c82580790cef0fdae5reed            return true;
5370eafc9b06cbfd47e9c3471c82580790cef0fdae5reed        }
5380eafc9b06cbfd47e9c3471c82580790cef0fdae5reed    }
5390eafc9b06cbfd47e9c3471c82580790cef0fdae5reed    return false;
5400eafc9b06cbfd47e9c3471c82580790cef0fdae5reed}
5410eafc9b06cbfd47e9c3471c82580790cef0fdae5reed
5420eafc9b06cbfd47e9c3471c82580790cef0fdae5reedvoid sk_maskfilter_ref(sk_maskfilter_t* cfilter) {
5430eafc9b06cbfd47e9c3471c82580790cef0fdae5reed    SkSafeRef(AsMaskFilter(cfilter));
5440eafc9b06cbfd47e9c3471c82580790cef0fdae5reed}
5450eafc9b06cbfd47e9c3471c82580790cef0fdae5reed
5460eafc9b06cbfd47e9c3471c82580790cef0fdae5reedvoid sk_maskfilter_unref(sk_maskfilter_t* cfilter) {
5470eafc9b06cbfd47e9c3471c82580790cef0fdae5reed    SkSafeUnref(AsMaskFilter(cfilter));
5480eafc9b06cbfd47e9c3471c82580790cef0fdae5reed}
5490eafc9b06cbfd47e9c3471c82580790cef0fdae5reed
5500eafc9b06cbfd47e9c3471c82580790cef0fdae5reedsk_maskfilter_t* sk_maskfilter_new_blur(sk_blurstyle_t cstyle, float sigma) {
5510eafc9b06cbfd47e9c3471c82580790cef0fdae5reed    SkBlurStyle style;
5520eafc9b06cbfd47e9c3471c82580790cef0fdae5reed    if (!find_blurstyle(cstyle, &style)) {
5530eafc9b06cbfd47e9c3471c82580790cef0fdae5reed        return NULL;
5540eafc9b06cbfd47e9c3471c82580790cef0fdae5reed    }
5550eafc9b06cbfd47e9c3471c82580790cef0fdae5reed    return ToMaskFilter(SkBlurMaskFilter::Create(style, sigma));
5560eafc9b06cbfd47e9c3471c82580790cef0fdae5reed}
5570eafc9b06cbfd47e9c3471c82580790cef0fdae5reed
5580eafc9b06cbfd47e9c3471c82580790cef0fdae5reed///////////////////////////////////////////////////////////////////////////////////////////
559b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed
560b2a5d7e02fd588d343baf6a7433c483f7af9fd43reedsk_data_t* sk_data_new_with_copy(const void* src, size_t length) {
561b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed    return ToData(SkData::NewWithCopy(src, length));
562b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed}
563b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed
564b2a5d7e02fd588d343baf6a7433c483f7af9fd43reedsk_data_t* sk_data_new_from_malloc(const void* memory, size_t length) {
565b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed    return ToData(SkData::NewFromMalloc(memory, length));
566b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed}
567b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed
568b2a5d7e02fd588d343baf6a7433c483f7af9fd43reedsk_data_t* sk_data_new_subset(const sk_data_t* csrc, size_t offset, size_t length) {
569b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed    return ToData(SkData::NewSubset(AsData(csrc), offset, length));
570b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed}
571b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed
572b2a5d7e02fd588d343baf6a7433c483f7af9fd43reedvoid sk_data_ref(const sk_data_t* cdata) {
573b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed    SkSafeRef(AsData(cdata));
574b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed}
575b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed
576b2a5d7e02fd588d343baf6a7433c483f7af9fd43reedvoid sk_data_unref(const sk_data_t* cdata) {
577b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed    SkSafeUnref(AsData(cdata));
578b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed}
579b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed
580b2a5d7e02fd588d343baf6a7433c483f7af9fd43reedsize_t sk_data_get_size(const sk_data_t* cdata) {
581b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed    return AsData(cdata)->size();
582b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed}
583b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed
584b2a5d7e02fd588d343baf6a7433c483f7af9fd43reedconst void* sk_data_get_data(const sk_data_t* cdata) {
585b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed    return AsData(cdata)->data();
586b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed}
587b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed
588b2a5d7e02fd588d343baf6a7433c483f7af9fd43reed///////////////////////////////////////////////////////////////////////////////////////////
589afa278e250034186497722b1bc49ced885770249reed///////////////////////////////////////////////////////////////////////////////////////////
5908e47478333bb77d3ba273432fcfe089a2a1384bereed
5918e47478333bb77d3ba273432fcfe089a2a1384bereedvoid sk_test_capi(SkCanvas* canvas) {
5928e47478333bb77d3ba273432fcfe089a2a1384bereed    sk_imageinfo_t cinfo;
5938e47478333bb77d3ba273432fcfe089a2a1384bereed    cinfo.width = 100;
5948e47478333bb77d3ba273432fcfe089a2a1384bereed    cinfo.height = 100;
5958e47478333bb77d3ba273432fcfe089a2a1384bereed    cinfo.colorType = (sk_colortype_t)kN32_SkColorType;
5968e47478333bb77d3ba273432fcfe089a2a1384bereed    cinfo.alphaType = (sk_alphatype_t)kPremul_SkAlphaType;
5978e47478333bb77d3ba273432fcfe089a2a1384bereed
5988e47478333bb77d3ba273432fcfe089a2a1384bereed    sk_surface_t* csurface = sk_surface_new_raster(&cinfo);
5998e47478333bb77d3ba273432fcfe089a2a1384bereed    sk_canvas_t* ccanvas = sk_surface_get_canvas(csurface);
6008e47478333bb77d3ba273432fcfe089a2a1384bereed
6018e47478333bb77d3ba273432fcfe089a2a1384bereed    sk_paint_t* cpaint = sk_paint_new();
6028e47478333bb77d3ba273432fcfe089a2a1384bereed    sk_paint_set_antialias(cpaint, true);
6038e47478333bb77d3ba273432fcfe089a2a1384bereed    sk_paint_set_color(cpaint, 0xFFFF0000);
6048e47478333bb77d3ba273432fcfe089a2a1384bereed
6058e47478333bb77d3ba273432fcfe089a2a1384bereed    sk_rect_t cr = { 5, 5, 95, 95 };
6068e47478333bb77d3ba273432fcfe089a2a1384bereed    sk_canvas_draw_oval(ccanvas, &cr, cpaint);
6078e47478333bb77d3ba273432fcfe089a2a1384bereed
6088e47478333bb77d3ba273432fcfe089a2a1384bereed    cr.left += 25;
6098e47478333bb77d3ba273432fcfe089a2a1384bereed    cr.top += 25;
6108e47478333bb77d3ba273432fcfe089a2a1384bereed    cr.right -= 25;
6118e47478333bb77d3ba273432fcfe089a2a1384bereed    cr.bottom -= 25;
6128e47478333bb77d3ba273432fcfe089a2a1384bereed    sk_paint_set_color(cpaint, 0xFF00FF00);
6138e47478333bb77d3ba273432fcfe089a2a1384bereed    sk_canvas_draw_rect(ccanvas, &cr, cpaint);
6148e47478333bb77d3ba273432fcfe089a2a1384bereed
615a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips    sk_path_t* cpath = sk_path_new();
616a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips    sk_path_move_to(cpath, 50, 50);
617a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips    sk_path_line_to(cpath, 100, 100);
618a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips    sk_path_line_to(cpath, 50, 100);
619a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips    sk_path_close(cpath);
620a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips
621a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips    sk_canvas_draw_path(ccanvas, cpath, cpaint);
622a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips
6238e47478333bb77d3ba273432fcfe089a2a1384bereed    sk_image_t* cimage = sk_surface_new_image_snapshot(csurface);
6248e47478333bb77d3ba273432fcfe089a2a1384bereed
6258e47478333bb77d3ba273432fcfe089a2a1384bereed    // HERE WE CROSS THE C..C++ boundary
6268e47478333bb77d3ba273432fcfe089a2a1384bereed    canvas->drawImage((const SkImage*)cimage, 20, 20, NULL);
6278e47478333bb77d3ba273432fcfe089a2a1384bereed
628a624e87e8e10fd9dc3a34e498dd30804ceee5228robertphillips    sk_path_delete(cpath);
6298e47478333bb77d3ba273432fcfe089a2a1384bereed    sk_paint_delete(cpaint);
6308e47478333bb77d3ba273432fcfe089a2a1384bereed    sk_image_unref(cimage);
631afa278e250034186497722b1bc49ced885770249reed    sk_surface_unref(csurface);
632938dfba51d0be03fa81866d99214447dac359e83reed}
633