/* ==================================================================== | |
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.hwmf.record; | |
import java.awt.geom.Rectangle2D; | |
import java.io.IOException; | |
import org.apache.poi.util.LittleEndianConsts; | |
import org.apache.poi.util.LittleEndianInputStream; | |
public class HwmfPlaceableHeader { | |
public static final int WMF_HEADER_MAGIC = 0x9AC6CDD7; | |
final Rectangle2D bounds; | |
final int unitsPerInch; | |
protected HwmfPlaceableHeader(LittleEndianInputStream leis) throws IOException { | |
/* | |
* HWmf (2 bytes): The resource handle to the metafile, when the metafile is in memory. When | |
* the metafile is on disk, this field MUST contain 0x0000. This attribute of the metafile is | |
* specified in the Type field of the META_HEADER record. | |
*/ | |
leis.readShort(); // ignore | |
/* | |
* BoundingBox (8 bytes): The destination rectangle, measured in logical units, for displaying | |
* the metafile. The size of a logical unit is specified by the Inch field. | |
*/ | |
int x1 = leis.readShort(); | |
int y1 = leis.readShort(); | |
int x2 = leis.readShort(); | |
int y2 = leis.readShort(); | |
bounds = new Rectangle2D.Double(Math.min(x1,x2), Math.min(y1,y2), Math.abs(x2-x1), Math.abs(y2-y1)); | |
/* | |
* Inch (2 bytes): The number of logical units per inch used to represent the image. | |
* This value can be used to scale an image. | |
* By convention, an image is considered to be recorded at 1440 logical units (twips) per inch. | |
* Thus, a value of 720 specifies that the image SHOULD be rendered at twice its normal size, | |
* and a value of 2880 specifies that the image SHOULD be rendered at half its normal size. | |
*/ | |
unitsPerInch = leis.readShort(); | |
/* | |
* Reserved (4 bytes): A field that is not used and MUST be set to 0x00000000. | |
*/ | |
leis.readInt(); | |
/* | |
* Checksum (2 bytes): A checksum for the previous 10 16-bit values in the header. | |
* This value can be used to determine whether the metafile has become corrupted. | |
*/ | |
leis.readShort(); | |
} | |
public static HwmfPlaceableHeader readHeader(LittleEndianInputStream leis) throws IOException { | |
leis.mark(LittleEndianConsts.INT_SIZE); | |
int magic = leis.readInt(); | |
if (magic == WMF_HEADER_MAGIC) { | |
return new HwmfPlaceableHeader(leis); | |
} else { | |
leis.reset(); | |
return null; | |
} | |
} | |
public Rectangle2D getBounds() { | |
return bounds; | |
} | |
public int getUnitsPerInch() { | |
return unitsPerInch; | |
} | |
} |