Statistics
| Revision:

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
}