001/* 002 * $RCSfile: SynWTFilterSpec.java,v $ 003 * $Revision: 1.1 $ 004 * $Date: 2005/02/11 05:02:34 $ 005 * $State: Exp $ 006 * 007 * Class: SynWTFilterSpec 008 * 009 * Description: Synthesis filters specification 010 * 011 * 012 * 013 * COPYRIGHT: 014 * 015 * This software module was originally developed by Raphaël Grosbois and 016 * Diego Santa Cruz (Swiss Federal Institute of Technology-EPFL); Joel 017 * Askelöf (Ericsson Radio Systems AB); and Bertrand Berthelot, David 018 * Bouchard, Félix Henry, Gerard Mozelle and Patrice Onno (Canon Research 019 * Centre France S.A) in the course of development of the JPEG2000 020 * standard as specified by ISO/IEC 15444 (JPEG 2000 Standard). This 021 * software module is an implementation of a part of the JPEG 2000 022 * Standard. Swiss Federal Institute of Technology-EPFL, Ericsson Radio 023 * Systems AB and Canon Research Centre France S.A (collectively JJ2000 024 * Partners) agree not to assert against ISO/IEC and users of the JPEG 025 * 2000 Standard (Users) any of their rights under the copyright, not 026 * including other intellectual property rights, for this software module 027 * with respect to the usage by ISO/IEC and Users of this software module 028 * or modifications thereof for use in hardware or software products 029 * claiming conformance to the JPEG 2000 Standard. Those intending to use 030 * this software module in hardware or software products are advised that 031 * their use may infringe existing patents. The original developers of 032 * this software module, JJ2000 Partners and ISO/IEC assume no liability 033 * for use of this software module or modifications thereof. No license 034 * or right to this software module is granted for non JPEG 2000 Standard 035 * conforming products. JJ2000 Partners have full right to use this 036 * software module for his/her own purpose, assign or donate this 037 * software module to any third party and to inhibit third parties from 038 * using this software module for non JPEG 2000 Standard conforming 039 * products. This copyright notice must be included in all copies or 040 * derivative works of this software module. 041 * 042 * Copyright (c) 1999/2000 JJ2000 Partners. 043 * 044 * 045 * 046 */ 047package jj2000.j2k.wavelet.synthesis; 048 049import jj2000.j2k.util.*; 050import jj2000.j2k.*; 051 052import java.util.*; 053 054/** 055 * This class extends ModuleSpec class for synthesis filters 056 * specification holding purpose. 057 * 058 * @see ModuleSpec 059 * 060 * */ 061public class SynWTFilterSpec extends ModuleSpec { 062 063 /** 064 * Constructs a new 'SynWTFilterSpec' for the specified number of 065 * components and tiles. 066 * 067 * @param nt The number of tiles 068 * 069 * @param nc The number of components 070 * 071 * @param type the type of the specification module i.e. tile specific, 072 * component specific or both. 073 * 074 * */ 075 public SynWTFilterSpec(int nt, int nc, byte type){ 076 super(nt, nc, type); 077 } 078 079 /** 080 * Returns the data type used by the filters in this object, as defined in 081 * the 'DataBlk' interface for specified tile-component. 082 * 083 * @param t Tile index 084 * 085 * @param c Component index 086 * 087 * @return The data type of the filters in this object 088 * 089 * @see jj2000.j2k.image.DataBlk 090 * 091 * */ 092 public int getWTDataType(int t,int c){ 093 SynWTFilter[][] an = (SynWTFilter[][])getSpec(t,c); 094 return an[0][0].getDataType(); 095 } 096 097 /** 098 * Returns the horizontal analysis filters to be used in component 'n' and 099 * tile 't'. 100 * 101 * <P>The horizontal analysis filters are returned in an array of 102 * SynWTFilter. Each element contains the horizontal filter for each 103 * resolution level starting with resolution level 1 (i.e. the analysis 104 * filter to go from resolution level 1 to resolution level 0). If there 105 * are less elements than the maximum resolution level, then the last 106 * element is assumed to be repeated. 107 * 108 * @param t The tile index, in raster scan order 109 * 110 * @param c The component index. 111 * 112 * @return The array of horizontal analysis filters for component 'n' and 113 * tile 't'. 114 * 115 * 116 * */ 117 public SynWTFilter[] getHFilters(int t, int c) { 118 SynWTFilter[][] an = (SynWTFilter[][])getSpec(t,c); 119 return an[0]; 120 } 121 122 /** 123 * Returns the vertical analysis filters to be used in component 'n' and 124 * tile 't'. 125 * 126 * <P>The vertical analysis filters are returned in an array of 127 * SynWTFilter. Each element contains the vertical filter for each 128 * resolution level starting with resolution level 1 (i.e. the analysis 129 * filter to go from resolution level 1 to resolution level 0). If there 130 * are less elements than the maximum resolution level, then the last 131 * element is assumed to be repeated. 132 * 133 * @param t The tile index, in raster scan order 134 * 135 * @param c The component index. 136 * 137 * @return The array of horizontal analysis filters for component 'n' and 138 * tile 't'. 139 * 140 * 141 * */ 142 public SynWTFilter[] getVFilters(int t,int c) { 143 SynWTFilter[][] an = (SynWTFilter[][])getSpec(t,c); 144 return an[1]; 145 } 146 147 /** Debugging method */ 148 public String toString(){ 149 String str = ""; 150 SynWTFilter[][] an; 151 152 str += "nTiles="+nTiles+"\nnComp="+nComp+"\n\n"; 153 154 for(int t=0; t<nTiles; t++){ 155 for(int c=0; c<nComp; c++){ 156 an = (SynWTFilter[][])getSpec(t,c); 157 158 str += "(t:"+t+",c:"+c+")\n"; 159 160 // Horizontal filters 161 str += "\tH:"; 162 for(int i=0; i<an[0].length; i++) 163 str += " "+an[0][i]; 164 // Horizontal filters 165 str += "\n\tV:"; 166 for(int i=0; i<an[1].length; i++) 167 str += " "+an[1][i]; 168 str += "\n"; 169 } 170 } 171 172 return str; 173 } 174 175 /** 176 * Check the reversibility of filters contained is the given 177 * tile-component. 178 * 179 * @param t The index of the tile 180 * 181 * @param c The index of the component 182 * 183 */ 184 public boolean isReversible(int t,int c){ 185 // Note: no need to buffer the result since this method is 186 // normally called once per tile-component. 187 SynWTFilter[] 188 hfilter = getHFilters(t,c), 189 vfilter = getVFilters(t,c); 190 191 // As soon as a filter is not reversible, false can be returned 192 for(int i=hfilter.length-1; i>=0; i--) 193 if(!hfilter[i].isReversible() || !vfilter[i].isReversible()) 194 return false; 195 return true; 196 } 197}