vx32

Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log | Files | Refs

jpc_mct.c (8261B)


      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) 1999-2000 Image Power, Inc.
     13  * Copyright (c) 1999-2000 The University of British Columbia
     14  * Copyright (c) 2001-2003 Michael David Adams
     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 1918 2005-07-24 14:12:08Z baford $
     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 }