/*
* CVS identifier:
*
* $Id: ModuleSpec.java,v 1.24 2001/10/26 16:30:11 grosbois Exp $
*
* Class: ModuleSpec
*
* Description: Generic class for storing module specs
*
* from WTFilterSpec (Diego Santa Cruz)
*
* 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 CSJ2K.j2k.image;
namespace CSJ2K.j2k
{
/// This generic class is used to handle values to be used by a module for each
/// tile and component. It uses attribute to determine which value to use. It
/// should be extended by each module needing this feature.
///
/// This class might be used for values that are only tile specific or
/// component specific but not both.
///
/// The attributes to use are defined by a hierarchy. The hierarchy is:
///
///
/// - Tile and component specific attribute
/// - Tile specific default attribute
/// - Component main default attribute
/// - Main default attribute
///
///
///
public class ModuleSpec : System.ICloneable
{
virtual public ModuleSpec Copy
{
get
{
return (ModuleSpec) this.Clone();
}
}
/// The identifier for a specification module that applies only to
/// components
///
public const byte SPEC_TYPE_COMP = 0;
/// The identifier for a specification module that applies only to tiles
public const byte SPEC_TYPE_TILE = 1;
/// The identifier for a specification module that applies both to tiles
/// and components
///
public const byte SPEC_TYPE_TILE_COMP = 2;
/// The identifier for default specification
public const byte SPEC_DEF = 0;
/// The identifier for "component default" specification
public const byte SPEC_COMP_DEF = 1;
/// The identifier for "tile default" specification
public const byte SPEC_TILE_DEF = 2;
/// The identifier for a "tile-component" specification
public const byte SPEC_TILE_COMP = 3;
/// The type of the specification module
protected internal int specType;
/// The number of tiles
protected internal int nTiles = 0;
/// The number of components
protected internal int nComp = 0;
/// The spec type for each tile-component. The first index is the tile
/// index, the second is the component index.
///
protected internal byte[][] specValType;
/// Default value for each tile-component
protected internal System.Object def = null;
/// The default value for each component. Null if no component
/// specific value is defined
///
protected internal System.Object[] compDef = null;
/// The default value for each tile. Null if no tile specific value is
/// defined
///
protected internal System.Object[] tileDef = null;
/// The specific value for each tile-component. Value of tile 16 component
/// 3 is accessible through the hash value "t16c3". Null if no
/// tile-component specific value is defined
///
protected internal System.Collections.Hashtable tileCompVal;
public virtual System.Object Clone()
{
ModuleSpec ms;
try
{
ms = (ModuleSpec) base.MemberwiseClone();
}
//UPGRADE_NOTE: Exception 'java.lang.CloneNotSupportedException' was converted to 'System.Exception' which has different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1100'"
catch (System.Exception)
{
throw new System.ApplicationException("Error when cloning ModuleSpec instance");
}
// Create a copy of the specValType array
ms.specValType = new byte[nTiles][];
for (int i = 0; i < nTiles; i++)
{
ms.specValType[i] = new byte[nComp];
}
for (int t = 0; t < nTiles; t++)
{
for (int c = 0; c < nComp; c++)
{
ms.specValType[t][c] = specValType[t][c];
}
}
// Create a copy of tileDef
if (tileDef != null)
{
ms.tileDef = new System.Object[nTiles];
for (int t = 0; t < nTiles; t++)
{
ms.tileDef[t] = tileDef[t];
}
}
// Create a copy of tileCompVal
if (tileCompVal != null)
{
ms.tileCompVal = System.Collections.Hashtable.Synchronized(new System.Collections.Hashtable());
System.String tmpKey;
System.Object tmpVal;
//UPGRADE_TODO: Method 'java.util.Enumeration.hasMoreElements' was converted to 'System.Collections.IEnumerator.MoveNext' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationhasMoreElements'"
for (System.Collections.IEnumerator e = tileCompVal.Keys.GetEnumerator(); e.MoveNext(); )
{
//UPGRADE_TODO: Method 'java.util.Enumeration.nextElement' was converted to 'System.Collections.IEnumerator.Current' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationnextElement'"
tmpKey = ((System.String) e.Current);
tmpVal = tileCompVal[tmpKey];
ms.tileCompVal[tmpKey] = tmpVal;
}
}
return ms;
}
/// Rotate the ModuleSpec instance by 90 degrees (this modifies only tile
/// and tile-component specifications).
///
///
/// Number of tiles along horizontal and vertical axis after
/// rotation.
///
///
public virtual void rotate90(Coord anT)
{
// Rotate specValType
byte[][] tmpsvt = new byte[nTiles][];
int ax, ay;
Coord bnT = new Coord(anT.y, anT.x);
for (int by = 0; by < bnT.y; by++)
{
for (int bx = 0; bx < bnT.x; bx++)
{
ay = bx;
ax = bnT.y - by - 1;
tmpsvt[ay * anT.x + ax] = specValType[by * bnT.x + bx];
}
}
specValType = tmpsvt;
// Rotate tileDef
if (tileDef != null)
{
System.Object[] tmptd = new System.Object[nTiles];
for (int by = 0; by < bnT.y; by++)
{
for (int bx = 0; bx < bnT.x; bx++)
{
ay = bx;
ax = bnT.y - by - 1;
tmptd[ay * anT.x + ax] = tileDef[by * bnT.x + bx];
}
}
tileDef = tmptd;
}
// Rotate tileCompVal
if (tileCompVal != null && tileCompVal.Count > 0)
{
System.Collections.Hashtable tmptcv = System.Collections.Hashtable.Synchronized(new System.Collections.Hashtable());
System.String tmpKey;
System.Object tmpVal;
int btIdx, atIdx;
int i1, i2;
int bx, by;
//UPGRADE_TODO: Method 'java.util.Enumeration.hasMoreElements' was converted to 'System.Collections.IEnumerator.MoveNext' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationhasMoreElements'"
for (System.Collections.IEnumerator e = tileCompVal.Keys.GetEnumerator(); e.MoveNext(); )
{
//UPGRADE_TODO: Method 'java.util.Enumeration.nextElement' was converted to 'System.Collections.IEnumerator.Current' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilEnumerationnextElement'"
tmpKey = ((System.String) e.Current);
tmpVal = tileCompVal[tmpKey];
i1 = tmpKey.IndexOf('t');
i2 = tmpKey.IndexOf('c');
btIdx = (System.Int32.Parse(tmpKey.Substring(i1 + 1, (i2) - (i1 + 1))));
bx = btIdx % bnT.x;
by = btIdx / bnT.x;
ay = bx;
ax = bnT.y - by - 1;
atIdx = ax + ay * anT.x;
tmptcv["t" + atIdx + tmpKey.Substring(i2)] = tmpVal;
}
tileCompVal = tmptcv;
}
}
/// Constructs a 'ModuleSpec' object, initializing all the components and
/// tiles to the 'SPEC_DEF' spec val type, for the specified number of
/// components and tiles.
///
///
/// The number of tiles
///
///
/// The number of components
///
///
/// the type of the specification module i.e. tile specific,
/// component specific or both.
///
///
public ModuleSpec(int nt, int nc, byte type)
{
nTiles = nt;
nComp = nc;
specValType = new byte[nt][];
for (int i = 0; i < nt; i++)
{
specValType[i] = new byte[nc];
}
switch (type)
{
case SPEC_TYPE_TILE:
specType = SPEC_TYPE_TILE;
break;
case SPEC_TYPE_COMP:
specType = SPEC_TYPE_COMP;
break;
case SPEC_TYPE_TILE_COMP:
specType = SPEC_TYPE_TILE_COMP;
break;
}
}
/// Sets default value for this module
///
///
public virtual void setDefault(System.Object value_Renamed)
{
def = value_Renamed;
}
/// Gets default value for this module.
///
///
/// The default value (Must be casted before use)
///
///
public virtual System.Object getDefault()
{
return def;
}
/// Sets default value for specified component and specValType tag if
/// allowed by its priority.
///
///
/// Component index
///
///
public virtual void setCompDef(int c, System.Object value_Renamed)
{
if (specType == SPEC_TYPE_TILE)
{
//UPGRADE_TODO: The equivalent in .NET for method 'java.lang.Object.toString' may return a different value. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1043'"
System.String errMsg = "Option whose value is '" + value_Renamed + "' cannot be " + "specified for components as it is a 'tile only' specific " + "option";
throw new System.ApplicationException(errMsg);
}
if (compDef == null)
{
compDef = new System.Object[nComp];
}
for (int i = 0; i < nTiles; i++)
{
if (specValType[i][c] < SPEC_COMP_DEF)
{
specValType[i][c] = SPEC_COMP_DEF;
}
}
compDef[c] = value_Renamed;
}
/// Gets default value of the specified component. If no specification have
/// been entered for this component, returns default value.
///
///
/// Component index
///
///
/// The default value for this component (Must be casted before
/// use)
///
///
///
///
///
public virtual System.Object getCompDef(int c)
{
if (specType == SPEC_TYPE_TILE)
{
throw new System.ApplicationException("Illegal use of ModuleSpec class");
}
if (compDef == null || compDef[c] == null)
{
return getDefault();
}
else
{
return compDef[c];
}
}
/// Sets default value for specified tile and specValType tag if allowed by
/// its priority.
///
///
/// Tile index.
///
///
public virtual void setTileDef(int t, System.Object value_Renamed)
{
if (specType == SPEC_TYPE_COMP)
{
//UPGRADE_TODO: The equivalent in .NET for method 'java.lang.Object.toString' may return a different value. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1043'"
System.String errMsg = "Option whose value is '" + value_Renamed + "' cannot be " + "specified for tiles as it is a 'component only' specific " + "option";
throw new System.ApplicationException(errMsg);
}
if (tileDef == null)
{
tileDef = new System.Object[nTiles];
}
for (int i = 0; i < nComp; i++)
{
if (specValType[t][i] < SPEC_TILE_DEF)
{
specValType[t][i] = SPEC_TILE_DEF;
}
}
tileDef[t] = value_Renamed;
}
/// Gets default value of the specified tile. If no specification has been
/// entered, it returns the default value.
///
///
/// Tile index
///
///
/// The default value for this tile (Must be casted before use)
///
///
///
///
///
public virtual System.Object getTileDef(int t)
{
if (specType == SPEC_TYPE_COMP)
{
throw new System.ApplicationException("Illegal use of ModuleSpec class");
}
if (tileDef == null || tileDef[t] == null)
{
return getDefault();
}
else
{
return tileDef[t];
}
}
/// Sets value for specified tile-component.
///
///
/// Tie index
///
///
/// Component index
///
///
public virtual void setTileCompVal(int t, int c, System.Object value_Renamed)
{
if (specType != SPEC_TYPE_TILE_COMP)
{
//UPGRADE_TODO: The equivalent in .NET for method 'java.lang.Object.toString' may return a different value. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1043'"
System.String errMsg = "Option whose value is '" + value_Renamed + "' cannot be " + "specified for ";
switch (specType)
{
case SPEC_TYPE_TILE:
errMsg += "components as it is a 'tile only' specific option";
break;
case SPEC_TYPE_COMP:
errMsg += "tiles as it is a 'component only' specific option";
break;
}
throw new System.ApplicationException(errMsg);
}
if (tileCompVal == null)
tileCompVal = System.Collections.Hashtable.Synchronized(new System.Collections.Hashtable());
specValType[t][c] = SPEC_TILE_COMP;
tileCompVal["t" + t + "c" + c] = value_Renamed;
}
/// Gets value of specified tile-component. This method calls getSpec but
/// has a public access.
///
///
/// Tile index
///
///
/// Component index
///
///
/// The value of this tile-component (Must be casted before use)
///
///
///
///
///
///
///
///
public virtual System.Object getTileCompVal(int t, int c)
{
if (specType != SPEC_TYPE_TILE_COMP)
{
throw new System.ApplicationException("Illegal use of ModuleSpec class");
}
return getSpec(t, c);
}
/// Gets value of specified tile-component without knowing if a specific
/// tile-component value has been previously entered. It first check if a
/// tile-component specific value has been entered, then if a tile specific
/// value exist, then if a component specific value exist. If not the
/// default value is returned.
///
///
/// Tile index
///
///
/// Component index
///
///
/// Value for this tile component.
///
///
protected internal virtual System.Object getSpec(int t, int c)
{
switch (specValType[t][c])
{
case SPEC_DEF:
return getDefault();
case SPEC_COMP_DEF:
return getCompDef(c);
case SPEC_TILE_DEF:
return getTileDef(t);
case SPEC_TILE_COMP:
return tileCompVal["t" + t + "c" + c];
default:
throw new System.ArgumentException("Not recognized spec type");
}
}
/// Return the spec type of the given tile-component.
///
///
/// Tile index
///
///
/// Component index
///
///
public virtual byte getSpecValType(int t, int c)
{
return specValType[t][c];
}
/// Whether or not specifications have been entered for the given
/// component.
///
///
/// Index of the component
///
///
/// True if component specification has been defined
///
///
public virtual bool isCompSpecified(int c)
{
if (compDef == null || compDef[c] == null)
{
return false;
}
else
{
return true;
}
}
/// Whether or not specifications have been entered for the given tile.
///
///
/// Index of the tile
///
///
/// True if tile specification has been entered
///
///
public virtual bool isTileSpecified(int t)
{
if (tileDef == null || tileDef[t] == null)
{
return false;
}
else
{
return true;
}
}
/// Whether or not a tile-component specification has been defined
///
///
/// Tile index
///
///
/// Component index
///
///
/// True if a tile-component specification has been defined.
///
///
public virtual bool isTileCompSpecified(int t, int c)
{
if (tileCompVal == null || tileCompVal["t" + t + "c" + c] == null)
{
return false;
}
else
{
return true;
}
}
/// This method is responsible of parsing tile indexes set and component
/// indexes set for an option. Such an argument must follow the following
/// policy:
///
/// t<indexes set> or c<indexes set> where
/// tile or component indexes are separated by commas or a dashes.
///
/// Example:
///
t0,3,4 means tiles with indexes 0, 3 and 4.
/// t2-4 means tiles with indexes 2,3 and 4.
///
/// It returns a boolean array skteching which tile or component are
/// concerned by the next parameters.
///
///
/// The word to parse.
///
///
/// Maximum authorized index
///
///
/// Indexes concerned by this parameter.
///
///
public static bool[] parseIdx(System.String word, int maxIdx)
{
int nChar = word.Length; // Number of characters
char c = word[0]; // current character
int idx = - 1; // Current (tile or component) index
int lastIdx = - 1; // Last (tile or component) index
bool isDash = false; // Whether or not last separator was a dash
bool[] idxSet = new bool[maxIdx];
int i = 1; // index of the current character
while (i < nChar)
{
c = word[i];
if (System.Char.IsDigit(c))
{
if (idx == - 1)
{
idx = 0;
}
idx = idx * 10 + (c - '0');
}
else
{
if (idx == - 1 || (c != ',' && c != '-'))
{
throw new System.ArgumentException("Bad construction for " + "parameter: " + word);
}
if (idx < 0 || idx >= maxIdx)
{
throw new System.ArgumentException("Out of range index " + "in " + "parameter `" + word + "' : " + idx);
}
// Found a comma
if (c == ',')
{
if (isDash)
{
// Previously found a dash, fill idxSet
for (int j = lastIdx + 1; j < idx; j++)
{
idxSet[j] = true;
}
}
isDash = false;
}
else
{
// Found a dash
isDash = true;
}
// Udate idxSet
idxSet[idx] = true;
lastIdx = idx;
idx = - 1;
}
i++;
}
// Process last found index
if (idx < 0 || idx >= maxIdx)
{
throw new System.ArgumentException("Out of range index in " + "parameter `" + word + "' : " + idx);
}
if (isDash)
{
for (int j = lastIdx + 1; j < idx; j++)
{
idxSet[j] = true;
}
}
idxSet[idx] = true;
return idxSet;
}
}
}