PaintingCommandExecutorGPU.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  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, CSS::ImageRendering, StackingContextTransform, Optional<StackingContextMask>)
  66. {
  67. // FIXME
  68. return CommandResult::Continue;
  69. }
  70. CommandResult PaintingCommandExecutorGPU::pop_stacking_context()
  71. {
  72. // FIXME
  73. return CommandResult::Continue;
  74. }
  75. CommandResult PaintingCommandExecutorGPU::paint_linear_gradient(Gfx::IntRect const& rect, Web::Painting::LinearGradientData const& data)
  76. {
  77. painter().fill_rect_with_linear_gradient(rect, data.color_stops.list, data.gradient_angle, data.color_stops.repeat_length);
  78. return CommandResult::Continue;
  79. }
  80. CommandResult PaintingCommandExecutorGPU::paint_outer_box_shadow(PaintOuterBoxShadowParams const&)
  81. {
  82. // FIXME
  83. return CommandResult::Continue;
  84. }
  85. CommandResult PaintingCommandExecutorGPU::paint_inner_box_shadow(PaintOuterBoxShadowParams const&)
  86. {
  87. // FIXME
  88. return CommandResult::Continue;
  89. }
  90. CommandResult PaintingCommandExecutorGPU::paint_text_shadow(int, Gfx::IntRect const&, Gfx::IntRect const&, String const&, Gfx::Font const&, Color const&, int, Gfx::IntPoint const&)
  91. {
  92. // FIXME
  93. return CommandResult::Continue;
  94. }
  95. 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&)
  96. {
  97. painter().fill_rect_with_rounded_corners(
  98. rect, color,
  99. { static_cast<float>(top_left_radius.horizontal_radius), static_cast<float>(top_left_radius.vertical_radius) },
  100. { static_cast<float>(top_right_radius.horizontal_radius), static_cast<float>(top_right_radius.vertical_radius) },
  101. { static_cast<float>(bottom_left_radius.horizontal_radius), static_cast<float>(bottom_left_radius.vertical_radius) },
  102. { static_cast<float>(bottom_right_radius.horizontal_radius), static_cast<float>(bottom_right_radius.vertical_radius) });
  103. return CommandResult::Continue;
  104. }
  105. CommandResult PaintingCommandExecutorGPU::fill_path_using_color(Gfx::Path const&, Color const&, Gfx::Painter::WindingRule, Optional<Gfx::FloatPoint> const&)
  106. {
  107. // FIXME
  108. return CommandResult::Continue;
  109. }
  110. CommandResult PaintingCommandExecutorGPU::fill_path_using_paint_style(Gfx::Path const&, Gfx::PaintStyle const&, Gfx::Painter::WindingRule, float, Optional<Gfx::FloatPoint> const&)
  111. {
  112. // FIXME
  113. return CommandResult::Continue;
  114. }
  115. CommandResult PaintingCommandExecutorGPU::stroke_path_using_color(Gfx::Path const&, Color const&, float, Optional<Gfx::FloatPoint> const&)
  116. {
  117. // FIXME
  118. return CommandResult::Continue;
  119. }
  120. CommandResult PaintingCommandExecutorGPU::stroke_path_using_paint_style(Gfx::Path const&, Gfx::PaintStyle const&, float, float, Optional<Gfx::FloatPoint> const&)
  121. {
  122. // FIXME
  123. return CommandResult::Continue;
  124. }
  125. CommandResult PaintingCommandExecutorGPU::draw_ellipse(Gfx::IntRect const&, Color const&, int)
  126. {
  127. // FIXME
  128. return CommandResult::Continue;
  129. }
  130. CommandResult PaintingCommandExecutorGPU::fill_ellipse(Gfx::IntRect const& rect, Color const& color, Gfx::AntiAliasingPainter::BlendMode)
  131. {
  132. auto horizontal_radius = static_cast<float>(rect.width() / 2);
  133. auto vertical_radius = static_cast<float>(rect.height() / 2);
  134. painter().fill_rect_with_rounded_corners(
  135. rect, color,
  136. { horizontal_radius, vertical_radius },
  137. { horizontal_radius, vertical_radius },
  138. { horizontal_radius, vertical_radius },
  139. { horizontal_radius, vertical_radius });
  140. return CommandResult::Continue;
  141. }
  142. CommandResult PaintingCommandExecutorGPU::draw_line(Color const& color, Gfx::IntPoint const& a, Gfx::IntPoint const& b, int thickness, Gfx::Painter::LineStyle, Color const&)
  143. {
  144. // FIXME: Pass line style and alternate color once AccelGfx::Painter supports it
  145. painter().draw_line(a, b, thickness, color);
  146. return CommandResult::Continue;
  147. }
  148. CommandResult PaintingCommandExecutorGPU::draw_signed_distance_field(Gfx::IntRect const&, Color const&, Gfx::GrayscaleBitmap const&, float)
  149. {
  150. // FIXME
  151. return CommandResult::Continue;
  152. }
  153. CommandResult PaintingCommandExecutorGPU::paint_progressbar(Gfx::IntRect const&, Gfx::IntRect const&, Palette const&, int, int, int, StringView const&)
  154. {
  155. // FIXME
  156. return CommandResult::Continue;
  157. }
  158. CommandResult PaintingCommandExecutorGPU::paint_frame(Gfx::IntRect const&, Palette const&, Gfx::FrameStyle)
  159. {
  160. // FIXME
  161. return CommandResult::Continue;
  162. }
  163. CommandResult PaintingCommandExecutorGPU::apply_backdrop_filter(Gfx::IntRect const&, Web::CSS::ResolvedBackdropFilter const&)
  164. {
  165. // FIXME
  166. return CommandResult::Continue;
  167. }
  168. CommandResult PaintingCommandExecutorGPU::draw_rect(Gfx::IntRect const&, Color const&, bool)
  169. {
  170. // FIXME
  171. return CommandResult::Continue;
  172. }
  173. CommandResult PaintingCommandExecutorGPU::paint_radial_gradient(Gfx::IntRect const&, Web::Painting::RadialGradientData const&, Gfx::IntPoint const&, Gfx::IntSize const&)
  174. {
  175. // FIXME
  176. return CommandResult::Continue;
  177. }
  178. CommandResult PaintingCommandExecutorGPU::paint_conic_gradient(Gfx::IntRect const&, Web::Painting::ConicGradientData const&, Gfx::IntPoint const&)
  179. {
  180. // FIXME
  181. return CommandResult::Continue;
  182. }
  183. CommandResult PaintingCommandExecutorGPU::draw_triangle_wave(Gfx::IntPoint const&, Gfx::IntPoint const&, Color const&, int, int)
  184. {
  185. // FIXME
  186. return CommandResult::Continue;
  187. }
  188. CommandResult PaintingCommandExecutorGPU::sample_under_corners(BorderRadiusCornerClipper&)
  189. {
  190. // FIXME
  191. return CommandResult::Continue;
  192. }
  193. CommandResult PaintingCommandExecutorGPU::blit_corner_clipping(BorderRadiusCornerClipper&)
  194. {
  195. // FIXME
  196. return CommandResult::Continue;
  197. }
  198. CommandResult PaintingCommandExecutorGPU::paint_borders(DevicePixelRect const& border_rect, CornerRadii const& corner_radii, BordersDataDevicePixels const& borders_data)
  199. {
  200. // FIXME: Add support for corner radiuses
  201. (void)corner_radii;
  202. Gfx::IntRect top_border_rect = {
  203. border_rect.x(),
  204. border_rect.y(),
  205. border_rect.width(),
  206. borders_data.top.width
  207. };
  208. Gfx::IntRect right_border_rect = {
  209. border_rect.x() + (border_rect.width() - borders_data.right.width),
  210. border_rect.y(),
  211. borders_data.right.width,
  212. border_rect.height()
  213. };
  214. Gfx::IntRect bottom_border_rect = {
  215. border_rect.x(),
  216. border_rect.y() + (border_rect.height() - borders_data.bottom.width),
  217. border_rect.width(),
  218. borders_data.bottom.width
  219. };
  220. Gfx::IntRect left_border_rect = {
  221. border_rect.x(),
  222. border_rect.y(),
  223. borders_data.left.width,
  224. border_rect.height()
  225. };
  226. painter().fill_rect(top_border_rect, borders_data.top.color);
  227. painter().fill_rect(right_border_rect, borders_data.right.color);
  228. painter().fill_rect(bottom_border_rect, borders_data.bottom.color);
  229. painter().fill_rect(left_border_rect, borders_data.left.color);
  230. return CommandResult::Continue;
  231. }
  232. bool PaintingCommandExecutorGPU::would_be_fully_clipped_by_painter(Gfx::IntRect) const
  233. {
  234. // FIXME
  235. return false;
  236. }
  237. void PaintingCommandExecutorGPU::prepare_glyph_texture(HashMap<Gfx::Font const*, HashTable<u32>> const& unique_glyphs)
  238. {
  239. m_painter.prepare_glyph_texture(unique_glyphs);
  240. }
  241. }