Commit 59a983b921e8318ae8da357aacd496c3ab5bbc5b

Authored by bellard
1 parent 4e463d8d

device independent VGA screen dump


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@668 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 3 changed files with 116 additions and 23 deletions
hw/vga.c
... ... @@ -737,7 +737,7 @@ static uint32_t vga_mem_readl(uint32_t addr)
737 737 }
738 738  
739 739 /* called for accesses between 0xa0000 and 0xc0000 */
740   -void vga_mem_writeb(uint32_t addr, uint32_t val, uint32_t vaddr)
  740 +static void vga_mem_writeb(uint32_t addr, uint32_t val, uint32_t vaddr)
741 741 {
742 742 VGAState *s = &vga_state;
743 743 int memory_map_mode, plane, write_mode, b, func_select;
... ... @@ -865,13 +865,13 @@ void vga_mem_writeb(uint32_t addr, uint32_t val, uint32_t vaddr)
865 865 }
866 866 }
867 867  
868   -void vga_mem_writew(uint32_t addr, uint32_t val, uint32_t vaddr)
  868 +static void vga_mem_writew(uint32_t addr, uint32_t val, uint32_t vaddr)
869 869 {
870 870 vga_mem_writeb(addr, val & 0xff, vaddr);
871 871 vga_mem_writeb(addr + 1, (val >> 8) & 0xff, vaddr);
872 872 }
873 873  
874   -void vga_mem_writel(uint32_t addr, uint32_t val, uint32_t vaddr)
  874 +static void vga_mem_writel(uint32_t addr, uint32_t val, uint32_t vaddr)
