2023-08-03 12:18:17 +02:00
/*
* Copyright ( c ) 2023 , Bastiaan van der Plaat < bastiaan . v . d . plaat @ gmail . com >
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
# pragma once
2023-08-07 21:48:49 +02:00
# include <LibWeb/CSS/Parser/Parser.h>
# include <LibWeb/CSS/StyleComputer.h>
2023-09-19 16:39:50 +01:00
# include <LibWeb/CSS/StyleValues/ShorthandStyleValue.h>
2023-08-07 21:48:49 +02:00
# include <LibWeb/DOM/Document.h>
2023-08-03 12:18:17 +02:00
# include <LibWeb/HTML/Canvas/CanvasState.h>
namespace Web : : HTML {
// https://html.spec.whatwg.org/multipage/canvas.html#canvastextdrawingstyles
template < typename IncludingClass >
class CanvasTextDrawingStyles {
public :
~ CanvasTextDrawingStyles ( ) = default ;
2023-12-16 17:49:34 +03:30
ByteString font ( ) const
2023-08-07 21:48:49 +02:00
{
// When font style value is empty return default string
if ( ! my_drawing_state ( ) . font_style_value ) {
return " 10px sans-serif " ;
}
// On getting, the font attribute must return the serialized form of the current font of the context (with no 'line-height' component).
2023-09-19 16:39:50 +01:00
auto const & font_style_value = my_drawing_state ( ) . font_style_value - > as_shorthand ( ) ;
auto font_style = font_style_value . longhand ( CSS : : PropertyID : : FontStyle ) ;
auto font_weight = font_style_value . longhand ( CSS : : PropertyID : : FontWeight ) ;
auto font_size = font_style_value . longhand ( CSS : : PropertyID : : FontSize ) ;
auto font_family = font_style_value . longhand ( CSS : : PropertyID : : FontFamily ) ;
2024-12-07 00:59:49 +01:00
return ByteString : : formatted ( " {} {} {} {} " ,
font_style - > to_string ( CSS : : CSSStyleValue : : SerializationMode : : Normal ) ,
font_weight - > to_string ( CSS : : CSSStyleValue : : SerializationMode : : Normal ) ,
font_size - > to_string ( CSS : : CSSStyleValue : : SerializationMode : : Normal ) ,
font_family - > to_string ( CSS : : CSSStyleValue : : SerializationMode : : Normal ) ) ;
2023-08-07 21:48:49 +02:00
}
2023-09-06 19:41:48 +12:00
void set_font ( StringView font )
2023-08-07 21:48:49 +02:00
{
// The font IDL attribute, on setting, must be parsed as a CSS <'font'> value (but without supporting property-independent style sheet syntax like 'inherit'),
// and the resulting font must be assigned to the context, with the 'line-height' component forced to 'normal', with the 'font-size' component converted to CSS pixels,
// and with system fonts being computed to explicit values.
2024-07-23 16:14:26 +01:00
// FIXME: with the 'line-height' component forced to 'normal'
// FIXME: with the 'font-size' component converted to CSS pixels
2025-02-05 12:08:27 +00:00
auto font_style_value_result = parse_css_value ( CSS : : Parser : : ParsingParams { } , font , CSS : : PropertyID : : Font ) ;
2023-08-07 21:48:49 +02:00
// If the new value is syntactically incorrect (including using property-independent style sheet syntax like 'inherit' or 'initial'), then it must be ignored, without assigning a new font value.
2024-07-23 16:14:26 +01:00
// NOTE: ShorthandStyleValue should be the only valid option here. We implicitly VERIFY this below.
if ( ! font_style_value_result | | ! font_style_value_result - > is_shorthand ( ) ) {
2023-08-07 21:48:49 +02:00
return ;
}
2023-08-19 15:01:21 +01:00
my_drawing_state ( ) . font_style_value = font_style_value_result . release_nonnull ( ) ;
2023-08-07 21:48:49 +02:00
// Load font with font style value properties
2023-09-19 16:39:50 +01:00
auto const & font_style_value = my_drawing_state ( ) . font_style_value - > as_shorthand ( ) ;
2023-08-07 21:48:49 +02:00
auto & canvas_element = reinterpret_cast < IncludingClass & > ( * this ) . canvas_element ( ) ;
2023-09-19 16:39:50 +01:00
auto & font_style = * font_style_value . longhand ( CSS : : PropertyID : : FontStyle ) ;
auto & font_weight = * font_style_value . longhand ( CSS : : PropertyID : : FontWeight ) ;
2024-09-27 14:04:59 +01:00
auto & font_width = * font_style_value . longhand ( CSS : : PropertyID : : FontWidth ) ;
2023-09-19 16:39:50 +01:00
auto & font_size = * font_style_value . longhand ( CSS : : PropertyID : : FontSize ) ;
auto & font_family = * font_style_value . longhand ( CSS : : PropertyID : : FontFamily ) ;
2024-09-27 14:04:59 +01:00
auto font_list = canvas_element . document ( ) . style_computer ( ) . compute_font_for_style_values ( & canvas_element , { } , font_family , font_size , font_style , font_weight , font_width ) ;
2025-04-19 18:34:53 +02:00
my_drawing_state ( ) . current_font_cascade_list = font_list ;
2023-08-07 21:48:49 +02:00
}
2023-08-03 12:18:17 +02:00
Bindings : : CanvasTextAlign text_align ( ) const { return my_drawing_state ( ) . text_align ; }
2023-08-07 21:48:49 +02:00
void set_text_align ( Bindings : : CanvasTextAlign text_align ) { my_drawing_state ( ) . text_align = text_align ; }
2023-08-03 12:18:17 +02:00
Bindings : : CanvasTextBaseline text_baseline ( ) const { return my_drawing_state ( ) . text_baseline ; }
2023-08-07 21:48:49 +02:00
void set_text_baseline ( Bindings : : CanvasTextBaseline text_baseline ) { my_drawing_state ( ) . text_baseline = text_baseline ; }
2023-08-03 12:18:17 +02:00
protected :
CanvasTextDrawingStyles ( ) = default ;
private :
CanvasState : : DrawingState & my_drawing_state ( ) { return reinterpret_cast < IncludingClass & > ( * this ) . drawing_state ( ) ; }
CanvasState : : DrawingState const & my_drawing_state ( ) const { return reinterpret_cast < IncludingClass const & > ( * this ) . drawing_state ( ) ; }
} ;
}