Mercurial > projects > dwt-mac
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 } |