thorium 0.4.0

Lokathor does stuff, ium
Documentation
//! Place to put stuff for color manipulation.

use super::*;

/// Struct for easy manipulation of ARGB32 color data.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg(target_endian = "little")]
#[allow(missing_docs)]
#[repr(C)]
pub struct ARGB32 {
  pub b: u8,
  pub g: u8,
  pub r: u8,
  pub a: u8,
}
impl ARGB32 {
  /// Constructs the color.
  pub const fn new(a: u8, r: u8, g: u8, b: u8) -> Self {
    Self { a, r, g, b }
  }
  /// Constructs a value from `0xRRGGBB`, assumes A=0xFF
  #[cfg(target_endian = "little")]
  pub const fn from_rgb24(rgb: u32) -> Self {
    Self {
      a: 0xFF,
      r: (rgb >> 16) as u8,
      g: (rgb >> 8) as u8,
      b: (rgb >> 0) as u8,
    }
  }
}
#[cfg(target_endian = "little")]
impl From<ARGB32> for u32 {
  fn from(argb: ARGB32) -> Self {
    u32::from(argb.b) | u32::from(argb.g) << 8 | u32::from(argb.r) << 16 | u32::from(argb.a) << 24
  }
}
#[cfg(target_endian = "little")]
impl From<u32> for ARGB32 {
  fn from(u: u32) -> Self {
    Self {
      a: (u >> 24) as u8,
      r: (u >> 16) as u8,
      g: (u >> 8) as u8,
      b: (u >> 0) as u8,
    }
  }
}

/// Converts 5bpc values to 8bpc (just index into the array).
pub const CONVERT_5BIT_CHANNEL_TO_8BIT_CHANNEL: [u8; 32] = [
  0, 8, 16, 24, 32, 41, 49, 57, 65, 74, 82, 90, 98, 106, 115, 123, 131, 139, 148, 156, 164, 172,
  180, 189, 197, 205, 213, 222, 230, 238, 246, 255,
];

