1 // Aseprite Document Library
2 // Copyright (c) 2001-2016 David Capello
3 //
4 // This file is released under the terms of the MIT license.
5 // Read LICENSE.txt for more information.
6 
7 #ifndef DOC_COLOR_H_INCLUDED
8 #define DOC_COLOR_H_INCLUDED
9 #pragma once
10 
11 #include "base/ints.h"
12 
13 namespace doc {
14 
15   // The greatest int type to storage a color for an image in the
16   // available pixel formats.
17   typedef uint32_t color_t;
18 
19   //////////////////////////////////////////////////////////////////////
20   // RGBA
21 
22   const uint32_t rgba_r_shift = 0;
23   const uint32_t rgba_g_shift = 8;
24   const uint32_t rgba_b_shift = 16;
25   const uint32_t rgba_a_shift = 24;
26 
27   const uint32_t rgba_r_mask = 0x000000ff;
28   const uint32_t rgba_g_mask = 0x0000ff00;
29   const uint32_t rgba_b_mask = 0x00ff0000;
30   const uint32_t rgba_rgb_mask = 0x00ffffff;
31   const uint32_t rgba_a_mask = 0xff000000;
32 
rgba_getr(uint32_t c)33   inline uint8_t rgba_getr(uint32_t c) {
34     return (c >> rgba_r_shift) & 0xff;
35   }
36 
rgba_getg(uint32_t c)37   inline uint8_t rgba_getg(uint32_t c) {
38     return (c >> rgba_g_shift) & 0xff;
39   }
40 
rgba_getb(uint32_t c)41   inline uint8_t rgba_getb(uint32_t c) {
42     return (c >> rgba_b_shift) & 0xff;
43   }
44 
rgba_geta(uint32_t c)45   inline uint8_t rgba_geta(uint32_t c) {
46     return (c >> rgba_a_shift) & 0xff;
47   }
48 
rgba(uint8_t r,uint8_t g,uint8_t b,uint8_t a)49   inline uint32_t rgba(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
50     return ((r << rgba_r_shift) |
51             (g << rgba_g_shift) |
52             (b << rgba_b_shift) |
53             (a << rgba_a_shift));
54   }
55 
rgb_luma(int r,int g,int b)56   inline int rgb_luma(int r, int g, int b) {
57     return (r*2126 + g*7152 + b*722) / 10000;
58   }
59 
rgba_luma(uint32_t c)60   inline uint8_t rgba_luma(uint32_t c) {
61     return rgb_luma(rgba_getr(c), rgba_getg(c), rgba_getb(c));
62   }
63 
64   //////////////////////////////////////////////////////////////////////
65   // Grayscale
66 
67   const uint16_t graya_v_shift = 0;
68   const uint16_t graya_a_shift = 8;
69 
70   const uint16_t graya_v_mask = 0x00ff;
71   const uint16_t graya_a_mask = 0xff00;
72 
graya_getv(uint16_t c)73   inline uint8_t graya_getv(uint16_t c) {
74     return (c >> graya_v_shift) & 0xff;
75   }
76 
graya_geta(uint16_t c)77   inline uint8_t graya_geta(uint16_t c) {
78     return (c >> graya_a_shift) & 0xff;
79   }
80 
graya(uint8_t v,uint8_t a)81   inline uint16_t graya(uint8_t v, uint8_t a) {
82     return ((v << graya_v_shift) |
83             (a << graya_a_shift));
84   }
85 
gray(uint8_t v)86   inline uint16_t gray(uint8_t v) {
87     return graya(v, 255);
88   }
89 
90 } // namespace doc
91 
92 #endif
93