Revision 43876 branches/org.gvsig.desktop-2018a/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.bsq/src/main/java/org/gvsig/fmap/dal/file/bsq/BSQBandPageManager.java
BSQBandPageManager.java | ||
---|---|---|
6 | 6 |
import java.io.RandomAccessFile; |
7 | 7 |
import java.nio.Buffer; |
8 | 8 |
import java.nio.ByteBuffer; |
9 |
import java.nio.ByteOrder; |
|
9 | 10 |
import java.nio.DoubleBuffer; |
10 | 11 |
import java.nio.FloatBuffer; |
11 | 12 |
import java.nio.IntBuffer; |
... | ... | |
26 | 27 |
private final int dataType; |
27 | 28 |
private final File file; |
28 | 29 |
private final long startpos; |
30 |
private final ByteOrder byteOrder; |
|
29 | 31 |
|
30 | 32 |
/** |
31 | 33 |
* @param file |
... | ... | |
33 | 35 |
* @param rows |
34 | 36 |
* @param columns |
35 | 37 |
* @param dataType |
38 |
* @param byteOrder |
|
36 | 39 |
* @throws IOException |
37 | 40 |
*/ |
38 |
public BSQBandPageManager(File file, long startpos, int rows, int columns, int dataType) throws IOException { |
|
41 |
public BSQBandPageManager(File file, long startpos, int rows, int columns, int dataType, ByteOrder byteOrder) throws IOException {
|
|
39 | 42 |
this.rows = rows; |
40 | 43 |
this.columns = columns; |
41 | 44 |
this.dataType = dataType; |
42 | 45 |
this.file = file; |
43 | 46 |
this.startpos = startpos; |
47 |
this.byteOrder = byteOrder; |
|
44 | 48 |
|
45 | 49 |
this.raf = new RandomAccessFile(this.file, "r"); |
46 | 50 |
// BufferManager bufferManager = BufferLocator.getBufferManager(); |
... | ... | |
55 | 59 |
raf.seek(pos); |
56 | 60 |
BufferManager bufferManager = BufferLocator.getBufferManager(); |
57 | 61 |
int dataTypeSize = bufferManager.getDataTypeSize(dataType); |
58 |
byte[] byteArray = new byte[buffer.capacity() * dataTypeSize]; |
|
59 |
raf.read(byteArray); |
|
62 |
int elements = buffer.capacity(); |
|
63 |
|
|
64 |
ByteBuffer byteBuffer = ByteBuffer.allocate(elements * dataTypeSize); |
|
65 |
byteBuffer.order(this.byteOrder); |
|
66 |
raf.read(byteBuffer.array()); |
|
67 |
|
|
60 | 68 |
buffer.rewind(); |
69 |
byteBuffer.rewind(); |
|
61 | 70 |
|
62 | 71 |
switch (dataType) { |
63 | 72 |
case BufferManager.TYPE_BYTE: |
64 |
//FIXME: Elegir cual de las dos siguientes maneras de hacerlo es la id?nea |
|
65 |
|
|
66 |
((ByteBuffer) buffer).put(byteArray, 0, byteArray.length); |
|
67 |
// System.arraycopy(byteArray, 0, ((ByteBuffer) buffer).array(), 0, byteArray.length); |
|
73 |
((ByteBuffer) buffer).put(byteBuffer); |
|
68 | 74 |
break; |
69 | 75 |
case BufferManager.TYPE_SHORT: |
70 | 76 |
case BufferManager.TYPE_USHORT: |
71 |
for( int cell =0 ; cell<byteArray.length ; cell++ ) {
|
|
72 |
((ShortBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
|
|
77 |
for( int element =0 ; element<elements ; element++ ) {
|
|
78 |
((ShortBuffer) buffer).put(byteBuffer.getShort());
|
|
73 | 79 |
} |
74 | 80 |
break; |
75 | 81 |
case BufferManager.TYPE_INT: |
76 |
for( int cell =0 ; cell<byteArray.length ; cell++ ) {
|
|
77 |
((IntBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
|
|
82 |
for( int element =0 ; element<elements ; element++ ) {
|
|
83 |
((IntBuffer) buffer).put(byteBuffer.getInt());
|
|
78 | 84 |
} |
79 | 85 |
break; |
80 | 86 |
case BufferManager.TYPE_FLOAT: |
81 |
for( int cell =0 ; cell<byteArray.length ; cell++ ) {
|
|
82 |
((FloatBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
|
|
87 |
for( int element=0 ; element<elements ; element++ ) {
|
|
88 |
((FloatBuffer) buffer).put(byteBuffer.getFloat());
|
|
83 | 89 |
} |
84 | 90 |
break; |
85 | 91 |
|
86 | 92 |
case BufferManager.TYPE_DOUBLE: |
87 |
for( int cell =0 ; cell<byteArray.length ; cell++ ) {
|
|
88 |
((DoubleBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
|
|
93 |
for( int element=0 ; element<elements ; element++ ) {
|
|
94 |
((DoubleBuffer) buffer).put(byteBuffer.getDouble());
|
|
89 | 95 |
} |
90 | 96 |
break; |
91 | 97 |
|
... | ... | |
97 | 103 |
@Override |
98 | 104 |
public void save(Buffer buffer, int row, int rows, int dataType) throws IOException { |
99 | 105 |
|
100 |
long pos = row*this.columns + this.startpos; |
|
101 |
raf.seek(pos); |
|
102 |
|
|
103 |
BufferManager bufferManager = BufferLocator.getBufferManager(); |
|
104 |
ByteBuffer byteBuffer = ByteBuffer.allocate(buffer.capacity() * bufferManager.getDataTypeSize(dataType)); |
|
105 |
switch (dataType) { |
|
106 |
case BufferManager.TYPE_BYTE: |
|
107 |
byteBuffer.put(((ByteBuffer)buffer).array()); |
|
108 |
break; |
|
109 |
case BufferManager.TYPE_SHORT: |
|
110 |
case BufferManager.TYPE_USHORT: |
|
111 |
ShortBuffer byteAsShortBuffer = byteBuffer.asShortBuffer(); |
|
112 |
byteAsShortBuffer.put((short[]) buffer.array()); |
|
113 |
break; |
|
114 |
case BufferManager.TYPE_INT: |
|
115 |
IntBuffer byteAsIntBuffer = byteBuffer.asIntBuffer(); |
|
116 |
byteAsIntBuffer.put((int[]) buffer.array()); |
|
117 |
break; |
|
118 |
case BufferManager.TYPE_FLOAT: |
|
119 |
FloatBuffer byteAsFloatBuffer = byteBuffer.asFloatBuffer(); |
|
120 |
byteAsFloatBuffer.put((float[]) buffer.array()); |
|
121 |
break; |
|
122 |
case BufferManager.TYPE_DOUBLE: |
|
123 |
DoubleBuffer byteAsDoubleBuffer = byteBuffer.asDoubleBuffer(); |
|
124 |
byteAsDoubleBuffer.put((double[]) buffer.array()); |
|
125 |
break; |
|
126 |
default: |
|
127 |
throw new IllegalArgumentException("Data Type " + dataType + " not supported."); |
|
128 |
} |
|
129 |
raf.write(byteBuffer.array()); |
|
130 |
|
|
131 | 106 |
} |
132 | 107 |
|
133 | 108 |
@Override |
Also available in: Unified diff