app: improve Measure Tool digit precision.

When working with high resolution, you may have cases where measured
length won't be displayed with enough digits; i.e. several pixels length
would show up as 0. For instance at 4000 PPI, up to 7 pixels show up as
0 mm, then at 0.1 mm from the 8th pixel (actually reaching over 0.05 mm,
approximating as 0.1), then 0.2 at 24 pixels (actually: 0.152), and so
on. At such a resolution, 3 digits are needed for 'mm' instead of the
1 digit returned by gimp_unit_get_digits() so that we display reliable
lengths.
Therefore we need to compute ideal digit precision. Configured digits
for a given unit will now be used as a minimum value, but actually used
digits may be higher.
This commit is contained in:
Jehan 2017-01-19 15:42:00 +01:00
parent 7a330dcf6a
commit d1c3c3deb0
1 changed files with 26 additions and 6 deletions

View File

@ -887,6 +887,9 @@ gimp_measure_tool_dialog_update (GimpMeasureTool *measure,
gdouble xres;
gdouble yres;
gchar format[128];
gint unit_distance_digits;
gint unit_width_digits;
gint unit_height_digits;
/* calculate distance and angle */
ax = measure->x[1] - measure->x[0];
@ -936,6 +939,20 @@ gimp_measure_tool_dialog_update (GimpMeasureTool *measure,
if (unit_angle > 180.0)
unit_angle = fabs (360.0 - unit_angle);
/* Compute minimum digits to display accurate values, so that
every pixel shows a different value in unit. */
unit_distance_digits = ceil (log10 (pixel_distance / unit_distance));
unit_distance_digits = MAX (gimp_unit_get_digits (shell->unit),
unit_distance_digits);
unit_width_digits = ceil (log10 (pixel_width / unit_width));
unit_width_digits = MAX (gimp_unit_get_digits (shell->unit),
unit_width_digits);
unit_height_digits = ceil (log10 (pixel_height / unit_height));
unit_height_digits = MAX (gimp_unit_get_digits (shell->unit),
unit_height_digits);
if (shell->unit == GIMP_UNIT_PIXEL)
{
gimp_tool_replace_status (GIMP_TOOL (measure), display,
@ -947,10 +964,10 @@ gimp_measure_tool_dialog_update (GimpMeasureTool *measure,
{
g_snprintf (format, sizeof (format),
"%%.%df %s, %%.2f\302\260 (%%.%df × %%.%df)",
gimp_unit_get_digits (shell->unit),
unit_distance_digits,
gimp_unit_get_plural (shell->unit),
gimp_unit_get_digits (shell->unit),
gimp_unit_get_digits (shell->unit));
unit_width_digits,
unit_height_digits);
gimp_tool_replace_status (GIMP_TOOL (measure), display, format,
unit_distance, unit_angle,
@ -962,15 +979,14 @@ gimp_measure_tool_dialog_update (GimpMeasureTool *measure,
{
gchar buf[128];
g_snprintf (format, sizeof (format), "%%.%df",
gimp_unit_get_digits (shell->unit));
/* Distance */
g_snprintf (buf, sizeof (buf), "%.1f", pixel_distance);
gtk_label_set_text (GTK_LABEL (measure->distance_label[0]), buf);
if (shell->unit != GIMP_UNIT_PIXEL)
{
g_snprintf (format, sizeof (format), "%%.%df",
unit_distance_digits);
g_snprintf (buf, sizeof (buf), format, unit_distance);
gtk_label_set_text (GTK_LABEL (measure->distance_label[1]), buf);
@ -1006,6 +1022,8 @@ gimp_measure_tool_dialog_update (GimpMeasureTool *measure,
if (shell->unit != GIMP_UNIT_PIXEL)
{
g_snprintf (format, sizeof (format), "%%.%df",
unit_width_digits);
g_snprintf (buf, sizeof (buf), format, unit_width);
gtk_label_set_text (GTK_LABEL (measure->width_label[1]), buf);
@ -1024,6 +1042,8 @@ gimp_measure_tool_dialog_update (GimpMeasureTool *measure,
/* Height */
if (shell->unit != GIMP_UNIT_PIXEL)
{
g_snprintf (format, sizeof (format), "%%.%df",
unit_height_digits);
g_snprintf (buf, sizeof (buf), format, unit_height);
gtk_label_set_text (GTK_LABEL (measure->height_label[1]), buf);