📄 modulespec.java
字号:
/* * CVS identifier: * * $Id: ModuleSpec.java,v 1.1.1.1 2002/07/22 09:26:46 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雔 Grosbois and * Diego Santa Cruz (Swiss Federal Institute of Technology-EPFL); Joel * Askel鰂 (Ericsson Radio Systems AB); and Bertrand Berthelot, David * Bouchard, F閘ix 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. * */package jj2000.j2k;import jj2000.j2k.image.*;import java.util.*;/** * 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. * * <p>The attributes to use are defined by a hierarchy. The hierarchy is: * * <ul> * <li> Tile and component specific attribute</li> * <li> Tile specific default attribute</li> * <li> Component main default attribute</li> * <li> Main default attribute</li> * </ul></p> * */public class ModuleSpec implements Cloneable { /** The identifier for a specification module that applies only to * components */ public final static byte SPEC_TYPE_COMP = 0; /** The identifier for a specification module that applies only to tiles */ public final static byte SPEC_TYPE_TILE = 1; /** The identifier for a specification module that applies both to tiles * and components */ public final static byte SPEC_TYPE_TILE_COMP = 2; /** The identifier for default specification */ public final static byte SPEC_DEF = 0; /** The identifier for "component default" specification */ public final static byte SPEC_COMP_DEF = 1; /** The identifier for "tile default" specification */ public final static byte SPEC_TILE_DEF = 2; /** The identifier for a "tile-component" specification */ public final static byte SPEC_TILE_COMP = 3; /** The type of the specification module */ protected int specType; /** The number of tiles */ protected int nTiles = 0; /** The number of components */ protected int nComp = 0; /** The spec type for each tile-component. The first index is the tile * index, the second is the component index. */ protected byte[][] specValType; /** Default value for each tile-component */ protected Object def = null; /** The default value for each component. Null if no component specific value is defined */ protected Object[] compDef = null; /** The default value for each tile. Null if no tile specific value is defined */ protected 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 Hashtable tileCompVal; public ModuleSpec getCopy() { return (ModuleSpec)this.clone(); } protected Object clone() { ModuleSpec ms; try { ms = (ModuleSpec)super.clone(); } catch(CloneNotSupportedException e) { throw new Error("Error when cloning ModuleSpec instance"); } // Create a copy of the specValType array ms.specValType = new byte[nTiles][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 Object[nTiles]; for(int t=0; t<nTiles; t++) { ms.tileDef[t] = tileDef[t]; } } // Create a copy of tileCompVal if(tileCompVal!=null) { ms.tileCompVal = new Hashtable(); String tmpKey; Object tmpVal; for(Enumeration e=tileCompVal.keys(); e.hasMoreElements(); ) { tmpKey = (String)e.nextElement(); tmpVal = tileCompVal.get(tmpKey); ms.tileCompVal.put(tmpKey,tmpVal); } } return ms; } /** * Rotate the ModuleSpec instance by 90 degrees (this modifies only tile * and tile-component specifications). * * @param nT Number of tiles along horizontal and vertical axis after * rotation. * */ public 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) { Object[] tmptd = new 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.size()>0) { Hashtable tmptcv = new Hashtable(); String tmpKey; Object tmpVal; int btIdx,atIdx; int i1,i2; int bx,by; for(Enumeration e=tileCompVal.keys(); e.hasMoreElements(); ) { tmpKey = (String)e.nextElement(); tmpVal = tileCompVal.get(tmpKey); i1 = tmpKey.indexOf('t'); i2 = tmpKey.indexOf('c'); btIdx = (new Integer(tmpKey.substring(i1+1,i2))).intValue(); bx = btIdx%bnT.x; by = btIdx/bnT.x; ay = bx; ax = bnT.y-by-1; atIdx = ax+ay*anT.x; tmptcv.put("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. * * @param nt The number of tiles * * @param nc The number of components * * @param type 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][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 void setDefault(Object value) { def = value; } /** * Gets default value for this module. * * @return The default value (Must be casted before use) * */ public Object getDefault() { return def; } /** * Sets default value for specified component and specValType tag if * allowed by its priority. * * @param c Component index * */ public void setCompDef(int c, Object value) { if ( specType == SPEC_TYPE_TILE ) { String errMsg = "Option whose value is '"+value+"' cannot be " +"specified for components as it is a 'tile only' specific " +"option"; throw new Error(errMsg); } if(compDef==null) { compDef = new 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; } /**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -