home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / gd201.zip / gd-2.0.1 / gdxpm.c < prev    next >
C/C++ Source or Header  |  2001-04-03  |  3KB  |  149 lines

  1.  
  2. /* 
  3.    add ability to load xpm files to gd, requires the xpm
  4.    library.
  5.    Caolan.McNamara@ul.ie 
  6.    http://www.csn.ul.ie/~caolan
  7.  */
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include "gd.h"
  11. #include "gdhelpers.h"
  12.  
  13. #ifndef HAVE_XPM
  14. gdImagePtr
  15. gdImageCreateFromXpm (char *filename)
  16. {
  17.   fprintf (stderr, "libgd was not built with xpm support\n");
  18.   return (NULL);
  19. }
  20.  
  21. #else
  22.  
  23. #include "xpm.h"
  24.  
  25. gdImagePtr
  26. gdImageCreateFromXpm (char *filename)
  27. {
  28.   XpmInfo info;
  29.   XpmImage image;
  30.   int i, j, k, number;
  31.   char buf[5];
  32.   gdImagePtr im = 0;
  33.   char *apixel;
  34.   int *pointer;
  35.   int red = 0, green = 0, blue = 0, color = 0;
  36.   int *colors;
  37.   int ret;
  38.  
  39.   ret = XpmReadFileToXpmImage (filename, &image, &info);
  40.   if (ret != XpmSuccess)
  41.     return 0;
  42.  
  43.   if (!(im = gdImageCreate (image.width, image.height)))
  44.     return 0;
  45.  
  46.   number = image.ncolors;
  47.   colors = (int *) gdMalloc (sizeof (int) * number);
  48.   if (colors == NULL)
  49.     return (0);
  50.   for (i = 0; i < number; i++)
  51.     {
  52.       switch (strlen (image.colorTable[i].c_color))
  53.     {
  54.     case 4:
  55.       buf[1] = '\0';
  56.       buf[0] = image.colorTable[i].c_color[1];
  57.       red = strtol (buf, NULL, 16);
  58.  
  59.       buf[0] = image.colorTable[i].c_color[3];
  60.       green = strtol (buf, NULL, 16);
  61.  
  62.       buf[0] = image.colorTable[i].c_color[5];
  63.       blue = strtol (buf, NULL, 16);
  64.       break;
  65.     case 7:
  66.       buf[2] = '\0';
  67.       buf[0] = image.colorTable[i].c_color[1];
  68.       buf[1] = image.colorTable[i].c_color[2];
  69.       red = strtol (buf, NULL, 16);
  70.  
  71.       buf[0] = image.colorTable[i].c_color[3];
  72.       buf[1] = image.colorTable[i].c_color[4];
  73.       green = strtol (buf, NULL, 16);
  74.  
  75.       buf[0] = image.colorTable[i].c_color[5];
  76.       buf[1] = image.colorTable[i].c_color[6];
  77.       blue = strtol (buf, NULL, 16);
  78.       break;
  79.     case 10:
  80.       buf[3] = '\0';
  81.       buf[0] = image.colorTable[i].c_color[1];
  82.       buf[1] = image.colorTable[i].c_color[2];
  83.       buf[2] = image.colorTable[i].c_color[3];
  84.       red = strtol (buf, NULL, 16);
  85.       red /= 64;
  86.  
  87.       buf[0] = image.colorTable[i].c_color[4];
  88.       buf[1] = image.colorTable[i].c_color[5];
  89.       buf[2] = image.colorTable[i].c_color[6];
  90.       green = strtol (buf, NULL, 16);
  91.       green /= 64;
  92.  
  93.       buf[0] = image.colorTable[i].c_color[7];
  94.       buf[1] = image.colorTable[i].c_color[8];
  95.       buf[2] = image.colorTable[i].c_color[9];
  96.       blue = strtol (buf, NULL, 16);
  97.       blue /= 64;
  98.       break;
  99.     case 13:
  100.       buf[4] = '\0';
  101.       buf[0] = image.colorTable[i].c_color[1];
  102.       buf[1] = image.colorTable[i].c_color[2];
  103.       buf[2] = image.colorTable[i].c_color[3];
  104.       buf[3] = image.colorTable[i].c_color[4];
  105.       red = strtol (buf, NULL, 16);
  106.       red /= 256;
  107.  
  108.       buf[0] = image.colorTable[i].c_color[5];
  109.       buf[1] = image.colorTable[i].c_color[6];
  110.       buf[2] = image.colorTable[i].c_color[7];
  111.       buf[3] = image.colorTable[i].c_color[8];
  112.       green = strtol (buf, NULL, 16);
  113.       green /= 256;
  114.  
  115.       buf[0] = image.colorTable[i].c_color[9];
  116.       buf[1] = image.colorTable[i].c_color[10];
  117.       buf[2] = image.colorTable[i].c_color[11];
  118.       buf[3] = image.colorTable[i].c_color[12];
  119.       blue = strtol (buf, NULL, 16);
  120.       blue /= 256;
  121.       break;
  122.     }
  123.  
  124.  
  125.       colors[i] = gdImageColorResolve (im, red, green, blue);
  126.       if (colors[i] == -1)
  127.     fprintf (stderr, "ARRRGH\n");
  128.     }
  129.  
  130.   apixel = (char *) gdMalloc (image.cpp + 1);
  131.   if (apixel == NULL)
  132.     return (0);
  133.   apixel[image.cpp] = '\0';
  134.  
  135.   pointer = image.data;
  136.   for (i = 0; i < image.height; i++)
  137.     {
  138.       for (j = 0; j < image.width; j++)
  139.     {
  140.       k = *pointer++;
  141.       gdImageSetPixel (im, j, i, colors[k]);
  142.     }
  143.     }
  144.   gdFree (apixel);
  145.   gdFree (colors);
  146.   return (im);
  147. }
  148. #endif
  149.