Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2001-2003, David Janssens
  3.  * Copyright (c) 2002-2003, Yannick Verschueren
  4.  * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
  5.  * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team
  6.  * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
  7.  * All rights reserved.
  8.  *
  9.  * Redistribution and use in source and binary forms, with or without
  10.  * modification, are permitted provided that the following conditions
  11.  * are met:
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in the
  16.  *    documentation and/or other materials provided with the distribution.
  17.  *
  18.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
  19.  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  20.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  21.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  22.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  23.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  24.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  25.  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  26.  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  27.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  28.  * POSSIBILITY OF SUCH DAMAGE.
  29.  */
  30.  
  31. #include "opj_includes.h"
  32.  
  33. /* <summary> */
  34. /* This table contains the norms of the basis function of the reversible MCT. */
  35. /* </summary> */
  36. static const double mct_norms[3] = { 1.732, .8292, .8292 };
  37.  
  38. /* <summary> */
  39. /* This table contains the norms of the basis function of the irreversible MCT. */
  40. /* </summary> */
  41. static const double mct_norms_real[3] = { 1.732, 1.805, 1.573 };
  42.  
  43. /* <summary> */
  44. /* Foward reversible MCT. */
  45. /* </summary> */
  46. void mct_encode(int *c0, int *c1, int *c2, int n) {
  47.         int i;
  48.         for (i = 0; i < n; i++) {
  49.                 int r, g, b, y, u, v;
  50.                 r = c0[i];
  51.                 g = c1[i];
  52.                 b = c2[i];
  53.                 y = (r + (g << 1) + b) >> 2;
  54.                 u = b - g;
  55.                 v = r - g;
  56.                 c0[i] = y;
  57.                 c1[i] = u;
  58.                 c2[i] = v;
  59.         }
  60. }
  61.  
  62. /* <summary> */
  63. /* Inverse reversible MCT. */
  64. /* </summary> */
  65. void mct_decode(int *c0, int *c1, int *c2, int n) {
  66.         int i;
  67.         for (i = 0; i < n; i++) {
  68.                 int y, u, v, r, g, b;
  69.                 y = c0[i];
  70.                 u = c1[i];
  71.                 v = c2[i];
  72.                 g = y - ((u + v) >> 2);
  73.                 r = v + g;
  74.                 b = u + g;
  75.                 c0[i] = r;
  76.                 c1[i] = g;
  77.                 c2[i] = b;
  78.         }
  79. }
  80.  
  81. /* <summary> */
  82. /* Get norm of basis function of reversible MCT. */
  83. /* </summary> */
  84. double mct_getnorm(int compno) {
  85.         return mct_norms[compno];
  86. }
  87.  
  88. /* <summary> */
  89. /* Foward irreversible MCT. */
  90. /* </summary> */
  91. void mct_encode_real(int *c0, int *c1, int *c2, int n) {
  92.         int i;
  93.         for (i = 0; i < n; i++) {
  94.                 int r, g, b, y, u, v;
  95.                 r = c0[i];
  96.                 g = c1[i];
  97.                 b = c2[i];
  98.                 y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934);
  99.                 u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096);
  100.                 v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666);
  101.                 c0[i] = y;
  102.                 c1[i] = u;
  103.                 c2[i] = v;
  104.         }
  105. }
  106.  
  107. /* <summary> */
  108. /* Inverse irreversible MCT. */
  109. /* </summary> */
  110. void mct_decode_real(int *c0, int *c1, int *c2, int n) {
  111.         int i;
  112.         for (i = 0; i < n; i++) {
  113.                 int y, u, v, r, g, b;
  114.                 y = c0[i];
  115.                 u = c1[i];
  116.                 v = c2[i];
  117.                 r = y + fix_mul(v, 11485);
  118.                 g = y - fix_mul(u, 2819) - fix_mul(v, 5850);
  119.                 b = y + fix_mul(u, 14516);
  120.                 c0[i] = r;
  121.                 c1[i] = g;
  122.                 c2[i] = b;
  123.         }
  124. }
  125.  
  126. /* <summary> */
  127. /* Get norm of basis function of irreversible MCT. */
  128. /* </summary> */
  129. double mct_getnorm_real(int compno) {
  130.         return mct_norms_real[compno];
  131. }
  132.