| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "export.h" |
| #include "helpers.h" |
| #include "third_party/skia/include/core/SkImage.h" |
| #include "third_party/skia/include/effects/SkGradientShader.h" |
| #include "third_party/skia/include/effects/SkRuntimeEffect.h" |
| #include "wrappers.h" |
| |
| using namespace Skwasm; |
| |
| SKWASM_EXPORT SkShader* shader_createLinearGradient( |
| SkPoint* endPoints, // Two points |
| SkColor* colors, |
| SkScalar* stops, |
| int count, // Number of stops/colors |
| SkTileMode tileMode, |
| SkScalar* matrix33 // Can be nullptr |
| ) { |
| if (matrix33) { |
| SkMatrix localMatrix = createMatrix(matrix33); |
| return SkGradientShader::MakeLinear(endPoints, colors, stops, count, |
| tileMode, 0, &localMatrix) |
| .release(); |
| } else { |
| return SkGradientShader::MakeLinear(endPoints, colors, stops, count, |
| tileMode) |
| .release(); |
| } |
| } |
| |
| SKWASM_EXPORT SkShader* shader_createRadialGradient(SkScalar centerX, |
| SkScalar centerY, |
| SkScalar radius, |
| SkColor* colors, |
| SkScalar* stops, |
| int count, |
| SkTileMode tileMode, |
| SkScalar* matrix33) { |
| if (matrix33) { |
| SkMatrix localMatrix = createMatrix(matrix33); |
| return SkGradientShader::MakeRadial({centerX, centerY}, radius, colors, |
| stops, count, tileMode, 0, &localMatrix) |
| .release(); |
| } else { |
| return SkGradientShader::MakeRadial({centerX, centerY}, radius, colors, |
| stops, count, tileMode) |
| .release(); |
| } |
| } |
| |
| SKWASM_EXPORT SkShader* shader_createConicalGradient( |
| SkPoint* endPoints, // Two points |
| SkScalar startRadius, |
| SkScalar endRadius, |
| SkColor* colors, |
| SkScalar* stops, |
| int count, |
| SkTileMode tileMode, |
| SkScalar* matrix33) { |
| if (matrix33) { |
| SkMatrix localMatrix = createMatrix(matrix33); |
| return SkGradientShader::MakeTwoPointConical( |
| endPoints[0], startRadius, endPoints[1], endRadius, colors, |
| stops, count, tileMode, 0, &localMatrix) |
| .release(); |
| |
| } else { |
| return SkGradientShader::MakeTwoPointConical(endPoints[0], startRadius, |
| endPoints[1], endRadius, |
| colors, stops, count, tileMode) |
| .release(); |
| } |
| } |
| |
| SKWASM_EXPORT SkShader* shader_createSweepGradient(SkScalar centerX, |
| SkScalar centerY, |
| SkColor* colors, |
| SkScalar* stops, |
| int count, |
| SkTileMode tileMode, |
| SkScalar startAngle, |
| SkScalar endAngle, |
| SkScalar* matrix33) { |
| if (matrix33) { |
| SkMatrix localMatrix = createMatrix(matrix33); |
| return SkGradientShader::MakeSweep(centerX, centerY, colors, stops, count, |
| tileMode, startAngle, endAngle, 0, |
| &localMatrix) |
| .release(); |
| } else { |
| return SkGradientShader::MakeSweep(centerX, centerY, colors, stops, count, |
| tileMode, startAngle, endAngle, 0, |
| nullptr) |
| .release(); |
| } |
| } |
| |
| SKWASM_EXPORT void shader_dispose(SkShader* shader) { |
| shader->unref(); |
| } |
| |
| SKWASM_EXPORT SkRuntimeEffect* runtimeEffect_create(SkString* source) { |
| auto result = SkRuntimeEffect::MakeForShader(*source); |
| if (result.effect == nullptr) { |
| printf("Failed to compile shader. Error text:\n%s", |
| result.errorText.data()); |
| return nullptr; |
| } else { |
| return result.effect.release(); |
| } |
| } |
| |
| SKWASM_EXPORT void runtimeEffect_dispose(SkRuntimeEffect* effect) { |
| effect->unref(); |
| } |
| |
| SKWASM_EXPORT size_t runtimeEffect_getUniformSize(SkRuntimeEffect* effect) { |
| return effect->uniformSize(); |
| } |
| |
| SKWASM_EXPORT SkShader* shader_createRuntimeEffectShader( |
| SkRuntimeEffect* runtimeEffect, |
| SkData* uniforms, |
| SkShader** children, |
| size_t childCount) { |
| std::vector<sk_sp<SkShader>> childPointers; |
| for (size_t i = 0; i < childCount; i++) { |
| childPointers.emplace_back(sk_ref_sp<SkShader>(children[i])); |
| } |
| return runtimeEffect |
| ->makeShader(SkData::MakeWithCopy(uniforms->data(), uniforms->size()), |
| childPointers.data(), childCount, nullptr) |
| .release(); |
| } |
| |
| SKWASM_EXPORT SkShader* shader_createFromImage(SkImage* image, |
| SkTileMode tileModeX, |
| SkTileMode tileModeY, |
| FilterQuality quality, |
| SkScalar* matrix33) { |
| if (matrix33) { |
| SkMatrix localMatrix = createMatrix(matrix33); |
| return image |
| ->makeShader(tileModeX, tileModeY, samplingOptionsForQuality(quality), |
| &localMatrix) |
| .release(); |
| } else { |
| return image |
| ->makeShader(tileModeX, tileModeY, samplingOptionsForQuality(quality)) |
| .release(); |
| } |
| } |