Gerd Hoffmann <kra...@redhat.com> writes: > +static pixman_image_t *pixman_from_displaystate(DisplayState *ds) > +{ > + PixelFormat *pf = &ds->surface->pf; > + pixman_format_code_t format; > + pixman_image_t *image; > + int type; > + > + type = pixman_shifts_to_type(pf->rshift, pf->gshift, pf->bshift); > + format = PIXMAN_FORMAT(pf->bits_per_pixel, type, > + pf->abits, pf->rbits, pf->gbits, pf->bbits); > + image = pixman_image_create_bits(format, ds_get_width(ds), > + ds_get_height(ds), > + (void *)ds_get_data(ds), > + ds_get_linesize(ds)); > + return image; > +} > + > +static pixman_image_t *pixman_from_framebuffer(void) > +{ > + pixman_format_code_t format; > + pixman_image_t *image; > + int type; > + > + type = pixman_shifts_to_type(fb_var.red.offset, > + fb_var.green.offset, > + fb_var.blue.offset); > + format = PIXMAN_FORMAT(fb_var.bits_per_pixel, type, > + fb_var.transp.length, > + fb_var.red.length, > + fb_var.green.length, > + fb_var.blue.length); > + image = pixman_image_create_bits(format, fb_var.xres, fb_var.yres, > + (void *)fb_mem, fb_fix.line_length); > + return image; > +}
You may want to call pixman_format_supported_source/destination() here to ensure that the format in question is supported by pixman. > -static void fbdev_render(DisplayState *ds, int x, int y, int w, int h) > +static void fbdev_render(DisplayState *ds) > { > - uint8_t *dst; > - uint8_t *src; > - int line; > - > - if (!conv) { > - return; > - } > - > - src = ds_get_data(ds) + y * ds_get_linesize(ds) > - + x * ds_get_bytes_per_pixel(ds); > - dst = fb_mem + y * fb_fix.line_length > - + x * fbpf.bytes_per_pixel; > - > - dst += cy * fb_fix.line_length; > - dst += cx * fbpf.bytes_per_pixel; > + assert(surface); > > - if (h > fb_var.yres - y) { > - h = fb_var.yres - y; > - } > - if (w > fb_var.xres - x) { > - w = fb_var.xres - x; > - } > - > - for (line = y; line < y+h; line++) { > - qemu_pf_conv_run(conv, dst, src, w); > - dst += fb_fix.line_length; > - src += ds_get_linesize(ds); > - } > + pixman_image_set_clip_region(surface, &dirty); > + pixman_image_composite(PIXMAN_OP_SRC, surface, NULL, framebuffer, > + 0, 0, 0, 0, 0, 0, fb_var.xres, fb_var.yres); > + pixman_region_fini(&dirty); > + pixman_region_init(&dirty); > } The fini()/init() here could be done with pixman_region_clear() which was introduced in 0.26.0. Søren