home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / graphics / gifbla20.zip / SOURCE / GBCON.C < prev    next >
C/C++ Source or Header  |  1992-12-15  |  2KB  |  114 lines

  1.  
  2. /* gbcon.c - Arithmetic coding context routines. */
  3.  
  4. #include <stdio.h>
  5. #include <string.h>
  6.  
  7. #include "arithmod.h"
  8. #include "gbcon.h"
  9.  
  10. void
  11. arcon_big_init(ac)
  12. ARCON_BIG_CONTEXT *ac;
  13. {
  14.     int i;
  15.  
  16.     ac->count = ac->tail = 0;
  17.     for (i=0; i<ARCON_NCODES; i++)
  18.         ac->freqs[i] = 1;
  19.     join_big_freqs(ac->freqs,ARCON_NCODES);
  20. }
  21.  
  22. int
  23. arcon_big_add(ac,c)
  24. ARCON_BIG_CONTEXT *ac; int c;
  25. {
  26.     if (c<0 || ARCON_NCODES<=c)
  27.         return -1;
  28.     if (ac->count == ARCON_BIG_RBSIZE)
  29.         add_to_big_freqs(ac->rb[ac->tail],-1,ac->freqs,ARCON_NCODES);
  30.     else
  31.         ac->count++;
  32.     ac->rb[ac->tail] = c;
  33.     ac->tail = ((ac->tail+1)%ARCON_BIG_RBSIZE);
  34.     add_to_big_freqs(c,1,ac->freqs,ARCON_NCODES);
  35.     return 0;
  36. }
  37.  
  38. int
  39. arcon_big_find_range(ac,c,prstart,prend)
  40. ARCON_BIG_CONTEXT *ac; int c; int *prstart; int *prend;
  41. {
  42.     int f;
  43.  
  44.     if (c<0 || ARCON_NCODES<=c)
  45.         return 0;
  46.     if ((f=ac->freqs[c]) > 0) {
  47.         (*prstart) = find_code_in_big_freqs(c,ac->freqs,ARCON_NCODES);
  48.         (*prend) = (*prstart) + f;
  49.     }
  50.     return f;
  51. }
  52.  
  53. int
  54. arcon_big_find_c(ac,rpos,prstart,prend)
  55. ARCON_BIG_CONTEXT *ac;  int rpos; int *prstart; int *prend;
  56. {
  57.     int c;
  58.  
  59.     if (rpos<0 || arcon_big_rtot(ac)<=rpos)
  60.         return -1;
  61.     c = find_freq_in_big_freqs(rpos,ac->freqs,prstart,ARCON_NCODES);
  62.     (*prend) = (*prstart) + ac->freqs[c];
  63.     return c;
  64. }
  65.  
  66. void
  67. arcon_small_init(ac,rbsize)
  68. ARCON_SMALL_CONTEXT *ac; int rbsize;
  69. {
  70.     ac->count = ac->tail = 0;
  71.     ac->rbsize = rbsize;
  72.     ac->nhits = 0;
  73. }
  74.  
  75. int
  76. arcon_small_add(ac,c)
  77. ARCON_SMALL_CONTEXT *ac; int c;
  78. {
  79.     if (c<0 || ARCON_NCODES<=c)
  80.         return -1;
  81.     if (ac->count == ac->rbsize)
  82.         del_from_small_freqs(ac->rb[ac->tail],
  83.             ac->hits,ac->hitfreqs,&ac->nhits);
  84.     else
  85.         ac->count++;
  86.     ac->rb[ac->tail] = c;
  87.     ac->tail = ((ac->tail+1)%ac->rbsize);
  88.     add_to_small_freqs(c,ac->hits,ac->hitfreqs,&ac->nhits);
  89.     return 0;
  90. }
  91.  
  92. int
  93. arcon_small_find_range(ac,c,prstart,prend)
  94. ARCON_SMALL_CONTEXT *ac; int c; int *prstart; int *prend;
  95. {
  96.     int f;
  97.  
  98.     if (c<0 || ARCON_NCODES<=c)
  99.         return 0;
  100.     f = find_code_in_small_freqs(c,
  101.         ac->hits,ac->hitfreqs,ac->nhits,prstart);
  102.     (*prend) = (*prstart) + f;
  103.     return f;
  104. }
  105.  
  106. int
  107. arcon_small_find_c(ac,rpos,prstart,prend)
  108. ARCON_SMALL_CONTEXT *ac; int rpos; int *prstart; int *prend;
  109. {
  110.     if (rpos<0 || ac->count<=rpos)
  111.         return -1;
  112.     return find_freq_in_small_freqs(rpos,ac->hits,ac->hitfreqs,prstart,prend);
  113. }
  114.