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