blob: 7fa5e0e9bc2c251e2be08e275c7704dcab969dd8 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/platform/graphics/compositor_filter_operations.h"
#include "third_party/blink/renderer/platform/graphics/color.h"
#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/rect_conversions.h"
namespace blink {
const cc::FilterOperations& CompositorFilterOperations::AsCcFilterOperations()
const {
return filter_operations_;
}
cc::FilterOperations CompositorFilterOperations::ReleaseCcFilterOperations() {
return std::move(filter_operations_);
}
void CompositorFilterOperations::AppendGrayscaleFilter(float amount) {
filter_operations_.Append(cc::FilterOperation::CreateGrayscaleFilter(amount));
}
void CompositorFilterOperations::AppendSepiaFilter(float amount) {
filter_operations_.Append(cc::FilterOperation::CreateSepiaFilter(amount));
}
void CompositorFilterOperations::AppendSaturateFilter(float amount) {
filter_operations_.Append(cc::FilterOperation::CreateSaturateFilter(amount));
}
void CompositorFilterOperations::AppendHueRotateFilter(float amount) {
filter_operations_.Append(cc::FilterOperation::CreateHueRotateFilter(amount));
}
void CompositorFilterOperations::AppendColorMatrixFilter(Vector<float> values) {
DCHECK_EQ(values.size(), 20u);
cc::FilterOperation::Matrix matrix = {};
for (WTF::wtf_size_t i = 0; i < values.size(); ++i)
matrix[i] = values[i];
filter_operations_.Append(
cc::FilterOperation::CreateColorMatrixFilter(matrix));
}
void CompositorFilterOperations::AppendInvertFilter(float amount) {
filter_operations_.Append(cc::FilterOperation::CreateInvertFilter(amount));
}
void CompositorFilterOperations::AppendBrightnessFilter(float amount) {
filter_operations_.Append(
cc::FilterOperation::CreateBrightnessFilter(amount));
}
void CompositorFilterOperations::AppendContrastFilter(float amount) {
filter_operations_.Append(cc::FilterOperation::CreateContrastFilter(amount));
}
void CompositorFilterOperations::AppendOpacityFilter(float amount) {
filter_operations_.Append(cc::FilterOperation::CreateOpacityFilter(amount));
}
void CompositorFilterOperations::AppendBlurFilter(float amount,
SkTileMode tile_mode) {
filter_operations_.Append(
cc::FilterOperation::CreateBlurFilter(amount, tile_mode));
}
void CompositorFilterOperations::AppendDropShadowFilter(gfx::Vector2d offset,
float std_deviation,
const Color& color) {
gfx::Point gfx_offset(offset.x(), offset.y());
// TODO(crbug/1308932): Remove FromColor and make all SkColor4f.
filter_operations_.Append(cc::FilterOperation::CreateDropShadowFilter(
gfx_offset, std_deviation, SkColor4f::FromColor(color.Rgb())));
}
void CompositorFilterOperations::AppendColorMatrixFilter(
const cc::FilterOperation::Matrix& matrix) {
filter_operations_.Append(
cc::FilterOperation::CreateColorMatrixFilter(matrix));
}
void CompositorFilterOperations::AppendZoomFilter(float amount, int inset) {
filter_operations_.Append(
cc::FilterOperation::CreateZoomFilter(amount, inset));
}
void CompositorFilterOperations::AppendSaturatingBrightnessFilter(
float amount) {
filter_operations_.Append(
cc::FilterOperation::CreateSaturatingBrightnessFilter(amount));
}
void CompositorFilterOperations::AppendReferenceFilter(
sk_sp<PaintFilter> image_filter) {
filter_operations_.Append(
cc::FilterOperation::CreateReferenceFilter(std::move(image_filter)));
}
void CompositorFilterOperations::Clear() {
filter_operations_.Clear();
}
bool CompositorFilterOperations::IsEmpty() const {
return filter_operations_.IsEmpty();
}
gfx::RectF CompositorFilterOperations::MapRect(
const gfx::RectF& input_rect) const {
return gfx::RectF(filter_operations_.MapRect(
gfx::ToEnclosingRect(input_rect),
RuntimeEnabledFeatures::NewFilterMapRectEnabled()
? std::nullopt
: std::make_optional(SkMatrix::I())));
}
bool CompositorFilterOperations::HasFilterThatMovesPixels() const {
return filter_operations_.HasFilterThatMovesPixels();
}
bool CompositorFilterOperations::HasReferenceFilter() const {
return filter_operations_.HasReferenceFilter();
}
bool CompositorFilterOperations::operator==(
const CompositorFilterOperations& o) const {
return reference_box_ == o.reference_box_ &&
filter_operations_ == o.filter_operations_;
}
String CompositorFilterOperations::ToString() const {
return String(filter_operations_.ToString()) + " at " +
String(reference_box_.ToString());
}
} // namespace blink