blob: cd568e8ea0ac79d70197bdbfdc14a9937fc923f8 [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.
#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 <memory>
#include "base/macros.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/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 {
DEFINE_WRAPPERTYPEINFO();
public:
PaintRenderingContext2D(const IntSize& container_size,
const PaintRenderingContext2DSettings*,
float zoom,
float device_scale_factor);
void Trace(Visitor* visitor) const override {
visitor->Trace(context_settings_);
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 {}
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* GetOrCreatePaintCanvas() final { return GetPaintCanvas(); }
cc::PaintCanvas* GetPaintCanvas() 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 ValidateStateStackWithCanvas(const cc::PaintCanvas*) 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; }
// CSS Paint doesn't have any notion of image orientation.
RespectImageOrientationEnum RespectImageOrientation() const final {
return kRespectImageOrientation;
}
DOMMatrix* getTransform() final;
void resetTransform() final;
sk_sp<PaintRecord> GetRecord();
protected:
CanvasColorParams GetCanvas2DColorParams() const override;
bool IsPaint2D() const override { return true; }
void WillOverwriteCanvas() override;
private:
void InitializePaintRecorder();
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_;
DISALLOW_COPY_AND_ASSIGN(PaintRenderingContext2D);
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_CSSPAINT_PAINT_RENDERING_CONTEXT_2D_H_