On Tue, Jan 03, 2012 at 03:32:57PM +0200, Avi Kivity wrote: > ppm_save() spends upwards of 50% of its time doing divisions. Replace them > with shifts. >
Reviewed-by: Alon Levy <al...@redhat.com> rmax/bmax/gmax are all uint8_t atm, could add a compilation error if sizeof(bmax)!=1 ever. > 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 > >