1// Copyright © SixtyFPS GmbH <info@slint.dev>
2// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0
3
4use super::*;
5
6pub use crate::graphics::{CompositionMode, TexturePixelFormat};
7
8/// This structure describes the properties of a texture for blending with [`TargetPixelBuffer::draw_texture`].
9#[allow(dead_code)]
10#[non_exhaustive]
11pub struct Texture<'a> {
12 /// A reference to the pixel bytes of the texture. These bytes are in the format specified by `pixel_format`.
13 pub bytes: &'a [u8],
14 /// The pixel format of the texture.
15 pub pixel_format: TexturePixelFormat,
16 /// The number of pixels per horizontal line of the texture.
17 pub pixel_stride: u16,
18 /// The width of the texture in pixels.
19 pub width: u16,
20 /// The height of the texture in pixels.
21 pub height: u16,
22 /// The delta to apply to the source x coordinate between pixels when drawing the texture.
23 /// This is used when scaling the texture. The delta is specified in 8:8 fixed point format.
24 pub delta_x: u16,
25 /// The delta to apply to the source y coordinate between pixels when drawing the texture.
26 /// This is used when scaling the texture. The delta is specified in 8:8 fixed point format.
27 pub delta_y: u16,
28 /// The offset within the texture to start reading pixels from in the x direction. The
29 /// offset is specified in 12:4 fixed point format.
30 pub source_offset_x: u16,
31 /// The offset within the texture to start reading pixels from in the y direction. The
32 /// offset is specified in 12:4 fixed point format.
33 pub source_offset_y: u16,
34}
35
36/// This trait represents access to a buffer of pixels the software renderer can render into, as well
37/// as certain operations that the renderer will try to delegate to this trait. Implement these functions
38/// to delegate rendering further to hardware-provided 2D acceleration units, such as DMA2D or PXP.
39pub trait TargetPixelBuffer {
40 /// The pixel type the buffer represents.
41 type TargetPixel: TargetPixel;
42
43 /// Returns a slice of pixels for the given line.
44 fn line_slice(&mut self, line_numer: usize) -> &mut [Self::TargetPixel];
45
46 /// Returns the number of lines the buffer has. This is typically the height in pixels.
47 fn num_lines(&self) -> usize;
48
49 /// Fills the buffer with a rectangle at the specified position with the given size and the
50 /// provided color. Returns true if the operation was successful; false if it could not be
51 /// implemented and instead the software renderer needs to draw the rectangle.
52 fn fill_rectangle(
53 &mut self,
54 _x: i16,
55 _y: i16,
56 _width: i16,
57 _height: i16,
58 _color: PremultipliedRgbaColor,
59 _composition_mode: CompositionMode,
60 ) -> bool {
61 false
62 }
63
64 /// Draw a texture into the buffer at the specified position with the given size and
65 /// colorized if needed. Returns true if the operation was successful; false if it could not be
66 /// implemented and instead the software renderer needs to draw the texture
67 fn draw_texture(
68 &mut self,
69 _x: i16,
70 _y: i16,
71 _width: i16,
72 _height: i16,
73 _src_texture: Texture<'_>,
74 _colorize: u32,
75 _alpha: u8,
76 _rotation: RenderingRotation,
77 _composition_mode: CompositionMode,
78 ) -> bool {
79 false
80 }
81}
82