Message-ID: <380E497E.273EE838@connect.ab.ca> Date: Wed, 20 Oct 1999 23:00:14 +0000 From: Tom Fjellstrom X-Mailer: Mozilla 4.61 [en] (Win95; U) X-Accept-Language: en MIME-Version: 1.0 Newsgroups: comp.os.msdos.djgpp Subject: Plague of the slow 'blit' routine :) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit NNTP-Posting-Host: ts1680.connect.ab.ca X-Trace: 20 Oct 1999 22:55:24 -0600, ts1680.connect.ab.ca Lines: 62 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com I've been playing around with mode 13h, and the only thing I've been really stuck on is my 'blit' routine. Suffice it to say it is extremely slow. It may have to do with '__djgpp_nearptr_enable()'ing before blit and '__djgpp_nearptr_disable()'ing after, for every bitmap (but that is only required when reading or writing to the gfx card memory. as far as i know), because i haven't thought of an efficient enough way to distinguish between a memory 'bitmap', and a system 'bitmap' (the screen). (i.e.: there may be a sub bitmap of the screen) If there is something I haven't thought of I'm sure some one can lend a hand. :) so here is my blit routine so far and (maybe) necessary info: #define ENABLE() do { if(!enabled) { __djgpp_nearptr_enable(); enabled = 1; } } while(0) #define DISABLE() do { if(enabled) { __djgpp_nearptr_disable(); enabled = 0; } } while(0) #define put_pixel(bmp,x,y,c) (bmp)->dat[((y) << 8) + ((y) << 6) + (x)] = (c) typedef struct BITMAP { int w,h; /* should add clip rect. */ char *dat; } BITMAP; void blit(BITMAP *src, BITMAP *dest, int srcw, int srch, int x, int y) { register int i,j; if(!src || !dest || !srcw || !srch) return; if((x+srcw>dest->w) || (y+srch>dest->h)) return; ENABLE(); for(i=0; i!=srch+1; i++) { if(y+i>dest->h) break; for(j=0; j!=srcw+1; j++) { if((x+j) > dest->w) break; put_pixel(dest, j, i, src->dat[(i << 8) + (i << 6) + j]); } } DISABLE(); } One last thing. Could this be speed up with an equivalent of allegro's 'read_bmp_line' and 'write_bmp_line'? (I think they're called that) thanks in advance for any help. -- "An Optimist will say the glass is half full, A Pessimist will say the glass is half empty, A Canadian will say Waiter!" Tom Fjellstrom tomcf AT connect DOT ab DOT ca