physis/bcn/color.rs
1// SPDX-FileCopyrightText: 2023 Rudolf Kolbe
2// SPDX-License-Identifier: MIT
3
4#![allow(clippy::too_many_arguments)]
5
6#[inline]
7pub const fn color(r: u8, g: u8, b: u8, a: u8) -> u32 {
8 u32::from_le_bytes([b, g, r, a])
9}
10
11// #[cfg(target_endian = "little")]
12// #[inline]
13// pub fn alpha_mask(a: u8) -> u32 {
14// TRANSPARENT_MASK | (a as u32) << 24
15// }
16
17// #[cfg(target_endian = "big")]
18// #[inline]
19// pub fn alpha_mask(a: u8) -> u32 {
20// TRANSPARENT_MASK | a as u32
21// }
22
23// #[cfg(target_endian = "little")]
24#[inline]
25pub const fn rgb565_le(d: u16) -> (u8, u8, u8) {
26 (
27 ((d >> 8) & 0xf8) as u8 | (d >> 13) as u8,
28 ((d >> 3) & 0xfc) as u8 | ((d >> 9) & 3) as u8,
29 (d << 3) as u8 | ((d >> 2) & 7) as u8,
30 )
31}
32
33// #[cfg(target_endian = "big")]
34// #[inline]
35// pub fn rgb565_le(d: u16) -> (u8, u8, u8) {
36// (
37// (d & 0xf8) as u8 | (d >> 5 & 7) as u8,
38// (d << 5 & 0xe0) as u8 | (d >> 11 & 0x1c) as u8 | (d >> 1 & 3) as u8,
39// (d >> 5 & 0xf8) as u8 | (d >> 10 & 0x7) as u8,
40// )
41// }
42
43// #[cfg(target_endian = "little")]
44// #[inline]
45// pub fn rgb565_be(d: u16) -> (u8, u8, u8) {
46// (
47// (d & 0xf8) as u8 | (d >> 5 & 7) as u8,
48// (d << 5 & 0xe0) as u8 | (d >> 11 & 0x1c) as u8 | (d >> 1 & 3) as u8,
49// (d >> 5 & 0xf8) as u8 | (d >> 10 & 0x7) as u8,
50// )
51// }
52
53// #[cfg(target_endian = "big")]
54// #[inline]
55// pub fn rgb565_be(d: u16) -> (u8, u8, u8) {
56// (
57// (d >> 8 & 0xf8) as u8 | (d >> 13) as u8,
58// (d >> 3 & 0xfc) as u8 | (d >> 9 & 3) as u8,
59// (d << 3) as u8 | (d >> 2 & 7) as u8,
60// )
61// }
62
63#[inline]
64pub fn copy_block_buffer(
65 bx: usize,
66 by: usize,
67 w: usize,
68 h: usize,
69 bw: usize,
70 bh: usize,
71 buffer: &[u32],
72 image: &mut [u32],
73) {
74 let x: usize = bw * bx;
75 let copy_width: usize = if bw * (bx + 1) > w { w - bw * bx } else { bw };
76
77 let y_0 = by * bh;
78 let copy_height: usize = if bh * (by + 1) > h { h - y_0 } else { bh };
79 let mut buffer_offset = 0;
80
81 for y in y_0..y_0 + copy_height {
82 let image_offset = y * w + x;
83 image[image_offset..image_offset + copy_width]
84 .copy_from_slice(&buffer[buffer_offset..buffer_offset + copy_width]);
85
86 buffer_offset += bw;
87 }
88}