/** ** patfbits.c ** ** Author unknow ** ** This file is part of the GRX graphics library. ** ** The GRX graphics library is free software; you can redistribute it ** and/or modify it under some conditions; see the "copying.grx" file ** for details. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** **/ #include "libgrx.h" #include "clipping.h" #include "shapes.h" void _GrFillBitmapPatternExt(int x,int y,int w,int h, int sx, int sy, char *bmp,int pitch,int start, GrPattern* p,GrColor bg) { GR_int8u *bits, *dptr; GR_int8u mask; int xx, width, oldx; GRX_ENTER(); bits = (GR_int8u *)bmp + ((unsigned int)start >> 3); if ( bg == GrNOCOLOR ) { w += x; h += y; do { mask = 0x80; dptr = bits; oldx = xx = x; width = 0; do { if ( *dptr & mask ) { if ( width == 0 ) oldx = xx; width++; } else if ( width ) { _GrFillPatternExt(oldx, y, sx, sy, width, p); width = 0; } if((mask >>= 1) == 0) { mask = 0x80; ++dptr; } } while ( ++xx < w ); if ( width ) _GrFillPatternExt(oldx, y, sx, sy, width, p); bits += pitch; } while ( ++y < h ); } else { int widthbg; w += x; h += y; do { mask = 0x80; dptr = bits; oldx = xx = x; widthbg = width = 0; do { if ( *dptr & mask ) { if ( widthbg ) { (*FDRV->drawhline)(oldx, y, widthbg, bg); widthbg = 0; oldx = xx; } width++; } else { if ( width ) { _GrFillPatternExt(oldx, y, sx, sy, width, p); width = 0; oldx = xx; } widthbg++; } if((mask >>= 1) == 0) { mask = 0x80; ++dptr; } } while ( ++xx < w ); if ( width ) _GrFillPatternExt(oldx, y, sx, sy, width, p); else if ( widthbg ) (*FDRV->drawhline)(oldx, y, widthbg, bg); bits += pitch; } while ( ++y < h ); } GRX_LEAVE(); } void _GrFillBitmapPattern(int x,int y,int w,int h,char *bmp,int pitch,int start,GrPattern* p,GrColor bg) { GRX_ENTER(); _GrFillBitmapPatternExt(x, y, w, h, 0, 0, bmp, pitch, start, p, bg); GRX_LEAVE(); }