blob: bfad30a9ef5e35beeeb9830ab0876ce1c5fdbe49 [file] [log] [blame]
// Copyright 2016 The Chromium 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 <memory>
#include "base/macros.h"
#include "third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h"
#include "third_party/blink/renderer/modules/csspaint/paint_rendering_context_2d_settings.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/paint/paint_record.h"
#include "third_party/blink/renderer/platform/graphics/paint/paint_recorder.h"
namespace blink {
class CanvasImageSource;
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 {
PaintRenderingContext2D(const IntSize& container_size,
const PaintRenderingContext2DSettings*,
float zoom,
float device_scale_factor);
void Trace(blink::Visitor* visitor) override {
// 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 {}
bool WouldTaintOrigin(CanvasImageSource*) final { return false; }
int Width() const final;
int Height() const final;
bool ParseColorOrCurrentColor(Color&, const String& color_string) const final;
cc::PaintCanvas* DrawingCanvas() const final;
cc::PaintCanvas* ExistingDrawingCanvas() const final;
void DidDraw(const SkIRect&) 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;
bool StateHasFilter() final;
sk_sp<PaintFilter> StateGetFilter() final;
void SnapshotStateForFilter() final {}
void ValidateStateStack() const 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; }
bool IsAccelerated() const final { return false; }
void setTransform(double m11,
double m12,
double m21,
double m22,
double dx,
double dy) final;
void setTransform(DOMMatrix2DInit*, ExceptionState&) final;
sk_sp<PaintRecord> GetRecord();
bool IsPaint2D() const override { return true; }
void WillOverwriteCanvas() override;
void InitializePaintRecorder();
cc::PaintCanvas* Canvas() const;
std::unique_ptr<PaintRecorder> paint_recorder_;
sk_sp<PaintRecord> previous_frame_;
IntSize container_size_;
Member<const PaintRenderingContext2DSettings> context_settings_;
bool did_record_draw_commands_in_paint_recorder_;
// 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_;
// On platforms where zoom_for_dsf is enabled, the |effective_zoom_|
// accounts for the device scale factor. For platforms where the feature is
// not enabled (currently Mac only), we need this extra variable.
const float device_scale_factor_;
} // namespace blink