gvsig-raster / org.gvsig.raster / branches / org.gvsig.raster.2.4 / org.gvsig.raster / org.gvsig.raster.lib / org.gvsig.raster.lib.buffer / org.gvsig.raster.lib.buffer.impl / src / main / java / org / gvsig / raster / lib / buffer / impl / SimpleBandPageManager.java @ 8800
History | View | Annotate | Download (4.73 KB)
1 | 5515 | fdiaz | package org.gvsig.raster.lib.buffer.impl; |
---|---|---|---|
2 | |||
3 | import java.io.File; |
||
4 | import java.io.IOException; |
||
5 | import java.io.RandomAccessFile; |
||
6 | 6220 | dmartinezizquierdo | import java.nio.Buffer; |
7 | 5515 | fdiaz | import java.nio.ByteBuffer; |
8 | 6220 | dmartinezizquierdo | import java.nio.DoubleBuffer; |
9 | import java.nio.FloatBuffer; |
||
10 | import java.nio.IntBuffer; |
||
11 | import java.nio.ShortBuffer; |
||
12 | 5515 | fdiaz | |
13 | 6302 | llmarques | import org.gvsig.raster.lib.buffer.api.BandInfo; |
14 | 5515 | fdiaz | import org.gvsig.raster.lib.buffer.api.BandPageManager; |
15 | import org.gvsig.raster.lib.buffer.api.BufferLocator; |
||
16 | import org.gvsig.raster.lib.buffer.api.BufferManager; |
||
17 | |||
18 | |||
19 | /**
|
||
20 | * @author fdiaz
|
||
21 | *
|
||
22 | */
|
||
23 | public class SimpleBandPageManager implements BandPageManager { |
||
24 | |||
25 | private RandomAccessFile raf; |
||
26 | private int rows; |
||
27 | private int columns; |
||
28 | private int dataType; |
||
29 | private File file; |
||
30 | |||
31 | /**
|
||
32 | * @param file
|
||
33 | * @param rows
|
||
34 | * @param columns
|
||
35 | * @param dataType
|
||
36 | * @throws IOException
|
||
37 | */
|
||
38 | public SimpleBandPageManager(File file, int rows, int columns, int dataType) throws IOException { |
||
39 | this.rows = rows;
|
||
40 | this.columns = columns;
|
||
41 | this.dataType = dataType;
|
||
42 | this.file = file;
|
||
43 | 5537 | fdiaz | if(this.file==null){ |
44 | this.file = File.createTempFile("bandPageManager", "tmp"); |
||
45 | } |
||
46 | 5515 | fdiaz | |
47 | 5537 | fdiaz | this.raf = new RandomAccessFile(this.file, "rw"); |
48 | 5515 | fdiaz | BufferManager bufferManager = BufferLocator.getBufferManager(); |
49 | raf.setLength(rows*columns*bufferManager.getDataTypeSize(dataType)); |
||
50 | |||
51 | } |
||
52 | |||
53 | 6220 | dmartinezizquierdo | public void load(Buffer buffer, int row, int rows, int dataType) throws IOException { |
54 | 5515 | fdiaz | |
55 | int pos = row*this.columns; |
||
56 | raf.seek(pos); |
||
57 | 6220 | dmartinezizquierdo | BufferManager bufferManager = BufferLocator.getBufferManager(); |
58 | int dataTypeSize = bufferManager.getDataTypeSize(dataType);
|
||
59 | byte[] byteArray = new byte[buffer.capacity() * dataTypeSize]; |
||
60 | raf.read(byteArray); |
||
61 | buffer.rewind(); |
||
62 | 5515 | fdiaz | |
63 | 6220 | dmartinezizquierdo | switch (dataType) {
|
64 | case BufferManager.TYPE_BYTE:
|
||
65 | 6326 | fdiaz | //FIXME: Elegir cual de las dos siguientes maneras de hacerlo es la id?nea
|
66 | |||
67 | ((ByteBuffer) buffer).put(byteArray, 0, byteArray.length); |
||
68 | // System.arraycopy(byteArray, 0, ((ByteBuffer) buffer).array(), 0, byteArray.length);
|
||
69 | 6220 | dmartinezizquierdo | break;
|
70 | case BufferManager.TYPE_SHORT:
|
||
71 | case BufferManager.TYPE_USHORT:
|
||
72 | for( int cell =0 ; cell<byteArray.length ; cell++ ) { |
||
73 | ((ShortBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]); |
||
74 | } |
||
75 | break;
|
||
76 | case BufferManager.TYPE_INT:
|
||
77 | for( int cell =0 ; cell<byteArray.length ; cell++ ) { |
||
78 | ((IntBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]); |
||
79 | } |
||
80 | break;
|
||
81 | case BufferManager.TYPE_FLOAT:
|
||
82 | for( int cell =0 ; cell<byteArray.length ; cell++ ) { |
||
83 | ((FloatBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]); |
||
84 | } |
||
85 | break;
|
||
86 | |||
87 | case BufferManager.TYPE_DOUBLE:
|
||
88 | for( int cell =0 ; cell<byteArray.length ; cell++ ) { |
||
89 | ((DoubleBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]); |
||
90 | } |
||
91 | break;
|
||
92 | |||
93 | default:
|
||
94 | throw new IllegalArgumentException("Data Type " + dataType + " not supported."); |
||
95 | } |
||
96 | |||
97 | |||
98 | |||
99 | |||
100 | 5515 | fdiaz | } |
101 | |||
102 | 6220 | dmartinezizquierdo | public void save(Buffer buffer, int row, int rows, int dataType) throws IOException { |
103 | 5515 | fdiaz | |
104 | int pos = row*this.columns; |
||
105 | raf.seek(pos); |
||
106 | |||
107 | 6220 | dmartinezizquierdo | BufferManager bufferManager = BufferLocator.getBufferManager(); |
108 | ByteBuffer byteBuffer = ByteBuffer.allocate(buffer.capacity() * bufferManager.getDataTypeSize(dataType)); |
||
109 | switch (dataType) {
|
||
110 | case BufferManager.TYPE_BYTE:
|
||
111 | 6298 | dmartinezizquierdo | byteBuffer.put(((ByteBuffer)buffer).array());
|
112 | break;
|
||
113 | 6220 | dmartinezizquierdo | case BufferManager.TYPE_SHORT:
|
114 | case BufferManager.TYPE_USHORT:
|
||
115 | ShortBuffer byteAsShortBuffer = byteBuffer.asShortBuffer();
|
||
116 | byteAsShortBuffer.put((short[]) buffer.array()); |
||
117 | break;
|
||
118 | case BufferManager.TYPE_INT:
|
||
119 | IntBuffer byteAsIntBuffer = byteBuffer.asIntBuffer();
|
||
120 | byteAsIntBuffer.put((int[]) buffer.array()); |
||
121 | break;
|
||
122 | case BufferManager.TYPE_FLOAT:
|
||
123 | FloatBuffer byteAsFloatBuffer = byteBuffer.asFloatBuffer();
|
||
124 | byteAsFloatBuffer.put((float[]) buffer.array()); |
||
125 | break;
|
||
126 | case BufferManager.TYPE_DOUBLE:
|
||
127 | DoubleBuffer byteAsDoubleBuffer = byteBuffer.asDoubleBuffer();
|
||
128 | byteAsDoubleBuffer.put((double[]) buffer.array()); |
||
129 | break;
|
||
130 | default:
|
||
131 | throw new IllegalArgumentException("Data Type " + dataType + " not supported."); |
||
132 | } |
||
133 | raf.write(byteBuffer.array()); |
||
134 | |||
135 | 5515 | fdiaz | } |
136 | |||
137 | @Override
|
||
138 | public boolean isSupportedSave() { |
||
139 | return true; |
||
140 | } |
||
141 | 6302 | llmarques | |
142 | @Override
|
||
143 | public BandInfo getBandInfo() {
|
||
144 | return null; |
||
145 | } |
||
146 | 5515 | fdiaz | } |