/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.ui.util; import org.eclipse.draw2d.geometry.Insets; import org.eclipse.draw2d.geometry.Point; import org.eclipse.swt.widgets.Display; import org.xmind.gef.draw2d.geometry.PrecisionInsets; import org.xmind.gef.draw2d.geometry.PrecisionPoint; public class UnitConvertor { /** * Millimeters per inch: <br> * <blockquote>a (inch) * INCH_TO_MM = b (mm)</blockquote> */ public static final double INCH_TO_MM = 25.4; /** * Inches per millimeter:<br> * <blockquote>a (mm) * MM_TO_INCH = b (inch)</blockquote> */ public static final double MM_TO_INCH = 1 / INCH_TO_MM; private static Point dpi = null; private static Point defaultDpi = null; public static Point getScreenDpi() { if (dpi == null) { Display display = Display.getCurrent(); if (display == null) { if (defaultDpi == null) defaultDpi = new Point(72, 72); return defaultDpi; } else { dpi = new Point(display.getDPI()); } } return dpi; } public static double inch2mm(double value) { return value * INCH_TO_MM; } public static double mm2inch(double value) { return value / INCH_TO_MM; } public static PrecisionPoint scrDots2inch(Point p) { double x = p.x * 1.0 / getScreenDpi().x; double y = p.y * 1.0 / getScreenDpi().y; return new PrecisionPoint(x, y); } public static PrecisionInsets scrDots2inch(Insets ins) { double top = ins.top * 1.0 / getScreenDpi().y; double left = ins.left * 1.0 / getScreenDpi().x; double bottom = ins.bottom * 1.0 / getScreenDpi().y; double right = ins.right * 1.0 / getScreenDpi().x; return new PrecisionInsets(top, left, bottom, right); } public static PrecisionPoint scrDots2mm(Point dots) { PrecisionPoint p = scrDots2inch(dots); p.x = inch2mm(p.x); p.y = inch2mm(p.y); return p; } public static PrecisionInsets scrDots2mm(Insets dots) { PrecisionInsets ins = scrDots2inch(dots); ins.top = inch2mm(ins.top); ins.left = inch2mm(ins.left); ins.bottom = inch2mm(ins.bottom); ins.right = inch2mm(ins.right); return ins; } public static Point inch2scrDots(PrecisionPoint p) { return inch2scrDots(p.x, p.y); } public static Point inch2scrDots(double x, double y) { int x2 = (int) (x * getScreenDpi().x); int y2 = (int) (y * getScreenDpi().y); return new Point(x2, y2); } public static Point mm2scrDots(PrecisionPoint p) { double x = mm2inch(p.x); double y = mm2inch(p.y); return inch2scrDots(new PrecisionPoint(x, y)); } public static Point mm2scrDots(double x, double y) { double x2 = mm2inch(x); double y2 = mm2inch(y); return inch2scrDots(x2, y2); } public static PrecisionInsets inch2mm(PrecisionInsets ins) { double left = inch2mm(ins.left); double right = inch2mm(ins.right); double top = inch2mm(ins.top); double bottom = inch2mm(ins.bottom); return new PrecisionInsets(top, left, bottom, right); } public static PrecisionInsets mm2inch(PrecisionInsets ins) { double left = mm2inch(ins.left); double right = mm2inch(ins.right); double top = mm2inch(ins.top); double bottom = mm2inch(ins.bottom); return new PrecisionInsets(top, left, bottom, right); } public static PrecisionInsets inch2dots(PrecisionInsets ins, Point dpi) { double left = ins.left * dpi.x; double right = ins.right * dpi.x; double top = ins.top * dpi.y; double bottom = ins.bottom * dpi.y; return new PrecisionInsets(top, left, bottom, right); } public static PrecisionInsets dots2inch(Insets ins, Point dpi) { double left = ins.left * 1.0 / dpi.x; double right = ins.right * 1.0 / dpi.x; double top = ins.top * 1.0 / dpi.y; double bottom = ins.bottom * 1.0 / dpi.y; return new PrecisionInsets(top, left, bottom, right); } public static PrecisionInsets dots2mm(Insets ins, Point dpi) { return inch2mm(dots2inch(ins, dpi)); } public static PrecisionInsets mm2dots(PrecisionInsets ins, Point dpi) { return inch2dots(mm2inch(ins), dpi); } public static PrecisionPoint dots2mm(Point p, Point dpi) { double x = inch2mm(p.x * 1.0 / dpi.x); double y = inch2mm(p.y * 1.0 / dpi.y); return new PrecisionPoint(x, y); } public static PrecisionPoint dots2inch(Point p, Point dpi) { double x = p.x * 1.0 / dpi.x; double y = p.y * 1.0 / dpi.y; return new PrecisionPoint(x, y); } }