blob: 4e43649a208e0ffcc7a3ea4bc08e44066dbfd338 [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/display_list/display_list_image_filter.h"
namespace flutter {
std::shared_ptr<DlImageFilter> DlImageFilter::From(
const SkImageFilter* sk_filter) {
if (sk_filter == nullptr) {
return nullptr;
}
{
SkColorFilter* color_filter;
if (sk_filter->isColorFilterNode(&color_filter)) {
FML_DCHECK(color_filter != nullptr);
// If |isColorFilterNode| succeeds, the pointer it sets into color_filter
// will be ref'd already so we do not use sk_ref_sp() here as that would
// double-ref the color filter object. Instead we use a bare sk_sp
// constructor to adopt this reference into an sk_sp<SkCF> without
// reffing it and let the compiler manage the refs.
return std::make_shared<DlColorFilterImageFilter>(
DlColorFilter::From(sk_sp<SkColorFilter>(color_filter)));
}
}
return std::make_shared<DlUnknownImageFilter>(sk_ref_sp(sk_filter));
}
std::shared_ptr<DlImageFilter> DlImageFilter::makeWithLocalMatrix(
const SkMatrix& matrix) const {
if (matrix.isIdentity()) {
return shared();
}
// Matrix
switch (this->matrix_capability()) {
case MatrixCapability::kTranslate: {
if (!matrix.isTranslate()) {
// Nothing we can do at this point
return nullptr;
}
break;
}
case MatrixCapability::kScaleTranslate: {
if (!matrix.isScaleTranslate()) {
// Nothing we can do at this point
return nullptr;
}
break;
}
default:
break;
}
return std::make_shared<DlLocalMatrixImageFilter>(matrix, shared());
}
SkRect* DlComposeImageFilter::map_local_bounds(const SkRect& input_bounds,
SkRect& output_bounds) const {
SkRect cur_bounds = input_bounds;
SkRect* ret = &output_bounds;
// We set this result in case neither filter is present.
output_bounds = input_bounds;
if (inner_) {
if (!inner_->map_local_bounds(cur_bounds, output_bounds)) {
ret = nullptr;
}
cur_bounds = output_bounds;
}
if (outer_) {
if (!outer_->map_local_bounds(cur_bounds, output_bounds)) {
ret = nullptr;
}
}
return ret;
}
SkIRect* DlComposeImageFilter::map_device_bounds(const SkIRect& input_bounds,
const SkMatrix& ctm,
SkIRect& output_bounds) const {
SkIRect cur_bounds = input_bounds;
SkIRect* ret = &output_bounds;
// We set this result in case neither filter is present.
output_bounds = input_bounds;
if (inner_) {
if (!inner_->map_device_bounds(cur_bounds, ctm, output_bounds)) {
ret = nullptr;
}
cur_bounds = output_bounds;
}
if (outer_) {
if (!outer_->map_device_bounds(cur_bounds, ctm, output_bounds)) {
ret = nullptr;
}
}
return ret;
}
SkIRect* DlComposeImageFilter::get_input_device_bounds(
const SkIRect& output_bounds,
const SkMatrix& ctm,
SkIRect& input_bounds) const {
SkIRect cur_bounds = output_bounds;
SkIRect* ret = &input_bounds;
// We set this result in case neither filter is present.
input_bounds = output_bounds;
if (outer_) {
if (!outer_->get_input_device_bounds(cur_bounds, ctm, input_bounds)) {
ret = nullptr;
}
cur_bounds = input_bounds;
}
if (inner_) {
if (!inner_->get_input_device_bounds(cur_bounds, ctm, input_bounds)) {
ret = nullptr;
}
}
return ret;
}
} // namespace flutter