Import "fix screendump" from qemu mainstream, plus few
following fixes.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6345
c046a42c-6fe2-441c-8c8c-71466251a162
Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
---
diff --git a/hw/blizzard.c b/hw/blizzard.c
index 041ef5f..2480092 100644
--- a/hw/blizzard.c
+++ b/hw/blizzard.c
@@ -940,7 +940,7 @@ static void blizzard_screen_dump(void *opaque, const char
*filename) {
blizzard_update_display(opaque);
if (s && ds_get_data(s->state))
- ppm_save(filename, ds_get_data(s->state), s->x, s->y,
ds_get_linesize(s->state));
+ ppm_save(filename, s->state->surface);
}
#define DEPTH 8
diff --git a/hw/vga.c b/hw/vga.c
index f1baa7f..84a713a 100644
--- a/hw/vga.c
+++ b/hw/vga.c
@@ -2690,8 +2690,6 @@ int pci_vga_init(PCIBus *bus, uint8_t *vga_ram_base,
/********************************************************/
/* vga screen dump */
-static int vga_save_w, vga_save_h;
-
static void vga_save_dpy_update(DisplayState *s,
int x, int y, int w, int h)
{
@@ -2705,30 +2703,39 @@ static void vga_save_dpy_refresh(DisplayState *s)
{
}
-static int ppm_save(const char *filename, uint8_t *data,
- int w, int h, int linesize)
+int ppm_save(const char *filename, struct DisplaySurface *ds)
{
FILE *f;
uint8_t *d, *d1;
- unsigned int v;
+ uint32_t v;
int y, x;
+ uint8_t r, g, b;
f = fopen(filename, "wb");
if (!f)
return -1;
fprintf(f, "P6\n%d %d\n%d\n",
- w, h, 255);
- d1 = data;
- for(y = 0; y < h; y++) {
+ ds->width, ds->height, 255);
+ d1 = ds->data;
+ for(y = 0; y < ds->height; y++) {
d = d1;
- for(x = 0; x < w; x++) {
- v = *(uint32_t *)d;
- fputc((v >> 16) & 0xff, f);
- fputc((v >> 8) & 0xff, f);
- fputc((v) & 0xff, f);
- d += 4;
+ for(x = 0; x < ds->width; x++) {
+ if (ds->pf.bits_per_pixel == 32)
+ v = *(uint32_t *)d;
+ else
+ v = (uint32_t) (*(uint16_t *)d);
+ r = ((v >> ds->pf.rshift) & ds->pf.rmax) * 256 /
+ (ds->pf.rmax + 1);
+ g = ((v >> ds->pf.gshift) & ds->pf.gmax) * 256 /
+ (ds->pf.gmax + 1);
+ b = ((v >> ds->pf.bshift) & ds->pf.bmax) * 256 /
+ (ds->pf.bmax + 1);
+ fputc(r, f);
+ fputc(g, f);
+ fputc(b, f);
+ d += ds->pf.bytes_per_pixel;
}
- d1 += linesize;
+ d1 += ds->linesize;
}
fclose(f);
return 0;
@@ -2741,6 +2748,9 @@ static void vga_screen_dump(void *opaque, const char
*filename)
VGAState *s = (VGAState *)opaque;
DisplayState *saved_ds, ds1, *ds = &ds1;
DisplayChangeListener dcl;
+ int w, h;
+
+ s->get_resolution(s, &w, &h);
/* XXX: this is a little hackish */
vga_invalidate_display(s);
@@ -2752,15 +2762,13 @@ static void vga_screen_dump(void *opaque, const char
*filename)
dcl.dpy_resize = vga_save_dpy_resize;
dcl.dpy_refresh = vga_save_dpy_refresh;
register_displaychangelistener(ds, &dcl);
- ds->surface = qemu_create_displaysurface(ds_get_width(saved_ds),
- ds_get_height(saved_ds), 32, 4 * ds_get_width(saved_ds));
+ ds->surface = qemu_create_displaysurface(w, h, 32, 4 * w);
s->ds = ds;
s->graphic_mode = -1;
vga_update_display(s);
- ppm_save(filename, ds_get_data(ds), vga_save_w, vga_save_h,
- ds_get_linesize(ds));
+ ppm_save(filename, ds->surface);
qemu_free_displaysurface(ds->surface);
s->ds = saved_ds;
diff --git a/hw/vga_int.h b/hw/vga_int.h
index 80ed901..c9be893 100644
--- a/hw/vga_int.h
+++ b/hw/vga_int.h
@@ -191,6 +191,7 @@ void vga_common_init(VGAState *s, uint8_t *vga_ram_base,
uint32_t vga_mem_readb(void *opaque, target_phys_addr_t addr);
void vga_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val);
void vga_invalidate_scanlines(VGAState *s, int y1, int y2);
+int ppm_save(const char *filename, struct DisplaySurface *ds);
void vga_draw_cursor_line_8(uint8_t *d1, const uint8_t *src1,
int poffset, int w,
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|