85 lines
2.8 KiB
Java
85 lines
2.8 KiB
Java
package org.apache.poi.hwmf.record;
|
|
|
|
import java.awt.image.BufferedImage;
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.IOException;
|
|
|
|
import org.apache.poi.util.LittleEndianConsts;
|
|
import org.apache.poi.util.LittleEndianInputStream;
|
|
|
|
public class WmfBitmap16 {
|
|
final boolean isPartial;
|
|
int type;
|
|
int width;
|
|
int height;
|
|
int widthBytes;
|
|
int planes;
|
|
int bitsPixel;
|
|
|
|
public WmfBitmap16() {
|
|
this(false);
|
|
}
|
|
|
|
public WmfBitmap16(boolean isPartial) {
|
|
this.isPartial = isPartial;
|
|
}
|
|
|
|
public int init(LittleEndianInputStream leis) throws IOException {
|
|
// A 16-bit signed integer that defines the bitmap type.
|
|
type = leis.readShort();
|
|
|
|
// A 16-bit signed integer that defines the width of the bitmap in pixels.
|
|
width = leis.readShort();
|
|
|
|
// A 16-bit signed integer that defines the height of the bitmap in scan lines.
|
|
height = leis.readShort();
|
|
|
|
// A 16-bit signed integer that defines the number of bytes per scan line.
|
|
widthBytes = leis.readShort();
|
|
|
|
// An 8-bit unsigned integer that defines the number of color planes in the
|
|
// bitmap. The value of this field MUST be 0x01.
|
|
planes = leis.readUByte();
|
|
|
|
// An 8-bit unsigned integer that defines the number of adjacent color bits on
|
|
// each plane.
|
|
bitsPixel = leis.readUByte();
|
|
|
|
int size = 2*LittleEndianConsts.BYTE_SIZE+4*LittleEndianConsts.SHORT_SIZE;
|
|
if (isPartial) {
|
|
// Bits (4 bytes): This field MUST be ignored.
|
|
long skipSize = leis.skip(LittleEndianConsts.INT_SIZE);
|
|
assert(skipSize == LittleEndianConsts.INT_SIZE);
|
|
// Reserved (18 bytes): This field MUST be ignored.
|
|
skipSize = leis.skip(18);
|
|
assert(skipSize == 18);
|
|
size += 18+LittleEndianConsts.INT_SIZE;
|
|
}
|
|
|
|
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
|
|
|
|
int size2 = 0;
|
|
byte buf[] = new byte[widthBytes];
|
|
for (int h=0; h<height; h++) {
|
|
leis.read(buf);
|
|
size2 += widthBytes;
|
|
|
|
BitInputStream bis = new BitInputStream(new ByteArrayInputStream(buf));
|
|
for (int w=0; w<width; w++) {
|
|
int bitsAtPixel = bis.read(bitsPixel);
|
|
// TODO: is bitsPixel a multiple of 3 (r,g,b)
|
|
// which colortable should be used for the various bit sizes???
|
|
|
|
}
|
|
}
|
|
|
|
int bytes = (((width * bitsPixel + 15) >> 4) << 1) * height;
|
|
assert (bytes == size2);
|
|
|
|
size += size2;
|
|
|
|
|
|
return size;
|
|
}
|
|
}
|