jpc_mct.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) 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 }