home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / driver / util / unpack.c < prev    next >
C/C++ Source or Header  |  1994-07-10  |  8KB  |  334 lines

  1. /*
  2. **    This file generated by localize 2.9 (AmigaDOS 2.1) from unpack.c
  3. */
  4. /*
  5.  *   Unpacks the raster data from the packed buffer.  This code was 
  6.  *   translated from pktopx.web using an automatic translator, then
  7.  *   converted for this purpose.  This little routine can be very useful
  8.  *   in other drivers as well.
  9.  */
  10.  
  11. #include "defines.h"
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <stddef.h>
  16. #include <string.h>
  17.  
  18. #include "globals.h"
  19. #include "textypes.h"
  20. #include "flmt.h"
  21. #include "new_font.h"
  22.  
  23. #include "globals.i"
  24. #include "unpack.i"
  25.  
  26.  
  27. /*
  28.  * Fuer die locale-Library:
  29.  *
  30.  * Hier duerfen *nur* die MSG_#? Nummern eingebunden werden!
  31.  * Achtung:
  32.  * Es muss/sollte 'multiple-include' erlaubt sein!
  33.  */
  34. #include "local.i"
  35.  
  36. #undef  CATCOMP_ARRAY
  37. #undef  CATCOMP_BLOCK
  38. #undef  CATCOMP_STRINGS
  39. #define CATCOMP_NUMBERS
  40. #include "localstr.h"
  41.  
  42.  
  43.  
  44. /*
  45.  * external procedures
  46.  */
  47. /* ?? */
  48.  
  49. extern struct FontMan    *FontRoot;    /* root structure    */
  50.  
  51.  
  52. /*
  53.  * internal procedures
  54.  */
  55. static shalfword getnyb        (void);
  56. static Boolean   getbit        (void);
  57. static long      pkpackednum    (void);
  58. #if 0
  59. static void      flip        (char *s, long howmany);
  60. #endif
  61. static long     getlong    (unsigned char *a);
  62. static void     unpack        (quarterword *pack, halfword *raster,
  63.                  halfword cwidth, halfword cheight,
  64.                  halfword cmd);
  65.  
  66.  
  67. /*
  68.  *   Some statics for use here.
  69.  */
  70. static halfword bitweight ; 
  71. static halfword dynf ;
  72. static halfword gpower[17] = { 0 , 1 , 3 , 7 , 15 , 31 , 63 , 127 ,
  73.      255 , 511 , 1023 , 2047 , 4095 , 8191 , 16383 , (halfword)32767 , (halfword)65535 } ; 
  74. static long repeatcount ;
  75. static quarterword *p ;
  76.  
  77. #if 0
  78. static halfword bftest = 1 ;
  79. #endif
  80.  
  81.  
  82. /*
  83.  *   We need procedures to get a nybble, bit, and packed word from the
  84.  *   packed data structure.
  85.  */
  86.  
  87. static shalfword __inline getnyb (void)
  88. {
  89.     if ( bitweight == 0 ) 
  90.     { bitweight = 16 ; 
  91.       return (shalfword)(*p++ & 15) ;
  92.     } else {
  93.       bitweight = 0 ;
  94.       return (shalfword)(*p >> 4) ;
  95.     }
  96.  
  97. static Boolean __inline getbit (void)
  98. {
  99.     bitweight >>= 1 ; 
  100.     if ( bitweight == 0 ) 
  101.     { p++ ;
  102.       bitweight = 128 ;
  103.     } 
  104.     return (Boolean)(*p & bitweight) ;
  105.  
  106. static long pkpackednum (void)
  107. {
  108.     register halfword i;
  109.     register long j ; 
  110.     i = getnyb () ; 
  111.     if ( i == 0 ) {
  112.        do { j = (long)getnyb () ; 
  113.           i++ ; 
  114.           } while ( j == 0L ) ; 
  115.        while ( i != 0 ) {
  116.           j = j * 16L + ((long) getnyb ()) ; 
  117.           i-- ; 
  118.           } 
  119.        return ( j - 15L + ( 13L - dynf ) * 16L + dynf ) ; 
  120.     }
  121.     else if ( i <= dynf ) return ( (long)i ) ; 
  122.     else if ( i < 14 ) return ( ( (long)i - (long)dynf - 1L )*16L + (long)getnyb() + (long)dynf + 1L ) ; 
  123.     else {
  124.        if (repeatcount != 0)
  125.           Fatal(10,MSG_UNPACK_RECURSIV);
  126.        repeatcount = 1L ;
  127.        if ( i == 14 ) repeatcount = pkpackednum () ; 
  128.        return ( pkpackednum() ) ;
  129.     } 
  130.  
  131. #if 0
  132. static void flip(char *s, long howmany)
  133. {
  134.    register char t ;
  135.  
  136.    while (howmany > 0) {
  137.       t = *s ;
  138.       *s = s[1] ;
  139.       s[1] = t ;
  140.       howmany-- ;
  141.       s += 2 ;
  142.    }
  143. }
  144. #endif
  145.  
  146.  
  147. /*
  148.  *   And now we have our main routine.
  149.  */
  150.  
  151. static void unpack(quarterword *pack, halfword *raster,
  152.             halfword cwidth, halfword cheight, halfword cmd)
  153.   register integer i, j ; 
  154.   shalfword wordwidth ; 
  155.   register halfword word, wordweight ;
  156.   shalfword rowsleft ; 
  157.   Boolean turnon ; 
  158.   shalfword hbit ; 
  159.   long count ; 
  160.  
  161. #if 0
  162.   halfword *oraster ;
  163.   oraster = raster ;
  164. #endif
  165.  
  166.   p = pack ;
  167.   dynf = cmd / 16 ; 
  168.   turnon = cmd & 8 ; 
  169.   wordwidth = (cwidth + 15)/16 ;
  170.   if ( dynf == 14 ) 
  171.   { bitweight = 256 ; 
  172.     for ( i = 1 ; i <= cheight ; i ++ ) 
  173.       { word = 0 ; 
  174.         wordweight = (halfword)32768 ; 
  175.         for ( j = 1 ; j <= cwidth ; j ++ ) 
  176.           { if ( getbit () ) word += wordweight ; 
  177.             wordweight >>= 1 ;
  178.             if ( wordweight == 0 ) 
  179.             { *raster++ = word ; 
  180.               word = 0 ;
  181.               wordweight = (halfword)32768 ; 
  182.               } 
  183.             } 
  184.           if ( wordweight != (halfword)32768 ) 
  185.              *raster++ = word ; 
  186.         } 
  187.   } else {
  188.     rowsleft = cheight ; 
  189.     hbit = cwidth ; 
  190.     repeatcount = 0 ; 
  191.     wordweight = 16 ; 
  192.     word = 0 ; 
  193.     bitweight = 16 ;
  194.     while ( rowsleft > 0 ) 
  195.       { count = pkpackednum() ; 
  196.         while ( count != 0 ) 
  197.           { if ( ( count <= wordweight ) && ( count < hbit ) ) 
  198.             { if ( turnon ) word += gpower [ wordweight ] - gpower 
  199.               [ wordweight - count ] ; 
  200.               hbit -= count ; 
  201.               wordweight -= count ; 
  202.               count = 0 ; 
  203.               } 
  204.             else if ( ( count >= hbit ) && ( hbit <= wordweight ) ) 
  205.             { if ( turnon )
  206.                  word += gpower[wordweight] - gpower[wordweight-hbit] ; 
  207.               *raster++ = word ; 
  208.               for ( i = 1 ; i <= repeatcount ; i ++ ) {
  209.                 for ( j = 1 ; j <= wordwidth ; j ++ ) {
  210.                   *raster = *(raster - wordwidth) ;
  211.                   raster++ ;
  212.                 }
  213.               }
  214.               rowsleft -= repeatcount + 1 ; 
  215.               repeatcount = 0 ; 
  216.               word = 0 ; 
  217.               wordweight = 16 ; 
  218.               count -= hbit ; 
  219.               hbit = cwidth ; 
  220.               } 
  221.             else 
  222.             { if ( turnon ) word += gpower [ wordweight ] ; 
  223.               *raster++ = word ;
  224.               word = 0 ; 
  225.               count -= wordweight ; 
  226.               hbit -= wordweight ; 
  227.               wordweight = 16 ; 
  228.               } 
  229.             } 
  230.           turnon = ! turnon ; 
  231.         } 
  232.       if ( ( rowsleft != 0 ) || ( hbit != cwidth ) ) 
  233.     Fatal(10,MSG_UNPACK_MORE_BITS);
  234.     } 
  235. #if 0
  236.     if (*(char *)&bftest) /* is the hardware LittleEndian? */
  237.        flip((char *)oraster, ((cwidth + 15) >> 4) * (long)cheight) ;
  238. #endif
  239.    /** return(p-pack) ;  **/
  240. }
  241.  
  242.  
  243. static long getlong(quarterword *a)
  244. {
  245.   return ((((((a[0] << 8L) + a[1]) << 8L) + a[2]) << 8L) + a[3]) ;
  246. }
  247.  
  248.  
  249. /*
  250.  *  unpack one character
  251.  */
  252. void unpack_char(struct Font *fnt, short cc)
  253. {
  254.    long i;
  255.    halfword cheight, cwidth ;
  256.    quarterword *p ;
  257.    halfword cmd ;
  258.    shalfword xoff, yoff ;
  259.    halfword wwidth;
  260.    struct Char *unpacked_char;
  261.    halfword *bitmap;
  262.  
  263.    if (fnt->common->fnt_status != FNT_LOADED && 
  264.        fnt->common->fnt_status != FNT_DEFINED_OLOADED &&
  265.        fnt->common->fnt_status != FNT_OLD_LOADED) {
  266.      return;    /* do nothing     (should never occure) */
  267.      /* der Fall tritt zur Zeit nicht auf, waere aber zu ueberlegen, ob man    */
  268.      /* nicht zulassen koennte, einen Font zu verwenden, dessen pk-data nicht    */
  269.      /*    geladen (weil removed) ist. Man muesste den Font nur dann laden, wenn    */
  270.      /*    ein Char gebraucht wird, der noch nicht ausgepackt ist!            */
  271.    }
  272.  
  273.    p = (quarterword *)(fnt->common->ch_start_bm + fnt->common->ch[cc].packed_data);
  274.  
  275.    cmd = *p++ ;
  276.    if (cmd & 4) {
  277.       if ((cmd & 7) == 7) {
  278.          cwidth = getlong(p) ;
  279.          cheight = getlong(p + 4) ;
  280.          xoff = getlong(p + 8) ;
  281.          yoff = getlong(p + 12) ;
  282.          p += 16 ;
  283.       } else {
  284.          cwidth = p[0] * 256 + p[1] ;
  285.          cheight = p[2] * 256 + p[3] ;
  286.          xoff = p[4] * 256 + p[5] ; /* N.B.: xoff, yoff are signed halfwords */
  287.          yoff = p[6] * 256 + p[7] ;
  288.          p += 8 ;
  289.       }
  290.    } else {
  291.       cwidth = *p++ ;
  292.       cheight = *p++ ;
  293.       xoff = *p++ ;
  294.       yoff = *p++ ;
  295.       if (xoff > 127)
  296.          xoff -= 256 ;
  297.       if (yoff > 127)
  298.          yoff -= 256 ;
  299.    }
  300.  
  301.    wwidth = (cwidth + 15) / 16 ;
  302.    i = 2L * (long)cheight * (long)wwidth ;
  303.    if (i <= 0) i = 2;
  304.  
  305.    unpacked_char = xmalloc(i + sizeof(struct Char)) ;
  306.    bitmap = (halfword *)(unpacked_char + 1);    /* bitmap at the end of the structure */
  307.  
  308.    memset(bitmap, 0, i);    /* clear the buffer */
  309.    unpack(p, (halfword *)bitmap, cwidth, cheight, cmd) ;
  310.  
  311. /*
  312.    unpacked_char->bytes = i + sizeof(struct Char);
  313.    FontRoot->unpacked_mem += unpacked_char->bytes;
  314. */
  315.    FontRoot->unpacked_mem += i + sizeof(struct Char);
  316.  
  317.    if (cheight == 0 || cwidth == 0) {        /* noetig ?? */
  318.       cwidth  = 1 ;
  319.       cheight = 1 ;
  320.       bitmap[0] = 0;
  321.    }
  322.  
  323.    unpacked_char->width   = cwidth;
  324.    unpacked_char->height  = cheight;
  325.    unpacked_char->xOffset = xoff;
  326.    unpacked_char->yOffset = yoff;
  327.  
  328.    fnt->common->ch[cc].unpacked = unpacked_char;
  329. }
  330.