blob: dbab7b6ce801fb18cadf5aab3bde2f86b6ecbda6 [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.
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_CSSPAINT_PAINT_RENDERING_CONTEXT_2D_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_CSSPAINT_PAINT_RENDERING_CONTEXT_2D_H_
#include "base/task/single_thread_task_runner.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_paint_rendering_context_2d_settings.h"
#include "third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h"
#include "third_party/blink/renderer/modules/csspaint/paint_worklet_global_scope.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/graphics/memory_managed_paint_recorder.h"
#include "third_party/blink/renderer/platform/graphics/paint/paint_record.h"
namespace blink {
class Color;
// In our internal implementation, there are different kinds of canvas such as
// recording canvas, GPU canvas. The CSS Paint API uses the recording canvas and
// this class is specifically designed for the recording canvas.
//
// The main difference between this class and other contexts is that
// PaintRenderingContext2D operates on CSS pixels rather than physical pixels.
class MODULES_EXPORT PaintRenderingContext2D
: public ScriptWrappable,
public BaseRenderingContext2D,
public MemoryManagedPaintRecorder::Client {
DEFINE_WRAPPERTYPEINFO();
public:
PaintRenderingContext2D(
const gfx::Size& container_size,
const PaintRenderingContext2DSettings*,
float zoom,
scoped_refptr<base::SingleThreadTaskRunner> task_runner,
PaintWorkletGlobalScope* global_scope = nullptr);
PaintRenderingContext2D(const PaintRenderingContext2D&) = delete;
PaintRenderingContext2D& operator=(const PaintRenderingContext2D&) = delete;
void Trace(Visitor* visitor) const override {
visitor->Trace(context_settings_);
visitor->Trace(global_scope_);
ScriptWrappable::Trace(visitor);
BaseRenderingContext2D::Trace(visitor);
}
// PaintRenderingContext2D doesn't have any pixel readback so the origin
// is always clean, and unable to taint it.
bool OriginClean() const final { return true; }
void SetOriginTainted() final {}
int Width() const final;
int Height() const final;
Color GetCurrentColor() const final;
cc::PaintCanvas* GetOrCreatePaintCanvas() final { return GetPaintCanvas(); }
using BaseRenderingContext2D::GetPaintCanvas; // Pull the non-const overload.
const cc::PaintCanvas* GetPaintCanvas() const final;
const MemoryManagedPaintRecorder* Recorder() const override {
return &paint_recorder_;
}
void WillDraw(const SkIRect&, CanvasPerformanceMonitor::DrawType) final;
double shadowOffsetX() const final;
void setShadowOffsetX(double) final;
double shadowOffsetY() const final;
void setShadowOffsetY(double) final;
double shadowBlur() const final;
void setShadowBlur(double) final;
sk_sp<PaintFilter> StateGetFilter() final;
bool HasAlpha() const final { return context_settings_->alpha(); }
// PaintRenderingContext2D cannot lose it's context.
bool isContextLost() const final { return false; }
// PaintRenderingContext2D uses a recording canvas, so it should never
// allocate a pixel buffer and is not accelerated.
bool CanCreateCanvas2dResourceProvider() const final { return false; }
// CSS Paint doesn't have any notion of image orientation.
RespectImageOrientationEnum RespectImageOrientation() const final {
return kRespectImageOrientation;
}
DOMMatrix* getTransform() final;
void resetTransform() final;
void reset() final;
std::optional<cc::PaintRecord> FlushCanvas(FlushReason) final {
return std::nullopt;
}
PaintRecord GetRecord();
ExecutionContext* GetTopExecutionContext() const override {
return global_scope_.Get();
}
protected:
PredefinedColorSpace GetDefaultImageDataColorSpace() const final;
bool IsPaint2D() const override { return true; }
// PaintRenderingContext2D is unable to resolve fonts.
bool ResolveFont(const String& new_font) final { return false; }
private:
void InitializeForRecording(cc::PaintCanvas* canvas) const override;
void RecordingCleared() override;
MemoryManagedPaintRecorder paint_recorder_;
std::optional<PaintRecord> previous_frame_;
gfx::Size container_size_;
Member<const PaintRenderingContext2DSettings> context_settings_;
// The paint worklet canvas operates on CSS pixels, and that's different than
// the HTML canvas which operates on physical pixels. In other words, the
// paint worklet canvas needs to handle device scale factor and browser zoom,
// and this is designed for that purpose.
const float effective_zoom_;
WeakMember<PaintWorkletGlobalScope> global_scope_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_CSSPAINT_PAINT_RENDERING_CONTEXT_2D_H_