1 | /* |
2 | * Copyright (c) 2023. |
3 | * |
4 | * This software is free software; |
5 | * |
6 | * You can redistribute it or modify it under terms of the MIT, Apache License or Zlib license |
7 | */ |
8 | |
9 | //! Image Colorspace information and manipulation utilities. |
10 | |
11 | /// All possible image colorspaces |
12 | /// Some of them aren't yet supported exist here. |
13 | #[allow (clippy::upper_case_acronyms)] |
14 | #[derive (Copy, Clone, Debug, Eq, PartialEq)] |
15 | #[non_exhaustive ] |
16 | pub enum ColorSpace { |
17 | /// Red, Green , Blue |
18 | RGB, |
19 | /// Red, Green, Blue, Alpha |
20 | RGBA, |
21 | /// YUV colorspace |
22 | YCbCr, |
23 | /// Grayscale colorspace |
24 | Luma, |
25 | /// Grayscale with alpha colorspace |
26 | LumaA, |
27 | YCCK, |
28 | /// Cyan , Magenta, Yellow, Black |
29 | CMYK, |
30 | /// Blue, Green, Red |
31 | BGR, |
32 | /// Blue, Green, Red, Alpha |
33 | BGRA, |
34 | /// The colorspace is unknown |
35 | Unknown, |
36 | /// Alpha Red Green Blue |
37 | ARGB, |
38 | /// Hue,Saturation,Lightness |
39 | /// Conversion from RGB to HSL and back matches that of Python [colorsys](https://docs.python.org/3/library/colorsys.html) module |
40 | /// Color type is expected to be in floating point |
41 | HSL, |
42 | /// Hue, Saturation,Value |
43 | /// |
44 | /// Conversion from RGB to HSV and back matches that of Python [colorsys](https://docs.python.org/3/library/colorsys.html) module |
45 | /// Color type is expected to be in floating point |
46 | HSV |
47 | } |
48 | |
49 | impl ColorSpace { |
50 | /// Number of color channels present for a certain colorspace |
51 | /// |
52 | /// E.g. RGB returns 3 since it contains R,G and B colors to make up a pixel |
53 | pub const fn num_components(&self) -> usize { |
54 | match self { |
55 | Self::RGB | Self::YCbCr | Self::BGR | Self::HSV | Self::HSL => 3, |
56 | Self::RGBA | Self::YCCK | Self::CMYK | Self::BGRA | Self::ARGB => 4, |
57 | Self::Luma => 1, |
58 | Self::LumaA => 2, |
59 | Self::Unknown => 0 |
60 | } |
61 | } |
62 | |
63 | pub const fn has_alpha(&self) -> bool { |
64 | matches!(self, Self::RGBA | Self::LumaA | Self::BGRA | Self::ARGB) |
65 | } |
66 | |
67 | pub const fn is_grayscale(&self) -> bool { |
68 | matches!(self, Self::LumaA | Self::Luma) |
69 | } |
70 | |
71 | /// Returns the position of the alpha pixel in a pixel |
72 | /// |
73 | /// |
74 | /// That is for an array of color components say `[0,1,2,3]` if the image has an alpha channel |
75 | /// and is in RGBA format, this will return `Some(3)`, indicating alpha is found in the third index |
76 | /// but if the image is in `ARGB` format, it will return `Some(0)` indicating alpha is found in |
77 | /// index 0 |
78 | /// |
79 | /// If an image doesn't have an alpha channel returns `None` |
80 | /// |
81 | pub const fn alpha_position(&self) -> Option<usize> { |
82 | match self { |
83 | ColorSpace::RGBA => Some(3), |
84 | ColorSpace::LumaA => Some(1), |
85 | ColorSpace::BGRA => Some(3), |
86 | ColorSpace::ARGB => Some(0), |
87 | _ => None |
88 | } |
89 | } |
90 | } |
91 | |
92 | /// Encapsulates all colorspaces supported by |
93 | /// the library |
94 | pub static ALL_COLORSPACES: [ColorSpace; 12] = [ |
95 | ColorSpace::RGB, |
96 | ColorSpace::RGBA, |
97 | ColorSpace::LumaA, |
98 | ColorSpace::Luma, |
99 | ColorSpace::CMYK, |
100 | ColorSpace::BGRA, |
101 | ColorSpace::BGR, |
102 | ColorSpace::YCCK, |
103 | ColorSpace::YCbCr, |
104 | ColorSpace::ARGB, |
105 | ColorSpace::HSL, |
106 | ColorSpace::HSV |
107 | ]; |
108 | |
109 | /// Color characteristics |
110 | /// |
111 | /// Gives more information about values in a certain |
112 | /// colorspace |
113 | #[allow (non_camel_case_types)] |
114 | #[derive (Copy, Clone, Debug, PartialEq)] |
115 | pub enum ColorCharacteristics { |
116 | /// Normal default gamma setting |
117 | /// The float contains gamma present |
118 | /// |
119 | /// The default gamma value is 2.2 but for |
120 | /// decoders that allow specifying gamma values,e.g PNG, |
121 | /// the gamma value becomes the specified value by the decoder |
122 | sRGB, |
123 | /// Linear transfer characteristics |
124 | /// The image is in linear colorspace |
125 | Linear |
126 | } |
127 | |