blob: a0f27f2dbeb96091f1b252e8733ca3048346972a [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/color_filter.h"
#include <cstring>
#include "flutter/lib/ui/ui_dart_state.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 ColorFilter_constructor(Dart_NativeArguments args) {
UIDartState::ThrowIfUIOperationsProhibited();
DartCallConstructor(&ColorFilter::Create, args);
}
IMPLEMENT_WRAPPERTYPEINFO(ui, ColorFilter);
#define FOR_EACH_BINDING(V) \
V(ColorFilter, initMode) \
V(ColorFilter, initMatrix) \
V(ColorFilter, initSrgbToLinearGamma) \
V(ColorFilter, initLinearToSrgbGamma)
FOR_EACH_BINDING(DART_NATIVE_CALLBACK)
void ColorFilter::RegisterNatives(tonic::DartLibraryNatives* natives) {
natives->Register(
{{"ColorFilter_constructor", ColorFilter_constructor, 1, true},
FOR_EACH_BINDING(DART_REGISTER_NATIVE)});
}
fml::RefPtr<ColorFilter> ColorFilter::Create() {
return fml::MakeRefCounted<ColorFilter>();
}
void ColorFilter::initMode(int color, int blend_mode) {
filter_ = SkColorFilters::Blend(static_cast<SkColor>(color),
static_cast<SkBlendMode>(blend_mode));
}
sk_sp<SkColorFilter> ColorFilter::MakeColorMatrixFilter255(
const float array[20]) {
float tmp[20];
memcpy(tmp, array, sizeof(tmp));
tmp[4] *= 1.0f / 255;
tmp[9] *= 1.0f / 255;
tmp[14] *= 1.0f / 255;
tmp[19] *= 1.0f / 255;
return SkColorFilters::Matrix(tmp);
}
void ColorFilter::initMatrix(const tonic::Float32List& color_matrix) {
FML_CHECK(color_matrix.num_elements() == 20);
filter_ = MakeColorMatrixFilter255(color_matrix.data());
}
void ColorFilter::initLinearToSrgbGamma() {
filter_ = SkColorFilters::LinearToSRGBGamma();
}
void ColorFilter::initSrgbToLinearGamma() {
filter_ = SkColorFilters::SRGBToLinearGamma();
}
ColorFilter::~ColorFilter() = default;
} // namespace flutter