/* ==================================================================== | |
Licensed to the Apache Software Foundation (ASF) under one or more | |
contributor license agreements. See the NOTICE file distributed with | |
this work for additional information regarding copyright ownership. | |
The ASF licenses this file to You under the Apache License, Version 2.0 | |
(the "License"); you may not use this file except in compliance with | |
the License. You may obtain a copy of the License at | |
http://www.apache.org/licenses/LICENSE-2.0 | |
Unless required by applicable law or agreed to in writing, software | |
distributed under the License is distributed on an "AS IS" BASIS, | |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
See the License for the specific language governing permissions and | |
limitations under the License. | |
==================================================================== */ | |
package org.apache.poi.util; | |
/** | |
* @author Yegor Kozlov | |
*/ | |
public class Units { | |
/** | |
* In Escher absolute distances are specified in | |
* English Metric Units (EMUs), occasionally referred to as A units; | |
* there are 360000 EMUs per centimeter, 914400 EMUs per inch, 12700 EMUs per point. | |
*/ | |
public static final int EMU_PER_PIXEL = 9525; | |
public static final int EMU_PER_POINT = 12700; | |
public static final int EMU_PER_CENTIMETER = 360000; | |
/** | |
* Master DPI (576 pixels per inch). | |
* Used by the reference coordinate system in PowerPoint (HSLF) | |
*/ | |
public static final int MASTER_DPI = 576; | |
/** | |
* Pixels DPI (96 pixels per inch) | |
*/ | |
public static final int PIXEL_DPI = 96; | |
/** | |
* Points DPI (72 pixels per inch) | |
*/ | |
public static final int POINT_DPI = 72; | |
/** | |
* Converts points to EMUs | |
* @param points points | |
* @return EMUs | |
*/ | |
public static int toEMU(double points){ | |
return (int)Math.rint(EMU_PER_POINT*points); | |
} | |
/** | |
* Converts pixels to EMUs | |
* @param pixels pixels | |
* @return EMUs | |
*/ | |
public static int pixelToEMU(int pixels) { | |
return pixels*EMU_PER_PIXEL; | |
} | |
/** | |
* Converts EMUs to points | |
* @param emu emu | |
* @return points | |
*/ | |
public static double toPoints(long emu){ | |
return (double)emu/EMU_PER_POINT; | |
} | |
/** | |
* Converts a value of type FixedPoint to a floating point | |
* | |
* @param fixedPoint value in fixed point notation | |
* @return floating point (double) | |
* | |
* @see <a href="http://msdn.microsoft.com/en-us/library/dd910765(v=office.12).aspx">[MS-OSHARED] - 2.2.1.6 FixedPoint</a> | |
*/ | |
public static double fixedPointToDouble(int fixedPoint) { | |
int i = (fixedPoint >> 16); | |
int f = fixedPoint & 0xFFFF; | |
return (i + f/65536d); | |
} | |
/** | |
* Converts a value of type floating point to a FixedPoint | |
* | |
* @param floatPoint value in floating point notation | |
* @return fixedPoint value in fixed points notation | |
* | |
* @see <a href="http://msdn.microsoft.com/en-us/library/dd910765(v=office.12).aspx">[MS-OSHARED] - 2.2.1.6 FixedPoint</a> | |
*/ | |
public static int doubleToFixedPoint(double floatPoint) { | |
double fractionalPart = floatPoint % 1d; | |
double integralPart = floatPoint - fractionalPart; | |
int i = (int)Math.floor(integralPart); | |
int f = (int)Math.rint(fractionalPart*65536d); | |
return (i << 16) | (f & 0xFFFF); | |
} | |
public static double masterToPoints(int masterDPI) { | |
double points = masterDPI; | |
points *= POINT_DPI; | |
points /= MASTER_DPI; | |
return points; | |
} | |
public static int pointsToMaster(double points) { | |
points *= MASTER_DPI; | |
points /= POINT_DPI; | |
return (int)Math.rint(points); | |
} | |
public static int pointsToPixel(double points) { | |
points *= PIXEL_DPI; | |
points /= POINT_DPI; | |
return (int)Math.rint(points); | |
} | |
public static double pixelToPoints(int pixel) { | |
double points = pixel; | |
points *= POINT_DPI; | |
points /= PIXEL_DPI; | |
return points; | |
} | |
} |