blob: 3b0379140bf07adfe80af94cd1bc0c1a193c8c48 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSSOM_CSS_PAINT_WORKLET_INPUT_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSSOM_CSS_PAINT_WORKLET_INPUT_H_
#include <memory>
#include <utility>
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/css/cssom/paint_worklet_input.h"
#include "third_party/blink/renderer/core/css/cssom/paint_worklet_style_property_map.h"
#include "third_party/blink/renderer/platform/graphics/compositor_element_id.h"
namespace blink {
// CSSPaintWorkletInput encapsulates the necessary information to run a CSS
// Paint instance (a 'PaintWorklet') for a given target (e.g. the
// 'background-image' property of a particular element). It is used to enable
// Off-Thread PaintWorklet, allowing us to defer the actual JavaScript calls
// until the cc-Raster phase (and even then run the JavaScript on a separate
// worklet thread).
//
// TODO: WTF::Strings are now thread-safe. Consider refactoring this code.
class CORE_EXPORT CSSPaintWorkletInput : public PaintWorkletInput {
public:
CSSPaintWorkletInput(
const String& name,
const gfx::SizeF& container_size,
float effective_zoom,
int worklet_id,
PaintWorkletStylePropertyMap::CrossThreadData values,
Vector<std::unique_ptr<CrossThreadStyleValue>> parsed_input_args,
cc::PaintWorkletInput::PropertyKeys property_keys);
~CSSPaintWorkletInput() override = default;
// These accessors are safe on any thread.
float EffectiveZoom() const { return effective_zoom_; }
const Vector<std::unique_ptr<CrossThreadStyleValue>>& ParsedInputArguments()
const {
return parsed_input_arguments_;
}
// These should only be accessed on the PaintWorklet thread.
String NameCopy() const { return name_; }
PaintWorkletStylePropertyMap::CrossThreadData StyleMapData() const {
return PaintWorkletStylePropertyMap::CopyCrossThreadData(style_map_data_);
}
PaintWorkletInputType GetType() const override {
return PaintWorkletInputType::kCSS;
}
private:
const String name_;
const float effective_zoom_;
PaintWorkletStylePropertyMap::CrossThreadData style_map_data_;
Vector<std::unique_ptr<CrossThreadStyleValue>> parsed_input_arguments_;
};
template <>
struct DowncastTraits<CSSPaintWorkletInput> {
static bool AllowFrom(const cc::PaintWorkletInput& worklet_input) {
auto* input = DynamicTo<PaintWorkletInput>(worklet_input);
return input && AllowFrom(*input);
}
static bool AllowFrom(const PaintWorkletInput& worklet_input) {
return worklet_input.GetType() ==
PaintWorkletInput::PaintWorkletInputType::kCSS;
}
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSSOM_CSS_PAINT_WORKLET_INPUT_H_