StyleValue.h 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2021, Tobias Christiansen <tobyase@serenityos.org>
  4. * Copyright (c) 2021-2022, Sam Atkins <atkinssj@serenityos.org>
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #pragma once
  9. #include <AK/Function.h>
  10. #include <AK/GenericShorthands.h>
  11. #include <AK/NonnullOwnPtr.h>
  12. #include <AK/NonnullOwnPtrVector.h>
  13. #include <AK/NonnullRefPtrVector.h>
  14. #include <AK/RefCounted.h>
  15. #include <AK/RefPtr.h>
  16. #include <AK/String.h>
  17. #include <AK/StringView.h>
  18. #include <AK/URL.h>
  19. #include <AK/Variant.h>
  20. #include <AK/Vector.h>
  21. #include <AK/WeakPtr.h>
  22. #include <LibGfx/Bitmap.h>
  23. #include <LibGfx/Color.h>
  24. #include <LibGfx/Painter.h>
  25. #include <LibWeb/CSS/Angle.h>
  26. #include <LibWeb/CSS/Display.h>
  27. #include <LibWeb/CSS/Enums.h>
  28. #include <LibWeb/CSS/Frequency.h>
  29. #include <LibWeb/CSS/Length.h>
  30. #include <LibWeb/CSS/Number.h>
  31. #include <LibWeb/CSS/Parser/ComponentValue.h>
  32. #include <LibWeb/CSS/Percentage.h>
  33. #include <LibWeb/CSS/PropertyID.h>
  34. #include <LibWeb/CSS/Resolution.h>
  35. #include <LibWeb/CSS/Time.h>
  36. #include <LibWeb/CSS/TransformFunctions.h>
  37. #include <LibWeb/CSS/ValueID.h>
  38. #include <LibWeb/Forward.h>
  39. #include <LibWeb/Loader/ImageResource.h>
  40. #include <LibWeb/Painting/GradientPainting.h>
  41. namespace Web::CSS {
  42. enum class BackgroundSize {
  43. Contain,
  44. Cover,
  45. LengthPercentage,
  46. };
  47. enum class ShadowPlacement {
  48. Outer,
  49. Inner,
  50. };
  51. enum class FlexBasis {
  52. Content,
  53. LengthPercentage,
  54. Auto,
  55. };
  56. // Note: The sides must be before the corners in this enum (as this order is used in parsing).
  57. enum class SideOrCorner {
  58. Top,
  59. Bottom,
  60. Left,
  61. Right,
  62. TopLeft,
  63. TopRight,
  64. BottomLeft,
  65. BottomRight
  66. };
  67. struct GradientColorStop {
  68. Color color;
  69. Optional<LengthPercentage> length;
  70. };
  71. struct GradientColorHint {
  72. LengthPercentage value;
  73. };
  74. struct ColorStopListElement {
  75. Optional<GradientColorHint> transition_hint;
  76. GradientColorStop color_stop;
  77. };
  78. struct EdgeRect {
  79. Length top_edge;
  80. Length right_edge;
  81. Length bottom_edge;
  82. Length left_edge;
  83. Gfx::FloatRect resolved(Layout::Node const&, Gfx::FloatRect) const;
  84. };
  85. // FIXME: Find a better place for this helper.
  86. inline Gfx::Painter::ScalingMode to_gfx_scaling_mode(CSS::ImageRendering css_value)
  87. {
  88. switch (css_value) {
  89. case CSS::ImageRendering::Auto:
  90. case CSS::ImageRendering::HighQuality:
  91. case CSS::ImageRendering::Smooth:
  92. return Gfx::Painter::ScalingMode::BilinearBlend;
  93. case CSS::ImageRendering::CrispEdges:
  94. return Gfx::Painter::ScalingMode::NearestNeighbor;
  95. case CSS::ImageRendering::Pixelated:
  96. return Gfx::Painter::ScalingMode::SmoothPixels;
  97. }
  98. VERIFY_NOT_REACHED();
  99. }
  100. class StyleValue : public RefCounted<StyleValue> {
  101. public:
  102. virtual ~StyleValue() = default;
  103. enum class Type {
  104. Angle,
  105. Background,
  106. BackgroundRepeat,
  107. BackgroundSize,
  108. Border,
  109. BorderRadius,
  110. BorderRadiusShorthand,
  111. Calculated,
  112. Color,
  113. Content,
  114. Flex,
  115. FlexFlow,
  116. Font,
  117. Frequency,
  118. Identifier,
  119. Image,
  120. Inherit,
  121. Initial,
  122. Invalid,
  123. Length,
  124. LinearGradient,
  125. ListStyle,
  126. Numeric,
  127. Overflow,
  128. Percentage,
  129. Position,
  130. Rect,
  131. Resolution,
  132. Shadow,
  133. String,
  134. TextDecoration,
  135. Time,
  136. Transformation,
  137. Unresolved,
  138. Unset,
  139. ValueList
  140. };
  141. Type type() const { return m_type; }
  142. bool is_abstract_image() const { return AK::first_is_one_of(type(), Type::Image, Type::LinearGradient); }
  143. bool is_angle() const { return type() == Type::Angle; }
  144. bool is_background() const { return type() == Type::Background; }
  145. bool is_background_repeat() const { return type() == Type::BackgroundRepeat; }
  146. bool is_background_size() const { return type() == Type::BackgroundSize; }
  147. bool is_border() const { return type() == Type::Border; }
  148. bool is_border_radius() const { return type() == Type::BorderRadius; }
  149. bool is_border_radius_shorthand() const { return type() == Type::BorderRadiusShorthand; }
  150. bool is_calculated() const { return type() == Type::Calculated; }
  151. bool is_color() const { return type() == Type::Color; }
  152. bool is_content() const { return type() == Type::Content; }
  153. bool is_flex() const { return type() == Type::Flex; }
  154. bool is_flex_flow() const { return type() == Type::FlexFlow; }
  155. bool is_font() const { return type() == Type::Font; }
  156. bool is_frequency() const { return type() == Type::Frequency; }
  157. bool is_identifier() const { return type() == Type::Identifier; }
  158. bool is_image() const { return type() == Type::Image; }
  159. bool is_inherit() const { return type() == Type::Inherit; }
  160. bool is_initial() const { return type() == Type::Initial; }
  161. bool is_length() const { return type() == Type::Length; }
  162. bool is_linear_gradient() const { return type() == Type::LinearGradient; }
  163. bool is_list_style() const { return type() == Type::ListStyle; }
  164. bool is_numeric() const { return type() == Type::Numeric; }
  165. bool is_overflow() const { return type() == Type::Overflow; }
  166. bool is_percentage() const { return type() == Type::Percentage; }
  167. bool is_position() const { return type() == Type::Position; }
  168. bool is_rect() const { return type() == Type::Rect; }
  169. bool is_resolution() const { return type() == Type::Resolution; }
  170. bool is_shadow() const { return type() == Type::Shadow; }
  171. bool is_string() const { return type() == Type::String; }
  172. bool is_text_decoration() const { return type() == Type::TextDecoration; }
  173. bool is_time() const { return type() == Type::Time; }
  174. bool is_transformation() const { return type() == Type::Transformation; }
  175. bool is_unresolved() const { return type() == Type::Unresolved; }
  176. bool is_unset() const { return type() == Type::Unset; }
  177. bool is_value_list() const { return type() == Type::ValueList; }
  178. bool is_builtin() const { return is_inherit() || is_initial() || is_unset(); }
  179. AbstractImageStyleValue const& as_abstract_image() const;
  180. AngleStyleValue const& as_angle() const;
  181. BackgroundStyleValue const& as_background() const;
  182. BackgroundRepeatStyleValue const& as_background_repeat() const;
  183. BackgroundSizeStyleValue const& as_background_size() const;
  184. BorderRadiusStyleValue const& as_border_radius() const;
  185. BorderRadiusShorthandStyleValue const& as_border_radius_shorthand() const;
  186. BorderStyleValue const& as_border() const;
  187. CalculatedStyleValue const& as_calculated() const;
  188. ColorStyleValue const& as_color() const;
  189. ContentStyleValue const& as_content() const;
  190. FlexFlowStyleValue const& as_flex_flow() const;
  191. FlexStyleValue const& as_flex() const;
  192. FontStyleValue const& as_font() const;
  193. FrequencyStyleValue const& as_frequency() const;
  194. IdentifierStyleValue const& as_identifier() const;
  195. ImageStyleValue const& as_image() const;
  196. InheritStyleValue const& as_inherit() const;
  197. InitialStyleValue const& as_initial() const;
  198. LengthStyleValue const& as_length() const;
  199. LinearGradientStyleValue const& as_linear_gradient() const;
  200. ListStyleStyleValue const& as_list_style() const;
  201. NumericStyleValue const& as_numeric() const;
  202. OverflowStyleValue const& as_overflow() const;
  203. PercentageStyleValue const& as_percentage() const;
  204. PositionStyleValue const& as_position() const;
  205. RectStyleValue const& as_rect() const;
  206. ResolutionStyleValue const& as_resolution() const;
  207. ShadowStyleValue const& as_shadow() const;
  208. StringStyleValue const& as_string() const;
  209. TextDecorationStyleValue const& as_text_decoration() const;
  210. TimeStyleValue const& as_time() const;
  211. TransformationStyleValue const& as_transformation() const;
  212. UnresolvedStyleValue const& as_unresolved() const;
  213. UnsetStyleValue const& as_unset() const;
  214. StyleValueList const& as_value_list() const;
  215. AbstractImageStyleValue& as_abstract_image() { return const_cast<AbstractImageStyleValue&>(const_cast<StyleValue const&>(*this).as_abstract_image()); }
  216. AngleStyleValue& as_angle() { return const_cast<AngleStyleValue&>(const_cast<StyleValue const&>(*this).as_angle()); }
  217. BackgroundStyleValue& as_background() { return const_cast<BackgroundStyleValue&>(const_cast<StyleValue const&>(*this).as_background()); }
  218. BackgroundRepeatStyleValue& as_background_repeat() { return const_cast<BackgroundRepeatStyleValue&>(const_cast<StyleValue const&>(*this).as_background_repeat()); }
  219. BackgroundSizeStyleValue& as_background_size() { return const_cast<BackgroundSizeStyleValue&>(const_cast<StyleValue const&>(*this).as_background_size()); }
  220. BorderRadiusStyleValue& as_border_radius() { return const_cast<BorderRadiusStyleValue&>(const_cast<StyleValue const&>(*this).as_border_radius()); }
  221. BorderRadiusShorthandStyleValue& as_border_radius_shorthand() { return const_cast<BorderRadiusShorthandStyleValue&>(const_cast<StyleValue const&>(*this).as_border_radius_shorthand()); }
  222. BorderStyleValue& as_border() { return const_cast<BorderStyleValue&>(const_cast<StyleValue const&>(*this).as_border()); }
  223. CalculatedStyleValue& as_calculated() { return const_cast<CalculatedStyleValue&>(const_cast<StyleValue const&>(*this).as_calculated()); }
  224. ColorStyleValue& as_color() { return const_cast<ColorStyleValue&>(const_cast<StyleValue const&>(*this).as_color()); }
  225. ContentStyleValue& as_content() { return const_cast<ContentStyleValue&>(const_cast<StyleValue const&>(*this).as_content()); }
  226. FlexFlowStyleValue& as_flex_flow() { return const_cast<FlexFlowStyleValue&>(const_cast<StyleValue const&>(*this).as_flex_flow()); }
  227. FlexStyleValue& as_flex() { return const_cast<FlexStyleValue&>(const_cast<StyleValue const&>(*this).as_flex()); }
  228. FontStyleValue& as_font() { return const_cast<FontStyleValue&>(const_cast<StyleValue const&>(*this).as_font()); }
  229. FrequencyStyleValue& as_frequency() { return const_cast<FrequencyStyleValue&>(const_cast<StyleValue const&>(*this).as_frequency()); }
  230. IdentifierStyleValue& as_identifier() { return const_cast<IdentifierStyleValue&>(const_cast<StyleValue const&>(*this).as_identifier()); }
  231. ImageStyleValue& as_image() { return const_cast<ImageStyleValue&>(const_cast<StyleValue const&>(*this).as_image()); }
  232. InheritStyleValue& as_inherit() { return const_cast<InheritStyleValue&>(const_cast<StyleValue const&>(*this).as_inherit()); }
  233. InitialStyleValue& as_initial() { return const_cast<InitialStyleValue&>(const_cast<StyleValue const&>(*this).as_initial()); }
  234. LengthStyleValue& as_length() { return const_cast<LengthStyleValue&>(const_cast<StyleValue const&>(*this).as_length()); }
  235. LinearGradientStyleValue& as_linear_gradient() { return const_cast<LinearGradientStyleValue&>(const_cast<StyleValue const&>(*this).as_linear_gradient()); }
  236. ListStyleStyleValue& as_list_style() { return const_cast<ListStyleStyleValue&>(const_cast<StyleValue const&>(*this).as_list_style()); }
  237. NumericStyleValue& as_numeric() { return const_cast<NumericStyleValue&>(const_cast<StyleValue const&>(*this).as_numeric()); }
  238. OverflowStyleValue& as_overflow() { return const_cast<OverflowStyleValue&>(const_cast<StyleValue const&>(*this).as_overflow()); }
  239. PercentageStyleValue& as_percentage() { return const_cast<PercentageStyleValue&>(const_cast<StyleValue const&>(*this).as_percentage()); }
  240. PositionStyleValue& as_position() { return const_cast<PositionStyleValue&>(const_cast<StyleValue const&>(*this).as_position()); }
  241. RectStyleValue& as_rect() { return const_cast<RectStyleValue&>(const_cast<StyleValue const&>(*this).as_rect()); }
  242. ResolutionStyleValue& as_resolution() { return const_cast<ResolutionStyleValue&>(const_cast<StyleValue const&>(*this).as_resolution()); }
  243. ShadowStyleValue& as_shadow() { return const_cast<ShadowStyleValue&>(const_cast<StyleValue const&>(*this).as_shadow()); }
  244. StringStyleValue& as_string() { return const_cast<StringStyleValue&>(const_cast<StyleValue const&>(*this).as_string()); }
  245. TextDecorationStyleValue& as_text_decoration() { return const_cast<TextDecorationStyleValue&>(const_cast<StyleValue const&>(*this).as_text_decoration()); }
  246. TimeStyleValue& as_time() { return const_cast<TimeStyleValue&>(const_cast<StyleValue const&>(*this).as_time()); }
  247. TransformationStyleValue& as_transformation() { return const_cast<TransformationStyleValue&>(const_cast<StyleValue const&>(*this).as_transformation()); }
  248. UnresolvedStyleValue& as_unresolved() { return const_cast<UnresolvedStyleValue&>(const_cast<StyleValue const&>(*this).as_unresolved()); }
  249. UnsetStyleValue& as_unset() { return const_cast<UnsetStyleValue&>(const_cast<StyleValue const&>(*this).as_unset()); }
  250. StyleValueList& as_value_list() { return const_cast<StyleValueList&>(const_cast<StyleValue const&>(*this).as_value_list()); }
  251. virtual bool has_auto() const { return false; }
  252. virtual bool has_color() const { return false; }
  253. virtual bool has_identifier() const { return false; }
  254. virtual bool has_length() const { return false; }
  255. virtual bool has_rect() const { return false; }
  256. virtual bool has_number() const { return false; }
  257. virtual bool has_integer() const { return false; }
  258. virtual NonnullRefPtr<StyleValue> absolutized(Gfx::IntRect const& viewport_rect, Gfx::FontPixelMetrics const& font_metrics, float font_size, float root_font_size) const;
  259. virtual Color to_color(Layout::NodeWithStyle const&) const { return {}; }
  260. virtual EdgeRect to_rect() const { VERIFY_NOT_REACHED(); }
  261. virtual CSS::ValueID to_identifier() const { return ValueID::Invalid; }
  262. virtual Length to_length() const { VERIFY_NOT_REACHED(); }
  263. virtual float to_number() const { return 0; }
  264. virtual float to_integer() const { return 0; }
  265. virtual String to_string() const = 0;
  266. bool operator==(StyleValue const& other) const { return equals(other); }
  267. bool operator!=(StyleValue const& other) const { return !(*this == other); }
  268. virtual bool equals(StyleValue const& other) const = 0;
  269. protected:
  270. explicit StyleValue(Type);
  271. private:
  272. Type m_type { Type::Invalid };
  273. };
  274. class AngleStyleValue : public StyleValue {
  275. public:
  276. static NonnullRefPtr<AngleStyleValue> create(Angle angle)
  277. {
  278. return adopt_ref(*new AngleStyleValue(move(angle)));
  279. }
  280. virtual ~AngleStyleValue() override { }
  281. Angle const& angle() const { return m_angle; }
  282. virtual String to_string() const override { return m_angle.to_string(); }
  283. virtual bool equals(StyleValue const& other) const override
  284. {
  285. if (type() != other.type())
  286. return false;
  287. return m_angle == static_cast<AngleStyleValue const&>(other).m_angle;
  288. }
  289. private:
  290. explicit AngleStyleValue(Angle angle)
  291. : StyleValue(Type::Angle)
  292. , m_angle(move(angle))
  293. {
  294. }
  295. Angle m_angle;
  296. };
  297. class BackgroundStyleValue final : public StyleValue {
  298. public:
  299. static NonnullRefPtr<BackgroundStyleValue> create(
  300. NonnullRefPtr<StyleValue> color,
  301. NonnullRefPtr<StyleValue> image,
  302. NonnullRefPtr<StyleValue> position,
  303. NonnullRefPtr<StyleValue> size,
  304. NonnullRefPtr<StyleValue> repeat,
  305. NonnullRefPtr<StyleValue> attachment,
  306. NonnullRefPtr<StyleValue> origin,
  307. NonnullRefPtr<StyleValue> clip)
  308. {
  309. return adopt_ref(*new BackgroundStyleValue(color, image, position, size, repeat, attachment, origin, clip));
  310. }
  311. virtual ~BackgroundStyleValue() override = default;
  312. size_t layer_count() const { return m_layer_count; }
  313. NonnullRefPtr<StyleValue> attachment() const { return m_attachment; }
  314. NonnullRefPtr<StyleValue> clip() const { return m_clip; }
  315. NonnullRefPtr<StyleValue> color() const { return m_color; }
  316. NonnullRefPtr<StyleValue> image() const { return m_image; }
  317. NonnullRefPtr<StyleValue> origin() const { return m_origin; }
  318. NonnullRefPtr<StyleValue> position() const { return m_position; }
  319. NonnullRefPtr<StyleValue> repeat() const { return m_repeat; }
  320. NonnullRefPtr<StyleValue> size() const { return m_size; }
  321. virtual String to_string() const override;
  322. virtual bool equals(StyleValue const& other) const override;
  323. private:
  324. BackgroundStyleValue(
  325. NonnullRefPtr<StyleValue> color,
  326. NonnullRefPtr<StyleValue> image,
  327. NonnullRefPtr<StyleValue> position,
  328. NonnullRefPtr<StyleValue> size,
  329. NonnullRefPtr<StyleValue> repeat,
  330. NonnullRefPtr<StyleValue> attachment,
  331. NonnullRefPtr<StyleValue> origin,
  332. NonnullRefPtr<StyleValue> clip);
  333. NonnullRefPtr<StyleValue> m_color;
  334. NonnullRefPtr<StyleValue> m_image;
  335. NonnullRefPtr<StyleValue> m_position;
  336. NonnullRefPtr<StyleValue> m_size;
  337. NonnullRefPtr<StyleValue> m_repeat;
  338. NonnullRefPtr<StyleValue> m_attachment;
  339. NonnullRefPtr<StyleValue> m_origin;
  340. NonnullRefPtr<StyleValue> m_clip;
  341. size_t m_layer_count;
  342. };
  343. class BackgroundRepeatStyleValue final : public StyleValue {
  344. public:
  345. static NonnullRefPtr<BackgroundRepeatStyleValue> create(Repeat repeat_x, Repeat repeat_y)
  346. {
  347. return adopt_ref(*new BackgroundRepeatStyleValue(repeat_x, repeat_y));
  348. }
  349. virtual ~BackgroundRepeatStyleValue() override = default;
  350. Repeat repeat_x() const { return m_repeat_x; }
  351. Repeat repeat_y() const { return m_repeat_y; }
  352. virtual String to_string() const override;
  353. virtual bool equals(StyleValue const& other) const override;
  354. private:
  355. BackgroundRepeatStyleValue(Repeat repeat_x, Repeat repeat_y)
  356. : StyleValue(Type::BackgroundRepeat)
  357. , m_repeat_x(repeat_x)
  358. , m_repeat_y(repeat_y)
  359. {
  360. }
  361. Repeat m_repeat_x;
  362. Repeat m_repeat_y;
  363. };
  364. // NOTE: This is not used for identifier sizes, like `cover` and `contain`.
  365. class BackgroundSizeStyleValue final : public StyleValue {
  366. public:
  367. static NonnullRefPtr<BackgroundSizeStyleValue> create(LengthPercentage size_x, LengthPercentage size_y)
  368. {
  369. return adopt_ref(*new BackgroundSizeStyleValue(size_x, size_y));
  370. }
  371. virtual ~BackgroundSizeStyleValue() override = default;
  372. LengthPercentage size_x() const { return m_size_x; }
  373. LengthPercentage size_y() const { return m_size_y; }
  374. virtual String to_string() const override;
  375. virtual bool equals(StyleValue const& other) const override;
  376. private:
  377. BackgroundSizeStyleValue(LengthPercentage size_x, LengthPercentage size_y)
  378. : StyleValue(Type::BackgroundSize)
  379. , m_size_x(size_x)
  380. , m_size_y(size_y)
  381. {
  382. }
  383. LengthPercentage m_size_x;
  384. LengthPercentage m_size_y;
  385. };
  386. class BorderStyleValue final : public StyleValue {
  387. public:
  388. static NonnullRefPtr<BorderStyleValue> create(
  389. NonnullRefPtr<StyleValue> border_width,
  390. NonnullRefPtr<StyleValue> border_style,
  391. NonnullRefPtr<StyleValue> border_color)
  392. {
  393. return adopt_ref(*new BorderStyleValue(border_width, border_style, border_color));
  394. }
  395. virtual ~BorderStyleValue() override = default;
  396. NonnullRefPtr<StyleValue> border_width() const { return m_border_width; }
  397. NonnullRefPtr<StyleValue> border_style() const { return m_border_style; }
  398. NonnullRefPtr<StyleValue> border_color() const { return m_border_color; }
  399. virtual String to_string() const override;
  400. virtual bool equals(StyleValue const& other) const override;
  401. private:
  402. BorderStyleValue(
  403. NonnullRefPtr<StyleValue> border_width,
  404. NonnullRefPtr<StyleValue> border_style,
  405. NonnullRefPtr<StyleValue> border_color)
  406. : StyleValue(Type::Border)
  407. , m_border_width(border_width)
  408. , m_border_style(border_style)
  409. , m_border_color(border_color)
  410. {
  411. }
  412. NonnullRefPtr<StyleValue> m_border_width;
  413. NonnullRefPtr<StyleValue> m_border_style;
  414. NonnullRefPtr<StyleValue> m_border_color;
  415. };
  416. class BorderRadiusStyleValue final : public StyleValue {
  417. public:
  418. static NonnullRefPtr<BorderRadiusStyleValue> create(LengthPercentage const& horizontal_radius, LengthPercentage const& vertical_radius)
  419. {
  420. return adopt_ref(*new BorderRadiusStyleValue(horizontal_radius, vertical_radius));
  421. }
  422. virtual ~BorderRadiusStyleValue() override = default;
  423. LengthPercentage const& horizontal_radius() const { return m_horizontal_radius; }
  424. LengthPercentage const& vertical_radius() const { return m_vertical_radius; }
  425. bool is_elliptical() const { return m_is_elliptical; }
  426. virtual String to_string() const override;
  427. virtual bool equals(StyleValue const& other) const override;
  428. private:
  429. BorderRadiusStyleValue(LengthPercentage const& horizontal_radius, LengthPercentage const& vertical_radius)
  430. : StyleValue(Type::BorderRadius)
  431. , m_horizontal_radius(horizontal_radius)
  432. , m_vertical_radius(vertical_radius)
  433. {
  434. m_is_elliptical = (m_horizontal_radius != m_vertical_radius);
  435. }
  436. virtual NonnullRefPtr<StyleValue> absolutized(Gfx::IntRect const& viewport_rect, Gfx::FontPixelMetrics const& font_metrics, float font_size, float root_font_size) const override;
  437. bool m_is_elliptical;
  438. LengthPercentage m_horizontal_radius;
  439. LengthPercentage m_vertical_radius;
  440. };
  441. class BorderRadiusShorthandStyleValue final : public StyleValue {
  442. public:
  443. static NonnullRefPtr<BorderRadiusShorthandStyleValue> create(NonnullRefPtr<BorderRadiusStyleValue> top_left, NonnullRefPtr<BorderRadiusStyleValue> top_right, NonnullRefPtr<BorderRadiusStyleValue> bottom_right, NonnullRefPtr<BorderRadiusStyleValue> bottom_left)
  444. {
  445. return adopt_ref(*new BorderRadiusShorthandStyleValue(top_left, top_right, bottom_right, bottom_left));
  446. }
  447. virtual ~BorderRadiusShorthandStyleValue() override = default;
  448. NonnullRefPtr<BorderRadiusStyleValue> top_left() const { return m_top_left; }
  449. NonnullRefPtr<BorderRadiusStyleValue> top_right() const { return m_top_right; }
  450. NonnullRefPtr<BorderRadiusStyleValue> bottom_right() const { return m_bottom_right; }
  451. NonnullRefPtr<BorderRadiusStyleValue> bottom_left() const { return m_bottom_left; }
  452. virtual String to_string() const override;
  453. virtual bool equals(StyleValue const& other) const override;
  454. private:
  455. BorderRadiusShorthandStyleValue(NonnullRefPtr<BorderRadiusStyleValue> top_left, NonnullRefPtr<BorderRadiusStyleValue> top_right, NonnullRefPtr<BorderRadiusStyleValue> bottom_right, NonnullRefPtr<BorderRadiusStyleValue> bottom_left)
  456. : StyleValue(Type::BorderRadiusShorthand)
  457. , m_top_left(top_left)
  458. , m_top_right(top_right)
  459. , m_bottom_right(bottom_right)
  460. , m_bottom_left(bottom_left)
  461. {
  462. }
  463. NonnullRefPtr<BorderRadiusStyleValue> m_top_left;
  464. NonnullRefPtr<BorderRadiusStyleValue> m_top_right;
  465. NonnullRefPtr<BorderRadiusStyleValue> m_bottom_right;
  466. NonnullRefPtr<BorderRadiusStyleValue> m_bottom_left;
  467. };
  468. class CalculatedStyleValue : public StyleValue {
  469. public:
  470. enum class ResolvedType {
  471. Angle,
  472. Frequency,
  473. Integer,
  474. Length,
  475. Number,
  476. Percentage,
  477. Time,
  478. };
  479. enum class SumOperation {
  480. Add,
  481. Subtract,
  482. };
  483. enum class ProductOperation {
  484. Multiply,
  485. Divide,
  486. };
  487. using PercentageBasis = Variant<Empty, Angle, Frequency, Length, Time>;
  488. class CalculationResult {
  489. public:
  490. using Value = Variant<Number, Angle, Frequency, Length, Percentage, Time>;
  491. CalculationResult(Value value)
  492. : m_value(move(value))
  493. {
  494. }
  495. void add(CalculationResult const& other, Layout::Node const*, PercentageBasis const& percentage_basis);
  496. void subtract(CalculationResult const& other, Layout::Node const*, PercentageBasis const& percentage_basis);
  497. void multiply_by(CalculationResult const& other, Layout::Node const*);
  498. void divide_by(CalculationResult const& other, Layout::Node const*);
  499. Value const& value() const { return m_value; }
  500. private:
  501. void add_or_subtract_internal(SumOperation op, CalculationResult const& other, Layout::Node const*, PercentageBasis const& percentage_basis);
  502. Value m_value;
  503. };
  504. struct CalcSum;
  505. struct CalcSumPartWithOperator;
  506. struct CalcProduct;
  507. struct CalcProductPartWithOperator;
  508. struct CalcNumberSum;
  509. struct CalcNumberSumPartWithOperator;
  510. struct CalcNumberProduct;
  511. struct CalcNumberProductPartWithOperator;
  512. struct CalcNumberValue {
  513. Variant<Number, NonnullOwnPtr<CalcNumberSum>> value;
  514. String to_string() const;
  515. Optional<ResolvedType> resolved_type() const;
  516. CalculationResult resolve(Layout::Node const*, PercentageBasis const& percentage_basis) const;
  517. };
  518. struct CalcValue {
  519. Variant<Number, Angle, Frequency, Length, Percentage, Time, NonnullOwnPtr<CalcSum>> value;
  520. String to_string() const;
  521. Optional<ResolvedType> resolved_type() const;
  522. CalculationResult resolve(Layout::Node const*, PercentageBasis const& percentage_basis) const;
  523. };
  524. // This represents that: https://www.w3.org/TR/css-values-3/#calc-syntax
  525. struct CalcSum {
  526. CalcSum(NonnullOwnPtr<CalcProduct> first_calc_product, NonnullOwnPtrVector<CalcSumPartWithOperator> additional)
  527. : first_calc_product(move(first_calc_product))
  528. , zero_or_more_additional_calc_products(move(additional)) {};
  529. NonnullOwnPtr<CalcProduct> first_calc_product;
  530. NonnullOwnPtrVector<CalcSumPartWithOperator> zero_or_more_additional_calc_products;
  531. String to_string() const;
  532. Optional<ResolvedType> resolved_type() const;
  533. CalculationResult resolve(Layout::Node const*, PercentageBasis const& percentage_basis) const;
  534. };
  535. struct CalcNumberSum {
  536. CalcNumberSum(NonnullOwnPtr<CalcNumberProduct> first_calc_number_product, NonnullOwnPtrVector<CalcNumberSumPartWithOperator> additional)
  537. : first_calc_number_product(move(first_calc_number_product))
  538. , zero_or_more_additional_calc_number_products(move(additional)) {};
  539. NonnullOwnPtr<CalcNumberProduct> first_calc_number_product;
  540. NonnullOwnPtrVector<CalcNumberSumPartWithOperator> zero_or_more_additional_calc_number_products;
  541. String to_string() const;
  542. Optional<ResolvedType> resolved_type() const;
  543. CalculationResult resolve(Layout::Node const*, PercentageBasis const& percentage_basis) const;
  544. };
  545. struct CalcProduct {
  546. CalcValue first_calc_value;
  547. NonnullOwnPtrVector<CalcProductPartWithOperator> zero_or_more_additional_calc_values;
  548. String to_string() const;
  549. Optional<ResolvedType> resolved_type() const;
  550. CalculationResult resolve(Layout::Node const*, PercentageBasis const& percentage_basis) const;
  551. };
  552. struct CalcSumPartWithOperator {
  553. CalcSumPartWithOperator(SumOperation op, NonnullOwnPtr<CalcProduct> calc_product)
  554. : op(op)
  555. , value(move(calc_product)) {};
  556. SumOperation op;
  557. NonnullOwnPtr<CalcProduct> value;
  558. String to_string() const;
  559. Optional<ResolvedType> resolved_type() const;
  560. CalculationResult resolve(Layout::Node const*, PercentageBasis const& percentage_basis) const;
  561. };
  562. struct CalcProductPartWithOperator {
  563. ProductOperation op;
  564. Variant<CalcValue, CalcNumberValue> value;
  565. String to_string() const;
  566. Optional<ResolvedType> resolved_type() const;
  567. CalculationResult resolve(Layout::Node const*, PercentageBasis const& percentage_basis) const;
  568. };
  569. struct CalcNumberProduct {
  570. CalcNumberValue first_calc_number_value;
  571. NonnullOwnPtrVector<CalcNumberProductPartWithOperator> zero_or_more_additional_calc_number_values;
  572. String to_string() const;
  573. Optional<ResolvedType> resolved_type() const;
  574. CalculationResult resolve(Layout::Node const*, PercentageBasis const& percentage_basis) const;
  575. };
  576. struct CalcNumberProductPartWithOperator {
  577. ProductOperation op;
  578. CalcNumberValue value;
  579. String to_string() const;
  580. Optional<ResolvedType> resolved_type() const;
  581. CalculationResult resolve(Layout::Node const*, PercentageBasis const& percentage_basis) const;
  582. };
  583. struct CalcNumberSumPartWithOperator {
  584. CalcNumberSumPartWithOperator(SumOperation op, NonnullOwnPtr<CalcNumberProduct> calc_number_product)
  585. : op(op)
  586. , value(move(calc_number_product)) {};
  587. SumOperation op;
  588. NonnullOwnPtr<CalcNumberProduct> value;
  589. String to_string() const;
  590. Optional<ResolvedType> resolved_type() const;
  591. CalculationResult resolve(Layout::Node const*, PercentageBasis const& percentage_basis) const;
  592. };
  593. static NonnullRefPtr<CalculatedStyleValue> create(NonnullOwnPtr<CalcSum> calc_sum, ResolvedType resolved_type)
  594. {
  595. return adopt_ref(*new CalculatedStyleValue(move(calc_sum), resolved_type));
  596. }
  597. String to_string() const override;
  598. virtual bool equals(StyleValue const& other) const override;
  599. ResolvedType resolved_type() const { return m_resolved_type; }
  600. NonnullOwnPtr<CalcSum> const& expression() const { return m_expression; }
  601. bool resolves_to_angle() const { return m_resolved_type == ResolvedType::Angle; }
  602. Optional<Angle> resolve_angle() const;
  603. Optional<Angle> resolve_angle_percentage(Angle const& percentage_basis) const;
  604. bool resolves_to_frequency() const { return m_resolved_type == ResolvedType::Frequency; }
  605. Optional<Frequency> resolve_frequency() const;
  606. Optional<Frequency> resolve_frequency_percentage(Frequency const& percentage_basis) const;
  607. bool resolves_to_length() const { return m_resolved_type == ResolvedType::Length; }
  608. Optional<Length> resolve_length(Layout::Node const& layout_node) const;
  609. Optional<Length> resolve_length_percentage(Layout::Node const&, Length const& percentage_basis) const;
  610. bool resolves_to_percentage() const { return m_resolved_type == ResolvedType::Percentage; }
  611. Optional<Percentage> resolve_percentage() const;
  612. bool resolves_to_time() const { return m_resolved_type == ResolvedType::Time; }
  613. Optional<Time> resolve_time() const;
  614. Optional<Time> resolve_time_percentage(Time const& percentage_basis) const;
  615. bool resolves_to_integer() const { return m_resolved_type == ResolvedType::Integer; }
  616. bool resolves_to_number() const { return resolves_to_integer() || m_resolved_type == ResolvedType::Number; }
  617. Optional<float> resolve_number();
  618. Optional<i64> resolve_integer();
  619. private:
  620. explicit CalculatedStyleValue(NonnullOwnPtr<CalcSum> calc_sum, ResolvedType resolved_type)
  621. : StyleValue(Type::Calculated)
  622. , m_resolved_type(resolved_type)
  623. , m_expression(move(calc_sum))
  624. {
  625. }
  626. ResolvedType m_resolved_type;
  627. NonnullOwnPtr<CalcSum> m_expression;
  628. };
  629. class ColorStyleValue : public StyleValue {
  630. public:
  631. static NonnullRefPtr<ColorStyleValue> create(Color color);
  632. virtual ~ColorStyleValue() override = default;
  633. Color color() const { return m_color; }
  634. virtual String to_string() const override;
  635. virtual bool has_color() const override { return true; }
  636. virtual Color to_color(Layout::NodeWithStyle const&) const override { return m_color; }
  637. virtual bool equals(StyleValue const& other) const override;
  638. private:
  639. explicit ColorStyleValue(Color color)
  640. : StyleValue(Type::Color)
  641. , m_color(color)
  642. {
  643. }
  644. Color m_color;
  645. };
  646. class ContentStyleValue final : public StyleValue {
  647. public:
  648. static NonnullRefPtr<ContentStyleValue> create(NonnullRefPtr<StyleValueList> content, RefPtr<StyleValueList> alt_text)
  649. {
  650. return adopt_ref(*new ContentStyleValue(move(content), move(alt_text)));
  651. }
  652. StyleValueList const& content() const { return *m_content; }
  653. bool has_alt_text() const { return !m_alt_text.is_null(); }
  654. StyleValueList const* alt_text() const { return m_alt_text; }
  655. virtual String to_string() const override;
  656. virtual bool equals(StyleValue const& other) const override;
  657. private:
  658. ContentStyleValue(NonnullRefPtr<StyleValueList> content, RefPtr<StyleValueList> alt_text)
  659. : StyleValue(Type::Content)
  660. , m_content(move(content))
  661. , m_alt_text(move(alt_text))
  662. {
  663. }
  664. NonnullRefPtr<StyleValueList> m_content;
  665. RefPtr<StyleValueList> m_alt_text;
  666. };
  667. class FlexStyleValue final : public StyleValue {
  668. public:
  669. static NonnullRefPtr<FlexStyleValue> create(
  670. NonnullRefPtr<StyleValue> grow,
  671. NonnullRefPtr<StyleValue> shrink,
  672. NonnullRefPtr<StyleValue> basis)
  673. {
  674. return adopt_ref(*new FlexStyleValue(grow, shrink, basis));
  675. }
  676. virtual ~FlexStyleValue() override = default;
  677. NonnullRefPtr<StyleValue> grow() const { return m_grow; }
  678. NonnullRefPtr<StyleValue> shrink() const { return m_shrink; }
  679. NonnullRefPtr<StyleValue> basis() const { return m_basis; }
  680. virtual String to_string() const override;
  681. virtual bool equals(StyleValue const& other) const override;
  682. private:
  683. FlexStyleValue(
  684. NonnullRefPtr<StyleValue> grow,
  685. NonnullRefPtr<StyleValue> shrink,
  686. NonnullRefPtr<StyleValue> basis)
  687. : StyleValue(Type::Flex)
  688. , m_grow(grow)
  689. , m_shrink(shrink)
  690. , m_basis(basis)
  691. {
  692. }
  693. NonnullRefPtr<StyleValue> m_grow;
  694. NonnullRefPtr<StyleValue> m_shrink;
  695. NonnullRefPtr<StyleValue> m_basis;
  696. };
  697. class FlexFlowStyleValue final : public StyleValue {
  698. public:
  699. static NonnullRefPtr<FlexFlowStyleValue> create(NonnullRefPtr<StyleValue> flex_direction, NonnullRefPtr<StyleValue> flex_wrap)
  700. {
  701. return adopt_ref(*new FlexFlowStyleValue(flex_direction, flex_wrap));
  702. }
  703. virtual ~FlexFlowStyleValue() override = default;
  704. NonnullRefPtr<StyleValue> flex_direction() const { return m_flex_direction; }
  705. NonnullRefPtr<StyleValue> flex_wrap() const { return m_flex_wrap; }
  706. virtual String to_string() const override;
  707. virtual bool equals(StyleValue const& other) const override;
  708. private:
  709. FlexFlowStyleValue(NonnullRefPtr<StyleValue> flex_direction, NonnullRefPtr<StyleValue> flex_wrap)
  710. : StyleValue(Type::FlexFlow)
  711. , m_flex_direction(flex_direction)
  712. , m_flex_wrap(flex_wrap)
  713. {
  714. }
  715. NonnullRefPtr<StyleValue> m_flex_direction;
  716. NonnullRefPtr<StyleValue> m_flex_wrap;
  717. };
  718. class FontStyleValue final : public StyleValue {
  719. public:
  720. static NonnullRefPtr<FontStyleValue> create(NonnullRefPtr<StyleValue> font_style, NonnullRefPtr<StyleValue> font_weight, NonnullRefPtr<StyleValue> font_size, NonnullRefPtr<StyleValue> line_height, NonnullRefPtr<StyleValue> font_families) { return adopt_ref(*new FontStyleValue(font_style, font_weight, font_size, line_height, font_families)); }
  721. virtual ~FontStyleValue() override = default;
  722. NonnullRefPtr<StyleValue> font_style() const { return m_font_style; }
  723. NonnullRefPtr<StyleValue> font_weight() const { return m_font_weight; }
  724. NonnullRefPtr<StyleValue> font_size() const { return m_font_size; }
  725. NonnullRefPtr<StyleValue> line_height() const { return m_line_height; }
  726. NonnullRefPtr<StyleValue> font_families() const { return m_font_families; }
  727. virtual String to_string() const override;
  728. virtual bool equals(StyleValue const& other) const override;
  729. private:
  730. FontStyleValue(NonnullRefPtr<StyleValue> font_style, NonnullRefPtr<StyleValue> font_weight, NonnullRefPtr<StyleValue> font_size, NonnullRefPtr<StyleValue> line_height, NonnullRefPtr<StyleValue> font_families)
  731. : StyleValue(Type::Font)
  732. , m_font_style(font_style)
  733. , m_font_weight(font_weight)
  734. , m_font_size(font_size)
  735. , m_line_height(line_height)
  736. , m_font_families(font_families)
  737. {
  738. }
  739. NonnullRefPtr<StyleValue> m_font_style;
  740. NonnullRefPtr<StyleValue> m_font_weight;
  741. NonnullRefPtr<StyleValue> m_font_size;
  742. NonnullRefPtr<StyleValue> m_line_height;
  743. NonnullRefPtr<StyleValue> m_font_families;
  744. // FIXME: Implement font-stretch and font-variant.
  745. };
  746. class FrequencyStyleValue : public StyleValue {
  747. public:
  748. static NonnullRefPtr<FrequencyStyleValue> create(Frequency frequency)
  749. {
  750. return adopt_ref(*new FrequencyStyleValue(move(frequency)));
  751. }
  752. virtual ~FrequencyStyleValue() override { }
  753. Frequency const& frequency() const { return m_frequency; }
  754. virtual String to_string() const override { return m_frequency.to_string(); }
  755. virtual bool equals(StyleValue const& other) const override;
  756. private:
  757. explicit FrequencyStyleValue(Frequency frequency)
  758. : StyleValue(Type::Frequency)
  759. , m_frequency(move(frequency))
  760. {
  761. }
  762. Frequency m_frequency;
  763. };
  764. class IdentifierStyleValue final : public StyleValue {
  765. public:
  766. static NonnullRefPtr<IdentifierStyleValue> create(CSS::ValueID id)
  767. {
  768. return adopt_ref(*new IdentifierStyleValue(id));
  769. }
  770. virtual ~IdentifierStyleValue() override = default;
  771. CSS::ValueID id() const { return m_id; }
  772. virtual bool has_auto() const override { return m_id == ValueID::Auto; }
  773. virtual bool has_identifier() const override { return true; }
  774. virtual CSS::ValueID to_identifier() const override { return m_id; }
  775. virtual bool has_color() const override;
  776. virtual Color to_color(Layout::NodeWithStyle const& node) const override;
  777. virtual String to_string() const override;
  778. virtual bool equals(StyleValue const& other) const override;
  779. private:
  780. explicit IdentifierStyleValue(CSS::ValueID id)
  781. : StyleValue(Type::Identifier)
  782. , m_id(id)
  783. {
  784. }
  785. CSS::ValueID m_id { CSS::ValueID::Invalid };
  786. };
  787. class AbstractImageStyleValue : public StyleValue {
  788. public:
  789. using StyleValue::StyleValue;
  790. virtual Optional<int> natural_width() const { return {}; }
  791. virtual Optional<int> natural_height() const { return {}; }
  792. virtual void load_any_resources(DOM::Document&) {};
  793. virtual void resolve_for_size(Layout::Node const&, Gfx::FloatSize const&) const {};
  794. virtual bool is_paintable() const = 0;
  795. virtual void paint(PaintContext& context, Gfx::IntRect const& dest_rect) const = 0;
  796. };
  797. class ImageStyleValue final
  798. : public AbstractImageStyleValue
  799. , public ImageResourceClient {
  800. public:
  801. static NonnullRefPtr<ImageStyleValue> create(AK::URL const& url) { return adopt_ref(*new ImageStyleValue(url)); }
  802. virtual ~ImageStyleValue() override = default;
  803. virtual String to_string() const override;
  804. virtual bool equals(StyleValue const& other) const override;
  805. virtual void load_any_resources(DOM::Document&) override;
  806. Gfx::Bitmap const* bitmap() const { return m_bitmap; }
  807. Optional<int> natural_width() const override;
  808. Optional<int> natural_height() const override;
  809. bool is_paintable() const override { return !m_bitmap.is_null(); }
  810. void paint(PaintContext& context, Gfx::IntRect const& dest_rect) const override;
  811. private:
  812. ImageStyleValue(AK::URL const&);
  813. // ^ResourceClient
  814. virtual void resource_did_load() override;
  815. AK::URL m_url;
  816. WeakPtr<DOM::Document> m_document;
  817. RefPtr<Gfx::Bitmap> m_bitmap;
  818. };
  819. class LinearGradientStyleValue final : public AbstractImageStyleValue {
  820. public:
  821. using GradientDirection = Variant<Angle, SideOrCorner>;
  822. enum class GradientType {
  823. Standard,
  824. WebKit
  825. };
  826. static NonnullRefPtr<LinearGradientStyleValue> create(GradientDirection direction, Vector<ColorStopListElement> color_stop_list, GradientType type)
  827. {
  828. VERIFY(color_stop_list.size() >= 2);
  829. return adopt_ref(*new LinearGradientStyleValue(direction, move(color_stop_list), type));
  830. }
  831. virtual String to_string() const override;
  832. virtual ~LinearGradientStyleValue() override = default;
  833. virtual bool equals(StyleValue const& other) const override;
  834. Vector<ColorStopListElement> const& color_stop_list() const
  835. {
  836. return m_color_stop_list;
  837. }
  838. float angle_degrees(Gfx::FloatSize const& gradient_rect) const;
  839. void resolve_for_size(Layout::Node const&, Gfx::FloatSize const&) const override;
  840. bool is_paintable() const override { return true; }
  841. void paint(PaintContext& context, Gfx::IntRect const& dest_rect) const override;
  842. private:
  843. LinearGradientStyleValue(GradientDirection direction, Vector<ColorStopListElement> color_stop_list, GradientType type)
  844. : AbstractImageStyleValue(Type::LinearGradient)
  845. , m_direction(direction)
  846. , m_color_stop_list(move(color_stop_list))
  847. , m_gradient_type(type)
  848. {
  849. }
  850. GradientDirection m_direction;
  851. Vector<ColorStopListElement> m_color_stop_list;
  852. GradientType m_gradient_type;
  853. mutable Optional<Painting::LinearGradientData> m_resolved_data;
  854. };
  855. class InheritStyleValue final : public StyleValue {
  856. public:
  857. static NonnullRefPtr<InheritStyleValue> the()
  858. {
  859. static NonnullRefPtr<InheritStyleValue> instance = adopt_ref(*new InheritStyleValue);
  860. return instance;
  861. }
  862. virtual ~InheritStyleValue() override = default;
  863. String to_string() const override { return "inherit"; }
  864. virtual bool equals(StyleValue const& other) const override;
  865. private:
  866. InheritStyleValue()
  867. : StyleValue(Type::Inherit)
  868. {
  869. }
  870. };
  871. class InitialStyleValue final : public StyleValue {
  872. public:
  873. static NonnullRefPtr<InitialStyleValue> the()
  874. {
  875. static NonnullRefPtr<InitialStyleValue> instance = adopt_ref(*new InitialStyleValue);
  876. return instance;
  877. }
  878. virtual ~InitialStyleValue() override = default;
  879. String to_string() const override { return "initial"; }
  880. virtual bool equals(StyleValue const& other) const override;
  881. private:
  882. InitialStyleValue()
  883. : StyleValue(Type::Initial)
  884. {
  885. }
  886. };
  887. class LengthStyleValue : public StyleValue {
  888. public:
  889. static NonnullRefPtr<LengthStyleValue> create(Length const&);
  890. virtual ~LengthStyleValue() override = default;
  891. Length const& length() const { return m_length; }
  892. virtual bool has_auto() const override { return m_length.is_auto(); }
  893. virtual bool has_length() const override { return true; }
  894. virtual bool has_identifier() const override { return has_auto(); }
  895. virtual String to_string() const override { return m_length.to_string(); }
  896. virtual Length to_length() const override { return m_length; }
  897. virtual ValueID to_identifier() const override { return has_auto() ? ValueID::Auto : ValueID::Invalid; }
  898. virtual NonnullRefPtr<StyleValue> absolutized(Gfx::IntRect const& viewport_rect, Gfx::FontPixelMetrics const& font_metrics, float font_size, float root_font_size) const override;
  899. virtual bool equals(StyleValue const& other) const override;
  900. private:
  901. explicit LengthStyleValue(Length const& length)
  902. : StyleValue(Type::Length)
  903. , m_length(length)
  904. {
  905. }
  906. Length m_length;
  907. };
  908. class ListStyleStyleValue final : public StyleValue {
  909. public:
  910. static NonnullRefPtr<ListStyleStyleValue> create(
  911. NonnullRefPtr<StyleValue> position,
  912. NonnullRefPtr<StyleValue> image,
  913. NonnullRefPtr<StyleValue> style_type)
  914. {
  915. return adopt_ref(*new ListStyleStyleValue(position, image, style_type));
  916. }
  917. virtual ~ListStyleStyleValue() override = default;
  918. NonnullRefPtr<StyleValue> position() const { return m_position; }
  919. NonnullRefPtr<StyleValue> image() const { return m_image; }
  920. NonnullRefPtr<StyleValue> style_type() const { return m_style_type; }
  921. virtual String to_string() const override;
  922. virtual bool equals(StyleValue const& other) const override;
  923. private:
  924. ListStyleStyleValue(
  925. NonnullRefPtr<StyleValue> position,
  926. NonnullRefPtr<StyleValue> image,
  927. NonnullRefPtr<StyleValue> style_type)
  928. : StyleValue(Type::ListStyle)
  929. , m_position(position)
  930. , m_image(image)
  931. , m_style_type(style_type)
  932. {
  933. }
  934. NonnullRefPtr<StyleValue> m_position;
  935. NonnullRefPtr<StyleValue> m_image;
  936. NonnullRefPtr<StyleValue> m_style_type;
  937. };
  938. class NumericStyleValue : public StyleValue {
  939. public:
  940. static NonnullRefPtr<NumericStyleValue> create_float(float value)
  941. {
  942. return adopt_ref(*new NumericStyleValue(value));
  943. }
  944. static NonnullRefPtr<NumericStyleValue> create_integer(i64 value)
  945. {
  946. return adopt_ref(*new NumericStyleValue(value));
  947. }
  948. virtual bool has_length() const override { return to_number() == 0; }
  949. virtual Length to_length() const override { return Length(0, Length::Type::Px); }
  950. virtual bool has_number() const override { return true; }
  951. virtual float to_number() const override
  952. {
  953. return m_value.visit(
  954. [](float value) { return value; },
  955. [](i64 value) { return (float)value; });
  956. }
  957. virtual bool has_integer() const override { return m_value.has<i64>(); }
  958. virtual float to_integer() const override { return m_value.get<i64>(); }
  959. virtual String to_string() const override;
  960. virtual bool equals(StyleValue const& other) const override;
  961. private:
  962. explicit NumericStyleValue(Variant<float, i64> value)
  963. : StyleValue(Type::Numeric)
  964. , m_value(move(value))
  965. {
  966. }
  967. Variant<float, i64> m_value { (i64)0 };
  968. };
  969. class OverflowStyleValue final : public StyleValue {
  970. public:
  971. static NonnullRefPtr<OverflowStyleValue> create(NonnullRefPtr<StyleValue> overflow_x, NonnullRefPtr<StyleValue> overflow_y)
  972. {
  973. return adopt_ref(*new OverflowStyleValue(overflow_x, overflow_y));
  974. }
  975. virtual ~OverflowStyleValue() override = default;
  976. NonnullRefPtr<StyleValue> overflow_x() const { return m_overflow_x; }
  977. NonnullRefPtr<StyleValue> overflow_y() const { return m_overflow_y; }
  978. virtual String to_string() const override;
  979. virtual bool equals(StyleValue const& other) const override;
  980. private:
  981. OverflowStyleValue(NonnullRefPtr<StyleValue> overflow_x, NonnullRefPtr<StyleValue> overflow_y)
  982. : StyleValue(Type::Overflow)
  983. , m_overflow_x(overflow_x)
  984. , m_overflow_y(overflow_y)
  985. {
  986. }
  987. NonnullRefPtr<StyleValue> m_overflow_x;
  988. NonnullRefPtr<StyleValue> m_overflow_y;
  989. };
  990. class PercentageStyleValue final : public StyleValue {
  991. public:
  992. static NonnullRefPtr<PercentageStyleValue> create(Percentage percentage)
  993. {
  994. return adopt_ref(*new PercentageStyleValue(move(percentage)));
  995. }
  996. virtual ~PercentageStyleValue() override = default;
  997. Percentage const& percentage() const { return m_percentage; }
  998. Percentage& percentage() { return m_percentage; }
  999. virtual String to_string() const override;
  1000. virtual bool equals(StyleValue const& other) const override;
  1001. private:
  1002. PercentageStyleValue(Percentage&& percentage)
  1003. : StyleValue(Type::Percentage)
  1004. , m_percentage(percentage)
  1005. {
  1006. }
  1007. Percentage m_percentage;
  1008. };
  1009. class PositionStyleValue final : public StyleValue {
  1010. public:
  1011. static NonnullRefPtr<PositionStyleValue> create(PositionEdge edge_x, LengthPercentage const& offset_x, PositionEdge edge_y, LengthPercentage const& offset_y)
  1012. {
  1013. return adopt_ref(*new PositionStyleValue(edge_x, offset_x, edge_y, offset_y));
  1014. }
  1015. virtual ~PositionStyleValue() override = default;
  1016. PositionEdge edge_x() const { return m_edge_x; }
  1017. LengthPercentage const& offset_x() const { return m_offset_x; }
  1018. PositionEdge edge_y() const { return m_edge_y; }
  1019. LengthPercentage const& offset_y() const { return m_offset_y; }
  1020. virtual String to_string() const override;
  1021. virtual bool equals(StyleValue const& other) const override;
  1022. private:
  1023. PositionStyleValue(PositionEdge edge_x, LengthPercentage const& offset_x, PositionEdge edge_y, LengthPercentage const& offset_y)
  1024. : StyleValue(Type::Position)
  1025. , m_edge_x(edge_x)
  1026. , m_offset_x(offset_x)
  1027. , m_edge_y(edge_y)
  1028. , m_offset_y(offset_y)
  1029. {
  1030. }
  1031. PositionEdge m_edge_x;
  1032. LengthPercentage m_offset_x;
  1033. PositionEdge m_edge_y;
  1034. LengthPercentage m_offset_y;
  1035. };
  1036. class ResolutionStyleValue : public StyleValue {
  1037. public:
  1038. static NonnullRefPtr<ResolutionStyleValue> create(Resolution resolution)
  1039. {
  1040. return adopt_ref(*new ResolutionStyleValue(move(resolution)));
  1041. }
  1042. virtual ~ResolutionStyleValue() override { }
  1043. Resolution const& resolution() const { return m_resolution; }
  1044. virtual String to_string() const override { return m_resolution.to_string(); }
  1045. virtual bool equals(StyleValue const& other) const override;
  1046. private:
  1047. explicit ResolutionStyleValue(Resolution resolution)
  1048. : StyleValue(Type::Resolution)
  1049. , m_resolution(move(resolution))
  1050. {
  1051. }
  1052. Resolution m_resolution;
  1053. };
  1054. class ShadowStyleValue final : public StyleValue {
  1055. public:
  1056. static NonnullRefPtr<ShadowStyleValue>
  1057. create(Color const& color, Length const& offset_x, Length const& offset_y, Length const& blur_radius, Length const& spread_distance, ShadowPlacement placement)
  1058. {
  1059. return adopt_ref(*new ShadowStyleValue(color, offset_x, offset_y, blur_radius, spread_distance, placement));
  1060. }
  1061. virtual ~ShadowStyleValue() override = default;
  1062. Color const& color() const { return m_color; }
  1063. Length const& offset_x() const { return m_offset_x; }
  1064. Length const& offset_y() const { return m_offset_y; }
  1065. Length const& blur_radius() const { return m_blur_radius; }
  1066. Length const& spread_distance() const { return m_spread_distance; }
  1067. ShadowPlacement placement() const { return m_placement; }
  1068. virtual String to_string() const override;
  1069. virtual bool equals(StyleValue const& other) const override;
  1070. private:
  1071. explicit ShadowStyleValue(Color const& color, Length const& offset_x, Length const& offset_y, Length const& blur_radius, Length const& spread_distance, ShadowPlacement placement)
  1072. : StyleValue(Type::Shadow)
  1073. , m_color(color)
  1074. , m_offset_x(offset_x)
  1075. , m_offset_y(offset_y)
  1076. , m_blur_radius(blur_radius)
  1077. , m_spread_distance(spread_distance)
  1078. , m_placement(placement)
  1079. {
  1080. }
  1081. virtual NonnullRefPtr<StyleValue> absolutized(Gfx::IntRect const& viewport_rect, Gfx::FontPixelMetrics const& font_metrics, float font_size, float root_font_size) const override;
  1082. Color m_color;
  1083. Length m_offset_x;
  1084. Length m_offset_y;
  1085. Length m_blur_radius;
  1086. Length m_spread_distance;
  1087. ShadowPlacement m_placement;
  1088. };
  1089. class StringStyleValue : public StyleValue {
  1090. public:
  1091. static NonnullRefPtr<StringStyleValue> create(String const& string)
  1092. {
  1093. return adopt_ref(*new StringStyleValue(string));
  1094. }
  1095. virtual ~StringStyleValue() override = default;
  1096. String to_string() const override { return m_string; }
  1097. virtual bool equals(StyleValue const& other) const override;
  1098. private:
  1099. explicit StringStyleValue(String const& string)
  1100. : StyleValue(Type::String)
  1101. , m_string(string)
  1102. {
  1103. }
  1104. String m_string;
  1105. };
  1106. class TextDecorationStyleValue final : public StyleValue {
  1107. public:
  1108. static NonnullRefPtr<TextDecorationStyleValue> create(
  1109. NonnullRefPtr<StyleValue> line,
  1110. NonnullRefPtr<StyleValue> thickness,
  1111. NonnullRefPtr<StyleValue> style,
  1112. NonnullRefPtr<StyleValue> color)
  1113. {
  1114. return adopt_ref(*new TextDecorationStyleValue(line, thickness, style, color));
  1115. }
  1116. virtual ~TextDecorationStyleValue() override = default;
  1117. NonnullRefPtr<StyleValue> line() const { return m_line; }
  1118. NonnullRefPtr<StyleValue> thickness() const { return m_thickness; }
  1119. NonnullRefPtr<StyleValue> style() const { return m_style; }
  1120. NonnullRefPtr<StyleValue> color() const { return m_color; }
  1121. virtual String to_string() const override;
  1122. virtual bool equals(StyleValue const& other) const override;
  1123. private:
  1124. TextDecorationStyleValue(
  1125. NonnullRefPtr<StyleValue> line,
  1126. NonnullRefPtr<StyleValue> thickness,
  1127. NonnullRefPtr<StyleValue> style,
  1128. NonnullRefPtr<StyleValue> color)
  1129. : StyleValue(Type::TextDecoration)
  1130. , m_line(line)
  1131. , m_thickness(thickness)
  1132. , m_style(style)
  1133. , m_color(color)
  1134. {
  1135. }
  1136. NonnullRefPtr<StyleValue> m_line;
  1137. NonnullRefPtr<StyleValue> m_thickness;
  1138. NonnullRefPtr<StyleValue> m_style;
  1139. NonnullRefPtr<StyleValue> m_color;
  1140. };
  1141. class TimeStyleValue : public StyleValue {
  1142. public:
  1143. static NonnullRefPtr<TimeStyleValue> create(Time time)
  1144. {
  1145. return adopt_ref(*new TimeStyleValue(move(time)));
  1146. }
  1147. virtual ~TimeStyleValue() override { }
  1148. Time const& time() const { return m_time; }
  1149. virtual String to_string() const override { return m_time.to_string(); }
  1150. virtual bool equals(StyleValue const& other) const override;
  1151. private:
  1152. explicit TimeStyleValue(Time time)
  1153. : StyleValue(Type::Time)
  1154. , m_time(move(time))
  1155. {
  1156. }
  1157. Time m_time;
  1158. };
  1159. class TransformationStyleValue final : public StyleValue {
  1160. public:
  1161. static NonnullRefPtr<TransformationStyleValue> create(CSS::TransformFunction transform_function, NonnullRefPtrVector<StyleValue>&& values)
  1162. {
  1163. return adopt_ref(*new TransformationStyleValue(transform_function, move(values)));
  1164. }
  1165. virtual ~TransformationStyleValue() override = default;
  1166. CSS::TransformFunction transform_function() const { return m_transform_function; }
  1167. NonnullRefPtrVector<StyleValue> values() const { return m_values; }
  1168. virtual String to_string() const override;
  1169. virtual bool equals(StyleValue const& other) const override;
  1170. private:
  1171. TransformationStyleValue(CSS::TransformFunction transform_function, NonnullRefPtrVector<StyleValue>&& values)
  1172. : StyleValue(Type::Transformation)
  1173. , m_transform_function(transform_function)
  1174. , m_values(move(values))
  1175. {
  1176. }
  1177. CSS::TransformFunction m_transform_function;
  1178. NonnullRefPtrVector<StyleValue> m_values;
  1179. };
  1180. class UnresolvedStyleValue final : public StyleValue {
  1181. public:
  1182. static NonnullRefPtr<UnresolvedStyleValue> create(Vector<Parser::ComponentValue>&& values, bool contains_var_or_attr)
  1183. {
  1184. return adopt_ref(*new UnresolvedStyleValue(move(values), contains_var_or_attr));
  1185. }
  1186. virtual ~UnresolvedStyleValue() override = default;
  1187. virtual String to_string() const override;
  1188. virtual bool equals(StyleValue const& other) const override;
  1189. Vector<Parser::ComponentValue> const& values() const { return m_values; }
  1190. bool contains_var_or_attr() const { return m_contains_var_or_attr; }
  1191. private:
  1192. UnresolvedStyleValue(Vector<Parser::ComponentValue>&& values, bool contains_var_or_attr)
  1193. : StyleValue(Type::Unresolved)
  1194. , m_values(move(values))
  1195. , m_contains_var_or_attr(contains_var_or_attr)
  1196. {
  1197. }
  1198. Vector<Parser::ComponentValue> m_values;
  1199. bool m_contains_var_or_attr { false };
  1200. };
  1201. class UnsetStyleValue final : public StyleValue {
  1202. public:
  1203. static NonnullRefPtr<UnsetStyleValue> the()
  1204. {
  1205. static NonnullRefPtr<UnsetStyleValue> instance = adopt_ref(*new UnsetStyleValue);
  1206. return instance;
  1207. }
  1208. virtual ~UnsetStyleValue() override = default;
  1209. String to_string() const override { return "unset"; }
  1210. virtual bool equals(StyleValue const& other) const override;
  1211. private:
  1212. UnsetStyleValue()
  1213. : StyleValue(Type::Unset)
  1214. {
  1215. }
  1216. };
  1217. class StyleValueList final : public StyleValue {
  1218. public:
  1219. enum class Separator {
  1220. Space,
  1221. Comma,
  1222. };
  1223. static NonnullRefPtr<StyleValueList> create(NonnullRefPtrVector<StyleValue>&& values, Separator separator) { return adopt_ref(*new StyleValueList(move(values), separator)); }
  1224. size_t size() const { return m_values.size(); }
  1225. NonnullRefPtrVector<StyleValue> const& values() const { return m_values; }
  1226. NonnullRefPtr<StyleValue> value_at(size_t i, bool allow_loop) const
  1227. {
  1228. if (allow_loop)
  1229. return m_values[i % size()];
  1230. return m_values[i];
  1231. }
  1232. virtual String to_string() const override;
  1233. virtual bool equals(StyleValue const& other) const override;
  1234. private:
  1235. StyleValueList(NonnullRefPtrVector<StyleValue>&& values, Separator separator)
  1236. : StyleValue(Type::ValueList)
  1237. , m_separator(separator)
  1238. , m_values(move(values))
  1239. {
  1240. }
  1241. Separator m_separator;
  1242. NonnullRefPtrVector<StyleValue> m_values;
  1243. };
  1244. class RectStyleValue : public StyleValue {
  1245. public:
  1246. static NonnullRefPtr<RectStyleValue> create(EdgeRect rect);
  1247. virtual ~RectStyleValue() override = default;
  1248. EdgeRect rect() const { return m_rect; }
  1249. virtual String to_string() const override;
  1250. virtual bool has_rect() const override { return true; }
  1251. virtual EdgeRect to_rect() const override { return m_rect; }
  1252. virtual bool equals(StyleValue const& other) const override;
  1253. private:
  1254. explicit RectStyleValue(EdgeRect rect)
  1255. : StyleValue(Type::Rect)
  1256. , m_rect(rect)
  1257. {
  1258. }
  1259. EdgeRect m_rect;
  1260. };
  1261. }
  1262. template<>
  1263. struct AK::Formatter<Web::CSS::StyleValue> : Formatter<StringView> {
  1264. ErrorOr<void> format(FormatBuilder& builder, Web::CSS::StyleValue const& style_value)
  1265. {
  1266. return Formatter<StringView>::format(builder, style_value.to_string());
  1267. }
  1268. };