1 /* 2 * Copyright (c) 1999-2000 Image Power, Inc. and the University of 3 * British Columbia. 4 * Copyright (c) 2001-2003 Michael David Adams. 5 * All rights reserved. 6 */ 7 8 /* __START_OF_JASPER_LICENSE__ 9 * 10 * JasPer License Version 2.0 11 * 12 * Copyright (c) 2001-2006 Michael David Adams 13 * Copyright (c) 1999-2000 Image Power, Inc. 14 * Copyright (c) 1999-2000 The University of British Columbia 15 * 16 * All rights reserved. 17 * 18 * Permission is hereby granted, free of charge, to any person (the 19 * "User") obtaining a copy of this software and associated documentation 20 * files (the "Software"), to deal in the Software without restriction, 21 * including without limitation the rights to use, copy, modify, merge, 22 * publish, distribute, and/or sell copies of the Software, and to permit 23 * persons to whom the Software is furnished to do so, subject to the 24 * following conditions: 25 * 26 * 1. The above copyright notices and this permission notice (which 27 * includes the disclaimer below) shall be included in all copies or 28 * substantial portions of the Software. 29 * 30 * 2. The name of a copyright holder shall not be used to endorse or 31 * promote products derived from the Software without specific prior 32 * written permission. 33 * 34 * THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS 35 * LICENSE. NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER 36 * THIS DISCLAIMER. THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 37 * "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 38 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 39 * PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO 40 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL 41 * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING 42 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 43 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 44 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. NO ASSURANCES ARE 45 * PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE 46 * THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY. 47 * EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS 48 * BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL 49 * PROPERTY RIGHTS OR OTHERWISE. AS A CONDITION TO EXERCISING THE RIGHTS 50 * GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE 51 * ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY. THE SOFTWARE 52 * IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL 53 * SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES, 54 * AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL 55 * SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH 56 * THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH, 57 * PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH 58 * RISK ACTIVITIES"). THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY 59 * EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES. 60 * 61 * __END_OF_JASPER_LICENSE__ 62 */ 63 64 /* 65 * Multicomponent Transform Code 66 * 67 * $Id: jpc_mct.c,v 1.2 2008-05-26 09:40:52 vp153 Exp $ 68 */ 69 70 /******************************************************************************\ 71 * Includes. 72 \******************************************************************************/ 73 74 #include <assert.h> 75 76 #include "jasper/jas_seq.h" 77 78 #include "jpc_fix.h" 79 #include "jpc_mct.h" 80 81 /******************************************************************************\ 82 * Code. 83 \******************************************************************************/ 84 85 /* Compute the forward RCT. */ 86 87 void jpc_rct(jas_matrix_t *c0, jas_matrix_t *c1, jas_matrix_t *c2) 88 { 89 int numrows; 90 int numcols; 91 int i; 92 int j; 93 jpc_fix_t *c0p; 94 jpc_fix_t *c1p; 95 jpc_fix_t *c2p; 96 97 numrows = jas_matrix_numrows(c0); 98 numcols = jas_matrix_numcols(c0); 99 100 /* All three matrices must have the same dimensions. */ 101 assert(jas_matrix_numrows(c1) == numrows && jas_matrix_numcols(c1) == numcols 102 && jas_matrix_numrows(c2) == numrows && jas_matrix_numcols(c2) == numcols); 103 104 for (i = 0; i < numrows; i++) { 105 c0p = jas_matrix_getref(c0, i, 0); 106 c1p = jas_matrix_getref(c1, i, 0); 107 c2p = jas_matrix_getref(c2, i, 0); 108 for (j = numcols; j > 0; --j) { 109 int r; 110 int g; 111 int b; 112 int y; 113 int u; 114 int v; 115 r = *c0p; 116 g = *c1p; 117 b = *c2p; 118 y = (r + (g << 1) + b) >> 2; 119 u = b - g; 120 v = r - g; 121 *c0p++ = y; 122 *c1p++ = u; 123 *c2p++ = v; 124 } 125 } 126 } 127 128 /* Compute the inverse RCT. */ 129 130 void jpc_irct(jas_matrix_t *c0, jas_matrix_t *c1, jas_matrix_t *c2) 131 { 132 int numrows; 133 int numcols; 134 int i; 135 int j; 136 jpc_fix_t *c0p; 137 jpc_fix_t *c1p; 138 jpc_fix_t *c2p; 139 140 numrows = jas_matrix_numrows(c0); 141 numcols = jas_matrix_numcols(c0); 142 143 /* All three matrices must have the same dimensions. */ 144 assert(jas_matrix_numrows(c1) == numrows && jas_matrix_numcols(c1) == numcols 145 && jas_matrix_numrows(c2) == numrows && jas_matrix_numcols(c2) == numcols); 146 147 for (i = 0; i < numrows; i++) { 148 c0p = jas_matrix_getref(c0, i, 0); 149 c1p = jas_matrix_getref(c1, i, 0); 150 c2p = jas_matrix_getref(c2, i, 0); 151 for (j = numcols; j > 0; --j) { 152 int r; 153 int g; 154 int b; 155 int y; 156 int u; 157 int v; 158 y = *c0p; 159 u = *c1p; 160 v = *c2p; 161 g = y - ((u + v) >> 2); 162 r = v + g; 163 b = u + g; 164 *c0p++ = r; 165 *c1p++ = g; 166 *c2p++ = b; 167 } 168 } 169 } 170 171 void jpc_ict(jas_matrix_t *c0, jas_matrix_t *c1, jas_matrix_t *c2) 172 { 173 int numrows; 174 int numcols; 175 int i; 176 int j; 177 jpc_fix_t r; 178 jpc_fix_t g; 179 jpc_fix_t b; 180 jpc_fix_t y; 181 jpc_fix_t u; 182 jpc_fix_t v; 183 jpc_fix_t *c0p; 184 jpc_fix_t *c1p; 185 jpc_fix_t *c2p; 186 187 numrows = jas_matrix_numrows(c0); 188 assert(jas_matrix_numrows(c1) == numrows && jas_matrix_numrows(c2) == numrows); 189 numcols = jas_matrix_numcols(c0); 190 assert(jas_matrix_numcols(c1) == numcols && jas_matrix_numcols(c2) == numcols); 191 for (i = 0; i < numrows; ++i) { 192 c0p = jas_matrix_getref(c0, i, 0); 193 c1p = jas_matrix_getref(c1, i, 0); 194 c2p = jas_matrix_getref(c2, i, 0); 195 for (j = numcols; j > 0; --j) { 196 r = *c0p; 197 g = *c1p; 198 b = *c2p; 199 y = jpc_fix_add3(jpc_fix_mul(jpc_dbltofix(0.299), r), jpc_fix_mul(jpc_dbltofix(0.587), g), 200 jpc_fix_mul(jpc_dbltofix(0.114), b)); 201 u = jpc_fix_add3(jpc_fix_mul(jpc_dbltofix(-0.16875), r), jpc_fix_mul(jpc_dbltofix(-0.33126), g), 202 jpc_fix_mul(jpc_dbltofix(0.5), b)); 203 v = jpc_fix_add3(jpc_fix_mul(jpc_dbltofix(0.5), r), jpc_fix_mul(jpc_dbltofix(-0.41869), g), 204 jpc_fix_mul(jpc_dbltofix(-0.08131), b)); 205 *c0p++ = y; 206 *c1p++ = u; 207 *c2p++ = v; 208 } 209 } 210 } 211 212 void jpc_iict(jas_matrix_t *c0, jas_matrix_t *c1, jas_matrix_t *c2) 213 { 214 int numrows; 215 int numcols; 216 int i; 217 int j; 218 jpc_fix_t r; 219 jpc_fix_t g; 220 jpc_fix_t b; 221 jpc_fix_t y; 222 jpc_fix_t u; 223 jpc_fix_t v; 224 jpc_fix_t *c0p; 225 jpc_fix_t *c1p; 226 jpc_fix_t *c2p; 227 228 numrows = jas_matrix_numrows(c0); 229 assert(jas_matrix_numrows(c1) == numrows && jas_matrix_numrows(c2) == numrows); 230 numcols = jas_matrix_numcols(c0); 231 assert(jas_matrix_numcols(c1) == numcols && jas_matrix_numcols(c2) == numcols); 232 for (i = 0; i < numrows; ++i) { 233 c0p = jas_matrix_getref(c0, i, 0); 234 c1p = jas_matrix_getref(c1, i, 0); 235 c2p = jas_matrix_getref(c2, i, 0); 236 for (j = numcols; j > 0; --j) { 237 y = *c0p; 238 u = *c1p; 239 v = *c2p; 240 r = jpc_fix_add(y, jpc_fix_mul(jpc_dbltofix(1.402), v)); 241 g = jpc_fix_add3(y, jpc_fix_mul(jpc_dbltofix(-0.34413), u), 242 jpc_fix_mul(jpc_dbltofix(-0.71414), v)); 243 b = jpc_fix_add(y, jpc_fix_mul(jpc_dbltofix(1.772), u)); 244 *c0p++ = r; 245 *c1p++ = g; 246 *c2p++ = b; 247 } 248 } 249 } 250 251 jpc_fix_t jpc_mct_getsynweight(int mctid, int cmptno) 252 { 253 jpc_fix_t synweight; 254 255 synweight = JPC_FIX_ONE; 256 switch (mctid) { 257 case JPC_MCT_RCT: 258 switch (cmptno) { 259 case 0: 260 synweight = jpc_dbltofix(sqrt(3.0)); 261 break; 262 case 1: 263 synweight = jpc_dbltofix(sqrt(0.6875)); 264 break; 265 case 2: 266 synweight = jpc_dbltofix(sqrt(0.6875)); 267 break; 268 } 269 break; 270 case JPC_MCT_ICT: 271 switch (cmptno) { 272 case 0: 273 synweight = jpc_dbltofix(sqrt(3.0000)); 274 break; 275 case 1: 276 synweight = jpc_dbltofix(sqrt(3.2584)); 277 break; 278 case 2: 279 synweight = jpc_dbltofix(sqrt(2.4755)); 280 break; 281 } 282 break; 283 #if 0 284 default: 285 synweight = JPC_FIX_ONE; 286 break; 287 #endif 288 } 289 290 return synweight; 291 } 292