home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / xloadimg.zip / xloadimage.4.1 / clip.c < prev    next >
C/C++ Source or Header  |  1993-10-21  |  3KB  |  116 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, 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. 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.     for (y= 0; y < cliph; y++) {
  59.       sp= sline + start;
  60.       dp= dline;
  61.       smask= startmask;
  62.       dmask= 0x80;
  63.       for (x= 0; x < clipw; x++) {
  64.     if (*sp & smask)
  65.       *dp |= dmask;
  66.     if (! (smask >>= 1)) {
  67.       smask= 0x80;
  68.       sp++;
  69.     }
  70.     if (! (dmask >>= 1)) {
  71.       dmask= 0x80;
  72.       dp++;
  73.     }
  74.       }
  75.       sline += slinelen;
  76.       dline += dlinelen;
  77.     }
  78.     break;
  79.  
  80.   case IRGB:
  81.   case ITRUE:
  82.     if (RGBP(simage)) {
  83.       image= newRGBImage(clipw, cliph, simage->depth);
  84.       for (x= 0; x < simage->rgb.used; x++) {
  85.     *(image->rgb.red + x)= *(simage->rgb.red + x);
  86.     *(image->rgb.green + x)= *(simage->rgb.green + x);
  87.     *(image->rgb.blue + x)= *(simage->rgb.blue + x);
  88.       }
  89.       image->rgb.used= simage->rgb.used;
  90.     }
  91.     else
  92.       image= newTrueImage(clipw, cliph);
  93.     slinelen= simage->width * simage->pixlen;
  94.     start= clipx * simage->pixlen;
  95.     sline= simage->data + (clipy * slinelen);
  96.     dp= image->data;
  97.     for (y= 0; y < cliph; y++) {
  98.       sp= sline + start;
  99.       for (x= 0; x < clipw; x++) {
  100.     valToMem(memToVal(sp, simage->pixlen), dp, simage->pixlen);
  101.     sp += simage->pixlen;
  102.     dp += simage->pixlen;
  103.       }
  104.       sline += slinelen;
  105.     }
  106.     break;
  107.   default:
  108.     printf("clip: Unsupported image type\n");
  109.     exit(1);
  110.   }
  111.   image->title= dupString(simage->title);
  112.   if (verbose)
  113.     printf("done\n");
  114.   return(image);
  115. }
  116.