ppm_save() spends upwards of 50% of its time doing divisions. Replace them with shifts.
Signed-off-by: Avi Kivity <a...@redhat.com> --- hw/vga.c | 10 ++++------ 1 files changed, 4 insertions(+), 6 deletions(-) diff --git a/hw/vga.c b/hw/vga.c index ca79aa1..a228cde 100644 --- a/hw/vga.c +++ b/hw/vga.c @@ -2370,12 +2370,10 @@ int ppm_save(const char *filename, struct DisplaySurface *ds) 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); + /* Limited to 8 or fewer bits per channel: */ + r = ((v >> ds->pf.rshift) & ds->pf.rmax) << (8 - ds->pf.rbits); + g = ((v >> ds->pf.gshift) & ds->pf.gmax) << (8 - ds->pf.gbits); + b = ((v >> ds->pf.bshift) & ds->pf.bmax) << (8 - ds->pf.bbits); *pbuf++ = r; *pbuf++ = g; *pbuf++ = b; -- 1.7.7.1