On Thu, Jan 12, 2012 at 05:16:03PM +0200, Alon Levy wrote: > 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.
meant {r,g,b}bits. > > > 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 > > > > >