comparison dwt/internal/image/TIFFRandomFileAccess.d @ 0:380af2bdd8e5

Upload of whole dwt tree
author Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
date Sat, 09 Aug 2008 17:00:02 +0200
parents
children 1a8b3cb347e0
comparison
equal deleted inserted replaced
-1:000000000000 0:380af2bdd8e5
1 /*******************************************************************************
2 * Copyright (c) 2000, 2003 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 module dwt.internal.image;
12
13 import java.io.IOException;
14
15 final class TIFFRandomFileAccess {
16
17 LEDataInputStream inputStream;
18 int start, current, next;
19 byte[][] buffers;
20
21 static final int CHUNK_SIZE = 8192;
22 static final int LIST_SIZE = 128;
23
24 public TIFFRandomFileAccess(LEDataInputStream stream) {
25 inputStream = stream;
26 start = current = next = inputStream.getPosition();
27 buffers = new byte[LIST_SIZE][];
28 }
29
30 void seek(int pos) throws IOException {
31 if (pos is current) return;
32 if (pos < start) throw new IOException();
33 current = pos;
34 if (current > next) {
35 int n = current - next;
36 /* store required bytes */
37 int index = next / CHUNK_SIZE;
38 int offset = next % CHUNK_SIZE;
39 while (n > 0) {
40 if (index >= buffers.length) {
41 byte[][] oldBuffers = buffers;
42 buffers = new byte[Math.max(index + 1, oldBuffers.length + LIST_SIZE)][];
43 System.arraycopy(oldBuffers, 0, buffers, 0, oldBuffers.length);
44 }
45 if (buffers[index] is null) buffers[index] = new byte[CHUNK_SIZE];
46 int cnt = inputStream.read(buffers[index], offset, Math.min(n, CHUNK_SIZE - offset));
47 n -= cnt;
48 next += cnt;
49 index++;
50 offset = 0;
51 }
52 }
53 }
54
55 void read(byte b[]) throws IOException {
56 int size = b.length;
57 int nCached = Math.min(size, next - current);
58 int nMissing = size - next + current;
59 int destNext = 0;
60 if (nCached > 0) {
61 /* Get cached bytes */
62 int index = current / CHUNK_SIZE;
63 int offset = current % CHUNK_SIZE;
64 while (nCached > 0) {
65 int cnt = Math.min(nCached, CHUNK_SIZE - offset);
66 System.arraycopy(buffers[index], offset, b, destNext, cnt);
67 nCached -= cnt;
68 destNext += cnt;
69 index++;
70 offset = 0;
71 }
72 }
73 if (nMissing > 0) {
74 /* Read required bytes */
75 int index = next / CHUNK_SIZE;
76 int offset = next % CHUNK_SIZE;
77 while (nMissing > 0) {
78 if (index >= buffers.length) {
79 byte[][] oldBuffers = buffers;
80 buffers = new byte[Math.max(index, oldBuffers.length + LIST_SIZE)][];
81 System.arraycopy(oldBuffers, 0, buffers, 0, oldBuffers.length);
82 }
83 if (buffers[index] is null) buffers[index] = new byte[CHUNK_SIZE];
84 int cnt = inputStream.read(buffers[index], offset, Math.min(nMissing, CHUNK_SIZE - offset));
85 System.arraycopy(buffers[index], offset, b, destNext, cnt);
86 nMissing -= cnt;
87 next += cnt;
88 destNext += cnt;
89 index++;
90 offset = 0;
91 }
92 }
93 current += size;
94 }
95
96 }