home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / xloadimg.zip / xloadimage.4.1 / new.c < prev    next >
C/C++ Source or Header  |  1993-10-28  |  5KB  |  230 lines

  1. /* new.c:
  2.  *
  3.  * functions to allocate and deallocate structures and structure data
  4.  *
  5.  * jim frost 09.29.89
  6.  *
  7.  * Copyright 1989, 1991 Jim Frost.
  8.  * See included file "copyright.h" for complete copyright information.
  9.  */
  10.  
  11. #include "copyright.h"
  12. #include "image.h"
  13.  
  14. extern int _Xdebug;
  15.  
  16. /* this table is useful for quick conversions between depth and ncolors
  17.  */
  18.  
  19. unsigned long DepthToColorsTable[] = {
  20.   /*  0 */ 1,
  21.   /*  1 */ 2,
  22.   /*  2 */ 4,
  23.   /*  3 */ 8,
  24.   /*  4 */ 16,
  25.   /*  5 */ 32,
  26.   /*  6 */ 64,
  27.   /*  7 */ 128,
  28.   /*  8 */ 256,
  29.   /*  9 */ 512,
  30.   /* 10 */ 1024,
  31.   /* 11 */ 2048,
  32.   /* 12 */ 4096,
  33.   /* 13 */ 8192,
  34.   /* 14 */ 16384,
  35.   /* 15 */ 32768,
  36.   /* 16 */ 65536,
  37.   /* 17 */ 131072,
  38.   /* 18 */ 262144,
  39.   /* 19 */ 524288,
  40.   /* 20 */ 1048576,
  41.   /* 21 */ 2097152,
  42.   /* 22 */ 4194304,
  43.   /* 23 */ 8388608,
  44.   /* 24 */ 16777216,
  45.   /* 25 */ 33554432,
  46.   /* 26 */ 67108864,
  47.   /* 27 */ 134217728,
  48.   /* 28 */ 268435456,
  49.   /* 29 */ 536870912,
  50.   /* 30 */ 1073741824,
  51.   /* 31 */ 2147483648,
  52.   /* 32 */ 2147483648 /* bigger than unsigned int; this is good enough */
  53. };
  54.  
  55. unsigned long colorsToDepth(ncolors)
  56.      unsigned long ncolors;
  57. { unsigned long a;
  58.  
  59.   for (a= 0; (a < 32) && (DepthToColorsTable[a] < ncolors); a++)
  60.     /* EMPTY */
  61.     ;
  62.   return(a);
  63. }
  64.  
  65.  
  66. void goodImage(image, func)
  67.      Image *image;
  68.      char  *func;
  69. {
  70.   if (!image) {
  71.     printf("%s: nil image\n", func);
  72.     exit(0);
  73.   }
  74.   switch (image->type) {
  75.   case IBITMAP:
  76.   case IRGB:
  77.   case ITRUE:
  78.     break;
  79.   default:
  80.     printf("%s: bad destination image\n", func);
  81.     exit(0);
  82.   }
  83. }
  84. char *dupString(s)
  85.      char *s;
  86. { char *d;
  87.  
  88.   if (!s)
  89.     return(NULL);
  90.   d= (char *)lmalloc(strlen(s) + 1);
  91.   strcpy(d, s);
  92.   return(d);
  93. }
  94.  
  95. void newRGBMapData(rgb, size)
  96.      RGBMap       *rgb;
  97.      unsigned int  size;
  98. {
  99.   rgb->used= 0;
  100.   rgb->size= size;
  101.   rgb->compressed= 0;
  102.   rgb->red= (Intensity *)lmalloc(sizeof(Intensity) * size);
  103.   rgb->green= (Intensity *)lmalloc(sizeof(Intensity) * size);
  104.   rgb->blue= (Intensity *)lmalloc(sizeof(Intensity) * size);
  105. }
  106.  
  107. void freeRGBMapData(rgb)
  108.      RGBMap *rgb;
  109. {
  110.   lfree((byte *)rgb->red);
  111.   lfree((byte *)rgb->green);
  112.   lfree((byte *)rgb->blue);
  113. }
  114.  
  115. Image *newBitImage(width, height)
  116.      unsigned int width, height;
  117. { Image        *image;
  118.   unsigned int  linelen;
  119.  
  120.   image= (Image *)lmalloc(sizeof(Image));
  121.   image->type= IBITMAP;
  122.   image->title= NULL;
  123.   newRGBMapData(&(image->rgb), (unsigned int)2);
  124.   *(image->rgb.red)= *(image->rgb.green)= *(image->rgb.blue)= 65535;
  125.   *(image->rgb.red + 1)= *(image->rgb.green + 1)= *(image->rgb.blue + 1)= 0;
  126.   image->rgb.used= 2;
  127.   image->width= width;
  128.   image->height= height;
  129.   image->depth= 1;
  130.   linelen= (width / 8) + (width % 8 ? 1 : 0); /* thanx johnh@amcc.com */
  131.   image->data= (unsigned char *)lcalloc(linelen * height);
  132.   return(image);
  133. }
  134.  
  135. Image *newRGBImage(width, height, depth)
  136.      unsigned int width, height, depth;
  137. { Image        *image;
  138.   unsigned int  pixlen, numcolors;
  139.  
  140.   pixlen= (depth / 8) + (depth % 8 ? 1 : 0);
  141.   if (pixlen == 0) /* special case for `zero' depth image, which is */
  142.     pixlen= 1;     /* sometimes interpreted as `one color' */
  143.   numcolors = depthToColors(depth);
  144.   image= (Image *)lmalloc(sizeof(Image));
  145.   image->type= IRGB;
  146.   image->title= NULL;
  147.   newRGBMapData(&(image->rgb), numcolors);
  148.   image->width= width;
  149.   image->height= height;
  150.   image->depth= depth;
  151.   image->pixlen= pixlen;
  152.   image->data= (unsigned char *)lmalloc(width * height * pixlen);
  153.   return(image);
  154. }
  155.  
  156. Image *newTrueImage(width, height)
  157.      unsigned int width, height;
  158. { Image        *image;
  159.  
  160.   image= (Image *)lmalloc(sizeof(Image));
  161.   image->type= ITRUE;
  162.   image->title= NULL;
  163.   image->rgb.used= image->rgb.size= 0;
  164.   image->width= width;
  165.   image->height= height;
  166.   image->depth= 24;
  167.   image->pixlen= 3;
  168.   image->data= (unsigned char *)lmalloc(width * height * 3);
  169.   return(image);
  170. }
  171.  
  172. void freeImageData(image)
  173.      Image *image;
  174. {
  175.   if (image->title) {
  176.     lfree((byte *)image->title);
  177.     image->title= NULL;
  178.   }
  179.   if (!TRUEP(image))
  180.     freeRGBMapData(&(image->rgb));
  181.   lfree(image->data);
  182. }
  183.  
  184. void freeImage(image)
  185.      Image *image;
  186. {
  187.   goodImage(image, "freeImage");
  188.   freeImageData(image);
  189.   image->type= IBAD;
  190.   lfree((byte *)image);
  191. }
  192.  
  193. byte *lmalloc(size)
  194.      unsigned int size;
  195. { byte *area;
  196.  
  197.   if (size == 0) {
  198.     size= 1;
  199.     if (_Xdebug)
  200.       fprintf(stderr, "lcalloc given zero size!\n");
  201.   }
  202.   if (!(area= (byte *)malloc(size))) {
  203.     memoryExhausted();
  204.     /* NOTREACHED */
  205.   }
  206.   return(area);
  207. }
  208.  
  209. byte *lcalloc(size)
  210.      unsigned int size;
  211. { byte *area;
  212.  
  213.   if (size == 0) {
  214.     size= 1;
  215.     if (_Xdebug)
  216.       fprintf(stderr, "lcalloc given zero size!\n");
  217.   }
  218.   if (!(area= (byte *)calloc(1, size))) {
  219.     memoryExhausted();
  220.     /* NOTREACHED */
  221.   }
  222.   return(area);
  223. }
  224.  
  225. void lfree(area)
  226.      byte *area;
  227. {
  228.   free(area);
  229. }
  230.