1 /* $Id: bitblt.c,v 1.6 2002-08-17 11:19:56 btb Exp $ */
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
24 #include "byteswap.h" // because of rle code that has short for row offsets
31 int gr_bitblt_dest_step_shift = 0;
32 int gr_bitblt_double = 0;
33 ubyte *gr_bitblt_fade_table=NULL;
35 void gr_bm_ubitblt00_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest);
36 void gr_bm_ubitblt00m_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest);
37 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);
39 void gr_bm_ubitblt01(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest);
40 void gr_bm_ubitblt02(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest);
47 void gr_linear_movsd( ubyte * source, ubyte * dest, unsigned int nbytes) {
48 memcpy(dest,source,nbytes);
51 void gr_linear_rep_movsdm(ubyte *src, ubyte *dest, int num_pixels) {
59 void gr_linear_rep_movsdm_faded(ubyte * src, ubyte * dest, int num_pixels, ubyte fade_value ) {
63 *dest++=gr_fade_table[((int)fade_value<<8)|(int)c];
66 void gr_linear_rep_movsd_2x(ubyte * source, ubyte * dest, uint nbytes ) {
73 *((unsigned short *)dest)++=((short)c<<8)|(short)c;
82 void gr_ubitmap00( int x, int y, grs_bitmap *bm )
90 dest_rowsize=grd_curcanv->cv_bitmap.bm_rowsize << gr_bitblt_dest_step_shift;
91 dest = &(grd_curcanv->cv_bitmap.bm_data[ dest_rowsize*y+x ]);
95 for (y1=0; y1 < bm->bm_h; y1++ ) {
97 gr_linear_rep_movsd_2x( src, dest, bm->bm_w );
99 gr_linear_movsd( src, dest, bm->bm_w );
100 src += bm->bm_rowsize;
101 dest+= (int)(dest_rowsize);
105 void gr_ubitmap00m( int x, int y, grs_bitmap *bm )
110 unsigned char * dest;
113 dest_rowsize=grd_curcanv->cv_bitmap.bm_rowsize << gr_bitblt_dest_step_shift;
114 dest = &(grd_curcanv->cv_bitmap.bm_data[ dest_rowsize*y+x ]);
118 if (gr_bitblt_fade_table==NULL) {
119 for (y1=0; y1 < bm->bm_h; y1++ ) {
120 gr_linear_rep_movsdm( src, dest, bm->bm_w );
121 src += bm->bm_rowsize;
122 dest+= (int)(dest_rowsize);
125 for (y1=0; y1 < bm->bm_h; y1++ ) {
126 gr_linear_rep_movsdm_faded( src, dest, bm->bm_w, gr_bitblt_fade_table[y1+y] );
127 src += bm->bm_rowsize;
128 dest+= (int)(dest_rowsize);
150 // From Linear to ModeX
151 void gr_bm_ubitblt01(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
161 sstep = src->bm_rowsize;
162 dstep = dest->bm_rowsize << gr_bitblt_dest_step_shift;
164 if (!gr_bitblt_double) {
165 for (plane=0; plane<4; plane++ ) {
166 gr_modex_setplane( (plane+dx)&3 );
167 sbits = src->bm_data + (src->bm_rowsize * sy) + sx + plane;
168 dbits = &gr_video_memory[(dest->bm_rowsize * dy) + ((plane+dx)/4) ];
170 if ( (w&3) > plane ) w1++;
171 for (y=dy; y < dy+h; y++ ) {
172 modex_copy_scanline( sbits, dbits, w1 );
178 for (plane=0; plane<4; plane++ ) {
179 gr_modex_setplane( (plane+dx)&3 );
180 sbits = src->bm_data + (src->bm_rowsize * sy) + sx + plane/2;
181 dbits = &gr_video_memory[(dest->bm_rowsize * dy) + ((plane+dx)/4) ];
183 if ( (w&3) > plane ) w1++;
184 for (y=dy; y < dy+h; y++ ) {
185 modex_copy_scanline_2x( sbits, dbits, w1 );
194 // From Linear to ModeX masked
195 void gr_bm_ubitblt01m(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
206 sbits = src->bm_data + (src->bm_rowsize * sy) + sx;
207 dbits = &gr_video_memory[(dest->bm_rowsize * dy) + dx/4];
209 for (x=dx; x < dx+w; x++ ) {
210 gr_modex_setplane( x&3 );
214 //for (y=0; y < h; y++ ) {
215 // *dbits1 = *sbits1;
216 // sbits1 += src_bm_rowsize;
217 // dbits1 += dest_bm_rowsize;
219 modex_copy_column_m(sbits, dbits, h, src->bm_rowsize, dest->bm_rowsize << gr_bitblt_dest_step_shift );
230 void gr_ubitmap012( int x, int y, grs_bitmap *bm )
237 for (y1=y; y1 < (y+bm->bm_h); y1++ ) {
238 for (x1=x; x1 < (x+bm->bm_w); x1++ ) {
239 gr_setcolor( *src++ );
245 void gr_ubitmap012m( int x, int y, grs_bitmap *bm )
252 for (y1=y; y1 < (y+bm->bm_h); y1++ ) {
253 for (x1=x; x1 < (x+bm->bm_w); x1++ ) {
264 void gr_ubitmapGENERIC(int x, int y, grs_bitmap * bm)
268 for (y1=0; y1 < bm->bm_h; y1++ ) {
269 for (x1=0; x1 < bm->bm_w; x1++ ) {
270 gr_setcolor( gr_gpixel(bm,x1,y1) );
271 gr_upixel( x+x1, y+y1 );
276 void gr_ubitmapGENERICm(int x, int y, grs_bitmap * bm)
281 for (y1=0; y1 < bm->bm_h; y1++ ) {
282 for (x1=0; x1 < bm->bm_w; x1++ ) {
283 c = gr_gpixel(bm,x1,y1);
286 gr_upixel( x+x1, y+y1 );
292 void gr_ubitmap( int x, int y, grs_bitmap *bm )
295 source = bm->bm_type;
298 if (source==BM_LINEAR) {
302 if ( bm->bm_flags & BM_FLAG_RLE )
303 gr_bm_ubitblt00_rle(bm->bm_w, bm->bm_h, x, y, 0, 0, bm, &grd_curcanv->cv_bitmap );
305 gr_ubitmap00( x, y, bm );
309 ogl_ubitmapm(x,y,bm);
314 Assert ((int)grd_curcanv->cv_bitmap.bm_data == BM_D3D_RENDER || (int)grd_curcanv->cv_bitmap.bm_data == BM_D3D_DISPLAY);
315 Win32_BlitLinearToDirectX_bm(bm, 0, 0, bm->bm_w, bm->bm_h, x, y, 0);
320 if ( bm->bm_flags & BM_FLAG_RLE )
321 gr_bm_ubitblt0x_rle(bm->bm_w, bm->bm_h, x, y, 0, 0, bm, &grd_curcanv->cv_bitmap, 0 );
323 gr_bm_ubitblt02( bm->bm_w, bm->bm_h, x, y, 0, 0, bm, &grd_curcanv->cv_bitmap);
326 gr_bm_ubitblt01(bm->bm_w, bm->bm_h, x+XOFFSET, y+YOFFSET, 0, 0, bm, &grd_curcanv->cv_bitmap);
330 gr_ubitmap012( x, y, bm );
334 gr_ubitmapGENERIC(x, y, bm);
338 void gr_ubitmapm( int x, int y, grs_bitmap *bm )
342 source = bm->bm_type;
345 if (source==BM_LINEAR) {
349 if ( bm->bm_flags & BM_FLAG_RLE )
350 gr_bm_ubitblt00m_rle(bm->bm_w, bm->bm_h, x, y, 0, 0, bm, &grd_curcanv->cv_bitmap );
352 gr_ubitmap00m( x, y, bm );
356 ogl_ubitmapm(x,y,bm);
361 if (bm->bm_w < 35 && bm->bm_h < 35) {
362 // ugly hack needed for reticle
363 if ( bm->bm_flags & BM_FLAG_RLE )
364 gr_bm_ubitblt0x_rle(bm->bm_w, bm->bm_h, x, y, 0, 0, bm, &grd_curcanv->cv_bitmap, 1 );
366 gr_ubitmapGENERICm(x, y, bm);
369 Assert ((int)grd_curcanv->cv_bitmap.bm_data == BM_D3D_RENDER || (int)grd_curcanv->cv_bitmap.bm_data == BM_D3D_DISPLAY);
370 Win32_BlitLinearToDirectX_bm(bm, 0, 0, bm->bm_w, bm->bm_h, x, y, 1);
375 gr_ubitmapGENERICm(x, y, bm);
378 gr_bm_ubitblt01m(bm->bm_w, bm->bm_h, x+XOFFSET, y+YOFFSET, 0, 0, bm, &grd_curcanv->cv_bitmap);
382 gr_ubitmap012m( x, y, bm );
386 gr_ubitmapGENERICm(x, y, bm);
392 // From linear to SVGA
393 void gr_bm_ubitblt02(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
395 unsigned char * sbits;
397 unsigned int offset, EndingOffset, VideoLocation;
399 int sbpr, dbpr, y1, page, BytesToMove;
401 sbpr = src->bm_rowsize;
403 dbpr = dest->bm_rowsize << gr_bitblt_dest_step_shift;
405 VideoLocation = (unsigned int)dest->bm_data + (dest->bm_rowsize * dy) + dx;
407 sbits = src->bm_data + ( sbpr*sy ) + sx;
409 for (y1=0; y1 < h; y1++ ) {
411 page = VideoLocation >> 16;
412 offset = VideoLocation & 0xFFFF;
414 gr_vesa_setpage( page );
416 EndingOffset = offset+w-1;
418 if ( EndingOffset <= 0xFFFF )
420 if ( gr_bitblt_double )
421 gr_linear_rep_movsd_2x( (void *)sbits, (void *)(offset+gr_video_memory), w );
423 gr_linear_movsd( (void *)sbits, (void *)(offset+gr_video_memory), w );
425 VideoLocation += dbpr;
430 BytesToMove = 0xFFFF-offset+1;
432 if ( gr_bitblt_double )
433 gr_linear_rep_movsd_2x( (void *)sbits, (void *)(offset+gr_video_memory), BytesToMove );
435 gr_linear_movsd( (void *)sbits, (void *)(offset+gr_video_memory), BytesToMove );
438 gr_vesa_setpage(page);
440 if ( gr_bitblt_double )
441 gr_linear_rep_movsd_2x( (void *)(sbits+BytesToMove/2), (void *)gr_video_memory, EndingOffset - 0xFFFF );
443 gr_linear_movsd( (void *)(sbits+BytesToMove), (void *)gr_video_memory, EndingOffset - 0xFFFF );
445 VideoLocation += dbpr;
451 // From SVGA to linear
452 void gr_bm_ubitblt20(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
454 unsigned char * dbits;
456 unsigned int offset, offset1, offset2;
458 int sbpr, dbpr, y1, page;
460 dbpr = dest->bm_rowsize;
462 sbpr = src->bm_rowsize;
464 for (y1=0; y1 < h; y1++ ) {
466 offset2 = (unsigned int)src->bm_data + (sbpr * (y1+sy)) + sx;
467 dbits = dest->bm_data + (dbpr * (y1+dy)) + dx;
469 page = offset2 >> 16;
470 offset = offset2 & 0xFFFF;
471 offset1 = offset+w-1;
472 gr_vesa_setpage( page );
474 if ( offset1 > 0xFFFF ) {
475 // Overlaps two pages
476 while( offset <= 0xFFFF )
477 *dbits++ = gr_video_memory[offset++];
478 offset1 -= (0xFFFF+1);
481 gr_vesa_setpage(page);
483 while( offset <= offset1 )
484 *dbits++ = gr_video_memory[offset++];
489 //@extern int Interlacing_on;
491 // From Linear to Linear
492 void gr_bm_ubitblt00(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
494 unsigned char * dbits;
495 unsigned char * sbits;
496 //int src_bm_rowsize_2, dest_bm_rowsize_2;
501 sbits = src->bm_data + (src->bm_rowsize * sy) + sx;
502 dbits = dest->bm_data + (dest->bm_rowsize * dy) + dx;
504 dstep = dest->bm_rowsize << gr_bitblt_dest_step_shift;
506 // No interlacing, copy the whole buffer.
507 if (gr_bitblt_double)
508 for (i=0; i < h; i++ ) {
509 gr_linear_rep_movsd_2x( sbits, dbits, w );
510 sbits += src->bm_rowsize;
514 for (i=0; i < h; i++ ) {
515 gr_linear_movsd( sbits, dbits, w );
516 //memcpy(dbits, sbits, w);
517 sbits += src->bm_rowsize;
522 // From Linear to Linear Masked
523 void gr_bm_ubitblt00m(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
525 unsigned char * dbits;
526 unsigned char * sbits;
527 //int src_bm_rowsize_2, dest_bm_rowsize_2;
531 sbits = src->bm_data + (src->bm_rowsize * sy) + sx;
532 dbits = dest->bm_data + (dest->bm_rowsize * dy) + dx;
534 // No interlacing, copy the whole buffer.
536 if (gr_bitblt_fade_table==NULL) {
537 for (i=0; i < h; i++ ) {
538 gr_linear_rep_movsdm( sbits, dbits, w );
539 sbits += src->bm_rowsize;
540 dbits += dest->bm_rowsize;
543 for (i=0; i < h; i++ ) {
544 gr_linear_rep_movsdm_faded( sbits, dbits, w, gr_bitblt_fade_table[dy+i] );
545 sbits += src->bm_rowsize;
546 dbits += dest->bm_rowsize;
552 void gr_bm_bitblt(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
554 int dx1=dx, dx2=dx+dest->bm_w-1;
555 int dy1=dy, dy2=dy+dest->bm_h-1;
557 int sx1=sx, sx2=sx+src->bm_w-1;
558 int sy1=sy, sy2=sy+src->bm_h-1;
560 if ((dx1 >= dest->bm_w ) || (dx2 < 0)) return;
561 if ((dy1 >= dest->bm_h ) || (dy2 < 0)) return;
562 if ( dx1 < 0 ) { sx1 += -dx1; dx1 = 0; }
563 if ( dy1 < 0 ) { sy1 += -dy1; dy1 = 0; }
564 if ( dx2 >= dest->bm_w ) { dx2 = dest->bm_w-1; }
565 if ( dy2 >= dest->bm_h ) { dy2 = dest->bm_h-1; }
567 if ((sx1 >= src->bm_w ) || (sx2 < 0)) return;
568 if ((sy1 >= src->bm_h ) || (sy2 < 0)) return;
569 if ( sx1 < 0 ) { dx1 += -sx1; sx1 = 0; }
570 if ( sy1 < 0 ) { dy1 += -sy1; sy1 = 0; }
571 if ( sx2 >= src->bm_w ) { sx2 = src->bm_w-1; }
572 if ( sy2 >= src->bm_h ) { sy2 = src->bm_h-1; }
574 // Draw bitmap bm[x,y] into (dx1,dy1)-(dx2,dy2)
584 gr_bm_ubitblt(w,h, dx1, dy1, sx1, sy1, src, dest );
587 void gr_bm_ubitblt(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
591 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_LINEAR ))
593 if ( src->bm_flags & BM_FLAG_RLE )
594 gr_bm_ubitblt00_rle( w, h, dx, dy, sx, sy, src, dest );
596 gr_bm_ubitblt00( w, h, dx, dy, sx, sy, src, dest );
601 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_OGL ))
603 ogl_ubitblt(w, h, dx, dy, sx, sy, src, dest);
606 if ( (src->bm_type == BM_OGL) && (dest->bm_type == BM_LINEAR ))
608 ogl_ubitblt_tolinear(w, h, dx, dy, sx, sy, src, dest);
611 if ( (src->bm_type == BM_OGL) && (dest->bm_type == BM_OGL ))
613 ogl_ubitblt_copy(w, h, dx, dy, sx, sy, src, dest);
619 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_DIRECTX ))
621 Assert ((int)dest->bm_data == BM_D3D_RENDER || (int)dest->bm_data == BM_D3D_DISPLAY);
622 Win32_BlitLinearToDirectX_bm (src, sx, sy, w, h, dx, dy, 0);
625 if ( (src->bm_type == BM_DIRECTX) && (dest->bm_type == BM_LINEAR ))
629 if ( (src->bm_type == BM_DIRECTX) && (dest->bm_type == BM_DIRECTX ))
635 if ( (src->bm_flags & BM_FLAG_RLE ) && (src->bm_type == BM_LINEAR) ) {
636 gr_bm_ubitblt0x_rle(w, h, dx, dy, sx, sy, src, dest, 0 );
640 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_SVGA ))
642 gr_bm_ubitblt02( w, h, dx, dy, sx, sy, src, dest );
646 if ( (src->bm_type == BM_SVGA) && (dest->bm_type == BM_LINEAR ))
648 gr_bm_ubitblt20( w, h, dx, dy, sx, sy, src, dest );
652 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_MODEX ))
654 gr_bm_ubitblt01( w, h, dx+XOFFSET, dy+YOFFSET, sx, sy, src, dest );
658 for (y1=0; y1 < h; y1++ ) {
659 for (x1=0; x1 < w; x1++ ) {
660 gr_bm_pixel( dest, dx+x1, dy+y1, gr_gpixel(src,sx+x1,sy+y1) );
665 // Clipped bitmap ...
667 void gr_bitmap( int x, int y, grs_bitmap *bm )
669 int dx1=x, dx2=x+bm->bm_w-1;
670 int dy1=y, dy2=y+bm->bm_h-1;
673 if ((dx1 >= grd_curcanv->cv_bitmap.bm_w ) || (dx2 < 0)) return;
674 if ((dy1 >= grd_curcanv->cv_bitmap.bm_h) || (dy2 < 0)) return;
675 if ( dx1 < 0 ) { sx = -dx1; dx1 = 0; }
676 if ( dy1 < 0 ) { sy = -dy1; dy1 = 0; }
677 if ( dx2 >= grd_curcanv->cv_bitmap.bm_w ) { dx2 = grd_curcanv->cv_bitmap.bm_w-1; }
678 if ( dy2 >= grd_curcanv->cv_bitmap.bm_h ) { dy2 = grd_curcanv->cv_bitmap.bm_h-1; }
680 // Draw bitmap bm[x,y] into (dx1,dy1)-(dx2,dy2)
682 gr_bm_ubitblt(dx2-dx1+1,dy2-dy1+1, dx1, dy1, sx, sy, bm, &grd_curcanv->cv_bitmap );
686 void gr_bitmapm( int x, int y, grs_bitmap *bm )
688 int dx1=x, dx2=x+bm->bm_w-1;
689 int dy1=y, dy2=y+bm->bm_h-1;
692 if ((dx1 >= grd_curcanv->cv_bitmap.bm_w ) || (dx2 < 0)) return;
693 if ((dy1 >= grd_curcanv->cv_bitmap.bm_h) || (dy2 < 0)) return;
694 if ( dx1 < 0 ) { sx = -dx1; dx1 = 0; }
695 if ( dy1 < 0 ) { sy = -dy1; dy1 = 0; }
696 if ( dx2 >= grd_curcanv->cv_bitmap.bm_w ) { dx2 = grd_curcanv->cv_bitmap.bm_w-1; }
697 if ( dy2 >= grd_curcanv->cv_bitmap.bm_h ) { dy2 = grd_curcanv->cv_bitmap.bm_h-1; }
699 // Draw bitmap bm[x,y] into (dx1,dy1)-(dx2,dy2)
701 if ( (bm->bm_type == BM_LINEAR) && (grd_curcanv->cv_bitmap.bm_type == BM_LINEAR ))
703 if ( bm->bm_flags & BM_FLAG_RLE )
704 gr_bm_ubitblt00m_rle(dx2-dx1+1,dy2-dy1+1, dx1, dy1, sx, sy, bm, &grd_curcanv->cv_bitmap );
706 gr_bm_ubitblt00m(dx2-dx1+1,dy2-dy1+1, dx1, dy1, sx, sy, bm, &grd_curcanv->cv_bitmap );
710 gr_bm_ubitbltm(dx2-dx1+1,dy2-dy1+1, dx1, dy1, sx, sy, bm, &grd_curcanv->cv_bitmap );
714 void gr_bm_ubitbltm(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
720 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_OGL ))
722 ogl_ubitblt(w, h, dx, dy, sx, sy, src, dest);
725 if ( (src->bm_type == BM_OGL) && (dest->bm_type == BM_LINEAR ))
727 ogl_ubitblt_tolinear(w, h, dx, dy, sx, sy, src, dest);
730 if ( (src->bm_type == BM_OGL) && (dest->bm_type == BM_OGL ))
732 ogl_ubitblt_copy(w, h, dx, dy, sx, sy, src, dest);
737 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_DIRECTX ))
739 Assert ((int)dest->bm_data == BM_D3D_RENDER || (int)dest->bm_data == BM_D3D_DISPLAY);
740 Win32_BlitLinearToDirectX_bm (src, sx, sy, w, h, dx, dy, 1);
743 if ( (src->bm_type == BM_DIRECTX) && (dest->bm_type == BM_DIRECTX ))
745 Assert ((int)src->bm_data == BM_D3D_RENDER || (int)src->bm_data == BM_D3D_DISPLAY);
746 // Win32_BlitDirectXToDirectX (w, h, dx, dy, sx, sy, src->bm_data, dest->bm_data, 0);
752 for (y1=0; y1 < h; y1++ ) {
753 for (x1=0; x1 < w; x1++ ) {
754 if ((c=gr_gpixel(src,sx+x1,sy+y1))!=255)
755 gr_bm_pixel( dest, dx+x1, dy+y1,c );
761 //-NOT-used // From linear to SVGA
762 //-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)
764 //-NOT-used unsigned char * sbits;
766 //-NOT-used unsigned int offset, EndingOffset, VideoLocation;
768 //-NOT-used int sbpr, dbpr, y1, page, BytesToMove;
770 //-NOT-used sbpr = src->bm_rowsize;
772 //-NOT-used dbpr = dest->bm_rowsize << gr_bitblt_dest_step_shift;
774 //-NOT-used VideoLocation = (unsigned int)dest->bm_data + (dest->bm_rowsize * dy) + dx;
776 //-NOT-used sbits = src->bm_data + ( sbpr*sy ) + sx;
778 //-NOT-used for (y1=0; y1 < h; y1++ ) {
780 //-NOT-used page = VideoLocation >> 16;
781 //-NOT-used offset = VideoLocation & 0xFFFF;
783 //-NOT-used gr_vesa_setpage( page );
785 //-NOT-used EndingOffset = offset+w-1;
787 //-NOT-used if ( EndingOffset <= 0xFFFF )
789 //-NOT-used gr_linear_rep_movsd_2x( (void *)sbits, (void *)(offset+gr_video_memory), w );
791 //-NOT-used VideoLocation += dbpr;
792 //-NOT-used sbits += sbpr;
796 //-NOT-used BytesToMove = 0xFFFF-offset+1;
798 //-NOT-used gr_linear_rep_movsd_2x( (void *)sbits, (void *)(offset+gr_video_memory), BytesToMove );
801 //-NOT-used gr_vesa_setpage(page);
803 //-NOT-used gr_linear_rep_movsd_2x( (void *)(sbits+BytesToMove/2), (void *)gr_video_memory, EndingOffset - 0xFFFF );
805 //-NOT-used VideoLocation += dbpr;
806 //-NOT-used sbits += sbpr;
814 //-NOT-used // From Linear to Linear
815 //-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)
817 //-NOT-used unsigned char * dbits;
818 //-NOT-used unsigned char * sbits;
819 //-NOT-used //int src_bm_rowsize_2, dest_bm_rowsize_2;
823 //-NOT-used sbits = src->bm_data + (src->bm_rowsize * sy) + sx;
824 //-NOT-used dbits = dest->bm_data + (dest->bm_rowsize * dy) + dx;
826 //-NOT-used // No interlacing, copy the whole buffer.
827 //-NOT-used for (i=0; i < h; i++ ) {
828 //-NOT-used gr_linear_rep_movsd_2x( sbits, dbits, w );
830 //-NOT-used sbits += src->bm_rowsize;
831 //-NOT-used dbits += dest->bm_rowsize << gr_bitblt_dest_step_shift;
835 void gr_bm_ubitblt00_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
837 unsigned char * dbits;
838 unsigned char * sbits;
842 if (src->bm_flags & BM_FLAG_RLE_BIG)
845 sbits = &src->bm_data[4 + (src->bm_h*data_offset)];
847 for (i=0; i<sy; i++ )
848 sbits += (int)(INTEL_SHORT(src->bm_data[4+(i*data_offset)]));
850 dbits = dest->bm_data + (dest->bm_rowsize * dy) + dx;
852 // No interlacing, copy the whole buffer.
853 for (i=0; i < h; i++ ) {
854 gr_rle_expand_scanline( dbits, sbits, sx, sx+w-1 );
855 if ( src->bm_flags & BM_FLAG_RLE_BIG )
856 sbits += (int)INTEL_SHORT(*((short *)&(src->bm_data[4+((i+sy)*data_offset)])));
858 sbits += (int)(src->bm_data[4+i+sy]);
859 dbits += dest->bm_rowsize << gr_bitblt_dest_step_shift;
863 void gr_bm_ubitblt00m_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
865 unsigned char * dbits;
866 unsigned char * sbits;
870 if (src->bm_flags & BM_FLAG_RLE_BIG)
873 sbits = &src->bm_data[4 + (src->bm_h*data_offset)];
874 for (i=0; i<sy; i++ )
875 sbits += (int)(INTEL_SHORT(src->bm_data[4+(i*data_offset)]));
877 dbits = dest->bm_data + (dest->bm_rowsize * dy) + dx;
879 // No interlacing, copy the whole buffer.
880 for (i=0; i < h; i++ ) {
881 gr_rle_expand_scanline_masked( dbits, sbits, sx, sx+w-1 );
882 if ( src->bm_flags & BM_FLAG_RLE_BIG )
883 sbits += (int)INTEL_SHORT(*((short *)&(src->bm_data[4+((i+sy)*data_offset)])));
885 sbits += (int)(src->bm_data[4+i+sy]);
886 dbits += dest->bm_rowsize << gr_bitblt_dest_step_shift;
892 extern void gr_rle_expand_scanline_generic( grs_bitmap * dest, int dx, int dy, ubyte *src,
893 int x1, int x2, int masked );
896 void gr_bm_ubitblt0x_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src,
897 grs_bitmap * dest, int masked )
901 unsigned char * sbits;
904 if (src->bm_flags & BM_FLAG_RLE_BIG)
907 sbits = &src->bm_data[4 + (src->bm_h*data_offset)];
908 for (i=0; i<sy; i++ )
909 sbits += (int)(INTEL_SHORT(src->bm_data[4+(i*data_offset)]));
911 for (y1=0; y1 < h; y1++ ) {
912 gr_rle_expand_scanline_generic( dest, dx, dy+y1, sbits, sx, sx+w-1, masked );
913 if ( src->bm_flags & BM_FLAG_RLE_BIG )
914 sbits += (int)INTEL_SHORT(*((short *)&(src->bm_data[4+((y1+sy)*data_offset)])));
916 sbits += (int)src->bm_data[4+y1+sy];
920 // rescalling bitmaps, 10/14/99 Jan Bobrowski jb@wizard.ae.krakow.pl
922 inline void scale_line(byte *in, byte *out, int ilen, int olen)
924 int a = olen/ilen, b = olen%ilen;
926 byte *end = out + olen;
942 void gr_bitmap_scale_to(grs_bitmap *src, grs_bitmap *dst)
944 byte *s = src->bm_data;
945 byte *d = dst->bm_data;
947 int a = dst->bm_h/h, b = dst->bm_h%h;
959 scale_line(s, d, src->bm_w, dst->bm_w);
960 d += dst->bm_rowsize;
962 s += src->bm_rowsize;
966 void show_fullscr(grs_bitmap *bm)
968 grs_bitmap * const scr = &grd_curcanv->cv_bitmap;
971 if(bm->bm_type == BM_LINEAR && scr->bm_type == BM_OGL) {
972 ogl_ubitblt_i(scr->bm_w,scr->bm_h,0,0,bm->bm_w,bm->bm_h,0,0,bm,scr);//use opengl to scale, faster and saves ram. -MPM
976 if(scr->bm_type != BM_LINEAR) {
977 grs_bitmap *tmp = gr_create_bitmap(scr->bm_w, scr->bm_h);
978 gr_bitmap_scale_to(bm, tmp);
979 gr_bitmap(0, 0, tmp);
983 gr_bitmap_scale_to(bm, scr);