mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 10:47:35 +00:00
LibWeb: Extract CanvasState class from CRC2D
As with CanvasPath, this is to better match the spec IDL.
This commit is contained in:
parent
7b61d16262
commit
08e6071ebb
7 changed files with 154 additions and 93 deletions
42
Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.cpp
Normal file
42
Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.cpp
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Copyright (c) 2021-2022, Linus Groh <linusg@serenityos.org>
|
||||
* Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <LibWeb/HTML/Canvas/CanvasState.h>
|
||||
|
||||
namespace Web::HTML {
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-save
|
||||
void CanvasState::save()
|
||||
{
|
||||
// The save() method steps are to push a copy of the current drawing state onto the drawing state stack.
|
||||
m_drawing_state_stack.append(m_drawing_state);
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-restore
|
||||
void CanvasState::restore()
|
||||
{
|
||||
// The restore() method steps are to pop the top entry in the drawing state stack, and reset the drawing state it describes. If there is no saved state, then the method must do nothing.
|
||||
if (m_drawing_state_stack.is_empty())
|
||||
return;
|
||||
m_drawing_state = m_drawing_state_stack.take_last();
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-reset
|
||||
void CanvasState::reset()
|
||||
{
|
||||
// The reset() method steps are to reset the rendering context to its default state.
|
||||
reset_to_default_state();
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-iscontextlost
|
||||
bool CanvasState::is_context_lost()
|
||||
{
|
||||
// The isContextLost() method steps are to return this's context lost.
|
||||
return m_context_lost;
|
||||
}
|
||||
|
||||
}
|
51
Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.h
Normal file
51
Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.h
Normal file
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/Vector.h>
|
||||
#include <LibGfx/AffineTransform.h>
|
||||
#include <LibGfx/Color.h>
|
||||
|
||||
namespace Web::HTML {
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/canvas.html#canvasstate
|
||||
class CanvasState {
|
||||
public:
|
||||
virtual ~CanvasState() = default;
|
||||
|
||||
void save();
|
||||
void restore();
|
||||
void reset();
|
||||
bool is_context_lost();
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/canvas.html#drawing-state
|
||||
struct DrawingState {
|
||||
Gfx::AffineTransform transform;
|
||||
Gfx::Color fill_style { Gfx::Color::Black };
|
||||
Gfx::Color stroke_style { Gfx::Color::Black };
|
||||
float line_width { 1 };
|
||||
};
|
||||
DrawingState& drawing_state() { return m_drawing_state; }
|
||||
DrawingState const& drawing_state() const { return m_drawing_state; }
|
||||
|
||||
void clear_drawing_state_stack() { m_drawing_state_stack.clear(); }
|
||||
void reset_drawing_state() { m_drawing_state = {}; }
|
||||
|
||||
virtual void reset_to_default_state() = 0;
|
||||
|
||||
protected:
|
||||
CanvasState() = default;
|
||||
|
||||
private:
|
||||
DrawingState m_drawing_state;
|
||||
Vector<DrawingState> m_drawing_state_stack;
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-context-lost
|
||||
bool m_context_lost { false };
|
||||
};
|
||||
|
||||
}
|
7
Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.idl
Normal file
7
Userland/Libraries/LibWeb/HTML/Canvas/CanvasState.idl
Normal file
|
@ -0,0 +1,7 @@
|
|||
// https://html.spec.whatwg.org/multipage/canvas.html#canvasstate
|
||||
interface mixin CanvasState {
|
||||
undefined save();
|
||||
undefined restore();
|
||||
undefined reset();
|
||||
boolean isContextLost();
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue