blob: 2b20b22ac5f6eed7e2ab967b1343d681006f292a [file] [log] [blame]
// 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 "flutter/lib/ui/painting/image_filter.h"
#include "flutter/lib/ui/painting/matrix.h"
#include "third_party/skia/include/effects/SkImageFilters.h"
#include "third_party/tonic/converter/dart_converter.h"
#include "third_party/tonic/dart_args.h"
#include "third_party/tonic/dart_binding_macros.h"
#include "third_party/tonic/dart_library_natives.h"
namespace flutter {
static void ImageFilter_constructor(Dart_NativeArguments args) {
UIDartState::ThrowIfUIOperationsProhibited();
DartCallConstructor(&ImageFilter::Create, args);
}
IMPLEMENT_WRAPPERTYPEINFO(ui, ImageFilter);
#define FOR_EACH_BINDING(V) \
V(ImageFilter, initImage) \
V(ImageFilter, initPicture) \
V(ImageFilter, initBlur) \
V(ImageFilter, initMatrix) \
V(ImageFilter, initColorFilter) \
V(ImageFilter, initComposeFilter)
FOR_EACH_BINDING(DART_NATIVE_CALLBACK)
void ImageFilter::RegisterNatives(tonic::DartLibraryNatives* natives) {
natives->Register(
{{"ImageFilter_constructor", ImageFilter_constructor, 1, true},
FOR_EACH_BINDING(DART_REGISTER_NATIVE)});
}
fml::RefPtr<ImageFilter> ImageFilter::Create() {
return fml::MakeRefCounted<ImageFilter>();
}
static const std::array<SkSamplingOptions, 4> filter_qualities = {
SkSamplingOptions(SkFilterMode::kNearest, SkMipmapMode::kNone),
SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kNone),
SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kLinear),
SkSamplingOptions(SkCubicResampler{1 / 3.0f, 1 / 3.0f}),
};
SkSamplingOptions ImageFilter::SamplingFromIndex(int filterQualityIndex) {
if (filterQualityIndex < 0) {
return filter_qualities.front();
} else if (((size_t)filterQualityIndex) >= filter_qualities.size()) {
return filter_qualities.back();
} else {
return filter_qualities[filterQualityIndex];
}
}
SkFilterMode ImageFilter::FilterModeFromIndex(int filterQualityIndex) {
if (filterQualityIndex <= 0) {
return SkFilterMode::kNearest;
}
return SkFilterMode::kLinear;
}
ImageFilter::ImageFilter() {}
ImageFilter::~ImageFilter() {}
void ImageFilter::initImage(CanvasImage* image) {
filter_ = SkImageFilters::Image(image->image());
}
void ImageFilter::initPicture(Picture* picture) {
filter_ = SkImageFilters::Picture(picture->picture());
}
void ImageFilter::initBlur(double sigma_x,
double sigma_y,
SkTileMode tile_mode) {
filter_ = SkImageFilters::Blur(sigma_x, sigma_y, tile_mode, nullptr, nullptr);
}
void ImageFilter::initMatrix(const tonic::Float64List& matrix4,
int filterQualityIndex) {
auto sampling = ImageFilter::SamplingFromIndex(filterQualityIndex);
filter_ =
SkImageFilters::MatrixTransform(ToSkMatrix(matrix4), sampling, nullptr);
}
void ImageFilter::initColorFilter(ColorFilter* colorFilter) {
filter_ = SkImageFilters::ColorFilter(
colorFilter ? colorFilter->filter() : nullptr, nullptr);
}
void ImageFilter::initComposeFilter(ImageFilter* outer, ImageFilter* inner) {
filter_ = SkImageFilters::Compose(outer ? outer->filter() : nullptr,
inner ? inner->filter() : nullptr);
}
} // namespace flutter