Subversion Repositories Kolibri OS

Rev

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

  1. /*
  2.  * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
  3.  * Copyright (c) 2002-2007, Professor Benoit Macq
  4.  * Copyright (c) 2001-2003, David Janssens
  5.  * Copyright (c) 2002-2003, Yannick Verschueren
  6.  * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
  7.  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  8.  * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
  9.  * All rights reserved.
  10.  *
  11.  * Redistribution and use in source and binary forms, with or without
  12.  * modification, are permitted provided that the following conditions
  13.  * are met:
  14.  * 1. Redistributions of source code must retain the above copyright
  15.  *    notice, this list of conditions and the following disclaimer.
  16.  * 2. Redistributions in binary form must reproduce the above copyright
  17.  *    notice, this list of conditions and the following disclaimer in the
  18.  *    documentation and/or other materials provided with the distribution.
  19.  *
  20.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
  21.  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  24.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  25.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  26.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  27.  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  28.  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  30.  * POSSIBILITY OF SUCH DAMAGE.
  31.  */
  32.  
  33. #include "opj_includes.h"
  34. #include <math.h>
  35.  
  36. static int t1_init_ctxno_zc(int f, int orient) {
  37.         int h, v, d, n, t, hv;
  38.         n = 0;
  39.         h = ((f & T1_SIG_W) != 0) + ((f & T1_SIG_E) != 0);
  40.         v = ((f & T1_SIG_N) != 0) + ((f & T1_SIG_S) != 0);
  41.         d = ((f & T1_SIG_NW) != 0) + ((f & T1_SIG_NE) != 0) + ((f & T1_SIG_SE) != 0) + ((f & T1_SIG_SW) != 0);
  42.  
  43.         switch (orient) {
  44.                 case 2:
  45.                         t = h;
  46.                         h = v;
  47.                         v = t;
  48.                 case 0:
  49.                 case 1:
  50.                         if (!h) {
  51.                                 if (!v) {
  52.                                         if (!d)
  53.                                                 n = 0;
  54.                                         else if (d == 1)
  55.                                                 n = 1;
  56.                                         else
  57.                                                 n = 2;
  58.                                 } else if (v == 1) {
  59.                                         n = 3;
  60.                                 } else {
  61.                                         n = 4;
  62.                                 }
  63.                         } else if (h == 1) {
  64.                                 if (!v) {
  65.                                         if (!d)
  66.                                                 n = 5;
  67.                                         else
  68.                                                 n = 6;
  69.                                 } else {
  70.                                         n = 7;
  71.                                 }
  72.                         } else
  73.                                 n = 8;
  74.                         break;
  75.                 case 3:
  76.                         hv = h + v;
  77.                         if (!d) {
  78.                                 if (!hv) {
  79.                                         n = 0;
  80.                                 } else if (hv == 1) {
  81.                                         n = 1;
  82.                                 } else {
  83.                                         n = 2;
  84.                                 }
  85.                         } else if (d == 1) {
  86.                                 if (!hv) {
  87.                                         n = 3;
  88.                                 } else if (hv == 1) {
  89.                                         n = 4;
  90.                                 } else {
  91.                                         n = 5;
  92.                                 }
  93.                         } else if (d == 2) {
  94.                                 if (!hv) {
  95.                                         n = 6;
  96.                                 } else {
  97.                                         n = 7;
  98.                                 }
  99.                         } else {
  100.                                 n = 8;
  101.                         }
  102.                         break;
  103.         }
  104.  
  105.         return (T1_CTXNO_ZC + n);
  106. }
  107.  
  108. static int t1_init_ctxno_sc(int f) {
  109.         int hc, vc, n;
  110.         n = 0;
  111.  
  112.         hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
  113.                                 T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
  114.                         1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
  115.                                         (T1_SIG_E | T1_SGN_E)) +
  116.                                 ((f & (T1_SIG_W | T1_SGN_W)) ==
  117.                                  (T1_SIG_W | T1_SGN_W)), 1);
  118.  
  119.         vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
  120.                                 T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
  121.                         1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
  122.                                         (T1_SIG_N | T1_SGN_N)) +
  123.                                 ((f & (T1_SIG_S | T1_SGN_S)) ==
  124.                                  (T1_SIG_S | T1_SGN_S)), 1);
  125.  
  126.         if (hc < 0) {
  127.                 hc = -hc;
  128.                 vc = -vc;
  129.         }
  130.         if (!hc) {
  131.                 if (vc == -1)
  132.                         n = 1;
  133.                 else if (!vc)
  134.                         n = 0;
  135.                 else
  136.                         n = 1;
  137.         } else if (hc == 1) {
  138.                 if (vc == -1)
  139.                         n = 2;
  140.                 else if (!vc)
  141.                         n = 3;
  142.                 else
  143.                         n = 4;
  144.         }
  145.  
  146.         return (T1_CTXNO_SC + n);
  147. }
  148.  
  149. static int t1_init_spb(int f) {
  150.         int hc, vc, n;
  151.  
  152.         hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
  153.                                 T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
  154.                         1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
  155.                                         (T1_SIG_E | T1_SGN_E)) +
  156.                                 ((f & (T1_SIG_W | T1_SGN_W)) ==
  157.                                  (T1_SIG_W | T1_SGN_W)), 1);
  158.  
  159.         vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
  160.                                 T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
  161.                         1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
  162.                                         (T1_SIG_N | T1_SGN_N)) +
  163.                                 ((f & (T1_SIG_S | T1_SGN_S)) ==
  164.                                  (T1_SIG_S | T1_SGN_S)), 1);
  165.  
  166.         if (!hc && !vc)
  167.                 n = 0;
  168.         else
  169.                 n = (!(hc > 0 || (!hc && vc > 0)));
  170.  
  171.         return n;
  172. }
  173.  
  174. void dump_array16(int array[],int size){
  175.         int i;
  176.         --size;
  177.         for (i = 0; i < size; ++i) {
  178.                 printf("0x%04x, ", array[i]);
  179.                 if(!((i+1)&0x7))
  180.                         printf("\n  ");
  181.         }
  182.         printf("0x%04x\n};\n\n", array[size]);
  183. }
  184.  
  185. int main(){
  186.         int i, j;
  187.         double u, v, t;
  188.  
  189.         int lut_ctxno_zc[1024];
  190.         int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS];
  191.         int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS];
  192.         int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS];
  193.         int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS];
  194.  
  195.         printf("/* This file was automatically generated by t1_generate_luts.c */\n\n");
  196.  
  197.         // lut_ctxno_zc
  198.         for (j = 0; j < 4; ++j) {
  199.                 for (i = 0; i < 256; ++i) {
  200.                         int orient = j;
  201.                         if (orient == 2) {
  202.                                 orient = 1;
  203.                         } else if (orient == 1) {
  204.                                 orient = 2;
  205.                         }
  206.                         lut_ctxno_zc[(orient << 8) | i] = t1_init_ctxno_zc(i, j);
  207.                 }
  208.         }
  209.  
  210.         printf("static char lut_ctxno_zc[1024] = {\n  ");
  211.         for (i = 0; i < 1023; ++i) {
  212.                 printf("%i, ", lut_ctxno_zc[i]);
  213.                 if(!((i+1)&0x1f))
  214.                         printf("\n  ");
  215.         }
  216.         printf("%i\n};\n\n", lut_ctxno_zc[1023]);
  217.  
  218.         // lut_ctxno_sc
  219.         printf("static char lut_ctxno_sc[256] = {\n  ");
  220.         for (i = 0; i < 255; ++i) {
  221.                 printf("0x%x, ", t1_init_ctxno_sc(i << 4));
  222.                 if(!((i+1)&0xf))
  223.                         printf("\n  ");
  224.         }
  225.         printf("0x%x\n};\n\n", t1_init_ctxno_sc(255 << 4));
  226.  
  227.         // lut_spb
  228.         printf("static char lut_spb[256] = {\n  ");
  229.         for (i = 0; i < 255; ++i) {
  230.                 printf("%i, ", t1_init_spb(i << 4));
  231.                 if(!((i+1)&0x1f))
  232.                         printf("\n  ");
  233.         }
  234.         printf("%i\n};\n\n", t1_init_spb(255 << 4));
  235.  
  236.         /* FIXME FIXME FIXME */
  237.         /* fprintf(stdout,"nmsedec luts:\n"); */
  238.         for (i = 0; i < (1 << T1_NMSEDEC_BITS); ++i) {
  239.                 t = i / pow(2, T1_NMSEDEC_FRACBITS);
  240.                 u = t;
  241.                 v = t - 1.5;
  242.                 lut_nmsedec_sig[i] =
  243.                         int_max(0,
  244.                                         (int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
  245.                 lut_nmsedec_sig0[i] =
  246.                         int_max(0,
  247.                                         (int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
  248.                 u = t - 1.0;
  249.                 if (i & (1 << (T1_NMSEDEC_BITS - 1))) {
  250.                         v = t - 1.5;
  251.                 } else {
  252.                         v = t - 0.5;
  253.                 }
  254.                 lut_nmsedec_ref[i] =
  255.                         int_max(0,
  256.                                         (int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
  257.                 lut_nmsedec_ref0[i] =
  258.                         int_max(0,
  259.                                         (int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
  260.         }
  261.  
  262.         printf("static short lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {\n  ");
  263.         dump_array16(lut_nmsedec_sig, 1 << T1_NMSEDEC_BITS);
  264.  
  265.         printf("static short lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {\n  ");
  266.         dump_array16(lut_nmsedec_sig0, 1 << T1_NMSEDEC_BITS);
  267.  
  268.         printf("static short lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {\n  ");
  269.         dump_array16(lut_nmsedec_ref, 1 << T1_NMSEDEC_BITS);
  270.  
  271.         printf("static short lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {\n  ");
  272.         dump_array16(lut_nmsedec_ref0, 1 << T1_NMSEDEC_BITS);
  273.  
  274.         return 0;
  275. }
  276.