From: Vladimir Pshenkin Organization: MSU Faculty of Economics To: djgpp AT sun DOT soe DOT clarkson DOT edu Date: Thu, 25 May 1995 19:21:30 +0300 Subject: LibGrx BitBlit corrections Hi, all! I found an error while using GrBitBlt() function from LibGrx, mouse cursor began to blink too often. Next version of GrBitBlt() is more correct. ---------------------- cut here -------------------------- /** ** BITBLT.C ** ** Copyright (C) 1992, Csaba Biegl ** 820 Stirrup Dr, Nashville, TN, 37221 ** csaba AT vuse DOT vanderbilt DOT edu ** ** This file is distributed under the terms listed in the document ** "copying.cb", available from the author at the address above. ** A copy of "copying.cb" should accompany this file; if not, a copy ** should be available from where this file was obtained. This file ** may not be distributed without a verbatim copy of "copying.cb". ** You should also have received a copy of the GNU General Public ** License along with this program (it is in the file "copying"); ** if not, write to the Free Software Foundation, Inc., 675 Mass Ave, ** Cambridge, MA 02139, USA. ** ** This program 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. See the ** GNU General Public License for more details. **/ #include "grx.h" #include "libgrx.h" #include "clipping.h" void GrBitBlt(GrContext *dst,int x,int y, GrContext *src,int x1,int y1,int x2,int y2,int oper) { int oldx,oldy; int msflag = FALSE; if(dst == NULL) dst = CURC; if(src == NULL) src = CURC; SORT2(x1,x2); SORT2(y1,y2); oldx = x1; oldy = y1; CLIPBOXTOCONTEXT(src,x1,y1,x2,y2); x += (x1 - oldx); y += (y1 - oldy); x2 += ((oldx = x) - x1); y2 += ((oldy = y) - y1); CLIPBOX(dst,x,y,x2,y2); x1 += (x - oldx); y1 += (y - oldy); if(_GrMouseDrawn) { GrContext *cxt = NULL; int mx1,my1,mx2,my2; /* // Begin of modyfied part ( by PV@ ) */ if(src->gc_onscreen) { cxt = src->gc_root ? src->gc_root : src; mx1 = x1 + src->gc_xoffset; my1 = y1 + src->gc_yoffset; mx2 = mx1 + x2 - x; my2 = my1 + y2 - y; if(dst->gc_onscreen) { cxt = dst->gc_root ? dst->gc_root : dst; mx1 = MIN(mx1,x + dst->gc_xoffset); my1 = MIN(my1,y + dst->gc_yoffset); mx2 = MAX(mx2,x2 + dst->gc_xoffset); my2 = MAX(my2,y2 + dst->gc_yoffset); } }else{ if(dst->gc_onscreen) { cxt = dst->gc_root ? dst->gc_root : dst; mx1 = x + dst->gc_xoffset; my1 = y + dst->gc_yoffset; mx2 = x2 + dst->gc_xoffset; my2 = y2 + dst->gc_yoffset; } } /* // End of modyfied part ( by PV@ ) */ if(cxt) msflag = (*_GrMouseBlock)(cxt,mx1,my1,mx2,my2); } _GrPixCopy(dst,PIX_ADDR(dst,x,y), src,PIX_ADDR(src,x1,y1), (x2 - x + 1), (y2 - y + 1), oper ); if(msflag) (*_GrMouseUnBlock)(msflag); } ---------------------- cut here -------------------------- Enjoy! With best regards, Vladimir A. Pshenkin Moscow State University, Moscow, Russia. Tel: (095) 939-5726 E-mail: pshenkin AT dei DOT econ DOT msu DOT su root AT pva DOT econ DOT msu DOT su FIDO: 2:5020/169.2