home *** CD-ROM | disk | FTP | other *** search
/ Der Mediaplex Sampler - Die 6 von Plex / 6_v_plex.zip / 6_v_plex / DISK5 / WIN_12 / IDEPIX2.ZIP / TIFFACS.ZIP / UNPACKBI.C < prev    next >
C/C++ Source or Header  |  1993-06-23  |  2KB  |  86 lines

  1. /*-------------------------------------------------------
  2.  
  3.     T I F F A C S : Unterstⁿtzungsroutinen fⁿr TIFF-Dateien
  4.             Ursprⁿnglich von Aldus, von mir auf dem
  5.             Walnut-Creek - Source-Code-ROM gefunden.
  6.  
  7.             Der ursprⁿngliche Source ist TIFF 4.0 und
  8.             auch ansonsten ein ziemlicher Mⁿll.
  9.  
  10.             Diese Version hat Funktionsprototypen und
  11.             ein paar Fehler weniger, aber im Grunde ist
  12.             sie auch ein ziemlicher Mⁿll.
  13.  
  14.             Im Mircosoft System Journal 4/93 ist eine ganz
  15.             brauchbare TIF-Routine dabei, aber eben nicht PD
  16.  
  17.             Bernd Herd
  18.             Rudolf Virchow Str. 8
  19.             6842 Bⁿrstadt
  20.             06206/79222
  21.  
  22.        U N P A C K B I: Dekompression zur PackBits-Kompression
  23.  
  24.   -------------------------------------------------------------*/
  25.  
  26.  
  27.  
  28. #include <windows.h>
  29. #pragma hdrstop
  30. #include <string.h>
  31. #include "tiff.h"
  32. #include "tiffi.h"
  33.  
  34.  
  35. /*----------------------------------------------------------------------
  36.  
  37.     UnpackBits : Dekomprimiert einen Puffer in PackBits-Kompression
  38.  
  39.     Parameter  : plpSrc    : Quell-Zeiger
  40.              plpDst    : Ziel-Zeiger
  41.              dstBytes    : Anzahl Bytes im Ziel-Puffer
  42.  
  43.     Rⁿckgabe   : FALSE    : Fehler
  44.              TRUE    : OK                     
  45.  
  46.   ----------------------------------------------------------------------*/
  47. BOOL UnpackBits (LONGPTR plpSrc, LONGPTR plpDst, SHORT dstBytes)
  48. {
  49.         register LONGPTR    lpSrc = plpSrc;
  50.         register LONGPTR    lpDst = plpDst;
  51.         register signed char    cc;
  52.         register SHORT        count;
  53.         register SHORT        outsofar = 0;
  54.  
  55.         while (outsofar < dstBytes) {
  56.  
  57.             cc = *((signed char FAR *)lpSrc)++;
  58.  
  59.             if (cc != -128)
  60.  
  61.             /* if -127 <= BYTE <= -1, replicate the next byte -n+1 times
  62.              */
  63.             if (cc & 0x80) {
  64.                 count = -((signed int)cc) + 1;    /* relies on sign-extension!!! */
  65.                 outsofar += count;
  66.  
  67.                 if (outsofar > dstBytes) return FALSE;
  68.  
  69.                 memset (lpDst, (BYTE)*lpSrc, (WORD)count);
  70.                 lpSrc++;
  71.             }
  72.  
  73.             /* else if 0 <= BYTE <= 127, copy the next n+1 bytes literally
  74.              */
  75.             else {
  76.                 count = (SHORT)cc + 1;
  77.                 outsofar += count;
  78.                 if (outsofar > dstBytes) return FALSE;
  79.                 memcpy (lpDst, lpSrc, (WORD)count);
  80.                 lpSrc += count;
  81.             }
  82.             lpDst += count;
  83.         }
  84.     return TRUE;
  85. }
  86.