ImBuf: use more accurate DPI/PPM conversion

Use 0.0254 for conversion as 39.3700787 isn't exactly 1/0.0254
and can't be written as a round float/double.
This commit is contained in:
Campbell Barton 2020-06-11 14:56:09 +10:00
parent 0439094105
commit 2c463a8250
2 changed files with 5 additions and 3 deletions

View File

@ -209,7 +209,7 @@ typedef struct ImBuf {
*/
float *rect_float;
/* resolution - pixels per meter */
/** Resolution in pixels per meter. Multiply by `0.0254` for DPI. */
double ppm[2];
/* tiled pixel storage */

View File

@ -390,7 +390,8 @@ static void openexr_header_metadata(Header *header, struct ImBuf *ibuf)
}
if (ibuf->ppm[0] > 0.0) {
addXDensity(*header, ibuf->ppm[0] / 39.3700787); /* 1 meter = 39.3700787 inches */
/* Convert meters to inches. */
addXDensity(*header, ibuf->ppm[0] * 0.0254);
}
}
@ -1920,7 +1921,8 @@ struct ImBuf *imb_load_openexr(const unsigned char *mem,
ibuf->flags |= exr_is_half_float(*file) ? IB_halffloat : 0;
if (hasXDensity(file->header(0))) {
ibuf->ppm[0] = xDensity(file->header(0)) * 39.3700787f;
/* Convert inches to meters. */
ibuf->ppm[0] = (double)xDensity(file->header(0)) / 0.0254;
ibuf->ppm[1] = ibuf->ppm[0] * (double)file->header(0).pixelAspectRatio();
}