summaryrefslogtreecommitdiff
path: root/userland
diff options
context:
space:
mode:
Diffstat (limited to 'userland')
-rw-r--r--userland/windowserver/draw.c22
-rw-r--r--userland/windowserver/draw.h4
-rw-r--r--userland/windowserver/ws.c27
-rw-r--r--userland/windowserver/ws.h5
4 files changed, 39 insertions, 19 deletions
diff --git a/userland/windowserver/draw.c b/userland/windowserver/draw.c
index cf3cd99..31e4301 100644
--- a/userland/windowserver/draw.c
+++ b/userland/windowserver/draw.c
@@ -2,10 +2,13 @@
#include <string.h>
#define place_pixel(_p, _w, _h) \
- { *(uint32_t *)(disp->back_buffer + BPP * (_w) + (WIDTH * BPP * (_h))) = _p; }
+ { \
+ *(uint32_t *)(disp->back_buffer + disp->bpp * (_w) + \
+ (disp->width * disp->bpp * (_h))) = _p; \
+ }
#define place_pixel_pos(_p, _pos) \
- { *(uint32_t *)(disp->back_buffer + BPP * (_pos)) = _p; }
+ { *(uint32_t *)(disp->back_buffer + disp->bpp * (_pos)) = _p; }
int mx;
int my;
@@ -18,7 +21,7 @@ void update_display(DISPLAY *disp) {
}
uint32_t *dst = disp->true_buffer;
uint32_t *src = disp->back_buffer;
- for (int i = 0; i < disp->size / BPP; i++) {
+ for (int i = 0; i < disp->size / disp->bpp; i++) {
*dst = *src;
dst++;
src++;
@@ -28,7 +31,7 @@ void update_display(DISPLAY *disp) {
void draw_wallpaper(DISPLAY *disp) {
uint32_t *dst = disp->back_buffer;
uint32_t *src = disp->wallpaper_buffer;
- for (int i = 0; i < disp->size / BPP; i++) {
+ for (int i = 0; i < disp->size / disp->bpp; i++) {
*dst = *src;
dst++;
src++;
@@ -46,12 +49,13 @@ void draw_line(DISPLAY *disp, int sx, int sy, int dx, int dy, uint32_t color) {
int y = sy;
for (;;) {
// Bounds checking
- if (y * WIDTH + x > HEIGHT * WIDTH)
+ if (y * disp->width + x > disp->height * disp->width)
break;
if (x >= dx - 1 && y >= dy - 1)
break;
- uint32_t *ptr = disp->back_buffer + (BPP * y * WIDTH) + (x * BPP);
+ uint32_t *ptr =
+ disp->back_buffer + (disp->bpp * y * disp->width) + (x * disp->bpp);
*ptr = color;
if (x < dx - 1)
x++;
@@ -82,10 +86,10 @@ void draw_window(DISPLAY *disp, const WINDOW *w) {
}
for (int i = 0; i < sy; i++) {
- if ((i + py) * WIDTH + px > HEIGHT * WIDTH)
+ if ((i + py) * disp->width + px > disp->height * disp->width)
break;
- uint32_t *ptr = disp->back_buffer + BPP * ((i + py) * WIDTH) + px * BPP;
- if (i * sx > HEIGHT * WIDTH)
+ uint32_t *ptr = disp->back_buffer + disp->bpp * ((i + py) * disp->width) + px * disp->bpp;
+ if (i * sx > disp->height * disp->width)
break;
uint32_t *bm = &w->bitmap_ptr[i * sx];
for (int j = 0; j < sx; j++) {
diff --git a/userland/windowserver/draw.h b/userland/windowserver/draw.h
index cebe0fa..f7ade64 100644
--- a/userland/windowserver/draw.h
+++ b/userland/windowserver/draw.h
@@ -2,10 +2,6 @@
#define DRAW_H
#include "ws.h"
-#define WIDTH 0x500
-#define HEIGHT 0x320
-#define BPP 4
-
void draw_wallpaper(DISPLAY *disp);
void draw_window(DISPLAY *disp, const WINDOW *w);
void update_full_display(DISPLAY *disp, int mouse_x, int mouse_y);
diff --git a/userland/windowserver/ws.c b/userland/windowserver/ws.c
index 3d6e10f..d04dd08 100644
--- a/userland/windowserver/ws.c
+++ b/userland/windowserver/ws.c
@@ -69,13 +69,30 @@ void setup_display(DISPLAY *disp, const char *path, uint64_t size) {
void *rc = mmap(NULL, size, 0, 0, disp->wallpaper_fd, 0);
assert(rc);
disp->wallpaper_buffer = rc;
- for (int i = 0; i < disp->size / BPP; i++) {
+ for (int i = 0; i < disp->size / disp->bpp; i++) {
uint32_t *p = disp->wallpaper_buffer + i * sizeof(uint32_t);
*p = 0xFFFFFF;
}
}
+struct DISPLAY_INFO {
+ uint32_t width;
+ uint32_t height;
+ uint8_t bpp;
+};
+
void setup(void) {
+ struct DISPLAY_INFO disp_info;
+ {
+ int info_fd = open("/dev/display_info", O_READ, 0);
+ assert(sizeof(disp_info) == read(info_fd, &disp_info, sizeof(disp_info)));
+ close(info_fd);
+ }
+
+ main_display.width = disp_info.width;
+ main_display.height = disp_info.height;
+ main_display.bpp = disp_info.bpp/8;
+
setup_display(&main_display, "/dev/vbe", 0xBB8000);
draw_wallpaper(&main_display);
update_display(&main_display);
@@ -207,11 +224,11 @@ void clamp_screen_position(int *x, int *y) {
if (0 > *y) {
*y = 0;
}
- if (WIDTH < *x) {
- *x = WIDTH;
+ if (main_display.width < *x) {
+ *x = main_display.width;
}
- if (HEIGHT < *y) {
- *y = HEIGHT;
+ if (main_display.height < *y) {
+ *y = main_display.height;
}
}
diff --git a/userland/windowserver/ws.h b/userland/windowserver/ws.h
index 241c960..6f8eee3 100644
--- a/userland/windowserver/ws.h
+++ b/userland/windowserver/ws.h
@@ -22,7 +22,10 @@ typedef struct {
uint8_t *wallpaper_buffer;
uint8_t *back_buffer;
uint8_t *true_buffer;
- size_t size;
+ uint32_t size;
+ uint32_t width;
+ uint32_t height;
+ uint32_t bpp;
uint8_t border_size;
uint8_t border_color;
uint8_t wallpaper_color;