Commit 2aebb3eb2b939d996ef6a905b42c70931e02a8ba

Authored by bellard
1 parent 95917e3f

blanking support


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@726 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 50 additions and 6 deletions
hw/vga.c
... ... @@ -109,7 +109,8 @@ typedef struct VGAState {
109 109 uint32_t line_compare;
110 110 uint32_t start_addr;
111 111 uint8_t last_cw, last_ch;
112   - uint32_t last_width, last_height;
  112 + uint32_t last_width, last_height; /* in chars or pixels */
  113 + uint32_t last_scr_width, last_scr_height; /* in pixels */
113 114 uint8_t cursor_start, cursor_end;
114 115 uint32_t cursor_offset;
115 116 unsigned int (*rgb_to_pixel)(unsigned int r, unsigned int g, unsigned b);
... ... @@ -1155,7 +1156,9 @@ static void vga_draw_text(VGAState *s, int full_update)
1155 1156 }
1156 1157 if (width != s->last_width || height != s->last_height ||
1157 1158 cw != s->last_cw || cheight != s->last_ch) {
1158   - dpy_resize(s->ds, width * cw, height * cheight);
  1159 + s->last_scr_width = width * cw;
  1160 + s->last_scr_height = height * cheight;
  1161 + dpy_resize(s->ds, s->last_scr_width, s->last_scr_height);
1159 1162 s->last_width = width;
1160 1163 s->last_height = height;
1161 1164 s->last_ch = cheight;
... ... @@ -1412,6 +1415,8 @@ static void vga_draw_graphic(VGAState *s, int full_update)
1412 1415 if (disp_width != s->last_width ||
1413 1416 height != s->last_height) {
1414 1417 dpy_resize(s->ds, disp_width, height);
  1418 + s->last_scr_width = disp_width;
  1419 + s->last_scr_height = height;
1415 1420 s->last_width = disp_width;
1416 1421 s->last_height = height;
1417 1422 full_update = 1;
... ... @@ -1494,6 +1499,33 @@ static void vga_draw_graphic(VGAState *s, int full_update)
1494 1499 }
1495 1500 }
1496 1501  
  1502 +static void vga_draw_blank(VGAState *s, int full_update)
  1503 +{
  1504 + int i, w, val;
  1505 + uint8_t *d;
  1506 +
  1507 + if (!full_update)
  1508 + return;
  1509 + if (s->last_scr_width <= 0 || s->last_scr_height <= 0)
  1510 + return;
  1511 + if (s->ds->depth == 8)
  1512 + val = s->rgb_to_pixel(0, 0, 0);
  1513 + else
  1514 + val = 0;
  1515 + w = s->last_scr_width * ((s->ds->depth + 7) >> 3);
  1516 + d = s->ds->data;
  1517 + for(i = 0; i < s->last_scr_height; i++) {
  1518 + memset(d, val, w);
  1519 + d += s->ds->linesize;
  1520 + }
  1521 + dpy_update(s->ds, 0, 0,
  1522 + s->last_scr_width, s->last_scr_height);
  1523 +}
  1524 +
  1525 +#define GMODE_TEXT 0
  1526 +#define GMODE_GRAPH 1
  1527 +#define GMODE_BLANK 2
  1528 +
1497 1529 void vga_update_display(void)
1498 1530 {
1499 1531 VGAState *s = &vga_state;
... ... @@ -1519,15 +1551,27 @@ void vga_update_display(void)
1519 1551 }
1520 1552  
1521 1553 full_update = 0;
1522   - graphic_mode = s->gr[6] & 1;
  1554 + if (!(s->ar_index & 0x20)) {
  1555 + graphic_mode = GMODE_BLANK;
  1556 + } else {
  1557 + graphic_mode = s->gr[6] & 1;
  1558 + }
1523 1559 if (graphic_mode != s->graphic_mode) {
1524 1560 s->graphic_mode = graphic_mode;
1525 1561 full_update = 1;
1526 1562 }
1527   - if (graphic_mode)
1528   - vga_draw_graphic(s, full_update);
1529   - else
  1563 + switch(graphic_mode) {
  1564 + case GMODE_TEXT:
1530 1565 vga_draw_text(s, full_update);
  1566 + break;
  1567 + case GMODE_GRAPH:
  1568 + vga_draw_graphic(s, full_update);
  1569 + break;
  1570 + case GMODE_BLANK:
  1571 + default:
  1572 + vga_draw_blank(s, full_update);
  1573 + break;
  1574 + }
1531 1575 }
1532 1576 }
1533 1577  
... ...