/** * Converts a length from a CSS length or percentage to 'pt'. * * @param spec the CSS length specification * @param whole the value that corresponds to 100%. It is used only when spec is a percentage. * @return the length in 'pt' */ public double ptLength(TermLengthOrPercent spec, double whole) { float nval = spec.getValue(); if (spec.isPercentage()) return (whole * nval) / 100; else { TermLength.Unit unit = spec.getUnit(); double ret = 0; if (unit == TermLength.Unit.pt) { ret = nval; } else if (unit == TermLength.Unit.in) { ret = nval * 72; } else if (unit == TermLength.Unit.cm) { ret = (nval * 72) / 2.54; } else if (unit == TermLength.Unit.mm) { ret = (nval * 72) / 25.4; } else if (unit == TermLength.Unit.pc) { ret = nval * 12; } else if (unit == TermLength.Unit.px) { ret = (nval * 72) / dpi; } else if (unit == TermLength.Unit.em) { ret = (em * nval * 72) / dpi; // em is in pixels } else if (unit == TermLength.Unit.rem) { ret = (rem * nval * 72) / dpi; } else if (unit == TermLength.Unit.ex) { ret = (ex * nval * 72) / dpi; } else if (unit == TermLength.Unit.ch) { ret = (ch * nval * 72) / dpi; } else if (unit == TermLength.Unit.vw) { return (viewport.getVisibleRect().getWidth() * nval * 72) / (100.0 * dpi); } else if (unit == TermLength.Unit.vh) { return (viewport.getVisibleRect().getHeight() * nval * 72) / (100.0 * dpi); } else if (unit == TermLength.Unit.vmin) { return (Math.min( viewport.getVisibleRect().getWidth(), viewport.getVisibleRect().getHeight()) * nval * 72) / (100.0 * dpi); } else if (unit == TermLength.Unit.vmax) { return (Math.max( viewport.getVisibleRect().getWidth(), viewport.getVisibleRect().getHeight()) * nval * 72) / (100.0 * dpi); } return ret; } }