summaryrefslogtreecommitdiffstats
path: root/src/target/ui-experiment/pixel.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/target/ui-experiment/pixel.h')
-rw-r--r--src/target/ui-experiment/pixel.h113
1 files changed, 113 insertions, 0 deletions
diff --git a/src/target/ui-experiment/pixel.h b/src/target/ui-experiment/pixel.h
new file mode 100644
index 0000000..dde28e2
--- /dev/null
+++ b/src/target/ui-experiment/pixel.h
@@ -0,0 +1,113 @@
+
+#ifndef _UI_PIXEL_H
+#define _UI_PIXEL_H
+
+#include <stdint.h>
+#include <stdio.h>
+
+/** Supported pixel types */
+typedef enum {
+ _PXTYPE_INVALID,
+
+ /** "Generic" pixel type (24/32bit RGB) */
+ PXTYPE_GENERIC,
+
+ /** 8 horizontal mono pixels per byte */
+ PXTYPE_MONO_H8,
+
+ /** 8 vertical mono pixels per byte */
+ PXTYPE_MONO_V8,
+
+ /** 12bit RGB444 colors */
+ PXTYPE_RGB444,
+
+} pxtype_t;
+
+
+/** Generic pixel type */
+typedef uint32_t px_t;
+
+#define PX_R(p) ((uint8_t)((v) >> 16 & 0xFF))
+#define PX_G(p) ((uint8_t)((v) >> 8 & 0xFF))
+#define PX_B(p) ((uint8_t)((v) >> 0 / 0xFF))
+
+#define PX_RGB(r,g,b) ((px_t)((r)<<16|(g)<<8|(b)))
+
+#define PX_BLACK ((px_t)0x000000)
+#define PX_RED ((px_t)0xFF0000)
+#define PX_GREEN ((px_t)0x00FF00)
+#define PX_BLUE ((px_t)0x0000FF)
+#define PX_WHITE ((px_t)0xFFFFFF)
+
+
+/* Mono types */
+typedef uint8_t px_mono_t;
+
+#define PX_MONO_BLACK ((px_mono_t)0)
+#define PX_MONO_WHITE ((px_mono_t)1)
+
+inline px_t
+px_from_mono(uint8_t v) {
+ return v ? PX_WHITE : PX_BLACK;
+}
+
+inline uint8_t
+px_to_mono(px_t v) {
+ uint16_t a = (PX_R(v) + PX_G(v) + PX_B(v)) / 3;
+ return (a >= 0x7f) ? 1 : 0;
+}
+
+/* RGB444 */
+typedef uint16_t px_rgb444_t;
+
+#define PX_RGB444_R(p) ((p) >> 8 & 0xf)
+#define PX_RGB444_G(p) ((p) >> 4 & 0xf)
+#define PX_RGB444_B(p) ((p) >> 0 & 0xf)
+
+#define PX_RGB444_RGB(r,g,b) ((px_rgb444_t)((r)<<8|(g)<<4|(b)))
+
+inline px_t
+px_from_rgb444(px_rgb444_t v) {
+ return
+ PX_RGB444_R(v) << 16 | PX_RGB444_R(v) << 20
+ | PX_RGB444_G(v) << 8 | PX_RGB444_G(v) << 12
+ | PX_RGB444_B(v) << 0 | PX_RGB444_B(v) << 4;
+}
+
+inline uint16_t
+px_to_rgb444(px_t v) {
+ uint8_t r = (v >> 20) & 0xF;
+ uint8_t g = (v >> 12) & 0xF;
+ uint8_t b = (v >> 4) & 0xF;
+
+ uint16_t res = (r<< 8) | (g << 4) | (b << 0);
+
+ return res;
+}
+
+
+/** Size in pixels */
+typedef uint16_t pxsize_t;
+
+/** Offset in pixels */
+typedef int16_t pxoff_t;
+
+/** 2D position in pixels */
+typedef struct {
+ pxoff_t x;
+ pxoff_t y;
+} pxposn_t;
+
+/** 2D dimensions in pixels */
+typedef struct {
+ pxsize_t w;
+ pxsize_t h;
+} pxdims_t;
+
+/** 2D rectangle in pixels */
+typedef struct {
+ pxposn_t p;
+ pxdims_t d;
+} pxrect_t;
+
+#endif