blob: 7f0481f0562e0a6ce1546fbaff95dab36efabbb2 [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/effects/dl_image_filter.h"
namespace flutter {
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