PaintingCommandExecutorGPU.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  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(Gfx::Bitmap& bitmap)
  9. : m_target_bitmap(bitmap)
  10. {
  11. auto painter = AccelGfx::Painter::create();
  12. auto canvas = AccelGfx::Canvas::create(bitmap.size());
  13. painter->set_target_canvas(canvas);
  14. stacking_contexts.append({ .canvas = canvas,
  15. .painter = move(painter),
  16. .opacity = 1.0f,
  17. .destination = {} });
  18. }
  19. PaintingCommandExecutorGPU::~PaintingCommandExecutorGPU()
  20. {
  21. VERIFY(stacking_contexts.size() == 1);
  22. painter().flush(m_target_bitmap);
  23. }
  24. CommandResult PaintingCommandExecutorGPU::draw_glyph_run(Vector<Gfx::DrawGlyphOrEmoji> const& glyph_run, Color const& color)
  25. {
  26. painter().draw_glyph_run(glyph_run, color);
  27. return CommandResult::Continue;
  28. }
  29. CommandResult PaintingCommandExecutorGPU::draw_text(Gfx::IntRect const&, String const&, Gfx::TextAlignment, Color const&, Gfx::TextElision, Gfx::TextWrapping, Optional<NonnullRefPtr<Gfx::Font>> const&)
  30. {
  31. // FIXME
  32. return CommandResult::Continue;
  33. }
  34. CommandResult PaintingCommandExecutorGPU::fill_rect(Gfx::IntRect const& rect, Color const& color)
  35. {
  36. painter().fill_rect(rect, color);
  37. return CommandResult::Continue;
  38. }
  39. static AccelGfx::Painter::ScalingMode to_accelgfx_scaling_mode(Gfx::Painter::ScalingMode scaling_mode)
  40. {
  41. switch (scaling_mode) {
  42. case Gfx::Painter::ScalingMode::NearestNeighbor:
  43. case Gfx::Painter::ScalingMode::BoxSampling:
  44. case Gfx::Painter::ScalingMode::SmoothPixels:
  45. case Gfx::Painter::ScalingMode::None:
  46. return AccelGfx::Painter::ScalingMode::NearestNeighbor;
  47. case Gfx::Painter::ScalingMode::BilinearBlend:
  48. return AccelGfx::Painter::ScalingMode::Bilinear;
  49. default:
  50. VERIFY_NOT_REACHED();
  51. }
  52. }
  53. CommandResult PaintingCommandExecutorGPU::draw_scaled_bitmap(Gfx::IntRect const& dst_rect, Gfx::Bitmap const& bitmap, Gfx::IntRect const& src_rect, Gfx::Painter::ScalingMode scaling_mode)
  54. {
  55. painter().draw_scaled_bitmap(dst_rect, bitmap, src_rect, to_accelgfx_scaling_mode(scaling_mode));
  56. return CommandResult::Continue;
  57. }
  58. CommandResult PaintingCommandExecutorGPU::draw_scaled_immutable_bitmap(Gfx::IntRect const& dst_rect, Gfx::ImmutableBitmap const& immutable_bitmap, Gfx::IntRect const& src_rect, Gfx::Painter::ScalingMode scaling_mode)
  59. {
  60. painter().draw_scaled_immutable_bitmap(dst_rect, immutable_bitmap, src_rect, to_accelgfx_scaling_mode(scaling_mode));
  61. return CommandResult::Continue;
  62. }
  63. CommandResult PaintingCommandExecutorGPU::set_clip_rect(Gfx::IntRect const& rect)
  64. {
  65. painter().set_clip_rect(rect);
  66. return CommandResult::Continue;
  67. }
  68. CommandResult PaintingCommandExecutorGPU::clear_clip_rect()
  69. {
  70. painter().clear_clip_rect();
  71. return CommandResult::Continue;
  72. }
  73. CommandResult PaintingCommandExecutorGPU::set_font(Gfx::Font const&)
  74. {
  75. // FIXME
  76. return CommandResult::Continue;
  77. }
  78. CommandResult PaintingCommandExecutorGPU::push_stacking_context(float opacity, bool, Gfx::IntRect const& source_paintable_rect, Gfx::IntPoint post_transform_translation, CSS::ImageRendering, StackingContextTransform, Optional<StackingContextMask>)
  79. {
  80. if (opacity < 1) {
  81. auto painter = AccelGfx::Painter::create_with_glyphs_texture_from_painter(this->painter());
  82. auto canvas = AccelGfx::Canvas::create(source_paintable_rect.size());
  83. painter->set_target_canvas(canvas);
  84. painter->translate(-source_paintable_rect.location().to_type<float>());
  85. stacking_contexts.append({ .canvas = canvas,
  86. .painter = move(painter),
  87. .opacity = opacity,
  88. .destination = source_paintable_rect });
  89. } else {
  90. painter().save();
  91. painter().translate(post_transform_translation.to_type<float>());
  92. }
  93. return CommandResult::Continue;
  94. }
  95. CommandResult PaintingCommandExecutorGPU::pop_stacking_context()
  96. {
  97. if (stacking_contexts.last().opacity < 1) {
  98. auto stacking_context = stacking_contexts.take_last();
  99. painter().blit_canvas(stacking_context.destination, *stacking_context.canvas, stacking_context.opacity);
  100. } else {
  101. painter().restore();
  102. }
  103. return CommandResult::Continue;
  104. }
  105. CommandResult PaintingCommandExecutorGPU::paint_linear_gradient(Gfx::IntRect const& rect, Web::Painting::LinearGradientData const& data)
  106. {
  107. painter().fill_rect_with_linear_gradient(rect, data.color_stops.list, data.gradient_angle, data.color_stops.repeat_length);
  108. return CommandResult::Continue;
  109. }
  110. CommandResult PaintingCommandExecutorGPU::paint_outer_box_shadow(PaintOuterBoxShadowParams const&)
  111. {
  112. // FIXME
  113. return CommandResult::Continue;
  114. }
  115. CommandResult PaintingCommandExecutorGPU::paint_inner_box_shadow(PaintOuterBoxShadowParams const&)
  116. {
  117. // FIXME
  118. return CommandResult::Continue;
  119. }
  120. CommandResult PaintingCommandExecutorGPU::paint_text_shadow(int, Gfx::IntRect const&, Gfx::IntRect const&, String const&, Gfx::Font const&, Color const&, int, Gfx::IntPoint const&)
  121. {
  122. // FIXME
  123. return CommandResult::Continue;
  124. }
  125. 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&)
  126. {
  127. painter().fill_rect_with_rounded_corners(
  128. rect, color,
  129. { static_cast<float>(top_left_radius.horizontal_radius), static_cast<float>(top_left_radius.vertical_radius) },
  130. { static_cast<float>(top_right_radius.horizontal_radius), static_cast<float>(top_right_radius.vertical_radius) },
  131. { static_cast<float>(bottom_left_radius.horizontal_radius), static_cast<float>(bottom_left_radius.vertical_radius) },
  132. { static_cast<float>(bottom_right_radius.horizontal_radius), static_cast<float>(bottom_right_radius.vertical_radius) });
  133. return CommandResult::Continue;
  134. }
  135. CommandResult PaintingCommandExecutorGPU::fill_path_using_color(Gfx::Path const&, Color const&, Gfx::Painter::WindingRule, Optional<Gfx::FloatPoint> const&)
  136. {
  137. // FIXME
  138. return CommandResult::Continue;
  139. }
  140. CommandResult PaintingCommandExecutorGPU::fill_path_using_paint_style(Gfx::Path const&, Gfx::PaintStyle const&, Gfx::Painter::WindingRule, float, Optional<Gfx::FloatPoint> const&)
  141. {
  142. // FIXME
  143. return CommandResult::Continue;
  144. }
  145. CommandResult PaintingCommandExecutorGPU::stroke_path_using_color(Gfx::Path const&, Color const&, float, Optional<Gfx::FloatPoint> const&)
  146. {
  147. // FIXME
  148. return CommandResult::Continue;
  149. }
  150. CommandResult PaintingCommandExecutorGPU::stroke_path_using_paint_style(Gfx::Path const&, Gfx::PaintStyle const&, float, float, Optional<Gfx::FloatPoint> const&)
  151. {
  152. // FIXME
  153. return CommandResult::Continue;
  154. }
  155. CommandResult PaintingCommandExecutorGPU::draw_ellipse(Gfx::IntRect const&, Color const&, int)
  156. {
  157. // FIXME
  158. return CommandResult::Continue;
  159. }
  160. CommandResult PaintingCommandExecutorGPU::fill_ellipse(Gfx::IntRect const& rect, Color const& color, Gfx::AntiAliasingPainter::BlendMode)
  161. {
  162. auto horizontal_radius = static_cast<float>(rect.width() / 2);
  163. auto vertical_radius = static_cast<float>(rect.height() / 2);
  164. painter().fill_rect_with_rounded_corners(
  165. rect, color,
  166. { horizontal_radius, vertical_radius },
  167. { horizontal_radius, vertical_radius },
  168. { horizontal_radius, vertical_radius },
  169. { horizontal_radius, vertical_radius });
  170. return CommandResult::Continue;
  171. }
  172. CommandResult PaintingCommandExecutorGPU::draw_line(Color const& color, Gfx::IntPoint const& a, Gfx::IntPoint const& b, int thickness, Gfx::Painter::LineStyle, Color const&)
  173. {
  174. // FIXME: Pass line style and alternate color once AccelGfx::Painter supports it
  175. painter().draw_line(a, b, thickness, color);
  176. return CommandResult::Continue;
  177. }
  178. CommandResult PaintingCommandExecutorGPU::draw_signed_distance_field(Gfx::IntRect const&, Color const&, Gfx::GrayscaleBitmap const&, float)
  179. {
  180. // FIXME
  181. return CommandResult::Continue;
  182. }
  183. CommandResult PaintingCommandExecutorGPU::paint_progressbar(Gfx::IntRect const&, Gfx::IntRect const&, Palette const&, int, int, int, StringView const&)
  184. {
  185. // FIXME
  186. return CommandResult::Continue;
  187. }
  188. CommandResult PaintingCommandExecutorGPU::paint_frame(Gfx::IntRect const&, Palette const&, Gfx::FrameStyle)
  189. {
  190. // FIXME
  191. return CommandResult::Continue;
  192. }
  193. CommandResult PaintingCommandExecutorGPU::apply_backdrop_filter(Gfx::IntRect const&, Web::CSS::ResolvedBackdropFilter const&)
  194. {
  195. // FIXME
  196. return CommandResult::Continue;
  197. }
  198. CommandResult PaintingCommandExecutorGPU::draw_rect(Gfx::IntRect const&, Color const&, bool)
  199. {
  200. // FIXME
  201. return CommandResult::Continue;
  202. }
  203. CommandResult PaintingCommandExecutorGPU::paint_radial_gradient(Gfx::IntRect const&, Web::Painting::RadialGradientData const&, Gfx::IntPoint const&, Gfx::IntSize const&)
  204. {
  205. // FIXME
  206. return CommandResult::Continue;
  207. }
  208. CommandResult PaintingCommandExecutorGPU::paint_conic_gradient(Gfx::IntRect const&, Web::Painting::ConicGradientData const&, Gfx::IntPoint const&)
  209. {
  210. // FIXME
  211. return CommandResult::Continue;
  212. }
  213. CommandResult PaintingCommandExecutorGPU::draw_triangle_wave(Gfx::IntPoint const&, Gfx::IntPoint const&, Color const&, int, int)
  214. {
  215. // FIXME
  216. return CommandResult::Continue;
  217. }
  218. CommandResult PaintingCommandExecutorGPU::sample_under_corners(BorderRadiusCornerClipper&)
  219. {
  220. // FIXME
  221. return CommandResult::Continue;
  222. }
  223. CommandResult PaintingCommandExecutorGPU::blit_corner_clipping(BorderRadiusCornerClipper&)
  224. {
  225. // FIXME
  226. return CommandResult::Continue;
  227. }
  228. CommandResult PaintingCommandExecutorGPU::paint_borders(DevicePixelRect const& border_rect, CornerRadii const& corner_radii, BordersDataDevicePixels const& borders_data)
  229. {
  230. // FIXME: Add support for corner radiuses
  231. (void)corner_radii;
  232. Gfx::IntRect top_border_rect = {
  233. border_rect.x(),
  234. border_rect.y(),
  235. border_rect.width(),
  236. borders_data.top.width
  237. };
  238. Gfx::IntRect right_border_rect = {
  239. border_rect.x() + (border_rect.width() - borders_data.right.width),
  240. border_rect.y(),
  241. borders_data.right.width,
  242. border_rect.height()
  243. };
  244. Gfx::IntRect bottom_border_rect = {
  245. border_rect.x(),
  246. border_rect.y() + (border_rect.height() - borders_data.bottom.width),
  247. border_rect.width(),
  248. borders_data.bottom.width
  249. };
  250. Gfx::IntRect left_border_rect = {
  251. border_rect.x(),
  252. border_rect.y(),
  253. borders_data.left.width,
  254. border_rect.height()
  255. };
  256. if (borders_data.top.width > 0)
  257. painter().fill_rect(top_border_rect, borders_data.top.color);
  258. if (borders_data.right.width > 0)
  259. painter().fill_rect(right_border_rect, borders_data.right.color);
  260. if (borders_data.bottom.width > 0)
  261. painter().fill_rect(bottom_border_rect, borders_data.bottom.color);
  262. if (borders_data.left.width > 0)
  263. painter().fill_rect(left_border_rect, borders_data.left.color);
  264. return CommandResult::Continue;
  265. }
  266. bool PaintingCommandExecutorGPU::would_be_fully_clipped_by_painter(Gfx::IntRect) const
  267. {
  268. // FIXME
  269. return false;
  270. }
  271. void PaintingCommandExecutorGPU::prepare_glyph_texture(HashMap<Gfx::Font const*, HashTable<u32>> const& unique_glyphs)
  272. {
  273. painter().prepare_glyph_texture(unique_glyphs);
  274. }
  275. void PaintingCommandExecutorGPU::update_immutable_bitmap_texture_cache(HashMap<u32, Gfx::ImmutableBitmap const*>& immutable_bitmaps)
  276. {
  277. painter().update_immutable_bitmap_texture_cache(immutable_bitmaps);
  278. }
  279. }