| 1 | // This file is part of SmallBASIC |
| 2 | // |
| 3 | // Copyright(C) 2001-2021 Chris Warren-Smith. |
| 4 | // |
| 5 | // This program is distributed under the terms of the GPL v2.0 or later |
| 6 | // Download the GNU Public License (GPL) from www.gnu.org |
| 7 | // |
| 8 | |
| 9 | #ifndef UI_RGB |
| 10 | #define UI_RGB |
| 11 | |
| 12 | typedef uint32_t pixel_t; |
| 13 | |
| 14 | #if defined(_SDL) |
| 15 | #define PIXELFORMAT SDL_PIXELFORMAT_RGB888 |
| 16 | #elif defined(_ANDROID) |
| 17 | #define PIXELFORMAT AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM |
| 18 | #endif |
| 19 | |
| 20 | inline void v_get_argb(int64_t c, uint8_t &a, uint8_t &r, uint8_t &g, uint8_t &b) { |
| 21 | if (c == 0) { |
| 22 | a = 0; |
| 23 | r = 0; |
| 24 | g = 0; |
| 25 | b = 0; |
| 26 | } else if (c < 0) { |
| 27 | // from RGB |
| 28 | a = 255; |
| 29 | r = (-c & 0xff0000) >> 16; |
| 30 | g = (-c & 0xff00) >> 8; |
| 31 | b = (-c & 0xff); |
| 32 | } else { |
| 33 | a = (c & 0xff000000) >> 24; |
| 34 | r = (c & 0xff0000) >> 16; |
| 35 | g = (c & 0xff00) >> 8; |
| 36 | b = (c & 0xff); |
| 37 | } |
| 38 | } |
| 39 | |
| 40 | #define v_get_argb_px(a, r, g, b) (a << 24 | (r << 16) | (g << 8) | (b)) |
| 41 | |
| 42 | #if defined(_SDL) |
| 43 | // SDL_PACKEDORDER_XRGB |
| 44 | // A = byte 3 |
| 45 | // R = byte 2 |
| 46 | // G = byte 1 |
| 47 | // B = byte 0 |
| 48 | |
| 49 | #define GET_RGB_PX(r, g, b) ((0xff000000) | (r << 16) | (g << 8) | (b)) |
| 50 | |
| 51 | // same as internal format |
| 52 | #define GET_FROM_RGB888(c) (c) |
| 53 | |
| 54 | inline void GET_RGB(pixel_t c, uint8_t &r, uint8_t &g, uint8_t &b) { |
| 55 | r = (c & 0xff0000) >> 16; |
| 56 | g = (c & 0xff00) >> 8; |
| 57 | b = (c & 0xff); |
| 58 | } |
| 59 | |
| 60 | inline void GET_IMAGE_ARGB(const uint8_t *image, unsigned offs, uint8_t &a, uint8_t &r, uint8_t &g, uint8_t &b) { |
| 61 | a = image[offs + 3]; |
| 62 | r = image[offs + 2]; |
| 63 | g = image[offs + 1]; |
| 64 | b = image[offs + 0]; |
| 65 | } |
| 66 | |
| 67 | inline void SET_IMAGE_ARGB(uint8_t *image, unsigned offs, uint8_t a, uint8_t r, uint8_t g, uint8_t b) { |
| 68 | image[offs + 3] = a; |
| 69 | image[offs + 2] = r; |
| 70 | image[offs + 1] = g; |
| 71 | image[offs + 0] = b; |
| 72 | } |
| 73 | |
| 74 | #else |
| 75 | |
| 76 | #define GET_RGB_PX(r, g, b) ((0xff000000) | (b << 16) | (g << 8) | (r)) |
| 77 | |
| 78 | inline pixel_t GET_FROM_RGB888(unsigned c) { |
| 79 | uint8_t r = (c & 0xff0000) >> 16; |
| 80 | uint8_t g = (c & 0xff00) >> 8; |
| 81 | uint8_t b = (c & 0xff); |
| 82 | return ((0xff000000) | (b << 16) | (g << 8) | (r)); |
| 83 | } |
| 84 | |
| 85 | inline void GET_RGB(pixel_t c, uint8_t &r, uint8_t &g, uint8_t &b) { |
| 86 | b = (c & 0xff0000) >> 16; |
| 87 | g = (c & 0xff00) >> 8; |
| 88 | r = (c & 0xff); |
| 89 | } |
| 90 | |
| 91 | inline void GET_IMAGE_ARGB(const uint8_t *image, unsigned offs, uint8_t &a, uint8_t &r, uint8_t &g, uint8_t &b) { |
| 92 | a = image[offs + 3]; |
| 93 | b = image[offs + 2]; |
| 94 | g = image[offs + 1]; |
| 95 | r = image[offs + 0]; |
| 96 | } |
| 97 | |
| 98 | inline void SET_IMAGE_ARGB(uint8_t *image, unsigned offs, uint8_t a, uint8_t r, uint8_t g, uint8_t b) { |
| 99 | image[offs + 3] = a; |
| 100 | image[offs + 2] = b; |
| 101 | image[offs + 1] = g; |
| 102 | image[offs + 0] = r; |
| 103 | } |
| 104 | |
| 105 | #endif |
| 106 | |
| 107 | #endif |
| 108 | |