package gov.nasa.worldwind.formats.nitfs; /* Copyright (C) 2001, 2007 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All Rights Reserved. */ /** * @author Lado Garakanidze * @version $Id: NitfsImageBand Apr 17, 2007 3:22:33 PM lado */ class NITFSImageBand { private String representation; private String significanceForImageCategory; private String imageFilterCondition; private String stdImageFilterCode; private short numOfLookupTables; private short numOfLookupTableEntries; // public int[] lookupTablesOffset; // one byte per entry per band private byte[][] lut; private boolean isGrayImage; private boolean hasTransparentEntry; public boolean isGrayImage() { return this.isGrayImage; } public boolean isHasTransparentEntry() { return this.hasTransparentEntry; } public String getRepresentation() { return this.representation; } public short getNumOfLookupTables() { return this.numOfLookupTables; } public short getNumOfLookupTableEntries() { return this.numOfLookupTableEntries; } public NITFSImageBand(java.nio.ByteBuffer buffer) { this.representation = NITFSUtil.getString(buffer, 2); this.significanceForImageCategory = NITFSUtil.getString(buffer, 6); this.imageFilterCondition = NITFSUtil.getString(buffer, 1); this.stdImageFilterCode = NITFSUtil.getString(buffer, 3); this.numOfLookupTables = NITFSUtil.getShortNumeric(buffer, 1); this.numOfLookupTableEntries = NITFSUtil.getShortNumeric(buffer, 5); if (0 < this.numOfLookupTables && 0 < this.numOfLookupTableEntries) { this.lut = new byte[this.numOfLookupTables][this.numOfLookupTableEntries]; for (int j = 0; j < this.numOfLookupTables; j++) { buffer.get(this.lut[j], 0, this.numOfLookupTableEntries); } } this.isGrayImage = (1 == this.numOfLookupTables); this.hasTransparentEntry = (217 == this.numOfLookupTableEntries); } public final int lookupR5G6B5(int colorIndex) { int r, g, b; if (3 == this.numOfLookupTables) { r = (0x00FF & this.lut[0][colorIndex]) >> 3; g = (0x00FF & this.lut[1][colorIndex]) >> 2; b = (0x00FF & this.lut[2][colorIndex]) >> 3; } else { int gray = 0x00FF & this.lut[0][ colorIndex ]; r = gray >> 3; g = gray >> 2; b = gray >> 3; } return 0x00FFFF & ((r << 11) | (g << 5) | b ); } public final int lookupRGB(int colorIndex) { int r, g, b; if (3 == this.numOfLookupTables) { r = (0x00FF & this.lut[0][colorIndex]); g = (0x00FF & this.lut[1][colorIndex]); b = (0x00FF & this.lut[2][colorIndex]); } else { r = g = b = 0x00FF & this.lut[0][ colorIndex ]; } return (int) (0x00FFFFFFL & (long)((r << 16) | (g << 8) | b )); } public final int lookupGray(int colorIndex) { if (3 == this.numOfLookupTables) { int r = (0x00FF & this.lut[0][colorIndex]); int g = (0x00FF & this.lut[1][colorIndex]); int b = (0x00FF & this.lut[2][colorIndex]); return (30 * r + 59 * g + 11 * b)/100; } else { return (0x00FF & this.lut[0][colorIndex]); } } }