home *** CD-ROM | disk | FTP | other *** search
- /*
-
- GBMRECT.C Extract Subrectangle of General Bitmap
-
- */
-
- /*...sincludes:0:*/
- #include <stdio.h>
- #include <ctype.h>
- #include <string.h>
- #include <stddef.h>
- #include <stdlib.h>
- #include <memory.h>
- #include <malloc.h>
- #include "standard.h"
- #include "gbm.h"
-
- /*...vgbm\46\h:0:*/
- /*...e*/
-
- /*...smiddle_4:0:*/
- static void middle_4(byte *dst, byte *src, int x, int w)
- {
- if ( x & 1 )
- {
- src += (x / 2);
- for ( ; w >= 2; w -= 2 )
- {
- *dst = (byte) (*src++ << 4);
- *dst++ |= (byte) (*src >> 4);
- }
- if ( w )
- *dst = (byte) (*src << 4);
- }
- else
- memcpy(dst, src + x / 2, (w + 1) / 2);
- }
- /*...e*/
- /*...smiddle_1:0:*/
- static void middle_1(byte *dst, byte *src, int x, int w)
- {
- int last = (x & 7);
-
- if ( last )
- {
- src += (x / 8);
- for ( ; w >= 8; w -= 8 )
- {
- *dst = (byte) (*src++ << last);
- *dst++ |= (byte) (*src >> (8 - last));
- }
- if ( w )
- *dst = (byte) (*src << last);
- }
- else
- memcpy(dst, src + x / 8, (w + 7) / 8);
- }
- /*...e*/
-
- void gbm_subrectangle(
- GBM *gbm,
- int x, int y, int w, int h,
- byte *data_src, byte *data_dst
- )
- {
- int i;
- int stride_src = ( ((gbm -> w * gbm -> bpp + 31)/32) * 4 );
- int stride_dst = ( (( w * gbm -> bpp + 31)/32) * 4 );
-
- data_src += stride_src * y;
-
- switch ( gbm -> bpp )
- {
- case 24:
- for ( i = 0; i < h; i++, data_src += stride_src, data_dst += stride_dst )
- memcpy(data_dst, data_src + x * 3, w * 3);
- break;
- case 8:
- for ( i = 0; i < h; i++, data_src += stride_src, data_dst += stride_dst )
- memcpy(data_dst, data_src + x, w);
- break;
- case 4:
- for ( i = 0; i < h; i++, data_src += stride_src, data_dst += stride_dst )
- middle_4(data_dst, data_src, x, w);
- break;
- case 1:
- for ( i = 0; i < h; i++, data_src += stride_src, data_dst += stride_dst )
- middle_1(data_dst, data_src, x, w);
- break;
- }
- }
-