1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "flutter/lib/ui/painting/image_filter.h"
6
7#include "flutter/lib/ui/painting/matrix.h"
8#include "third_party/skia/include/effects/SkBlurImageFilter.h"
9#include "third_party/skia/include/effects/SkImageSource.h"
10#include "third_party/skia/include/effects/SkPictureImageFilter.h"
11#include "third_party/tonic/converter/dart_converter.h"
12#include "third_party/tonic/dart_args.h"
13#include "third_party/tonic/dart_binding_macros.h"
14#include "third_party/tonic/dart_library_natives.h"
15
16namespace flutter {
17
18static void ImageFilter_constructor(Dart_NativeArguments args) {
19 UIDartState::ThrowIfUIOperationsProhibited();
20 DartCallConstructor(&ImageFilter::Create, args);
21}
22
23IMPLEMENT_WRAPPERTYPEINFO(ui, ImageFilter);
24
25#define FOR_EACH_BINDING(V) \
26 V(ImageFilter, initImage) \
27 V(ImageFilter, initPicture) \
28 V(ImageFilter, initBlur) \
29 V(ImageFilter, initMatrix)
30
31FOR_EACH_BINDING(DART_NATIVE_CALLBACK)
32
33void ImageFilter::RegisterNatives(tonic::DartLibraryNatives* natives) {
34 natives->Register(
35 {{"ImageFilter_constructor", ImageFilter_constructor, 1, true},
36 FOR_EACH_BINDING(DART_REGISTER_NATIVE)});
37}
38
39fml::RefPtr<ImageFilter> ImageFilter::Create() {
40 return fml::MakeRefCounted<ImageFilter>();
41}
42
43ImageFilter::ImageFilter() {}
44
45ImageFilter::~ImageFilter() {}
46
47void ImageFilter::initImage(CanvasImage* image) {
48 filter_ = SkImageSource::Make(image->image());
49}
50
51void ImageFilter::initPicture(Picture* picture) {
52 filter_ = SkPictureImageFilter::Make(picture->picture());
53}
54
55void ImageFilter::initBlur(double sigma_x, double sigma_y) {
56 filter_ = SkBlurImageFilter::Make(sigma_x, sigma_y, nullptr, nullptr,
57 SkBlurImageFilter::kClamp_TileMode);
58}
59
60void ImageFilter::initMatrix(const tonic::Float64List& matrix4,
61 int filterQuality) {
62 filter_ = SkImageFilter::MakeMatrixFilter(
63 ToSkMatrix(matrix4), static_cast<SkFilterQuality>(filterQuality),
64 nullptr);
65}
66
67} // namespace flutter
68