summaryrefslogtreecommitdiff
path: root/src/user/lib/draw
diff options
context:
space:
mode:
Diffstat (limited to 'src/user/lib/draw')
-rw-r--r--src/user/lib/draw/draw.c83
-rw-r--r--src/user/lib/draw/flush.c43
2 files changed, 0 insertions, 126 deletions
diff --git a/src/user/lib/draw/draw.c b/src/user/lib/draw/draw.c
deleted file mode 100644
index 1c2a371..0000000
--- a/src/user/lib/draw/draw.c
+++ /dev/null
@@ -1,83 +0,0 @@
-#include <camellia.h>
-#include <camellia/syscalls.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <draw.h>
-
-void dirty_reset(struct rect *d) {
- d->x1 = ~0; d->y1 = ~0;
- d->x2 = 0; d->y2 = 0;
-}
-
-void dirty_mark(struct rect *d, uint32_t x, uint32_t y) {
- if (d->x1 > x) d->x1 = x;
- if (d->x2 < x) d->x2 = x;
- if (d->y1 > y) d->y1 = y;
- if (d->y2 < y) d->y2 = y;
-}
-
-int fb_setup(struct framebuf *fb, const char *base) {
- char path[64], *spec;
- size_t pos;
- FILE *f;
-
- f = fopen(base, "r");
- if (!f) return -errno;
-
- pos = strlen(base);
- memcpy(path, base, pos);
- spec = path + pos;
- fread(spec, 1, sizeof(path) - pos, f);
- /* assumes the read went correctly */
- fclose(f);
-
- fb->fd = camellia_open(path, OPEN_RW);
- if (fb->fd < 0) return fb->fd;
-
- fb->width = strtol(spec, &spec, 0);
- if (*spec++ != 'x') return -EINVAL;
- fb->height = strtol(spec, &spec, 0);
- if (*spec++ != 'x') return -EINVAL;
- fb->bpp = strtol(spec, &spec, 0);
- if (fb->bpp != 32) return -EINVAL;
-
- fb->len = _sys_getsize(fb->fd);
- fb->pitch = fb->len / fb->height;
- fb->b = malloc(fb->len);
-
- _sys_read(fb->fd, fb->b, fb->len, 0);
-
- return 0;
-}
-
-int fb_anon(struct framebuf *fb, size_t w, size_t h) {
- fb->width = w;
- fb->height = h;
- fb->bpp = 32;
- fb->pitch = fb->width * fb->bpp / 8;
- fb->len = fb->pitch * fb->height;
- fb->b = malloc(fb->len);
- fb->fd = -1;
- return 0;
-}
-
-uint32_t *fb_pixel(struct framebuf *fb, uint32_t x, uint32_t y) {
- if (x < fb->width && y < fb->height)
- return (void*)fb->b + fb->pitch * y + 4 * x;
- return NULL;
-}
-
-void fb_cpy(
- struct framebuf *dest, const struct framebuf *src,
- size_t xd, size_t yd, size_t xs, size_t ys, size_t w, size_t h)
-{
- for (size_t y = 0; y < h; y++) {
- memcpy(
- fb_pixel( dest, xd, yd + y),
- fb_pixel((void*)src, xs, ys + y),
- w * 4
- );
- }
-}
diff --git a/src/user/lib/draw/flush.c b/src/user/lib/draw/flush.c
deleted file mode 100644
index 88bf3d6..0000000
--- a/src/user/lib/draw/flush.c
+++ /dev/null
@@ -1,43 +0,0 @@
-#include <camellia/execbuf.h>
-#include <camellia/syscalls.h>
-#include <draw.h>
-
-static void flush_combined(struct rect pix, struct framebuf *fb) {
- size_t low = fb->pitch * pix.y1 + 4 * pix.x1;
- size_t high = fb->pitch * pix.y2 + 4 * pix.y2 + 4;
- _sys_write(fb->fd, fb->b + low, high - low, low, 0);
-}
-
-static void flush_split(struct rect pix, struct framebuf *fb) {
- static uint64_t execbuf[EXECBUF_MAX_LEN / sizeof(uint64_t)];
- size_t epos = 0;
- if (7 * (pix.y2 - pix.y1) * sizeof(uint64_t) >= sizeof execbuf) {
- flush_combined(pix, fb);
- return;
- }
-
- for (uint32_t y = pix.y1; y < pix.y2; y++) {
- size_t low = fb->pitch * y + 4 * pix.x1;
- size_t high = fb->pitch * y + 4 * pix.x2 + 4;
-
- execbuf[epos++] = EXECBUF_SYSCALL;
- execbuf[epos++] = _SYS_WRITE;
- execbuf[epos++] = fb->fd;
- execbuf[epos++] = (uintptr_t)fb->b + low;
- execbuf[epos++] = high - low;
- execbuf[epos++] = low;
- execbuf[epos++] = 0;
- }
- _sys_execbuf(execbuf, epos * sizeof(uint64_t));
-}
-
-void dirty_flush(struct rect *d, struct framebuf *fb) {
- if (~d->x1 == 0) return;
- if (d->x2 >= fb->width) d->x2 = fb->width - 1;
- if (d->y2 >= fb->height) d->y2 = fb->height - 1;
-
- /* the threshold is mostly arbitrary, wasn't based on any real benchmarks */
- if (d->x2 - d->x1 > fb->width - 600) flush_combined(*d, fb);
- else flush_split(*d, fb);
- dirty_reset(d);
-}