home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / rexx / library2 / gbmrexx / gbm / gbmrect.c < prev    next >
C/C++ Source or Header  |  1993-08-21  |  2KB  |  92 lines

  1. /*
  2.  
  3. GBMRECT.C  Extract Subrectangle of General Bitmap
  4.  
  5. */
  6.  
  7. /*...sincludes:0:*/
  8. #include <stdio.h>
  9. #include <ctype.h>
  10. #include <string.h>
  11. #include <stddef.h>
  12. #include <stdlib.h>
  13. #include <memory.h>
  14. #include <malloc.h>
  15. #include "standard.h"
  16. #include "gbm.h"
  17.  
  18. /*...vgbm\46\h:0:*/
  19. /*...e*/
  20.  
  21. /*...smiddle_4:0:*/
  22. static void middle_4(byte *dst, byte *src, int x, int w)
  23.     {
  24.     if ( x & 1 )
  25.         {
  26.         src += (x / 2);
  27.         for ( ; w >= 2; w -= 2 )
  28.             {
  29.             *dst    = (byte) (*src++ << 4);
  30.             *dst++ |= (byte) (*src   >> 4);
  31.             }
  32.         if ( w )
  33.             *dst = (byte) (*src << 4);
  34.         }
  35.     else
  36.         memcpy(dst, src + x / 2, (w + 1) / 2);
  37.     }
  38. /*...e*/
  39. /*...smiddle_1:0:*/
  40. static void middle_1(byte *dst, byte *src, int x, int w)
  41.     {
  42.     int    last = (x & 7);
  43.  
  44.     if ( last )
  45.         {
  46.         src += (x / 8);
  47.         for ( ; w >= 8; w -= 8 )
  48.             {
  49.             *dst    = (byte) (*src++ << last);
  50.             *dst++ |= (byte) (*src   >> (8 - last));
  51.             }
  52.         if ( w )
  53.             *dst = (byte) (*src << last);
  54.         }
  55.     else
  56.         memcpy(dst, src + x / 8, (w + 7) / 8);
  57.     }
  58. /*...e*/
  59.  
  60. void gbm_subrectangle(
  61.     GBM *gbm,
  62.     int x, int y, int w, int h,
  63.     byte *data_src, byte *data_dst
  64.     )
  65.     {
  66.     int    i;
  67.     int    stride_src = ( ((gbm -> w * gbm -> bpp + 31)/32) * 4 );
  68.     int    stride_dst = ( ((       w * gbm -> bpp + 31)/32) * 4 );
  69.  
  70.     data_src += stride_src * y;
  71.  
  72.     switch ( gbm -> bpp )
  73.         {
  74.         case 24:
  75.             for ( i = 0; i < h; i++, data_src += stride_src, data_dst += stride_dst )
  76.                 memcpy(data_dst, data_src + x * 3, w * 3);
  77.             break;
  78.         case 8:
  79.             for ( i = 0; i < h; i++, data_src += stride_src, data_dst += stride_dst )
  80.                 memcpy(data_dst, data_src + x, w);
  81.             break;
  82.         case 4:
  83.             for ( i = 0; i < h; i++, data_src += stride_src, data_dst += stride_dst )
  84.                 middle_4(data_dst, data_src, x, w);
  85.             break;
  86.         case 1:
  87.             for ( i = 0; i < h; i++, data_src += stride_src, data_dst += stride_dst )
  88.                 middle_1(data_dst, data_src, x, w);
  89.             break;
  90.         }
  91.     }
  92.