-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIntegerSpec.cs
More file actions
340 lines (304 loc) · 9.61 KB
/
IntegerSpec.cs
File metadata and controls
340 lines (304 loc) · 9.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
/*
* CVS identifier:
*
* $Id: IntegerSpec.java,v 1.14 2001/09/20 12:31:08 grosbois Exp $
*
* Class: IntegerSpec
*
* Description: Holds specs corresponding to an Integer
*
*
*
* COPYRIGHT:
*
* This software module was originally developed by Rapha�l Grosbois and
* Diego Santa Cruz (Swiss Federal Institute of Technology-EPFL); Joel
* Askel�f (Ericsson Radio Systems AB); and Bertrand Berthelot, David
* Bouchard, F�lix Henry, Gerard Mozelle and Patrice Onno (Canon Research
* Centre France S.A) in the course of development of the JPEG2000
* standard as specified by ISO/IEC 15444 (JPEG 2000 Standard). This
* software module is an implementation of a part of the JPEG 2000
* Standard. Swiss Federal Institute of Technology-EPFL, Ericsson Radio
* Systems AB and Canon Research Centre France S.A (collectively JJ2000
* Partners) agree not to assert against ISO/IEC and users of the JPEG
* 2000 Standard (Users) any of their rights under the copyright, not
* including other intellectual property rights, for this software module
* with respect to the usage by ISO/IEC and Users of this software module
* or modifications thereof for use in hardware or software products
* claiming conformance to the JPEG 2000 Standard. Those intending to use
* this software module in hardware or software products are advised that
* their use may infringe existing patents. The original developers of
* this software module, JJ2000 Partners and ISO/IEC assume no liability
* for use of this software module or modifications thereof. No license
* or right to this software module is granted for non JPEG 2000 Standard
* conforming products. JJ2000 Partners have full right to use this
* software module for his/her own purpose, assign or donate this
* software module to any third party and to inhibit third parties from
* using this software module for non JPEG 2000 Standard conforming
* products. This copyright notice must be included in all copies or
* derivative works of this software module.
*
* Copyright (c) 1999/2000 JJ2000 Partners.
* */
using System;
using jpeg2000_decoder.Util;
/**
* This class extends ModuleSpec and is responsible of Integer specifications
* for each tile-component.
*
* @see ModuleSpec
* */
public class IntegerSpec : ModuleSpec {
/** The largest value of type int */
protected static int MAX_INT = int.MaxValue;
/**
* Constructs a new 'IntegerSpec' for the specified number of tiles and
* components and with allowed type of specifications. This constructor is
* normally called at decoder side.
*
* @param nt The number of tiles
*
* @param nc The number of components
*
* @param type The type of allowed specifications
* */
public IntegerSpec(int nt,int nc,byte type) : base(nt,nc,type) {
}
/**
* Constructs a new 'IntegerSpec' for the specified number of tiles and
* components, the allowed specifications type and the ParameterList
* instance. This constructor is normally called at encoder side and parse
* arguments of specified option.
*
* @param nt The number of tiles
*
* @param nc The number of components
*
* @param type The allowed specifications type
*
* @param pl The ParameterList instance
*
* @param optName The name of the option to process
* */
public IntegerSpec(int nt,int nc,byte type,ParameterList pl,
string optName): base(nt,nc,type) {
int value;
string param = pl.getParameter(optName);
if(param==null) { // No parameter specified
param = pl.getDefaultParameterList().getParameter(optName);
try {
setDefault(int.Parse(param));
} catch(Exception e) {
throw new ArgumentException("Non recognized value for option -"+optName+": "+param);
}
return;
}
// Parse argument
StringTokenizer stk = new StringTokenizer(param);
String word; // current word
byte curSpecType = SPEC_DEF; // Specification type of the
// current parameter
bool[] tileSpec = null; // Tiles concerned by the specification
bool[] compSpec = null; // Components concerned by the specification
while(stk.HasMoreTokens()) {
word = stk.NextToken();
switch(word[0]) {
case 't': // Tiles specification
tileSpec = parseIdx(word,nTiles);
if(curSpecType==SPEC_COMP_DEF) {
curSpecType = SPEC_TILE_COMP;
} else {
curSpecType = SPEC_TILE_DEF;
}
break;
case 'c': // Components specification
compSpec = parseIdx(word,nComp);
if(curSpecType==SPEC_TILE_DEF) {
curSpecType = SPEC_TILE_COMP;
} else {
curSpecType = SPEC_COMP_DEF;
}
break;
default:
try {
value = int.Parse(word);
} catch(Exception e) {
throw new ArgumentException("Non recognized value for option -"+optName+ ": "+word);
}
if(curSpecType==SPEC_DEF) {
setDefault(value);
} else if(curSpecType==SPEC_TILE_DEF) {
for(int i=tileSpec.Length-1; i>=0; i--)
if(tileSpec[i]) {
setTileDef(i,value);
}
} else if(curSpecType==SPEC_COMP_DEF) {
for(int i=compSpec.Length-1; i>=0; i--)
if(compSpec[i]) {
setCompDef(i,value);
}
} else {
for(int i=tileSpec.Length-1; i>=0; i--) {
for(int j=compSpec.Length-1; j>=0 ; j--) {
if(tileSpec[i] && compSpec[j]) {
setTileCompVal(i,j,value);
}
}
}
}
// Re-initialize
curSpecType = SPEC_DEF;
tileSpec = null;
compSpec = null;
break;
}
}
// Check that default value has been specified
if(getDefault()==null) {
int ndefspec = 0;
for(int t=nt-1; t>=0; t--) {
for(int c=nc-1; c>=0 ; c--) {
if(specValType[t][c] == SPEC_DEF) {
ndefspec++;
}
}
}
// If some tile-component have received no specification, it takes
// the default value defined in ParameterList
if(ndefspec!=0) {
param = pl.getDefaultParameterList().getParameter(optName);
try {
setDefault(int.Parse(param));
} catch(Exception e) {
throw new ArgumentException("Non recognized value for option -"+optName+": "+param);
}
} else {
// All tile-component have been specified, takes the first
// tile-component value as default.
setDefault(getTileCompVal(0,0));
switch(specValType[0][0]) {
case SPEC_TILE_DEF:
for(int c=nc-1; c>=0; c--) {
if(specValType[0][c]==SPEC_TILE_DEF)
specValType[0][c] = SPEC_DEF;
}
tileDef[0] = null;
break;
case SPEC_COMP_DEF:
for(int t=nt-1; t>=0; t--) {
if(specValType[t][0]==SPEC_COMP_DEF)
specValType[t][0] = SPEC_DEF;
}
compDef[0] = null;
break;
case SPEC_TILE_COMP:
specValType[0][0] = SPEC_DEF;
tileCompVal.Add("t0c0",null);
break;
}
}
}
}
/**
* Gets the maximum value of all tile-components.
*
* @return The maximum value
* */
public int getMax() {
int max = (int)def;
int tmp;
for(int t=0; t<nTiles; t++) {
for(int c=0; c<nComp; c++) {
tmp = (int)getSpec(t,c);
if(max<tmp)
max = tmp;
}
}
return max;
}
/**
* Get the minimum value of all tile-components.
*
* @return The minimum value
* */
public int getMin() {
int min = (int)def;
int tmp;
for(int t=0; t<nTiles; t++) {
for(int c=0; c<nComp; c++) {
tmp = (int)getSpec(t,c);
if(min>tmp)
min = tmp;
}
}
return min;
}
/**
* Gets the maximum value of each tile for specified component
*
* @param c The component index
*
* @return The maximum value
* */
public int getMaxInComp(int c) {
int max = 0;
int tmp;
for(int t=0; t<nTiles; t++) {
tmp = (int)getSpec(t,c);
if(max<tmp)
max = tmp;
}
return max;
}
/**
* Gets the minimum value of all tiles for the specified component.
*
* @param c The component index
*
* @return The minimum value
* */
public int getMinInComp(int c) {
int min = MAX_INT; // Big value
int tmp;
for(int t=0; t<nTiles; t++) {
tmp = (int)getSpec(t,c);
if(min>tmp)
min = tmp;
}
return min;
}
/**
* Gets the maximum value of all components in the specified tile.
*
* @param t The tile index
*
* @return The maximum value
* */
public int getMaxInTile(int t) {
int max = 0;
int tmp;
for(int c=0; c<nComp; c++) {
tmp = (int)getSpec(t,c);
if(max<tmp)
max = tmp;
}
return max;
}
/**
* Gets the minimum value of each component in specified tile
*
* @param t The tile index
*
* @return The minimum value
* */
public int getMinInTile(int t) {
int min = MAX_INT; // Big value
int tmp;
for(int c=0; c<nComp; c++) {
tmp = (int)getSpec(t,c);
if(min>tmp)
min = tmp;
}
return min;
}
}