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: * */
044: package jj2000.j2k.roi.encoder;
045:
046: import jj2000.j2k.codestream.writer.*;
047: import jj2000.j2k.wavelet.analysis.*;
048: import jj2000.j2k.quantization.*;
049: import jj2000.j2k.wavelet.*;
050: import jj2000.j2k.image.*;
051: import jj2000.j2k.util.*;
052: import 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: * */
061: public 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,
095: int[] lrxs, 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: } else {
138: lulxs[r] = (x - hlnSup) / 2;
139: hulxs[r] = (x + 1 - hhnSup) / 2;
140: }
141: // Upper left y for all children
142: y = ulys[r];
143: if (verEvenLow == 0) {
144: lulys[r] = (y + 1 - vlnSup) / 2;
145: hulys[r] = (y - vhnSup) / 2;
146: } else {
147: lulys[r] = (y - vlnSup) / 2;
148: hulys[r] = (y + 1 - vhnSup) / 2;
149: }
150: // lower right x for all children
151: x = lrxs[r];
152: if (horEvenLow == 0) {
153: llrxs[r] = (x + hlpSup) / 2;
154: hlrxs[r] = (x - 1 + hhpSup) / 2;
155: } else {
156: llrxs[r] = (x - 1 + hlpSup) / 2;
157: hlrxs[r] = (x + hhpSup) / 2;
158: }
159: // lower right y for all children
160: y = lrys[r];
161: if (verEvenLow == 0) {
162: llrys[r] = (y + vlpSup) / 2;
163: hlrys[r] = (y - 1 + vhpSup) / 2;
164: } else {
165: llrys[r] = (y - 1 + vlpSup) / 2;
166: hlrys[r] = (y + vhpSup) / 2;
167: }
168: }
169: // Create children
170: hh = new SubbandRectROIMask(sb.getHH(), hulxs, hulys,
171: hlrxs, hlrys, nr);
172: lh = new SubbandRectROIMask(sb.getLH(), lulxs, hulys,
173: llrxs, hlrys, nr);
174: hl = new SubbandRectROIMask(sb.getHL(), hulxs, lulys,
175: hlrxs, llrys, nr);
176: ll = new SubbandRectROIMask(sb.getLL(), lulxs, lulys,
177: llrxs, llrys, nr);
178:
179: }
180: }
181: }
|