提交 6ca2f8e7 编写于 作者: J Jason Simmons 提交者: GitHub

Export the Skia ShadowMaskFilter API (#3401)

See https://github.com/flutter/flutter/issues/6807
上级 44eaa416
...@@ -861,9 +861,49 @@ class MaskFilter extends NativeFieldWrapperClass2 { ...@@ -861,9 +861,49 @@ class MaskFilter extends NativeFieldWrapperClass2 {
/// ///
/// A blur is an expensive operation and should therefore be used sparingly. /// A blur is an expensive operation and should therefore be used sparingly.
MaskFilter.blur(BlurStyle style, double sigma) { MaskFilter.blur(BlurStyle style, double sigma) {
_constructor(style.index, sigma); _constructorBlur(style.index, sigma);
} }
void _constructor(int style, double sigma) native "MaskFilter_constructor"; void _constructorBlur(int style, double sigma) native "MaskFilter_constructorBlur";
/// Creates a mask filter that implements a pair of shadows for an occluding
/// object - one representing ambient occlusion, and one representing a
/// displaced shadow from a point light.
///
/// `occluderHeight`: Height of occluding object off of ground plane.
///
/// `lightPos`: Position of the light applied to this object.
///
/// `lightRadius`: Radius of the light (light is assumed to be spherical).
///
/// `ambientAlpha`: Base opacity of the ambient occlusion shadow.
///
/// `spotAlpha`: Base opacity of the displaced spot shadow.
MaskFilter.shadow({
double occluderHeight: 0.0,
double lightPosX: 0.0,
double lightPosY: 0.0,
double lightPosZ: 0.0,
double lightRadius: 0.0,
double ambientAlpha: 0.0,
double spotAlpha: 0.0,
}) {
if (!(occluderHeight > 0.0 &&
lightPosZ > occluderHeight &&
lightRadius > 0.0 &&
ambientAlpha >= 0.0 &&
spotAlpha >= 0.0))
throw new ArgumentError("Invalid shadow mask filter parameters");
_constructorShadow(occluderHeight, lightPosX, lightPosY, lightPosZ,
lightRadius, ambientAlpha, spotAlpha);
}
void _constructorShadow(double occluderHeight,
double lightPosX,
double lightPosY,
double lightPosZ,
double lightRadius,
double ambientAlpha,
double spotAlpha) native "MaskFilter_constructorShadow";
} }
/// A description of a color filter to apply when drawing a shape or compositing /// A description of a color filter to apply when drawing a shape or compositing
......
...@@ -11,26 +11,47 @@ ...@@ -11,26 +11,47 @@
#include "lib/tonic/converter/dart_converter.h" #include "lib/tonic/converter/dart_converter.h"
#include "lib/tonic/dart_library_natives.h" #include "lib/tonic/dart_library_natives.h"
#include "third_party/skia/include/effects/SkBlurMaskFilter.h" #include "third_party/skia/include/effects/SkBlurMaskFilter.h"
#include "third_party/skia/include/effects/SkShadowMaskFilter.h"
namespace blink { namespace blink {
static void MaskFilter_constructor(Dart_NativeArguments args) { static void MaskFilter_constructorBlur(Dart_NativeArguments args) {
DartCallConstructor(&MaskFilter::Create, args); DartCallConstructor(&MaskFilter::CreateBlur, args);
}
static void MaskFilter_constructorShadow(Dart_NativeArguments args) {
DartCallConstructor(&MaskFilter::CreateShadow, args);
} }
IMPLEMENT_WRAPPERTYPEINFO(ui, MaskFilter); IMPLEMENT_WRAPPERTYPEINFO(ui, MaskFilter);
void MaskFilter::RegisterNatives(tonic::DartLibraryNatives* natives) { void MaskFilter::RegisterNatives(tonic::DartLibraryNatives* natives) {
natives->Register({ natives->Register({
{"MaskFilter_constructor", MaskFilter_constructor, 3, true}, {"MaskFilter_constructorBlur", MaskFilter_constructorBlur, 3, true},
{"MaskFilter_constructorShadow", MaskFilter_constructorShadow, 8, true},
}); });
} }
ftl::RefPtr<MaskFilter> MaskFilter::Create(unsigned style, double sigma) { ftl::RefPtr<MaskFilter> MaskFilter::CreateBlur(unsigned style, double sigma) {
return ftl::MakeRefCounted<MaskFilter>( return ftl::MakeRefCounted<MaskFilter>(
SkBlurMaskFilter::Make(static_cast<SkBlurStyle>(style), sigma)); SkBlurMaskFilter::Make(static_cast<SkBlurStyle>(style), sigma));
} }
ftl::RefPtr<MaskFilter> MaskFilter::CreateShadow(double occluderHeight,
double lightPosX,
double lightPosY,
double lightPosZ,
double lightRadius,
double ambientAlpha,
double spotAlpha) {
return ftl::MakeRefCounted<MaskFilter>(
SkShadowMaskFilter::Make(occluderHeight,
SkPoint3::Make(lightPosX, lightPosY, lightPosZ),
lightRadius,
ambientAlpha,
spotAlpha));
}
MaskFilter::MaskFilter(sk_sp<SkMaskFilter> filter) MaskFilter::MaskFilter(sk_sp<SkMaskFilter> filter)
: filter_(std::move(filter)) {} : filter_(std::move(filter)) {}
......
...@@ -23,7 +23,15 @@ class MaskFilter : public ftl::RefCountedThreadSafe<MaskFilter>, ...@@ -23,7 +23,15 @@ class MaskFilter : public ftl::RefCountedThreadSafe<MaskFilter>,
public: public:
~MaskFilter() override; ~MaskFilter() override;
static ftl::RefPtr<MaskFilter> Create(unsigned style, double sigma); static ftl::RefPtr<MaskFilter> CreateBlur(unsigned style, double sigma);
static ftl::RefPtr<MaskFilter> CreateShadow(double occluderHeight,
double lightPosX,
double lightPosY,
double lightPosZ,
double lightRadius,
double ambientAlpha,
double spotAlpha);
const sk_sp<SkMaskFilter>& filter() { return filter_; } const sk_sp<SkMaskFilter>& filter() { return filter_; }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册