physis/bcn/
color.rs

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