From dcc3a41036f374a48b2b1791575e11e5e3f09d02 Mon Sep 17 00:00:00 2001 From: Ingo Albrecht Date: Wed, 1 Sep 2010 21:24:34 +0200 Subject: ui: Some experimental code snippets i cobbled together several months ago. --- src/target/ui-experiment/image.h | 166 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 src/target/ui-experiment/image.h (limited to 'src/target/ui-experiment/image.h') diff --git a/src/target/ui-experiment/image.h b/src/target/ui-experiment/image.h new file mode 100644 index 00000000..13c11f5b --- /dev/null +++ b/src/target/ui-experiment/image.h @@ -0,0 +1,166 @@ + +#ifndef _UI_IMAGE_H +#define _UI_IMAGE_H + +/* for exit() */ +#include + +#include +#include + +struct image { + pxtype_t type; + pxdims_t size; + unsigned char *data; +}; + + +struct image font_img_v = { + .type = PXTYPE_MONO_V8, + .size = {8, 2048}, + .data = &fontdata_r8x8, +}; + +struct image font_img_h = { + .type = PXTYPE_MONO_H8, + .size = {8, 2048}, + .data = &fontdata_r8x8_horiz, +}; + +px_t +image_get_pixel(struct image *img, pxoff_t x, pxoff_t y) { + unsigned stride, base, offset; + const uint8_t *p8; + const uint16_t *p16; + + switch(img->type) { + case PXTYPE_MONO_V8: + stride = img->size.w; + base = y / 8; + offset = y % 8; + p8 = (uint8_t*)(img->data + x + base * stride); + return px_from_mono(((*p8) >> offset) & 1); + case PXTYPE_MONO_H8: + stride = img->size.w / 8; + base = x / 8; + offset = x % 8; + p8 = (uint8_t*)(img->data + base + y * stride); + return px_from_mono(((*p8) >> offset) & 1); + case PXTYPE_RGB444: + stride = img->size.w * 2; + p16 = (uint16_t*)(img->data + x * 2 + y * stride); + return px_from_rgb444(*p16); + } + + return 0; +} + +void +image_set_pixel(struct image *img, pxoff_t x, pxoff_t y, px_t v) { + unsigned stride, base, offset; + uint8_t *p8; + uint16_t *p16; + + switch(img->type) { + case PXTYPE_MONO_V8: + stride = img->size.w; + base = y / 8; + offset = y % 8; + p8 = (uint8_t*)(img->data + x + base * stride); + *p8 |= (px_to_mono(v) << offset); + break; + case PXTYPE_MONO_H8: + stride = img->size.w / 8; + base = x / 8; + offset = x % 8; + p8 = (uint8_t*)(img->data + base + y * stride); + *p8 |= (px_to_mono(v) << offset); + break; + case PXTYPE_RGB444: + stride = img->size.w * 2; + p16 = (uint16_t*)(img->data + x * 2 + y * stride); + *p16 = px_to_rgb444(v); + break; + } +} + +void +image_blit(struct image *dst, pxposn_t dstp, + struct image *src, pxposn_t srcp, + pxdims_t d) +{ + unsigned x, y, s; + + printf("blit %dx%d from %dx%d to %dx%d\n", d.w, d.h, srcp.x, srcp.y, dstp.x, dstp.y); + + // *cough* slow. + for(y = 0; y < d.h; y++) { + for(x = 0; x < d.w; x++) { + px_t p = image_get_pixel(src, srcp.x + x, srcp.y + y); + image_set_pixel(dst, dstp.x + x, dstp.y + y, p); + } + } +} + +void +image_draw_char(struct image *dst, pxposn_t p, char chr) { + unsigned char c = (unsigned char)chr; + pxposn_t pf = {0,c*8}; + pxdims_t d = {8,8}; + image_blit(dst, p, &font_img_h, pf, d); +} + +void +image_draw_string(struct image *dst, pxposn_t p, char *str) { + while(*str) { + image_draw_char(dst, p, *str); + p.x += 8; + str++; + } +} + +static void +image_fill_rect_rgb444(struct image *dst, pxrect_t rect, uint16_t color) { + unsigned x, y, s; + uint16_t *p; + + unsigned stride = dst->size.w * 2; + + for(y = rect.p.y; y < rect.p.y + rect.d.h; y++) { + for(x = rect.p.x; x < rect.p.x + rect.d.w; x++) { + p = (uint16_t*)&dst->data[x * 2 + y * stride]; + *p = color; + } + } +} + +void +image_fill_rect(struct image *dst, pxrect_t rect, px_t color) +{ + switch(dst->type) { + case PXTYPE_MONO_V8: + break; + case PXTYPE_MONO_H8: + break; + case PXTYPE_RGB444: + image_fill_rect_rgb444(dst, rect, px_to_rgb444(color)); + break; + } +} + +void +image_draw_hline(struct image *dst, pxposn_t posn, pxoff_t len, px_t color) +{ +} + +void +image_draw_vline(struct image *dst, pxposn_t posn, pxoff_t len, px_t color) +{ +} + +void +image_draw_rect(struct image *dst, pxrect_t rect, px_t color) +{ +} + +#endif -- cgit v1.2.3