875 875 {
876 876 vga_mem_writeb(addr, val & 0xff, vaddr);
877 877 vga_mem_writeb(addr + 1, (val >> 8) & 0xff, vaddr);
... ... @@ -1523,7 +1523,23 @@ void vga_update_display(void)
1523 1523  
1524 1524 if (s->ds->depth == 0) {
1525 1525 /* nothing to do */
1526   - } else {
  1526 + } else {
  1527 + switch(s->ds->depth) {
  1528 + case 8:
  1529 + s->rgb_to_pixel = rgb_to_pixel8_dup;
  1530 + break;
  1531 + case 15:
  1532 + s->rgb_to_pixel = rgb_to_pixel15_dup;
  1533 + break;
  1534 + default:
  1535 + case 16:
  1536 + s->rgb_to_pixel = rgb_to_pixel16_dup;
  1537 + break;
  1538 + case 32:
  1539 + s->rgb_to_pixel = rgb_to_pixel32_dup;
  1540 + break;
  1541 + }
  1542 +
1527 1543 full_update = 0;
1528 1544 graphic_mode = s->gr[6] & 1;
1529 1545 if (graphic_mode != s->graphic_mode) {
... ... @@ -1537,7 +1553,7 @@ void vga_update_display(void)
1537 1553 }
1538 1554 }
1539 1555  
1540   -void vga_reset(VGAState *s)
  1556 +static void vga_reset(VGAState *s)
1541 1557 {
1542 1558 memset(s, 0, sizeof(VGAState));
1543 1559 #ifdef CONFIG_S3VGA
... ... @@ -1550,13 +1566,13 @@ void vga_reset(VGAState *s)
1550 1566 s->graphic_mode = -1; /* force full update */
1551 1567 }
1552 1568  
1553   -CPUReadMemoryFunc *vga_mem_read[3] = {
  1569 +static CPUReadMemoryFunc *vga_mem_read[3] = {
1554 1570 vga_mem_readb,
1555 1571 vga_mem_readw,
1556 1572 vga_mem_readl,
1557 1573 };
1558 1574  
1559   -CPUWriteMemoryFunc *vga_mem_write[3] = {
  1575 +static CPUWriteMemoryFunc *vga_mem_write[3] = {
1560 1576 vga_mem_writeb,
1561 1577 vga_mem_writew,
1562 1578 vga_mem_writel,
... ... @@ -1593,22 +1609,6 @@ int vga_initialize(DisplayState *ds, uint8_t *vga_ram_base,
1593 1609  
1594 1610 vga_reset(s);
1595 1611  
1596   - switch(ds->depth) {
1597   - case 8:
1598   - s->rgb_to_pixel = rgb_to_pixel8_dup;
1599   - break;
1600   - case 15:
1601   - s->rgb_to_pixel = rgb_to_pixel15_dup;
1602   - break;
1603   - default:
1604   - case 16:
1605   - s->rgb_to_pixel = rgb_to_pixel16_dup;
1606   - break;
1607   - case 32:
1608   - s->rgb_to_pixel = rgb_to_pixel32_dup;
1609   - break;
1610   - }
1611   -
1612 1612 s->vram_ptr = vga_ram_base;
1613 1613 s->vram_offset = vga_ram_offset;
1614 1614 s->vram_size = vga_ram_size;
... ... @@ -1652,3 +1652,84 @@ int vga_initialize(DisplayState *ds, uint8_t *vga_ram_base,
1652 1652 #endif
1653 1653 return 0;
1654 1654 }
  1655 +
  1656 +/********************************************************/
  1657 +/* vga screen dump */
  1658 +
  1659 +static int vga_save_w, vga_save_h;
  1660 +
  1661 +static void vga_save_dpy_update(DisplayState *s,
  1662 + int x, int y, int w, int h)
  1663 +{
  1664 +}
  1665 +
  1666 +static void vga_save_dpy_resize(DisplayState *s, int w, int h)
  1667 +{
  1668 + s->linesize = w * 4;
  1669 + s->data = qemu_malloc(h * s->linesize);
  1670 + vga_save_w = w;
  1671 + vga_save_h = h;
  1672 +}
  1673 +
  1674 +static void vga_save_dpy_refresh(DisplayState *s)
  1675 +{
  1676 +}
  1677 +
  1678 +static int ppm_save(const char *filename, uint8_t *data,
  1679 + int w, int h, int linesize)
  1680 +{
  1681 + FILE *f;
  1682 + uint8_t *d, *d1;
  1683 + unsigned int v;
  1684 + int y, x;
  1685 +
  1686 + f = fopen(filename, "wb");
  1687 + if (!f)
  1688 + return -1;
  1689 + fprintf(f, "P6\n%d %d\n%d\n",
  1690 + w, h, 255);
  1691 + d1 = data;
  1692 + for(y = 0; y < h; y++) {
  1693 + d = d1;
  1694 + for(x = 0; x < w; x++) {
  1695 + v = *(uint32_t *)d;
  1696 + fputc((v >> 16) & 0xff, f);
  1697 + fputc((v >> 8) & 0xff, f);
  1698 + fputc((v) & 0xff, f);
  1699 + d += 4;
  1700 + }
  1701 + d1 += linesize;
  1702 + }
  1703 + fclose(f);
  1704 + return 0;
  1705 +}
  1706 +
  1707 +/* save the vga display in a PPM image even if no display is
  1708 + available */
  1709 +void vga_screen_dump(const char *filename)
  1710 +{
  1711 + VGAState *s = &vga_state;
  1712 + DisplayState *saved_ds, ds1, *ds = &ds1;
  1713 +
  1714 + /* XXX: this is a little hackish */
  1715 + s->last_width = -1;
  1716 + s->last_height = -1;
  1717 + saved_ds = s->ds;
  1718 +
  1719 + memset(ds, 0, sizeof(DisplayState));
  1720 + ds->dpy_update = vga_save_dpy_update;
  1721 + ds->dpy_resize = vga_save_dpy_resize;
  1722 + ds->dpy_refresh = vga_save_dpy_refresh;
  1723 + ds->depth = 32;
  1724 +
  1725 + s->ds = ds;
  1726 + s->graphic_mode = -1;
  1727 + vga_update_display();
  1728 +
  1729 + if (ds->data) {
  1730 + ppm_save(filename, ds->data, vga_save_w, vga_save_h,
  1731 + s->ds->linesize);
  1732 + qemu_free(ds->data);
  1733 + }
  1734 + s->ds = saved_ds;
  1735 +}
... ...
monitor.c
... ... @@ -245,6 +245,15 @@ static void do_change(int argc, const char **argv)
245 245 bdrv_open(bs, argv[2], 0);
246 246 }
247 247  
  248 +static void do_screen_dump(int argc, const char **argv)
  249 +{
  250 + if (argc != 2) {
  251 + help_cmd(argv[0]);
  252 + return;
  253 + }
  254 + vga_screen_dump(argv[1]);
  255 +}
  256 +
248 257 static term_cmd_t term_cmds[] = {
249 258 { "help|?", do_help,
250 259 "[cmd]", "show the help" },
... ... @@ -258,6 +267,8 @@ static term_cmd_t term_cmds[] = {
258 267 "[-f] device", "eject a removable media (use -f to force it)" },
259 268 { "change", do_change,
260 269 "device filename", "change a removable media" },
  270 + { "screendump", do_screen_dump,
  271 + "filename", "save screen into PPM image 'filename'" },
261 272 { NULL, NULL, },
262 273 };
263 274  
... ...
... ... @@ -136,6 +136,7 @@ static inline void dpy_resize(DisplayState *s, int w, int h)
136 136 int vga_initialize(DisplayState *ds, uint8_t *vga_ram_base,
137 137 unsigned long vga_ram_offset, int vga_ram_size);
138 138 void vga_update_display(void);
  139 +void vga_screen_dump(const char *filename);
139 140  
140 141 /* sdl.c */
141 142 void sdl_display_init(DisplayState *ds);
... ...