001/* 002 * $RCSfile: SubbandRectROIMask.java,v $ 003 * $Revision: 1.1 $ 004 * $Date: 2005/02/11 05:02:24 $ 005 * $State: Exp $ 006 * 007 * Class: ROI 008 * 009 * Description: This class describes the ROI mask for a subband 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 * */ 044package jj2000.j2k.roi.encoder; 045 046import jj2000.j2k.codestream.writer.*; 047import jj2000.j2k.wavelet.analysis.*; 048import jj2000.j2k.quantization.*; 049import jj2000.j2k.wavelet.*; 050import jj2000.j2k.image.*; 051import jj2000.j2k.util.*; 052import jj2000.j2k.roi.*; 053 054/** 055 * This class describes the ROI mask for a single subband. Each object of the 056 * class contains the mask for a particular subband and also has references to 057 * the masks of the children subbands of the subband corresponding to this 058 * mask. This class describes subband masks for images containing only 059 * rectangular ROIS 060 * */ 061public class SubbandRectROIMask extends SubbandROIMask{ 062 063 /** The upper left x coordinates of the applicable ROIs */ 064 public int[] ulxs; 065 066 /** The upper left y coordinates of the applicable ROIs */ 067 public int[] ulys; 068 069 /** The lower right x coordinates of the applicable ROIs */ 070 public int[] lrxs; 071 072 /** The lower right y coordinates of the applicable ROIs */ 073 public int[] lrys; 074 075 /** 076 * The constructor of the SubbandROIMask takes the dimensions of the 077 * subband as parameters. A tree of masks is generated from the subband 078 * sb. Each Subband contains the boundaries of each ROI. 079 * 080 * @param sb The subband corresponding to this Subband Mask 081 * 082 * @param ulxs The upper left x coordinates of the ROIs 083 * 084 * @param ulys The upper left y coordinates of the ROIs 085 * 086 * @param lrxs The lower right x coordinates of the ROIs 087 * 088 * @param lrys The lower right y coordinates of the ROIs 089 * 090 * @param lrys The lower right y coordinates of the ROIs 091 * 092 * @param nr Number of ROIs that affect this tile 093 * */ 094 public SubbandRectROIMask(Subband sb, int[] ulxs, int[] ulys, int[] lrxs, 095 int[] lrys, int nr){ 096 super(sb.ulx,sb.uly,sb.w,sb.h); 097 this.ulxs = ulxs; 098 this.ulys = ulys; 099 this.lrxs = lrxs; 100 this.lrys = lrys; 101 int r; 102 103 if(sb.isNode){ 104 isNode=true; 105 // determine odd/even - high/low filters 106 int horEvenLow = sb.ulcx%2; 107 int verEvenLow = sb.ulcy%2; 108 109 // Get filter support lengths 110 WaveletFilter hFilter = sb.getHorWFilter(); 111 WaveletFilter vFilter = sb.getVerWFilter(); 112 int hlnSup = hFilter.getSynLowNegSupport(); 113 int hhnSup = hFilter.getSynHighNegSupport(); 114 int hlpSup = hFilter.getSynLowPosSupport(); 115 int hhpSup = hFilter.getSynHighPosSupport(); 116 int vlnSup = vFilter.getSynLowNegSupport(); 117 int vhnSup = vFilter.getSynHighNegSupport(); 118 int vlpSup = vFilter.getSynLowPosSupport(); 119 int vhpSup = vFilter.getSynHighPosSupport(); 120 121 // Generate arrays for children 122 int x,y; 123 int[] lulxs = new int[nr]; 124 int[] lulys = new int[nr]; 125 int[] llrxs = new int[nr]; 126 int[] llrys = new int[nr]; 127 int[] hulxs = new int[nr]; 128 int[] hulys = new int[nr]; 129 int[] hlrxs = new int[nr]; 130 int[] hlrys = new int[nr]; 131 for(r=nr-1;r>=0;r--){ // For all ROI calculate ... 132 // Upper left x for all children 133 x = ulxs[r]; 134 if(horEvenLow==0){ 135 lulxs[r] = (x+1-hlnSup)/2; 136 hulxs[r] = (x-hhnSup)/2; 137 } 138 else{ 139 lulxs[r] = (x-hlnSup)/2; 140 hulxs[r] = (x+1-hhnSup)/2; 141 } 142 // Upper left y for all children 143 y = ulys[r]; 144 if(verEvenLow==0){ 145 lulys[r] = (y+1-vlnSup)/2; 146 hulys[r] = (y-vhnSup)/2; 147 } 148 else{ 149 lulys[r] = (y-vlnSup)/2; 150 hulys[r] = (y+1-vhnSup)/2; 151 } 152 // lower right x for all children 153 x = lrxs[r]; 154 if(horEvenLow==0){ 155 llrxs[r] = (x+hlpSup)/2; 156 hlrxs[r] = (x-1+hhpSup)/2; 157 } 158 else{ 159 llrxs[r] = (x-1+hlpSup)/2; 160 hlrxs[r] = (x+hhpSup)/2; 161 } 162 // lower right y for all children 163 y=lrys[r]; 164 if(verEvenLow==0){ 165 llrys[r] = (y+vlpSup)/2; 166 hlrys[r] = (y-1+vhpSup)/2; 167 } 168 else{ 169 llrys[r] = (y-1+vlpSup)/2; 170 hlrys[r] = (y+vhpSup)/2; 171 } 172 } 173 // Create children 174 hh = new SubbandRectROIMask(sb.getHH(),hulxs,hulys,hlrxs,hlrys,nr); 175 lh = new SubbandRectROIMask(sb.getLH(),lulxs,hulys,llrxs,hlrys,nr); 176 hl = new SubbandRectROIMask(sb.getHL(),hulxs,lulys,hlrxs,llrys,nr); 177 ll = new SubbandRectROIMask(sb.getLL(),lulxs,lulys,llrxs,llrys,nr); 178 179 } 180 } 181} 182 183 184 185 186 187 188 189 190 191 192