/// Various palettes for use with 4-color mode.
///
/// The 0th position is considered the "blank" color.
pub const FOUR_COLOR_PALETTES: &[[ARGB32; 4]] = &[
  // DMG (green-scale, greenish to blackish)
  [
    ARGB32::new(0xFF, 0x9b, 0xbc, 0x0f),
    ARGB32::new(0xFF, 0x8b, 0xac, 0x0f),
    ARGB32::new(0xFF, 0x30, 0x62, 0x30),
    ARGB32::new(0xFF, 0x0f, 0x38, 0x0f),
  ],
  // MGB (gray-scale, white to black)
  [
    ARGB32::new(0xFF, 0xFF, 0xFF, 0xFF),
    ARGB32::new(0xFF, 0xb6, 0xb6, 0xb6),
    ARGB32::new(0xFF, 0x67, 0x67, 0x67),
    ARGB32::new(0xFF, 0x00, 0x00, 0x00),
  ],
  // CGA 0 low (black, green, red, brown)
  [
    ARGB32::new(0xFF, 0x00, 0x00, 0x00),
    ARGB32::new(0xFF, 0xAA, 0x00, 0x00),
    ARGB32::new(0xFF, 0x00, 0xAA, 0x00),
    ARGB32::new(0xFF, 0xAA, 0x55, 0x00),
  ],
  // CGA 0 high (black, light green, light red, yellow)
  [
    ARGB32::new(0xFF, 0x00, 0x00, 0x00),
    ARGB32::new(0xFF, 0xFF, 0x55, 0x55),
    ARGB32::new(0xFF, 0x55, 0xFF, 0x55),
    ARGB32::new(0xFF, 0xFF, 0xFF, 0x55),
  ],
  // CGA 1 low (black, cyan, magenta, light gray)
  [
    ARGB32::new(0xFF, 0x00, 0x00, 0x00),
    ARGB32::new(0xFF, 0x00, 0xAA, 0xAA),
    ARGB32::new(0xFF, 0xAA, 0x00, 0xAA),
    ARGB32::new(0xFF, 0xAA, 0xAA, 0xAA),
  ],
  // CGA 1 high (black, light cyan, light magenta, white)
  [
    ARGB32::new(0xFF, 0x00, 0x00, 0x00),
    ARGB32::new(0xFF, 0x55, 0xFF, 0xFF),
    ARGB32::new(0xFF, 0xFF, 0x55, 0xFF),
    ARGB32::new(0xFF, 0xFF, 0xFF, 0xFF),
  ],
  // CGA 2 low (black, cyan, red, light gray)
  [
    ARGB32::new(0xFF, 0x00, 0x00, 0x00),
    ARGB32::new(0xFF, 0x00, 0xAA, 0xAA),
    ARGB32::new(0xFF, 0xAA, 0x00, 0x00),
    ARGB32::new(0xFF, 0xAA, 0xAA, 0xAA),
  ],
  // CGA 2 high (black, light cyan, light red, white)
  [
    ARGB32::new(0xFF, 0x00, 0x00, 0x00),
    ARGB32::new(0xFF, 0x55, 0xFF, 0xFF),
    ARGB32::new(0xFF, 0xFF, 0x55, 0x55),
    ARGB32::new(0xFF, 0xFF, 0xFF, 0xFF),
  ],
  // SGB 1A
  [
    ARGB32::from_rgb24(0xf8e8c8), // BG
    ARGB32::from_rgb24(0xd89048), // nose
    ARGB32::from_rgb24(0xa82820), // arm
    ARGB32::from_rgb24(0x301850), // outline
  ],
  // SGB 1B
  [
    ARGB32::from_rgb24(0xd8d8c0), // BG
    ARGB32::from_rgb24(0xc8b070), // nose
    ARGB32::from_rgb24(0xb05010), // arm
    ARGB32::from_rgb24(0x000000), // outline
  ],
  // SGB 1C
  [
    ARGB32::from_rgb24(0xf8c0f8), // BG
    ARGB32::from_rgb24(0xe89850), // nose
    ARGB32::from_rgb24(0x983860), // arm
    ARGB32::from_rgb24(0x383898), // outline
  ],
  // SGB 1D
  [
    ARGB32::from_rgb24(0xf8f8a8), // BG
    ARGB32::from_rgb24(0xc08048), // nose
    ARGB32::from_rgb24(0xf80000), // arm
    ARGB32::from_rgb24(0x501800), // outline
  ],
  // SGB 1E
  [
    ARGB32::from_rgb24(0xf8d8b0), // BG
    ARGB32::from_rgb24(0x78c078), // nose
    ARGB32::from_rgb24(0x688840), // arm
    ARGB32::from_rgb24(0x583820), // outline
  ],
  // SGB 1F
  [
    ARGB32::from_rgb24(0xd8e8f8), // BG
    ARGB32::from_rgb24(0xe08850), // nose
    ARGB32::from_rgb24(0xa80000), // arm
    ARGB32::from_rgb24(0x004010), // outline
  ],
  // SGB 1G
  [
    ARGB32::from_rgb24(0x000050), // BG
    ARGB32::from_rgb24(0x00a0e8), // nose
    ARGB32::from_rgb24(0x787800), // arm
    ARGB32::from_rgb24(0xf8f858), // outline
  ],
  // SGB 1H
  [
    ARGB32::from_rgb24(0xf8e8e0), // BG
    ARGB32::from_rgb24(0xf8b888), // nose
    ARGB32::from_rgb24(0x804000), // arm
    ARGB32::from_rgb24(0x301800), // outline
  ],
  // SGB 2A
  [
    ARGB32::from_rgb24(0xf0c8a0), // BG
    ARGB32::from_rgb24(0xc08848), // nose
    ARGB32::from_rgb24(0x287800), // arm
    ARGB32::from_rgb24(0x000000), // outline
  ],
  // SGB 2B
  [
    ARGB32::from_rgb24(0xf8f8f8), // BG
    ARGB32::from_rgb24(0xf8e850), // nose
    ARGB32::from_rgb24(0xf83000), // arm
    ARGB32::from_rgb24(0x500058), // outline
  ],
  // SGB 2C
  [
    ARGB32::from_rgb24(0xf8c0f8), // BG
    ARGB32::from_rgb24(0xe88888), // nose
    ARGB32::from_rgb24(0x7830e8), // arm
    ARGB32::from_rgb24(0x282898), // outline
  ],
  // SGB 2D
  [
    ARGB32::from_rgb24(0xf8f8a0), // BG
    ARGB32::from_rgb24(0x00f800), // nose
    ARGB32::from_rgb24(0xf83000), // arm
    ARGB32::from_rgb24(0x000050), // outline
  ],
  // SGB 2E
  [
    ARGB32::from_rgb24(0xf8c880), // BG
    ARGB32::from_rgb24(0x90b0e0), // nose
    ARGB32::from_rgb24(0x281060), // arm
    ARGB32::from_rgb24(0x100810), // outline
  ],
  // SGB 2F
  [
    ARGB32::from_rgb24(0xd0f8f8), // BG
    ARGB32::from_rgb24(0xf89050), // nose
    ARGB32::from_rgb24(0xa00000), // arm
    ARGB32::from_rgb24(0x180000), // outline
  ],
  // SGB 2G
  [
    ARGB32::from_rgb24(0x68b838), // BG
    ARGB32::from_rgb24(0xe05040), // nose
    ARGB32::from_rgb24(0xe0b880), // arm
    ARGB32::from_rgb24(0x001800), // outline
  ],
  // SGB 2H
  [
    ARGB32::from_rgb24(0xf8f8f8), // BG
    ARGB32::from_rgb24(0xb8b8b8), // nose
    ARGB32::from_rgb24(0x707070), // arm
    ARGB32::from_rgb24(0x000000), // outline
  ],
  // SGB 3A
  [
    ARGB32::from_rgb24(0xf8d098), // BG
    ARGB32::from_rgb24(0x70c0c0), // nose
    ARGB32::from_rgb24(0xf86028), // arm
    ARGB32::from_rgb24(0x304860), // outline
  ],
  // SGB 3B
  [
    ARGB32::from_rgb24(0xd8d8c0), // BG
    ARGB32::from_rgb24(0xe08020), // nose
    ARGB32::from_rgb24(0x005000), // arm
    ARGB32::from_rgb24(0x001010), // outline
  ],
  // SGB 3C
  [
    ARGB32::from_rgb24(0xe0a8c8), // BG
    ARGB32::from_rgb24(0xf8f878), // nose
    ARGB32::from_rgb24(0x00b8f8), // arm
    ARGB32::from_rgb24(0x202058), // outline
  ],
  // SGB 3D
  [
    ARGB32::from_rgb24(0xf0f8b8), // BG
    ARGB32::from_rgb24(0xe0a878), // nose
    ARGB32::from_rgb24(0x08c800), // arm
    ARGB32::from_rgb24(0x000000), // outline
  ],
  // SGB 3E
  [
    ARGB32::from_rgb24(0xf8f8c0), // BG
    ARGB32::from_rgb24(0xe0b068), // nose
    ARGB32::from_rgb24(0xb07820), // arm
    ARGB32::from_rgb24(0x504870), // outline
  ],
  // SGB 3F
  [
    ARGB32::from_rgb24(0x7878c8), // BG
    ARGB32::from_rgb24(0xf868f8), // nose
    ARGB32::from_rgb24(0xf8d000), // arm
    ARGB32::from_rgb24(0x404040), // outline
  ],
  // SGB 3G
  [
    ARGB32::from_rgb24(0x60d850), // BG
    ARGB32::from_rgb24(0xf8f8f8), // nose
    ARGB32::from_rgb24(0xc83038), // arm
    ARGB32::from_rgb24(0x380000), // outline
  ],
  // SGB 3H
  [
    ARGB32::from_rgb24(0xe0f8a0), // BG
    ARGB32::from_rgb24(0x78c838), // nose
    ARGB32::from_rgb24(0x488818), // arm
    ARGB32::from_rgb24(0x081800), // outline
  ],
  // SGB 4A
  [
    ARGB32::from_rgb24(0xf0a868), // BG
    ARGB32::from_rgb24(0x78a8f8), // nose
    ARGB32::from_rgb24(0xd000d0), // arm
    ARGB32::from_rgb24(0x000078), // outline
  ],
  // SGB 4B
  [
    ARGB32::from_rgb24(0xf0e8f0), // BG
    ARGB32::from_rgb24(0xe8a060), // nose
    ARGB32::from_rgb24(0x407838), // arm
    ARGB32::from_rgb24(0x180808), // outline
  ],
  // SGB 4C
  [
    ARGB32::from_rgb24(0xf8e0e0), // BG
    ARGB32::from_rgb24(0xd8a0d0), // nose
    ARGB32::from_rgb24(0x98a0e0), // arm
    ARGB32::from_rgb24(0x080000), // outline
  ],
  // SGB 4D
  [
    ARGB32::from_rgb24(0xf8f8b8), // BG
    ARGB32::from_rgb24(0x90c8c8), // nose
    ARGB32::from_rgb24(0x486878), // arm
    ARGB32::from_rgb24(0x082048), // outline
  ],
  // SGB 4E
  [
    ARGB32::from_rgb24(0xf8d8a8), // BG
    ARGB32::from_rgb24(0xe0a878), // nose
    ARGB32::from_rgb24(0x785888), // arm
    ARGB32::from_rgb24(0x002030), // outline
  ],
  // SGB 4F
  [
    ARGB32::from_rgb24(0xb8d0d0), // BG
    ARGB32::from_rgb24(0xd880d8), // nose
    ARGB32::from_rgb24(0x8000a0), // arm
    ARGB32::from_rgb24(0x380000), // outline
  ],
  // SGB 4G
  [
    ARGB32::from_rgb24(0xb0e018), // BG
    ARGB32::from_rgb24(0xb82058), // nose
    ARGB32::from_rgb24(0x281000), // arm
    ARGB32::from_rgb24(0x008060), // outline
  ],
  // SGB 4H
  [
    ARGB32::from_rgb24(0xf8f8c8), // BG
    ARGB32::from_rgb24(0xb8c058), // nose
    ARGB32::from_rgb24(0x808840), // arm
    ARGB32::from_rgb24(0x405028), // outline
  ],
];