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