PaintingCommandExecutorGPU.cpp 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. /*
  2. * Copyright (c) 2023, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibWeb/Painting/PaintingCommandExecutorGPU.h>
  7. namespace Web::Painting {
  8. PaintingCommandExecutorGPU::PaintingCommandExecutorGPU(AccelGfx::Painter& painter)
  9. : m_painter(painter)
  10. {
  11. }
  12. PaintingCommandExecutorGPU::~PaintingCommandExecutorGPU()
  13. {
  14. }
  15. CommandResult PaintingCommandExecutorGPU::draw_glyph_run(Vector<Gfx::DrawGlyphOrEmoji> const& glyph_run, Color const& color)
  16. {
  17. painter().draw_glyph_run(glyph_run, color);
  18. return CommandResult::Continue;
  19. }
  20. CommandResult PaintingCommandExecutorGPU::draw_text(Gfx::IntRect const&, String const&, Gfx::TextAlignment, Color const&, Gfx::TextElision, Gfx::TextWrapping, Optional<NonnullRefPtr<Gfx::Font>> const&)
  21. {
  22. // FIXME
  23. return CommandResult::Continue;
  24. }
  25. CommandResult PaintingCommandExecutorGPU::fill_rect(Gfx::IntRect const& rect, Color const& color)
  26. {
  27. painter().fill_rect(rect, color);
  28. return CommandResult::Continue;
  29. }
  30. CommandResult PaintingCommandExecutorGPU::draw_scaled_bitmap(Gfx::IntRect const& dst_rect, Gfx::Bitmap const& bitmap, Gfx::IntRect const& src_rect, float, Gfx::Painter::ScalingMode scaling_mode)
  31. {
  32. // FIXME: We should avoid using Gfx::Painter specific enums in painting commands
  33. AccelGfx::Painter::ScalingMode accel_scaling_mode;
  34. switch (scaling_mode) {
  35. case Gfx::Painter::ScalingMode::NearestNeighbor:
  36. case Gfx::Painter::ScalingMode::BoxSampling:
  37. case Gfx::Painter::ScalingMode::SmoothPixels:
  38. case Gfx::Painter::ScalingMode::None:
  39. accel_scaling_mode = AccelGfx::Painter::ScalingMode::NearestNeighbor;
  40. break;
  41. case Gfx::Painter::ScalingMode::BilinearBlend:
  42. accel_scaling_mode = AccelGfx::Painter::ScalingMode::Bilinear;
  43. break;
  44. default:
  45. VERIFY_NOT_REACHED();
  46. }
  47. painter().draw_scaled_bitmap(dst_rect, bitmap, src_rect, accel_scaling_mode);
  48. return CommandResult::Continue;
  49. }
  50. CommandResult PaintingCommandExecutorGPU::set_clip_rect(Gfx::IntRect const& rect)
  51. {
  52. painter().set_clip_rect(rect);
  53. return CommandResult::Continue;
  54. }
  55. CommandResult PaintingCommandExecutorGPU::clear_clip_rect()
  56. {
  57. painter().clear_clip_rect();
  58. return CommandResult::Continue;
  59. }
  60. CommandResult PaintingCommandExecutorGPU::set_font(Gfx::Font const&)
  61. {
  62. // FIXME
  63. return CommandResult::Continue;
  64. }
  65. CommandResult PaintingCommandExecutorGPU::push_stacking_context(float, bool, Gfx::IntRect const&, Gfx::IntPoint post_transform_translation, CSS::ImageRendering, StackingContextTransform, Optional<StackingContextMask>)
  66. {
  67. painter().save();
  68. painter().translate(post_transform_translation.to_type<float>());
  69. return CommandResult::Continue;
  70. }
  71. CommandResult PaintingCommandExecutorGPU::pop_stacking_context()
  72. {
  73. painter().restore();
  74. return CommandResult::Continue;
  75. }
  76. CommandResult PaintingCommandExecutorGPU::paint_linear_gradient(Gfx::IntRect const& rect, Web::Painting::LinearGradientData const& data)
  77. {
  78. painter().fill_rect_with_linear_gradient(rect, data.color_stops.list, data.gradient_angle, data.color_stops.repeat_length);
  79. return CommandResult::Continue;
  80. }
  81. CommandResult PaintingCommandExecutorGPU::paint_outer_box_shadow(PaintOuterBoxShadowParams const&)
  82. {
  83. // FIXME
  84. return CommandResult::Continue;
  85. }
  86. CommandResult PaintingCommandExecutorGPU::paint_inner_box_shadow(PaintOuterBoxShadowParams const&)
  87. {
  88. // FIXME
  89. return CommandResult::Continue;
  90. }
  91. CommandResult PaintingCommandExecutorGPU::paint_text_shadow(int, Gfx::IntRect const&, Gfx::IntRect const&, String const&, Gfx::Font const&, Color const&, int, Gfx::IntPoint const&)
  92. {
  93. // FIXME
  94. return CommandResult::Continue;
  95. }
  96. CommandResult PaintingCommandExecutorGPU::fill_rect_with_rounded_corners(Gfx::IntRect const& rect, Color const& color, Gfx::AntiAliasingPainter::CornerRadius const& top_left_radius, Gfx::AntiAliasingPainter::CornerRadius const& top_right_radius, Gfx::AntiAliasingPainter::CornerRadius const& bottom_left_radius, Gfx::AntiAliasingPainter::CornerRadius const& bottom_right_radius, Optional<Gfx::FloatPoint> const&)
  97. {
  98. painter().fill_rect_with_rounded_corners(
  99. rect, color,
  100. { static_cast<float>(top_left_radius.horizontal_radius), static_cast<float>(top_left_radius.vertical_radius) },
  101. { static_cast<float>(top_right_radius.horizontal_radius), static_cast<float>(top_right_radius.vertical_radius) },
  102. { static_cast<float>(bottom_left_radius.horizontal_radius), static_cast<float>(bottom_left_radius.vertical_radius) },
  103. { static_cast<float>(bottom_right_radius.horizontal_radius), static_cast<float>(bottom_right_radius.vertical_radius) });
  104. return CommandResult::Continue;
  105. }
  106. CommandResult PaintingCommandExecutorGPU::fill_path_using_color(Gfx::Path const&, Color const&, Gfx::Painter::WindingRule, Optional<Gfx::FloatPoint> const&)
  107. {
  108. // FIXME
  109. return CommandResult::Continue;
  110. }
  111. CommandResult PaintingCommandExecutorGPU::fill_path_using_paint_style(Gfx::Path const&, Gfx::PaintStyle const&, Gfx::Painter::WindingRule, float, Optional<Gfx::FloatPoint> const&)
  112. {
  113. // FIXME
  114. return CommandResult::Continue;
  115. }
  116. CommandResult PaintingCommandExecutorGPU::stroke_path_using_color(Gfx::Path const&, Color const&, float, Optional<Gfx::FloatPoint> const&)
  117. {
  118. // FIXME
  119. return CommandResult::Continue;
  120. }
  121. CommandResult PaintingCommandExecutorGPU::stroke_path_using_paint_style(Gfx::Path const&, Gfx::PaintStyle const&, float, float, Optional<Gfx::FloatPoint> const&)
  122. {
  123. // FIXME
  124. return CommandResult::Continue;
  125. }
  126. CommandResult PaintingCommandExecutorGPU::draw_ellipse(Gfx::IntRect const&, Color const&, int)
  127. {
  128. // FIXME
  129. return CommandResult::Continue;
  130. }
  131. CommandResult PaintingCommandExecutorGPU::fill_ellipse(Gfx::IntRect const& rect, Color const& color, Gfx::AntiAliasingPainter::BlendMode)
  132. {
  133. auto horizontal_radius = static_cast<float>(rect.width() / 2);
  134. auto vertical_radius = static_cast<float>(rect.height() / 2);
  135. painter().fill_rect_with_rounded_corners(
  136. rect, color,
  137. { horizontal_radius, vertical_radius },
  138. { horizontal_radius, vertical_radius },
  139. { horizontal_radius, vertical_radius },
  140. { horizontal_radius, vertical_radius });
  141. return CommandResult::Continue;
  142. }
  143. CommandResult PaintingCommandExecutorGPU::draw_line(Color const& color, Gfx::IntPoint const& a, Gfx::IntPoint const& b, int thickness, Gfx::Painter::LineStyle, Color const&)
  144. {
  145. // FIXME: Pass line style and alternate color once AccelGfx::Painter supports it
  146. painter().draw_line(a, b, thickness, color);
  147. return CommandResult::Continue;
  148. }
  149. CommandResult PaintingCommandExecutorGPU::draw_signed_distance_field(Gfx::IntRect const&, Color const&, Gfx::GrayscaleBitmap const&, float)
  150. {
  151. // FIXME
  152. return CommandResult::Continue;
  153. }
  154. CommandResult PaintingCommandExecutorGPU::paint_progressbar(Gfx::IntRect const&, Gfx::IntRect const&, Palette const&, int, int, int, StringView const&)
  155. {
  156. // FIXME
  157. return CommandResult::Continue;
  158. }
  159. CommandResult PaintingCommandExecutorGPU::paint_frame(Gfx::IntRect const&, Palette const&, Gfx::FrameStyle)
  160. {
  161. // FIXME
  162. return CommandResult::Continue;
  163. }
  164. CommandResult PaintingCommandExecutorGPU::apply_backdrop_filter(Gfx::IntRect const&, Web::CSS::ResolvedBackdropFilter const&)
  165. {
  166. // FIXME
  167. return CommandResult::Continue;
  168. }
  169. CommandResult PaintingCommandExecutorGPU::draw_rect(Gfx::IntRect const&, Color const&, bool)
  170. {
  171. // FIXME
  172. return CommandResult::Continue;
  173. }
  174. CommandResult PaintingCommandExecutorGPU::paint_radial_gradient(Gfx::IntRect const&, Web::Painting::RadialGradientData const&, Gfx::IntPoint const&, Gfx::IntSize const&)
  175. {
  176. // FIXME
  177. return CommandResult::Continue;
  178. }
  179. CommandResult PaintingCommandExecutorGPU::paint_conic_gradient(Gfx::IntRect const&, Web::Painting::ConicGradientData const&, Gfx::IntPoint const&)
  180. {
  181. // FIXME
  182. return CommandResult::Continue;
  183. }
  184. CommandResult PaintingCommandExecutorGPU::draw_triangle_wave(Gfx::IntPoint const&, Gfx::IntPoint const&, Color const&, int, int)
  185. {
  186. // FIXME
  187. return CommandResult::Continue;
  188. }
  189. CommandResult PaintingCommandExecutorGPU::sample_under_corners(BorderRadiusCornerClipper&)
  190. {
  191. // FIXME
  192. return CommandResult::Continue;
  193. }
  194. CommandResult PaintingCommandExecutorGPU::blit_corner_clipping(BorderRadiusCornerClipper&)
  195. {
  196. // FIXME
  197. return CommandResult::Continue;
  198. }
  199. CommandResult PaintingCommandExecutorGPU::paint_borders(DevicePixelRect const& border_rect, CornerRadii const& corner_radii, BordersDataDevicePixels const& borders_data)
  200. {
  201. // FIXME: Add support for corner radiuses
  202. (void)corner_radii;
  203. Gfx::IntRect top_border_rect = {
  204. border_rect.x(),
  205. border_rect.y(),
  206. border_rect.width(),
  207. borders_data.top.width
  208. };
  209. Gfx::IntRect right_border_rect = {
  210. border_rect.x() + (border_rect.width() - borders_data.right.width),
  211. border_rect.y(),
  212. borders_data.right.width,
  213. border_rect.height()
  214. };
  215. Gfx::IntRect bottom_border_rect = {
  216. border_rect.x(),
  217. border_rect.y() + (border_rect.height() - borders_data.bottom.width),
  218. border_rect.width(),
  219. borders_data.bottom.width
  220. };
  221. Gfx::IntRect left_border_rect = {
  222. border_rect.x(),
  223. border_rect.y(),
  224. borders_data.left.width,
  225. border_rect.height()
  226. };
  227. if (borders_data.top.width > 0)
  228. painter().fill_rect(top_border_rect, borders_data.top.color);
  229. if (borders_data.right.width > 0)
  230. painter().fill_rect(right_border_rect, borders_data.right.color);
  231. if (borders_data.bottom.width > 0)
  232. painter().fill_rect(bottom_border_rect, borders_data.bottom.color);
  233. if (borders_data.left.width > 0)
  234. painter().fill_rect(left_border_rect, borders_data.left.color);
  235. return CommandResult::Continue;
  236. }
  237. bool PaintingCommandExecutorGPU::would_be_fully_clipped_by_painter(Gfx::IntRect) const
  238. {
  239. // FIXME
  240. return false;
  241. }
  242. void PaintingCommandExecutorGPU::prepare_glyph_texture(HashMap<Gfx::Font const*, HashTable<u32>> const& unique_glyphs)
  243. {
  244. m_painter.prepare_glyph_texture(unique_glyphs);
  245. }
  246. }