History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/com/sun/imageio/plugins/common/ReaderUtil.java (1 of 18352 files). Show all

Unified · Split

java/pkg/com/sun/imageio/plugins/common/ReaderUtil.java+216−0
@@ -0,0 +1,216 @@
1/*
2 * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package com.sun.imageio.plugins.common;
27
28import java.awt.Point;
29import java.awt.Rectangle;
30import java.io.IOException;
31import javax.imageio.stream.ImageInputStream;
32
33/**
34 * This class contains utility methods that may be useful to ImageReader
35 * plugins. Ideally these methods would be in the ImageReader base class
36 * so that all subclasses could benefit from them, but that would be an
37 * addition to the existing API, and it is not yet clear whether these methods
38 * are universally useful, so for now we will leave them here.
39 */
40public class ReaderUtil {
41
42 // Helper for computeUpdatedPixels method
43 private static void computeUpdatedPixels(int sourceOffset,
44 int sourceExtent,
45 int destinationOffset,
46 int dstMin,
47 int dstMax,
48 int sourceSubsampling,
49 int passStart,
50 int passExtent,
51 int passPeriod,
52 int[] vals,
53 int offset)
54 {
55 // We need to satisfy the congruences:
56 // dst = destinationOffset + (src - sourceOffset)/sourceSubsampling
57 //
58 // src - passStart == 0 (mod passPeriod)
59 // src - sourceOffset == 0 (mod sourceSubsampling)
60 //
61 // subject to the inequalities:
62 //
63 // src >= passStart
64 // src < passStart + passExtent
65 // src >= sourceOffset
66 // src < sourceOffset + sourceExtent
67 // dst >= dstMin
68 // dst <= dstmax
69 //
70 // where
71 //
72 // dst = destinationOffset + (src - sourceOffset)/sourceSubsampling
73 //
74 // For now we use a brute-force approach although we could
75 // attempt to analyze the congruences. If passPeriod and
76 // sourceSubsamling are relatively prime, the period will be
77 // their product. If they share a common factor, either the
78 // period will be equal to the larger value, or the sequences
79 // will be completely disjoint, depending on the relationship
80 // between passStart and sourceOffset. Since we only have to do this
81 // twice per image (once each for X and Y), it seems cheap enough
82 // to do it the straightforward way.
83
84 boolean gotPixel = false;
85 int firstDst = -1;
86 int secondDst = -1;
87 int lastDst = -1;
88
89 for (int i = 0; i < passExtent; i++) {
90 int src = passStart + i*passPeriod;
91 if (src < sourceOffset) {
92 continue;
93 }
94 if ((src - sourceOffset) % sourceSubsampling != 0) {
95 continue;
96 }
97 if (src >= sourceOffset + sourceExtent) {
98 break;
99 }
100
101 int dst = destinationOffset +
102 (src - sourceOffset)/sourceSubsampling;
103 if (dst < dstMin) {
104 continue;
105 }
106 if (dst > dstMax) {
107 break;
108 }
109
110 if (!gotPixel) {
111 firstDst = dst; // Record smallest valid pixel
112 gotPixel = true;
113 } else if (secondDst == -1) {
114 secondDst = dst; // Record second smallest valid pixel
115 }
116 lastDst = dst; // Record largest valid pixel
117 }
118
119 vals[offset] = firstDst;
120
121 // If we never saw a valid pixel, set width to 0
122 if (!gotPixel) {
123 vals[offset + 2] = 0;
124 } else {
125 vals[offset + 2] = lastDst - firstDst + 1;
126 }
127
128 // The period is given by the difference of any two adjacent pixels
129 vals[offset + 4] = Math.max(secondDst - firstDst, 1);
130 }
131
132 /**
133 * A utility method that computes the exact set of destination
134 * pixels that will be written during a particular decoding pass.
135 * The intent is to simplify the work done by readers in combining
136 * the source region, source subsampling, and destination offset
137 * information obtained from the <code>ImageReadParam</code> with
138 * the offsets and periods of a progressive or interlaced decoding
139 * pass.
140 *
141 * @param sourceRegion a <code>Rectangle</code> containing the
142 * source region being read, offset by the source subsampling
143 * offsets, and clipped against the source bounds, as returned by
144 * the <code>getSourceRegion</code> method.
145 * @param destinationOffset a <code>Point</code> containing the
146 * coordinates of the upper-left pixel to be written in the
147 * destination.
148 * @param dstMinX the smallest X coordinate (inclusive) of the
149 * destination <code>Raster</code>.
150 * @param dstMinY the smallest Y coordinate (inclusive) of the
151 * destination <code>Raster</code>.
152 * @param dstMaxX the largest X coordinate (inclusive) of the destination
153 * <code>Raster</code>.
154 * @param dstMaxY the largest Y coordinate (inclusive) of the destination
155 * <code>Raster</code>.
156 * @param sourceXSubsampling the X subsampling factor.
157 * @param sourceYSubsampling the Y subsampling factor.
158 * @param passXStart the smallest source X coordinate (inclusive)
159 * of the current progressive pass.
160 * @param passYStart the smallest source Y coordinate (inclusive)
161 * of the current progressive pass.
162 * @param passWidth the width in pixels of the current progressive
163 * pass.
164 * @param passHeight the height in pixels of the current progressive
165 * pass.
166 * @param passPeriodX the X period (horizontal spacing between
167 * pixels) of the current progressive pass.
168 * @param passPeriodY the Y period (vertical spacing between
169 * pixels) of the current progressive pass.
170 *
171 * @return an array of 6 <code>int</code>s containing the
172 * destination min X, min Y, width, height, X period and Y period
173 * of the region that will be updated.
174 */
175 public static int[] computeUpdatedPixels(Rectangle sourceRegion,
176 Point destinationOffset,
177 int dstMinX,
178 int dstMinY,
179 int dstMaxX,
180 int dstMaxY,
181 int sourceXSubsampling,
182 int sourceYSubsampling,
183 int passXStart,
184 int passYStart,
185 int passWidth,
186 int passHeight,
187 int passPeriodX,
188 int passPeriodY)
189 {
190 int[] vals = new int[6];
191 computeUpdatedPixels(sourceRegion.x, sourceRegion.width,
192 destinationOffset.x,
193 dstMinX, dstMaxX, sourceXSubsampling,
194 passXStart, passWidth, passPeriodX,
195 vals, 0);
196 computeUpdatedPixels(sourceRegion.y, sourceRegion.height,
197 destinationOffset.y,
198 dstMinY, dstMaxY, sourceYSubsampling,
199 passYStart, passHeight, passPeriodY,
200 vals, 1);
201 return vals;
202 }
203
204 public static int readMultiByteInteger(ImageInputStream iis)
205 throws IOException
206 {
207 int value = iis.readByte();
208 int result = value & 0x7f;
209 while((value & 0x80) == 0x80) {
210 result <<= 7;
211 value = iis.readByte();
212 result |= (value & 0x7f);
213 }
214 return result;
215 }
216}