On 01/03/2012 07:32 AM, Avi Kivity wrote:
ppm_save() spends upwards of 50% of its time doing divisions. Replace them
with shifts.
Signed-off-by: Avi Kivity<a...@redhat.com>
Applied. Thanks.
Regards,
Anthony Liguori
---
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;