Home | History | Annotate | Download | only in libjasper
      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