home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / NEXTSTEP / Graphics / ToyViewer-2.6a / src / ImageOpr.bproj / resize.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-24  |  2.3 KB  |  91 lines

  1. #include  <stdio.h>
  2. #include  <libc.h>
  3. #include  <objc/objc.h>
  4. #include  <stdlib.h>
  5. #include  "../common.h"
  6. #include  "../getpixel.h"
  7.  
  8. static void resizeCopy(float factor, commonInfo *newinf,
  9.         unsigned char *map[], unsigned char *newmap[])
  10. {
  11.     int i, x, y, px, nx, pnum, alp;
  12.     int elm[MAXPLANE];
  13.     unsigned char *pp[MAXPLANE];
  14.     int rstab[MAXWidth];
  15.  
  16.     pnum = (newinf->numcolors == 1) ? 1 : 3;
  17.     alp = (newinf->alpha) ? pnum : 0;
  18.     if ((x = newinf->width) < newinf->height)
  19.         x = newinf->height;
  20.     for (i = 0; i < x; i++)
  21.         rstab[i] = (float)i / factor;
  22.     for (i = 0; i < 5; i++)
  23.         pp[i] = newmap[i];
  24.     for (y = 0; y < newinf->height; y++) {
  25.         resetPixel(map, rstab[y]);
  26.         for (px = -1, x = 0; x < newinf->width; x++) {
  27.             for (nx = rstab[x]; px < nx; px++)
  28.                 getPixelA(elm);
  29.             for (i = 0; i < pnum; i++)
  30.                 *pp[i]++ = elm[i];
  31.             if (alp)
  32.                 *pp[alp]++ = elm[ALPHA];
  33.         }
  34.     }
  35. }
  36.  
  37. commonInfo *makeResizedMap(float factor, commonInfo *cinf,
  38.         unsigned char *map[], unsigned char *newmap[])
  39. {
  40.     commonInfo *newinf = NULL;
  41.     unsigned char *planes[MAXPLANE];
  42.     int pn;
  43.  
  44.     planes[0] = NULL;
  45.     if ((newinf = (commonInfo *)malloc(sizeof(commonInfo))) == NULL)
  46.         goto ErrEXIT;
  47.     *newinf = *cinf;
  48.     newinf->width = cinf->width * factor;
  49.     newinf->height = cinf->height * factor;
  50.     newinf->xbytes = byte_length(newinf->bits, newinf->width);
  51.     if (newinf->cspace == NX_OneIsBlackColorSpace)
  52.         newinf->cspace = NX_OneIsWhiteColorSpace;
  53.     newinf->isplanar = YES;
  54.     if (newinf->width > MAXWidth)
  55.         goto ErrEXIT;
  56.     newinf->palette = NULL;
  57.     if (cinf->palette) {
  58.         newinf->palette = copyPalette(cinf->palette, cinf->palsteps);
  59.         if (newinf->palette == NULL)
  60.             goto ErrEXIT;
  61.     }
  62.     pn = (cinf->numcolors == 1) ? 1 : 3;
  63.     if (cinf->alpha) ++pn;
  64.     if (allocImage(planes, newinf->width, newinf->height, 8, pn))
  65.         goto ErrEXIT;
  66.     if (initGetPixel(cinf) != 0)
  67.         goto ErrEXIT;
  68.     resizeCopy(factor, newinf, map, planes);
  69.  
  70.     if (newinf->bits == 8) {
  71.         int i;
  72.         for (i = 0; i < pn; i++)
  73.             newmap[i] = planes[i];
  74.     }else {
  75.         if (allocImage(newmap,
  76.             newinf->width, newinf->height, newinf->bits, pn))
  77.             goto ErrEXIT;
  78.         packWorkingImage(newinf, pn, planes, newmap);
  79.         free((void *)planes[0]);
  80.     }
  81.     return newinf;
  82.  
  83. ErrEXIT:
  84.     if (newinf) {
  85.         if (newinf->palette) free((void *)newinf->palette);
  86.         free((void *)newinf);
  87.     }
  88.     if (planes[0]) free((void *)planes[0]);
  89.     return NULL;
  90. }
  91.