diff options
Diffstat (limited to 'userland/windowserver')
| -rw-r--r-- | userland/windowserver/draw.c | 22 | ||||
| -rw-r--r-- | userland/windowserver/draw.h | 4 | ||||
| -rw-r--r-- | userland/windowserver/ws.c | 27 | ||||
| -rw-r--r-- | userland/windowserver/ws.h | 5 | 
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; |