home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume5 / xldimage / part01 / clip.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-11-13  |  2.7 KB  |  112 lines

  1. /* clip.c:
  2.  *
  3.  * return a new image which is a clipped subsection of the old image
  4.  *
  5.  * jim frost 10.04.89
  6.  *
  7.  * Copyright 1989 Jim Frost.  See included file "copyright.h" for complete
  8.  * copyright information.
  9.  */
  10.  
  11. #include "copyright.h"
  12. #include "image.h"
  13.  
  14. Image *clip(simage, clipx, clipy, clipw, cliph, verbose)
  15.      Image        *simage;
  16.      unsigned int  clipx, clipy, clipw, cliph;
  17.      unsigned int  verbose;
  18. { Image *image;
  19.   unsigned int  x, y;
  20.   unsigned int  slinelen, dlinelen;
  21.   unsigned int  start;
  22.   byte          startmask, smask, dmask;
  23.   byte         *sp, *sline, *dp, *dline;
  24.  
  25.   goodImage(simage, "clip");
  26.  
  27.   if (verbose) {
  28.     printf("  Clipping image...");
  29.     fflush(stdout);
  30.   }
  31.  
  32.   /* sane-ify clip area with respect to image
  33.    */
  34.  
  35.   if (clipx + clipw > simage->width)
  36.     clipw -= (simage->width - (clipx + clipw));
  37.   if (clipy + cliph > simage->height)
  38.     cliph -= (simage->height - (clipy + cliph));
  39.  
  40.   switch (simage->type) {
  41.   case IBITMAP:
  42.  
  43.     /* this could be sped up; i don't care
  44.      */
  45.  
  46.     image= newBitImage(clipw, cliph);
  47.     for (x= 0; x < simage->rgb.used; x++) {
  48.       *(image->rgb.red + x)= *(simage->rgb.red + x);
  49.       *(image->rgb.green + x)= *(simage->rgb.green + x);
  50.       *(image->rgb.blue + x)= *(simage->rgb.blue + x);
  51.     }
  52.     slinelen= (simage->width / 8) + (simage->width % 8 ? 1 : 0);
  53.     dlinelen= (clipw / 8) + (clipw % 8 ? 1 : 0);
  54.     start= clipx / 8;
  55.     startmask= 0x80 >> (clipx % 8);
  56.     sline= simage->data + (slinelen * clipy);
  57.     dline= image->data;
  58.     dp= image->data;
  59.     for (y= 0; y < cliph; y++) {
  60.       sp= sline + start;
  61.       dp= dline;
  62.       smask= startmask;
  63.       dmask= 0x80;
  64.       for (x= 0; x < clipw; x++) {
  65.     if (*sp & smask)
  66.       *dp |= dmask;
  67.     if (! (smask >>= 1)) {
  68.       smask= 0x80;
  69.       sp++;
  70.     }
  71.     if (! (dmask >>= 1)) {
  72.       dmask= 0x80;
  73.       dp++;
  74.     }
  75.       }
  76.       sline += slinelen;
  77.       dline += dlinelen;
  78.     }
  79.     break;
  80.  
  81.   case IRGB:
  82.     image= newRGBImage(clipw, cliph, simage->depth);
  83.     for (x= 0; x < simage->rgb.used; x++) {
  84.       *(image->rgb.red + x)= *(simage->rgb.red + x);
  85.       *(image->rgb.green + x)= *(simage->rgb.green + x);
  86.       *(image->rgb.blue + x)= *(simage->rgb.blue + x);
  87.     }
  88.     image->rgb.used= simage->rgb.used;
  89.     slinelen= simage->width * simage->pixlen;
  90.     start= clipx * simage->pixlen;
  91.     sline= simage->data + (clipy * slinelen);
  92.     dp= image->data;
  93.     for (y= 0; y < cliph; y++) {
  94.       sp= sline + start;
  95.       for (x= 0; x < clipw; x++) {
  96.     valToMem(memToVal(sp, simage->pixlen), dp, simage->pixlen);
  97.     sp += simage->pixlen;
  98.     dp += simage->pixlen;
  99.       }
  100.       sline += slinelen;
  101.     }
  102.     break;
  103.   default:
  104.     printf("clip: Unsupported image type\n");
  105.     exit(1);
  106.   }
  107.   image->title= dupString(simage->title);
  108.   if (verbose)
  109.     printf("done\n");
  110.   return(image);
  111. }
  112.