Mail Archives: djgpp/1999/10/21/10:11:52
Message-ID: | <380E497E.273EE838@connect.ab.ca>
|
Date: | Wed, 20 Oct 1999 23:00:14 +0000
|
From: | Tom Fjellstrom <tomcf AT connect DOT ab DOT ca>
|
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 :)
|
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
- Raw text -