2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
11 COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
26 int gr_bitblt_dest_step_shift = 0;
27 int gr_bitblt_double = 0;
28 ubyte *gr_bitblt_fade_table=NULL;
30 void gr_bm_ubitblt00_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest);
31 void gr_bm_ubitblt00m_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest);
32 void gr_bm_ubitblt0x_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest, int masked);
34 void gr_bm_ubitblt01(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest);
35 void gr_bm_ubitblt02(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest);
42 void gr_linear_movsd( ubyte * source, ubyte * dest, unsigned int nbytes) {
43 memcpy(dest,source,nbytes);
46 void gr_linear_rep_movsdm(ubyte *src, ubyte *dest, int num_pixels) {
54 void gr_linear_rep_movsdm_faded(ubyte * src, ubyte * dest, int num_pixels, ubyte fade_value ) {
58 *dest++=gr_fade_table[((int)fade_value<<8)|(int)c];
61 void gr_linear_rep_movsd_2x(ubyte * source, ubyte * dest, uint nbytes ) {
68 *((unsigned short *)dest)++=((short)c<<8)|(short)c;
77 void gr_ubitmap00( int x, int y, grs_bitmap *bm )
85 dest_rowsize=grd_curcanv->cv_bitmap.bm_rowsize << gr_bitblt_dest_step_shift;
86 dest = &(grd_curcanv->cv_bitmap.bm_data[ dest_rowsize*y+x ]);
90 for (y1=0; y1 < bm->bm_h; y1++ ) {
92 gr_linear_rep_movsd_2x( src, dest, bm->bm_w );
94 gr_linear_movsd( src, dest, bm->bm_w );
95 src += bm->bm_rowsize;
96 dest+= (int)(dest_rowsize);
100 void gr_ubitmap00m( int x, int y, grs_bitmap *bm )
105 unsigned char * dest;
108 dest_rowsize=grd_curcanv->cv_bitmap.bm_rowsize << gr_bitblt_dest_step_shift;
109 dest = &(grd_curcanv->cv_bitmap.bm_data[ dest_rowsize*y+x ]);
113 if (gr_bitblt_fade_table==NULL) {
114 for (y1=0; y1 < bm->bm_h; y1++ ) {
115 gr_linear_rep_movsdm( src, dest, bm->bm_w );
116 src += bm->bm_rowsize;
117 dest+= (int)(dest_rowsize);
120 for (y1=0; y1 < bm->bm_h; y1++ ) {
121 gr_linear_rep_movsdm_faded( src, dest, bm->bm_w, gr_bitblt_fade_table[y1+y] );
122 src += bm->bm_rowsize;
123 dest+= (int)(dest_rowsize);
145 // From Linear to ModeX
146 void gr_bm_ubitblt01(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
156 sstep = src->bm_rowsize;
157 dstep = dest->bm_rowsize << gr_bitblt_dest_step_shift;
159 if (!gr_bitblt_double) {
160 for (plane=0; plane<4; plane++ ) {
161 gr_modex_setplane( (plane+dx)&3 );
162 sbits = src->bm_data + (src->bm_rowsize * sy) + sx + plane;
163 dbits = &gr_video_memory[(dest->bm_rowsize * dy) + ((plane+dx)/4) ];
165 if ( (w&3) > plane ) w1++;
166 for (y=dy; y < dy+h; y++ ) {
167 modex_copy_scanline( sbits, dbits, w1 );
173 for (plane=0; plane<4; plane++ ) {
174 gr_modex_setplane( (plane+dx)&3 );
175 sbits = src->bm_data + (src->bm_rowsize * sy) + sx + plane/2;
176 dbits = &gr_video_memory[(dest->bm_rowsize * dy) + ((plane+dx)/4) ];
178 if ( (w&3) > plane ) w1++;
179 for (y=dy; y < dy+h; y++ ) {
180 modex_copy_scanline_2x( sbits, dbits, w1 );
189 // From Linear to ModeX masked
190 void gr_bm_ubitblt01m(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
201 sbits = src->bm_data + (src->bm_rowsize * sy) + sx;
202 dbits = &gr_video_memory[(dest->bm_rowsize * dy) + dx/4];
204 for (x=dx; x < dx+w; x++ ) {
205 gr_modex_setplane( x&3 );
209 //for (y=0; y < h; y++ ) {
210 // *dbits1 = *sbits1;
211 // sbits1 += src_bm_rowsize;
212 // dbits1 += dest_bm_rowsize;
214 modex_copy_column_m(sbits, dbits, h, src->bm_rowsize, dest->bm_rowsize << gr_bitblt_dest_step_shift );
225 void gr_ubitmap012( int x, int y, grs_bitmap *bm )
232 for (y1=y; y1 < (y+bm->bm_h); y1++ ) {
233 for (x1=x; x1 < (x+bm->bm_w); x1++ ) {
234 gr_setcolor( *src++ );
240 void gr_ubitmap012m( int x, int y, grs_bitmap *bm )
247 for (y1=y; y1 < (y+bm->bm_h); y1++ ) {
248 for (x1=x; x1 < (x+bm->bm_w); x1++ ) {
259 void gr_ubitmapGENERIC(int x, int y, grs_bitmap * bm)
263 for (y1=0; y1 < bm->bm_h; y1++ ) {
264 for (x1=0; x1 < bm->bm_w; x1++ ) {
265 gr_setcolor( gr_gpixel(bm,x1,y1) );
266 gr_upixel( x+x1, y+y1 );
271 void gr_ubitmapGENERICm(int x, int y, grs_bitmap * bm)
276 for (y1=0; y1 < bm->bm_h; y1++ ) {
277 for (x1=0; x1 < bm->bm_w; x1++ ) {
278 c = gr_gpixel(bm,x1,y1);
281 gr_upixel( x+x1, y+y1 );
287 void gr_ubitmap( int x, int y, grs_bitmap *bm )
290 source = bm->bm_type;
293 if (source==BM_LINEAR) {
297 if ( bm->bm_flags & BM_FLAG_RLE )
298 gr_bm_ubitblt00_rle(bm->bm_w, bm->bm_h, x, y, 0, 0, bm, &grd_curcanv->cv_bitmap );
300 gr_ubitmap00( x, y, bm );
304 ogl_ubitmapm(x,y,bm);
309 Assert ((int)grd_curcanv->cv_bitmap.bm_data == BM_D3D_RENDER || (int)grd_curcanv->cv_bitmap.bm_data == BM_D3D_DISPLAY);
310 Win32_BlitLinearToDirectX_bm(bm, 0, 0, bm->bm_w, bm->bm_h, x, y, 0);
315 if ( bm->bm_flags & BM_FLAG_RLE )
316 gr_bm_ubitblt0x_rle(bm->bm_w, bm->bm_h, x, y, 0, 0, bm, &grd_curcanv->cv_bitmap, 0 );
318 gr_bm_ubitblt02( bm->bm_w, bm->bm_h, x, y, 0, 0, bm, &grd_curcanv->cv_bitmap);
321 gr_bm_ubitblt01(bm->bm_w, bm->bm_h, x+XOFFSET, y+YOFFSET, 0, 0, bm, &grd_curcanv->cv_bitmap);
325 gr_ubitmap012( x, y, bm );
329 gr_ubitmapGENERIC(x, y, bm);
333 void gr_ubitmapm( int x, int y, grs_bitmap *bm )
337 source = bm->bm_type;
340 if (source==BM_LINEAR) {
344 if ( bm->bm_flags & BM_FLAG_RLE )
345 gr_bm_ubitblt00m_rle(bm->bm_w, bm->bm_h, x, y, 0, 0, bm, &grd_curcanv->cv_bitmap );
347 gr_ubitmap00m( x, y, bm );
351 ogl_ubitmapm(x,y,bm);
356 if (bm->bm_w < 35 && bm->bm_h < 35) {
357 // ugly hack needed for reticle
358 if ( bm->bm_flags & BM_FLAG_RLE )
359 gr_bm_ubitblt0x_rle(bm->bm_w, bm->bm_h, x, y, 0, 0, bm, &grd_curcanv->cv_bitmap, 1 );
361 gr_ubitmapGENERICm(x, y, bm);
364 Assert ((int)grd_curcanv->cv_bitmap.bm_data == BM_D3D_RENDER || (int)grd_curcanv->cv_bitmap.bm_data == BM_D3D_DISPLAY);
365 Win32_BlitLinearToDirectX_bm(bm, 0, 0, bm->bm_w, bm->bm_h, x, y, 1);
370 gr_ubitmapGENERICm(x, y, bm);
373 gr_bm_ubitblt01m(bm->bm_w, bm->bm_h, x+XOFFSET, y+YOFFSET, 0, 0, bm, &grd_curcanv->cv_bitmap);
377 gr_ubitmap012m( x, y, bm );
381 gr_ubitmapGENERICm(x, y, bm);
387 // From linear to SVGA
388 void gr_bm_ubitblt02(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
390 unsigned char * sbits;
392 unsigned int offset, EndingOffset, VideoLocation;
394 int sbpr, dbpr, y1, page, BytesToMove;
396 sbpr = src->bm_rowsize;
398 dbpr = dest->bm_rowsize << gr_bitblt_dest_step_shift;
400 VideoLocation = (unsigned int)dest->bm_data + (dest->bm_rowsize * dy) + dx;
402 sbits = src->bm_data + ( sbpr*sy ) + sx;
404 for (y1=0; y1 < h; y1++ ) {
406 page = VideoLocation >> 16;
407 offset = VideoLocation & 0xFFFF;
409 gr_vesa_setpage( page );
411 EndingOffset = offset+w-1;
413 if ( EndingOffset <= 0xFFFF )
415 if ( gr_bitblt_double )
416 gr_linear_rep_movsd_2x( (void *)sbits, (void *)(offset+gr_video_memory), w );
418 gr_linear_movsd( (void *)sbits, (void *)(offset+gr_video_memory), w );
420 VideoLocation += dbpr;
425 BytesToMove = 0xFFFF-offset+1;
427 if ( gr_bitblt_double )
428 gr_linear_rep_movsd_2x( (void *)sbits, (void *)(offset+gr_video_memory), BytesToMove );
430 gr_linear_movsd( (void *)sbits, (void *)(offset+gr_video_memory), BytesToMove );
433 gr_vesa_setpage(page);
435 if ( gr_bitblt_double )
436 gr_linear_rep_movsd_2x( (void *)(sbits+BytesToMove/2), (void *)gr_video_memory, EndingOffset - 0xFFFF );
438 gr_linear_movsd( (void *)(sbits+BytesToMove), (void *)gr_video_memory, EndingOffset - 0xFFFF );
440 VideoLocation += dbpr;
446 // From SVGA to linear
447 void gr_bm_ubitblt20(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
449 unsigned char * dbits;
451 unsigned int offset, offset1, offset2;
453 int sbpr, dbpr, y1, page;
455 dbpr = dest->bm_rowsize;
457 sbpr = src->bm_rowsize;
459 for (y1=0; y1 < h; y1++ ) {
461 offset2 = (unsigned int)src->bm_data + (sbpr * (y1+sy)) + sx;
462 dbits = dest->bm_data + (dbpr * (y1+dy)) + dx;
464 page = offset2 >> 16;
465 offset = offset2 & 0xFFFF;
466 offset1 = offset+w-1;
467 gr_vesa_setpage( page );
469 if ( offset1 > 0xFFFF ) {
470 // Overlaps two pages
471 while( offset <= 0xFFFF )
472 *dbits++ = gr_video_memory[offset++];
473 offset1 -= (0xFFFF+1);
476 gr_vesa_setpage(page);
478 while( offset <= offset1 )
479 *dbits++ = gr_video_memory[offset++];
483 #endif // __ENV_DJGPP__
484 //@extern int Interlacing_on;
486 // From Linear to Linear
487 void gr_bm_ubitblt00(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
489 unsigned char * dbits;
490 unsigned char * sbits;
491 //int src_bm_rowsize_2, dest_bm_rowsize_2;
496 sbits = src->bm_data + (src->bm_rowsize * sy) + sx;
497 dbits = dest->bm_data + (dest->bm_rowsize * dy) + dx;
499 dstep = dest->bm_rowsize << gr_bitblt_dest_step_shift;
501 // No interlacing, copy the whole buffer.
502 if (gr_bitblt_double)
503 for (i=0; i < h; i++ ) {
504 gr_linear_rep_movsd_2x( sbits, dbits, w );
505 sbits += src->bm_rowsize;
509 for (i=0; i < h; i++ ) {
510 gr_linear_movsd( sbits, dbits, w );
511 //memcpy(dbits, sbits, w);
512 sbits += src->bm_rowsize;
517 // From Linear to Linear Masked
518 void gr_bm_ubitblt00m(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
520 unsigned char * dbits;
521 unsigned char * sbits;
522 //int src_bm_rowsize_2, dest_bm_rowsize_2;
526 sbits = src->bm_data + (src->bm_rowsize * sy) + sx;
527 dbits = dest->bm_data + (dest->bm_rowsize * dy) + dx;
529 // No interlacing, copy the whole buffer.
531 if (gr_bitblt_fade_table==NULL) {
532 for (i=0; i < h; i++ ) {
533 gr_linear_rep_movsdm( sbits, dbits, w );
534 sbits += src->bm_rowsize;
535 dbits += dest->bm_rowsize;
538 for (i=0; i < h; i++ ) {
539 gr_linear_rep_movsdm_faded( sbits, dbits, w, gr_bitblt_fade_table[dy+i] );
540 sbits += src->bm_rowsize;
541 dbits += dest->bm_rowsize;
547 void gr_bm_bitblt(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
549 int dx1=dx, dx2=dx+dest->bm_w-1;
550 int dy1=dy, dy2=dy+dest->bm_h-1;
552 int sx1=sx, sx2=sx+src->bm_w-1;
553 int sy1=sy, sy2=sy+src->bm_h-1;
555 if ((dx1 >= dest->bm_w ) || (dx2 < 0)) return;
556 if ((dy1 >= dest->bm_h ) || (dy2 < 0)) return;
557 if ( dx1 < 0 ) { sx1 += -dx1; dx1 = 0; }
558 if ( dy1 < 0 ) { sy1 += -dy1; dy1 = 0; }
559 if ( dx2 >= dest->bm_w ) { dx2 = dest->bm_w-1; }
560 if ( dy2 >= dest->bm_h ) { dy2 = dest->bm_h-1; }
562 if ((sx1 >= src->bm_w ) || (sx2 < 0)) return;
563 if ((sy1 >= src->bm_h ) || (sy2 < 0)) return;
564 if ( sx1 < 0 ) { dx1 += -sx1; sx1 = 0; }
565 if ( sy1 < 0 ) { dy1 += -sy1; sy1 = 0; }
566 if ( sx2 >= src->bm_w ) { sx2 = src->bm_w-1; }
567 if ( sy2 >= src->bm_h ) { sy2 = src->bm_h-1; }
569 // Draw bitmap bm[x,y] into (dx1,dy1)-(dx2,dy2)
579 gr_bm_ubitblt(w,h, dx1, dy1, sx1, sy1, src, dest );
582 void gr_bm_ubitblt(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
586 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_LINEAR ))
588 if ( src->bm_flags & BM_FLAG_RLE )
589 gr_bm_ubitblt00_rle( w, h, dx, dy, sx, sy, src, dest );
591 gr_bm_ubitblt00( w, h, dx, dy, sx, sy, src, dest );
596 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_OGL ))
598 ogl_ubitblt(w, h, dx, dy, sx, sy, src, dest);
601 if ( (src->bm_type == BM_OGL) && (dest->bm_type == BM_LINEAR ))
603 ogl_ubitblt_tolinear(w, h, dx, dy, sx, sy, src, dest);
606 if ( (src->bm_type == BM_OGL) && (dest->bm_type == BM_OGL ))
608 ogl_ubitblt_copy(w, h, dx, dy, sx, sy, src, dest);
614 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_DIRECTX ))
616 Assert ((int)dest->bm_data == BM_D3D_RENDER || (int)dest->bm_data == BM_D3D_DISPLAY);
617 Win32_BlitLinearToDirectX_bm (src, sx, sy, w, h, dx, dy, 0);
620 if ( (src->bm_type == BM_DIRECTX) && (dest->bm_type == BM_LINEAR ))
624 if ( (src->bm_type == BM_DIRECTX) && (dest->bm_type == BM_DIRECTX ))
630 if ( (src->bm_flags & BM_FLAG_RLE ) && (src->bm_type == BM_LINEAR) ) {
631 gr_bm_ubitblt0x_rle(w, h, dx, dy, sx, sy, src, dest, 0 );
635 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_SVGA ))
637 gr_bm_ubitblt02( w, h, dx, dy, sx, sy, src, dest );
641 if ( (src->bm_type == BM_SVGA) && (dest->bm_type == BM_LINEAR ))
643 gr_bm_ubitblt20( w, h, dx, dy, sx, sy, src, dest );
647 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_MODEX ))
649 gr_bm_ubitblt01( w, h, dx+XOFFSET, dy+YOFFSET, sx, sy, src, dest );
653 for (y1=0; y1 < h; y1++ ) {
654 for (x1=0; x1 < w; x1++ ) {
655 gr_bm_pixel( dest, dx+x1, dy+y1, gr_gpixel(src,sx+x1,sy+y1) );
660 // Clipped bitmap ...
662 void gr_bitmap( int x, int y, grs_bitmap *bm )
664 int dx1=x, dx2=x+bm->bm_w-1;
665 int dy1=y, dy2=y+bm->bm_h-1;
668 if ((dx1 >= grd_curcanv->cv_bitmap.bm_w ) || (dx2 < 0)) return;
669 if ((dy1 >= grd_curcanv->cv_bitmap.bm_h) || (dy2 < 0)) return;
670 if ( dx1 < 0 ) { sx = -dx1; dx1 = 0; }
671 if ( dy1 < 0 ) { sy = -dy1; dy1 = 0; }
672 if ( dx2 >= grd_curcanv->cv_bitmap.bm_w ) { dx2 = grd_curcanv->cv_bitmap.bm_w-1; }
673 if ( dy2 >= grd_curcanv->cv_bitmap.bm_h ) { dy2 = grd_curcanv->cv_bitmap.bm_h-1; }
675 // Draw bitmap bm[x,y] into (dx1,dy1)-(dx2,dy2)
677 gr_bm_ubitblt(dx2-dx1+1,dy2-dy1+1, dx1, dy1, sx, sy, bm, &grd_curcanv->cv_bitmap );
681 void gr_bitmapm( int x, int y, grs_bitmap *bm )
683 int dx1=x, dx2=x+bm->bm_w-1;
684 int dy1=y, dy2=y+bm->bm_h-1;
687 if ((dx1 >= grd_curcanv->cv_bitmap.bm_w ) || (dx2 < 0)) return;
688 if ((dy1 >= grd_curcanv->cv_bitmap.bm_h) || (dy2 < 0)) return;
689 if ( dx1 < 0 ) { sx = -dx1; dx1 = 0; }
690 if ( dy1 < 0 ) { sy = -dy1; dy1 = 0; }
691 if ( dx2 >= grd_curcanv->cv_bitmap.bm_w ) { dx2 = grd_curcanv->cv_bitmap.bm_w-1; }
692 if ( dy2 >= grd_curcanv->cv_bitmap.bm_h ) { dy2 = grd_curcanv->cv_bitmap.bm_h-1; }
694 // Draw bitmap bm[x,y] into (dx1,dy1)-(dx2,dy2)
696 if ( (bm->bm_type == BM_LINEAR) && (grd_curcanv->cv_bitmap.bm_type == BM_LINEAR ))
698 if ( bm->bm_flags & BM_FLAG_RLE )
699 gr_bm_ubitblt00m_rle(dx2-dx1+1,dy2-dy1+1, dx1, dy1, sx, sy, bm, &grd_curcanv->cv_bitmap );
701 gr_bm_ubitblt00m(dx2-dx1+1,dy2-dy1+1, dx1, dy1, sx, sy, bm, &grd_curcanv->cv_bitmap );
705 gr_bm_ubitbltm(dx2-dx1+1,dy2-dy1+1, dx1, dy1, sx, sy, bm, &grd_curcanv->cv_bitmap );
709 void gr_bm_ubitbltm(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
715 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_OGL ))
717 ogl_ubitblt(w, h, dx, dy, sx, sy, src, dest);
720 if ( (src->bm_type == BM_OGL) && (dest->bm_type == BM_LINEAR ))
722 ogl_ubitblt_tolinear(w, h, dx, dy, sx, sy, src, dest);
725 if ( (src->bm_type == BM_OGL) && (dest->bm_type == BM_OGL ))
727 ogl_ubitblt_copy(w, h, dx, dy, sx, sy, src, dest);
732 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_DIRECTX ))
734 Assert ((int)dest->bm_data == BM_D3D_RENDER || (int)dest->bm_data == BM_D3D_DISPLAY);
735 Win32_BlitLinearToDirectX_bm (src, sx, sy, w, h, dx, dy, 1);
738 if ( (src->bm_type == BM_DIRECTX) && (dest->bm_type == BM_DIRECTX ))
740 Assert ((int)src->bm_data == BM_D3D_RENDER || (int)src->bm_data == BM_D3D_DISPLAY);
741 // Win32_BlitDirectXToDirectX (w, h, dx, dy, sx, sy, src->bm_data, dest->bm_data, 0);
747 for (y1=0; y1 < h; y1++ ) {
748 for (x1=0; x1 < w; x1++ ) {
749 if ((c=gr_gpixel(src,sx+x1,sy+y1))!=255)
750 gr_bm_pixel( dest, dx+x1, dy+y1,c );
756 //-NOT-used // From linear to SVGA
757 //-NOT-used void gr_bm_ubitblt02_2x(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
759 //-NOT-used unsigned char * sbits;
761 //-NOT-used unsigned int offset, EndingOffset, VideoLocation;
763 //-NOT-used int sbpr, dbpr, y1, page, BytesToMove;
765 //-NOT-used sbpr = src->bm_rowsize;
767 //-NOT-used dbpr = dest->bm_rowsize << gr_bitblt_dest_step_shift;
769 //-NOT-used VideoLocation = (unsigned int)dest->bm_data + (dest->bm_rowsize * dy) + dx;
771 //-NOT-used sbits = src->bm_data + ( sbpr*sy ) + sx;
773 //-NOT-used for (y1=0; y1 < h; y1++ ) {
775 //-NOT-used page = VideoLocation >> 16;
776 //-NOT-used offset = VideoLocation & 0xFFFF;
778 //-NOT-used gr_vesa_setpage( page );
780 //-NOT-used EndingOffset = offset+w-1;
782 //-NOT-used if ( EndingOffset <= 0xFFFF )
784 //-NOT-used gr_linear_rep_movsd_2x( (void *)sbits, (void *)(offset+gr_video_memory), w );
786 //-NOT-used VideoLocation += dbpr;
787 //-NOT-used sbits += sbpr;
791 //-NOT-used BytesToMove = 0xFFFF-offset+1;
793 //-NOT-used gr_linear_rep_movsd_2x( (void *)sbits, (void *)(offset+gr_video_memory), BytesToMove );
796 //-NOT-used gr_vesa_setpage(page);
798 //-NOT-used gr_linear_rep_movsd_2x( (void *)(sbits+BytesToMove/2), (void *)gr_video_memory, EndingOffset - 0xFFFF );
800 //-NOT-used VideoLocation += dbpr;
801 //-NOT-used sbits += sbpr;
809 //-NOT-used // From Linear to Linear
810 //-NOT-used void gr_bm_ubitblt00_2x(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
812 //-NOT-used unsigned char * dbits;
813 //-NOT-used unsigned char * sbits;
814 //-NOT-used //int src_bm_rowsize_2, dest_bm_rowsize_2;
818 //-NOT-used sbits = src->bm_data + (src->bm_rowsize * sy) + sx;
819 //-NOT-used dbits = dest->bm_data + (dest->bm_rowsize * dy) + dx;
821 //-NOT-used // No interlacing, copy the whole buffer.
822 //-NOT-used for (i=0; i < h; i++ ) {
823 //-NOT-used gr_linear_rep_movsd_2x( sbits, dbits, w );
825 //-NOT-used sbits += src->bm_rowsize;
826 //-NOT-used dbits += dest->bm_rowsize << gr_bitblt_dest_step_shift;
830 void gr_bm_ubitblt00_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
832 unsigned char * dbits;
833 unsigned char * sbits;
837 sbits = &src->bm_data[4 + src->bm_h];
838 for (i=0; i<sy; i++ )
839 sbits += (int)src->bm_data[4+i];
841 dbits = dest->bm_data + (dest->bm_rowsize * dy) + dx;
843 // No interlacing, copy the whole buffer.
844 for (i=0; i < h; i++ ) {
845 gr_rle_expand_scanline( dbits, sbits, sx, sx+w-1 );
846 sbits += (int)src->bm_data[4+i+sy];
847 dbits += dest->bm_rowsize << gr_bitblt_dest_step_shift;
851 void gr_bm_ubitblt00m_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
853 unsigned char * dbits;
854 unsigned char * sbits;
858 sbits = &src->bm_data[4 + src->bm_h];
859 for (i=0; i<sy; i++ )
860 sbits += (int)src->bm_data[4+i];
862 dbits = dest->bm_data + (dest->bm_rowsize * dy) + dx;
864 // No interlacing, copy the whole buffer.
865 for (i=0; i < h; i++ ) {
866 gr_rle_expand_scanline_masked( dbits, sbits, sx, sx+w-1 );
867 sbits += (int)src->bm_data[4+i+sy];
868 dbits += dest->bm_rowsize << gr_bitblt_dest_step_shift;
874 extern void gr_rle_expand_scanline_generic( grs_bitmap * dest, int dx, int dy, ubyte *src,
875 int x1, int x2, int masked );
878 void gr_bm_ubitblt0x_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src,
879 grs_bitmap * dest, int masked )
883 unsigned char * sbits;
885 sbits = &src->bm_data[4 + src->bm_h];
886 for (i=0; i<sy; i++ )
887 sbits += (int)src->bm_data[4+i];
889 for (y1=0; y1 < h; y1++ ) {
890 gr_rle_expand_scanline_generic( dest, dx, dy+y1, sbits, sx, sx+w-1,
892 sbits += (int)src->bm_data[4+y1+sy];
896 // rescalling bitmaps, 10/14/99 Jan Bobrowski jb@wizard.ae.krakow.pl
898 inline void scale_line(byte *in, byte *out, int ilen, int olen)
900 int a = olen/ilen, b = olen%ilen;
902 byte *end = out + olen;
918 void gr_bitmap_scale_to(grs_bitmap *src, grs_bitmap *dst)
920 byte *s = src->bm_data;
921 byte *d = dst->bm_data;
923 int a = dst->bm_h/h, b = dst->bm_h%h;
935 scale_line(s, d, src->bm_w, dst->bm_w);
936 d += dst->bm_rowsize;
938 s += src->bm_rowsize;
942 void show_fullscr(grs_bitmap *bm)
944 grs_bitmap * const scr = &grd_curcanv->cv_bitmap;
946 if(scr->bm_type != BM_LINEAR) {
947 grs_bitmap *tmp = gr_create_bitmap(scr->bm_w, scr->bm_h);
948 gr_bitmap_scale_to(bm, tmp);
949 gr_bitmap(0, 0, tmp);
953 gr_bitmap_scale_to(bm, scr);