/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved.
*/
package org.pentaho.reporting.libraries.pixie.wmf.bitmap;
import org.pentaho.reporting.libraries.pixie.wmf.MfRecord;
public final class BitmapHeader {
public static final int BI_RGB = 0;
public static final int BI_RLE8 = 1;
public static final int BI_RLE4 = 2;
public static final int BI_BITFIELDS = 3;
private static final int BMPH_DATA_OFFSET = MfRecord.RECORD_HEADER_SIZE;
private static final int BMPH_HEADERSIZE = MfRecord.RECORD_HEADER_SIZE + 4;
private static final int BMPH_WIDTH = MfRecord.RECORD_HEADER_SIZE + 8;
private static final int BMPH_HEIGHT = MfRecord.RECORD_HEADER_SIZE + 12;
private static final int BMPH_NO_PLANES = MfRecord.RECORD_HEADER_SIZE + 14;
private static final int BMPH_BPP = MfRecord.RECORD_HEADER_SIZE + 16;
private static final int BMPH_COMPRESSION = MfRecord.RECORD_HEADER_SIZE + 20;
private static final int BMPH_DATASIZE = MfRecord.RECORD_HEADER_SIZE + 24;
private static final int BMPH_HRES = MfRecord.RECORD_HEADER_SIZE + 28;
private static final int BMPH_VRES = MfRecord.RECORD_HEADER_SIZE + 32;
private static final int BMPH_NO_COLORS = MfRecord.RECORD_HEADER_SIZE + 36;
private static final int BMPH_NO_IMPORTANT_COLORS = MfRecord.RECORD_HEADER_SIZE + 40;
private int dataOffset;
private int headerSize;
private int width;
private int height;
private int noPlanes;
private int bitPerPixel;
private int compression;
private int dataSize;
private int hres; // ignored
private int vres; // ignored
private int noColors; // in palette
private int noImportantColors; // is <= noColors
private boolean isTopDown;
public BitmapHeader() {
}
public void setRecord( final MfRecord record, final int offset ) {
dataOffset = record.getInt( offset + BMPH_DATA_OFFSET );
headerSize = record.getInt( offset + BMPH_HEADERSIZE );
width = record.getInt( offset + BMPH_WIDTH );
height = record.getInt( offset + BMPH_HEIGHT );
noPlanes = record.getShort( offset + BMPH_NO_PLANES );
bitPerPixel = record.getShort( offset + BMPH_BPP );
compression = record.getInt( offset + BMPH_COMPRESSION );
dataSize = record.getInt( offset + BMPH_DATASIZE );
hres = record.getInt( offset + BMPH_HRES );
vres = record.getInt( offset + BMPH_VRES );
noColors = record.getInt( offset + BMPH_NO_COLORS );
noImportantColors = record.getInt( offset + BMPH_NO_IMPORTANT_COLORS );
if ( height < 0 ) {
isTopDown = true;
height = -height;
}
fixPalette();
}
private void fixPalette() {
if ( bitPerPixel < 16 ) {
if ( noColors == 0 ) {
noColors = (int) StrictMath.pow( 2, bitPerPixel );
}
if ( noImportantColors == 0 ) {
noImportantColors = (int) StrictMath.pow( 2, bitPerPixel );
}
}
}
public int getHeaderSize() {
return headerSize;
}
public int getCompression() {
return compression;
}
public int getBitsPerPixel() {
return bitPerPixel;
}
public int getHRes() {
return hres;
}
public int getVRes() {
return vres;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public int getNoOfColors() {
return noColors;
}
public int getNoOfImportantColors() {
return noImportantColors;
}
public boolean isTopDown() {
return isTopDown;
}
public int getDataOffset() {
return dataOffset;
}
public int getDataSize() {
return dataSize;
}
public int getNoPlanes() {
return noPlanes;
}
}