Bug 46197

Summary: rounding bugs in HSSFPicture.getPreferredSize
Product: POI Reporter: littlenoodles <ryampolsky>
Component: HSSFAssignee: POI Developers List <dev>
Severity: normal    
Priority: P2    
Version: 3.2-FINAL   
Target Milestone: ---   
Hardware: PC   
OS: All   

Description littlenoodles 2008-11-12 11:05:28 UTC
In HSSFPicture.getPreferredSize().  This line:

 h += (1 - anchor.dy1/256)* getRowHeightInPixels(anchor.row1);

doesn't work right.  It computes (1 - anchor.dy1/256) as an integer before applying it as a fraction to getRowHeightInPixels.  So you always get h incremented by 1 full row height (anchor.dy/256 evaluates to 0).  It works if I change it to:

 h += ((float)1 - (float)anchor.dy1/256)* getRowHeightInPixels(anchor.row1);

Same problem with the code to apply an initial x-offset to the image width:

 //space in the leftmost cell
 w += getColumnWidthInPixels(anchor.col1)*(1 - anchor.dx1/1024);

should be:
 w += getColumnWidthInPixels(anchor.col1)*((float)1 - (float)anchor.dx1/1024);
Comment 1 Yegor Kozlov 2008-11-16 05:28:23 UTC
Thanks for the suggestion. Applied in r718023.

P.S. Inspired by the "images and anchors - controlling image size" thread in poi-user, I added HSSFPicture.resize(double scale).
scale is the amount by which image dimensions are multiplied relative to the original size:

picture.resize(); //resets to 100% size
picture.resize(1); //resets to 100% size
picture.resize(2); //resets to 200% size
picture.resize(0.5); //resets to 50% size