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.
29 int gr_bitblt_dest_step_shift = 0;
30 int gr_bitblt_double = 0;
31 ubyte *gr_bitblt_fade_table=NULL;
33 void gr_bm_ubitblt00_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest);
34 void gr_bm_ubitblt00m_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest);
35 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);
37 void gr_bm_ubitblt01(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest);
38 void gr_bm_ubitblt02(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest);
45 void gr_linear_movsd( ubyte * source, ubyte * dest, unsigned int nbytes) {
46 memcpy(dest,source,nbytes);
49 void gr_linear_rep_movsdm(ubyte *src, ubyte *dest, int num_pixels) {
57 void gr_linear_rep_movsdm_faded(ubyte * src, ubyte * dest, int num_pixels, ubyte fade_value ) {
61 *dest++=gr_fade_table[((int)fade_value<<8)|(int)c];
64 void gr_linear_rep_movsd_2x(ubyte * source, ubyte * dest, uint nbytes ) {
71 *((unsigned short *)dest)++=((short)c<<8)|(short)c;
80 void gr_ubitmap00( int x, int y, grs_bitmap *bm )
88 dest_rowsize=grd_curcanv->cv_bitmap.bm_rowsize << gr_bitblt_dest_step_shift;
89 dest = &(grd_curcanv->cv_bitmap.bm_data[ dest_rowsize*y+x ]);
93 for (y1=0; y1 < bm->bm_h; y1++ ) {
95 gr_linear_rep_movsd_2x( src, dest, bm->bm_w );
97 gr_linear_movsd( src, dest, bm->bm_w );
98 src += bm->bm_rowsize;
99 dest+= (int)(dest_rowsize);
103 void gr_ubitmap00m( int x, int y, grs_bitmap *bm )
108 unsigned char * dest;
111 dest_rowsize=grd_curcanv->cv_bitmap.bm_rowsize << gr_bitblt_dest_step_shift;
112 dest = &(grd_curcanv->cv_bitmap.bm_data[ dest_rowsize*y+x ]);
116 if (gr_bitblt_fade_table==NULL) {
117 for (y1=0; y1 < bm->bm_h; y1++ ) {
118 gr_linear_rep_movsdm( src, dest, bm->bm_w );
119 src += bm->bm_rowsize;
120 dest+= (int)(dest_rowsize);
123 for (y1=0; y1 < bm->bm_h; y1++ ) {
124 gr_linear_rep_movsdm_faded( src, dest, bm->bm_w, gr_bitblt_fade_table[y1+y] );
125 src += bm->bm_rowsize;
126 dest+= (int)(dest_rowsize);
148 // From Linear to ModeX
149 void gr_bm_ubitblt01(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
159 sstep = src->bm_rowsize;
160 dstep = dest->bm_rowsize << gr_bitblt_dest_step_shift;
162 if (!gr_bitblt_double) {
163 for (plane=0; plane<4; plane++ ) {
164 gr_modex_setplane( (plane+dx)&3 );
165 sbits = src->bm_data + (src->bm_rowsize * sy) + sx + plane;
166 dbits = &gr_video_memory[(dest->bm_rowsize * dy) + ((plane+dx)/4) ];
168 if ( (w&3) > plane ) w1++;
169 for (y=dy; y < dy+h; y++ ) {
170 modex_copy_scanline( sbits, dbits, w1 );
176 for (plane=0; plane<4; plane++ ) {
177 gr_modex_setplane( (plane+dx)&3 );
178 sbits = src->bm_data + (src->bm_rowsize * sy) + sx + plane/2;
179 dbits = &gr_video_memory[(dest->bm_rowsize * dy) + ((plane+dx)/4) ];
181 if ( (w&3) > plane ) w1++;
182 for (y=dy; y < dy+h; y++ ) {
183 modex_copy_scanline_2x( sbits, dbits, w1 );
192 // From Linear to ModeX masked
193 void gr_bm_ubitblt01m(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
204 sbits = src->bm_data + (src->bm_rowsize * sy) + sx;
205 dbits = &gr_video_memory[(dest->bm_rowsize * dy) + dx/4];
207 for (x=dx; x < dx+w; x++ ) {
208 gr_modex_setplane( x&3 );
212 //for (y=0; y < h; y++ ) {
213 // *dbits1 = *sbits1;
214 // sbits1 += src_bm_rowsize;
215 // dbits1 += dest_bm_rowsize;
217 modex_copy_column_m(sbits, dbits, h, src->bm_rowsize, dest->bm_rowsize << gr_bitblt_dest_step_shift );
228 void gr_ubitmap012( int x, int y, grs_bitmap *bm )
235 for (y1=y; y1 < (y+bm->bm_h); y1++ ) {
236 for (x1=x; x1 < (x+bm->bm_w); x1++ ) {
237 gr_setcolor( *src++ );
243 void gr_ubitmap012m( int x, int y, grs_bitmap *bm )
250 for (y1=y; y1 < (y+bm->bm_h); y1++ ) {
251 for (x1=x; x1 < (x+bm->bm_w); x1++ ) {
262 void gr_ubitmapGENERIC(int x, int y, grs_bitmap * bm)
266 for (y1=0; y1 < bm->bm_h; y1++ ) {
267 for (x1=0; x1 < bm->bm_w; x1++ ) {
268 gr_setcolor( gr_gpixel(bm,x1,y1) );
269 gr_upixel( x+x1, y+y1 );
274 void gr_ubitmapGENERICm(int x, int y, grs_bitmap * bm)
279 for (y1=0; y1 < bm->bm_h; y1++ ) {
280 for (x1=0; x1 < bm->bm_w; x1++ ) {
281 c = gr_gpixel(bm,x1,y1);
284 gr_upixel( x+x1, y+y1 );
290 void gr_ubitmap( int x, int y, grs_bitmap *bm )
293 source = bm->bm_type;
296 if (source==BM_LINEAR) {
300 if ( bm->bm_flags & BM_FLAG_RLE )
301 gr_bm_ubitblt00_rle(bm->bm_w, bm->bm_h, x, y, 0, 0, bm, &grd_curcanv->cv_bitmap );
303 gr_ubitmap00( x, y, bm );
307 ogl_ubitmapm(x,y,bm);
312 Assert ((int)grd_curcanv->cv_bitmap.bm_data == BM_D3D_RENDER || (int)grd_curcanv->cv_bitmap.bm_data == BM_D3D_DISPLAY);
313 Win32_BlitLinearToDirectX_bm(bm, 0, 0, bm->bm_w, bm->bm_h, x, y, 0);
318 if ( bm->bm_flags & BM_FLAG_RLE )
319 gr_bm_ubitblt0x_rle(bm->bm_w, bm->bm_h, x, y, 0, 0, bm, &grd_curcanv->cv_bitmap, 0 );
321 gr_bm_ubitblt02( bm->bm_w, bm->bm_h, x, y, 0, 0, bm, &grd_curcanv->cv_bitmap);
324 gr_bm_ubitblt01(bm->bm_w, bm->bm_h, x+XOFFSET, y+YOFFSET, 0, 0, bm, &grd_curcanv->cv_bitmap);
328 gr_ubitmap012( x, y, bm );
332 gr_ubitmapGENERIC(x, y, bm);
336 void gr_ubitmapm( int x, int y, grs_bitmap *bm )
340 source = bm->bm_type;
343 if (source==BM_LINEAR) {
347 if ( bm->bm_flags & BM_FLAG_RLE )
348 gr_bm_ubitblt00m_rle(bm->bm_w, bm->bm_h, x, y, 0, 0, bm, &grd_curcanv->cv_bitmap );
350 gr_ubitmap00m( x, y, bm );
354 ogl_ubitmapm(x,y,bm);
359 if (bm->bm_w < 35 && bm->bm_h < 35) {
360 // ugly hack needed for reticle
361 if ( bm->bm_flags & BM_FLAG_RLE )
362 gr_bm_ubitblt0x_rle(bm->bm_w, bm->bm_h, x, y, 0, 0, bm, &grd_curcanv->cv_bitmap, 1 );
364 gr_ubitmapGENERICm(x, y, bm);
367 Assert ((int)grd_curcanv->cv_bitmap.bm_data == BM_D3D_RENDER || (int)grd_curcanv->cv_bitmap.bm_data == BM_D3D_DISPLAY);
368 Win32_BlitLinearToDirectX_bm(bm, 0, 0, bm->bm_w, bm->bm_h, x, y, 1);
373 gr_ubitmapGENERICm(x, y, bm);
376 gr_bm_ubitblt01m(bm->bm_w, bm->bm_h, x+XOFFSET, y+YOFFSET, 0, 0, bm, &grd_curcanv->cv_bitmap);
380 gr_ubitmap012m( x, y, bm );
384 gr_ubitmapGENERICm(x, y, bm);
390 // From linear to SVGA
391 void gr_bm_ubitblt02(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
393 unsigned char * sbits;
395 unsigned int offset, EndingOffset, VideoLocation;
397 int sbpr, dbpr, y1, page, BytesToMove;
399 sbpr = src->bm_rowsize;
401 dbpr = dest->bm_rowsize << gr_bitblt_dest_step_shift;
403 VideoLocation = (unsigned int)dest->bm_data + (dest->bm_rowsize * dy) + dx;
405 sbits = src->bm_data + ( sbpr*sy ) + sx;
407 for (y1=0; y1 < h; y1++ ) {
409 page = VideoLocation >> 16;
410 offset = VideoLocation & 0xFFFF;
412 gr_vesa_setpage( page );
414 EndingOffset = offset+w-1;
416 if ( EndingOffset <= 0xFFFF )
418 if ( gr_bitblt_double )
419 gr_linear_rep_movsd_2x( (void *)sbits, (void *)(offset+gr_video_memory), w );
421 gr_linear_movsd( (void *)sbits, (void *)(offset+gr_video_memory), w );
423 VideoLocation += dbpr;
428 BytesToMove = 0xFFFF-offset+1;
430 if ( gr_bitblt_double )
431 gr_linear_rep_movsd_2x( (void *)sbits, (void *)(offset+gr_video_memory), BytesToMove );
433 gr_linear_movsd( (void *)sbits, (void *)(offset+gr_video_memory), BytesToMove );
436 gr_vesa_setpage(page);
438 if ( gr_bitblt_double )
439 gr_linear_rep_movsd_2x( (void *)(sbits+BytesToMove/2), (void *)gr_video_memory, EndingOffset - 0xFFFF );
441 gr_linear_movsd( (void *)(sbits+BytesToMove), (void *)gr_video_memory, EndingOffset - 0xFFFF );
443 VideoLocation += dbpr;
449 // From SVGA to linear
450 void gr_bm_ubitblt20(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
452 unsigned char * dbits;
454 unsigned int offset, offset1, offset2;
456 int sbpr, dbpr, y1, page;
458 dbpr = dest->bm_rowsize;
460 sbpr = src->bm_rowsize;
462 for (y1=0; y1 < h; y1++ ) {
464 offset2 = (unsigned int)src->bm_data + (sbpr * (y1+sy)) + sx;
465 dbits = dest->bm_data + (dbpr * (y1+dy)) + dx;
467 page = offset2 >> 16;
468 offset = offset2 & 0xFFFF;
469 offset1 = offset+w-1;
470 gr_vesa_setpage( page );
472 if ( offset1 > 0xFFFF ) {
473 // Overlaps two pages
474 while( offset <= 0xFFFF )
475 *dbits++ = gr_video_memory[offset++];
476 offset1 -= (0xFFFF+1);
479 gr_vesa_setpage(page);
481 while( offset <= offset1 )
482 *dbits++ = gr_video_memory[offset++];
487 //@extern int Interlacing_on;
489 // From Linear to Linear
490 void gr_bm_ubitblt00(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
492 unsigned char * dbits;
493 unsigned char * sbits;
494 //int src_bm_rowsize_2, dest_bm_rowsize_2;
499 sbits = src->bm_data + (src->bm_rowsize * sy) + sx;
500 dbits = dest->bm_data + (dest->bm_rowsize * dy) + dx;
502 dstep = dest->bm_rowsize << gr_bitblt_dest_step_shift;
504 // No interlacing, copy the whole buffer.
505 if (gr_bitblt_double)
506 for (i=0; i < h; i++ ) {
507 gr_linear_rep_movsd_2x( sbits, dbits, w );
508 sbits += src->bm_rowsize;
512 for (i=0; i < h; i++ ) {
513 gr_linear_movsd( sbits, dbits, w );
514 //memcpy(dbits, sbits, w);
515 sbits += src->bm_rowsize;
520 // From Linear to Linear Masked
521 void gr_bm_ubitblt00m(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
523 unsigned char * dbits;
524 unsigned char * sbits;
525 //int src_bm_rowsize_2, dest_bm_rowsize_2;
529 sbits = src->bm_data + (src->bm_rowsize * sy) + sx;
530 dbits = dest->bm_data + (dest->bm_rowsize * dy) + dx;
532 // No interlacing, copy the whole buffer.
534 if (gr_bitblt_fade_table==NULL) {
535 for (i=0; i < h; i++ ) {
536 gr_linear_rep_movsdm( sbits, dbits, w );
537 sbits += src->bm_rowsize;
538 dbits += dest->bm_rowsize;
541 for (i=0; i < h; i++ ) {
542 gr_linear_rep_movsdm_faded( sbits, dbits, w, gr_bitblt_fade_table[dy+i] );
543 sbits += src->bm_rowsize;
544 dbits += dest->bm_rowsize;
550 void gr_bm_bitblt(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
552 int dx1=dx, dx2=dx+dest->bm_w-1;
553 int dy1=dy, dy2=dy+dest->bm_h-1;
555 int sx1=sx, sx2=sx+src->bm_w-1;
556 int sy1=sy, sy2=sy+src->bm_h-1;
558 if ((dx1 >= dest->bm_w ) || (dx2 < 0)) return;
559 if ((dy1 >= dest->bm_h ) || (dy2 < 0)) return;
560 if ( dx1 < 0 ) { sx1 += -dx1; dx1 = 0; }
561 if ( dy1 < 0 ) { sy1 += -dy1; dy1 = 0; }
562 if ( dx2 >= dest->bm_w ) { dx2 = dest->bm_w-1; }
563 if ( dy2 >= dest->bm_h ) { dy2 = dest->bm_h-1; }
565 if ((sx1 >= src->bm_w ) || (sx2 < 0)) return;
566 if ((sy1 >= src->bm_h ) || (sy2 < 0)) return;
567 if ( sx1 < 0 ) { dx1 += -sx1; sx1 = 0; }
568 if ( sy1 < 0 ) { dy1 += -sy1; sy1 = 0; }
569 if ( sx2 >= src->bm_w ) { sx2 = src->bm_w-1; }
570 if ( sy2 >= src->bm_h ) { sy2 = src->bm_h-1; }
572 // Draw bitmap bm[x,y] into (dx1,dy1)-(dx2,dy2)
582 gr_bm_ubitblt(w,h, dx1, dy1, sx1, sy1, src, dest );
585 void gr_bm_ubitblt(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
589 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_LINEAR ))
591 if ( src->bm_flags & BM_FLAG_RLE )
592 gr_bm_ubitblt00_rle( w, h, dx, dy, sx, sy, src, dest );
594 gr_bm_ubitblt00( w, h, dx, dy, sx, sy, src, dest );
599 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_OGL ))
601 ogl_ubitblt(w, h, dx, dy, sx, sy, src, dest);
604 if ( (src->bm_type == BM_OGL) && (dest->bm_type == BM_LINEAR ))
606 ogl_ubitblt_tolinear(w, h, dx, dy, sx, sy, src, dest);
609 if ( (src->bm_type == BM_OGL) && (dest->bm_type == BM_OGL ))
611 ogl_ubitblt_copy(w, h, dx, dy, sx, sy, src, dest);
617 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_DIRECTX ))
619 Assert ((int)dest->bm_data == BM_D3D_RENDER || (int)dest->bm_data == BM_D3D_DISPLAY);
620 Win32_BlitLinearToDirectX_bm (src, sx, sy, w, h, dx, dy, 0);
623 if ( (src->bm_type == BM_DIRECTX) && (dest->bm_type == BM_LINEAR ))
627 if ( (src->bm_type == BM_DIRECTX) && (dest->bm_type == BM_DIRECTX ))
633 if ( (src->bm_flags & BM_FLAG_RLE ) && (src->bm_type == BM_LINEAR) ) {
634 gr_bm_ubitblt0x_rle(w, h, dx, dy, sx, sy, src, dest, 0 );
638 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_SVGA ))
640 gr_bm_ubitblt02( w, h, dx, dy, sx, sy, src, dest );
644 if ( (src->bm_type == BM_SVGA) && (dest->bm_type == BM_LINEAR ))
646 gr_bm_ubitblt20( w, h, dx, dy, sx, sy, src, dest );
650 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_MODEX ))
652 gr_bm_ubitblt01( w, h, dx+XOFFSET, dy+YOFFSET, sx, sy, src, dest );
656 for (y1=0; y1 < h; y1++ ) {
657 for (x1=0; x1 < w; x1++ ) {
658 gr_bm_pixel( dest, dx+x1, dy+y1, gr_gpixel(src,sx+x1,sy+y1) );
663 // Clipped bitmap ...
665 void gr_bitmap( int x, int y, grs_bitmap *bm )
667 int dx1=x, dx2=x+bm->bm_w-1;
668 int dy1=y, dy2=y+bm->bm_h-1;
671 if ((dx1 >= grd_curcanv->cv_bitmap.bm_w ) || (dx2 < 0)) return;
672 if ((dy1 >= grd_curcanv->cv_bitmap.bm_h) || (dy2 < 0)) return;
673 if ( dx1 < 0 ) { sx = -dx1; dx1 = 0; }
674 if ( dy1 < 0 ) { sy = -dy1; dy1 = 0; }
675 if ( dx2 >= grd_curcanv->cv_bitmap.bm_w ) { dx2 = grd_curcanv->cv_bitmap.bm_w-1; }
676 if ( dy2 >= grd_curcanv->cv_bitmap.bm_h ) { dy2 = grd_curcanv->cv_bitmap.bm_h-1; }
678 // Draw bitmap bm[x,y] into (dx1,dy1)-(dx2,dy2)
680 gr_bm_ubitblt(dx2-dx1+1,dy2-dy1+1, dx1, dy1, sx, sy, bm, &grd_curcanv->cv_bitmap );
684 void gr_bitmapm( int x, int y, grs_bitmap *bm )
686 int dx1=x, dx2=x+bm->bm_w-1;
687 int dy1=y, dy2=y+bm->bm_h-1;
690 if ((dx1 >= grd_curcanv->cv_bitmap.bm_w ) || (dx2 < 0)) return;
691 if ((dy1 >= grd_curcanv->cv_bitmap.bm_h) || (dy2 < 0)) return;
692 if ( dx1 < 0 ) { sx = -dx1; dx1 = 0; }
693 if ( dy1 < 0 ) { sy = -dy1; dy1 = 0; }
694 if ( dx2 >= grd_curcanv->cv_bitmap.bm_w ) { dx2 = grd_curcanv->cv_bitmap.bm_w-1; }
695 if ( dy2 >= grd_curcanv->cv_bitmap.bm_h ) { dy2 = grd_curcanv->cv_bitmap.bm_h-1; }
697 // Draw bitmap bm[x,y] into (dx1,dy1)-(dx2,dy2)
699 if ( (bm->bm_type == BM_LINEAR) && (grd_curcanv->cv_bitmap.bm_type == BM_LINEAR ))
701 if ( bm->bm_flags & BM_FLAG_RLE )
702 gr_bm_ubitblt00m_rle(dx2-dx1+1,dy2-dy1+1, dx1, dy1, sx, sy, bm, &grd_curcanv->cv_bitmap );
704 gr_bm_ubitblt00m(dx2-dx1+1,dy2-dy1+1, dx1, dy1, sx, sy, bm, &grd_curcanv->cv_bitmap );
708 gr_bm_ubitbltm(dx2-dx1+1,dy2-dy1+1, dx1, dy1, sx, sy, bm, &grd_curcanv->cv_bitmap );
712 void gr_bm_ubitbltm(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
718 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_OGL ))
720 ogl_ubitblt(w, h, dx, dy, sx, sy, src, dest);
723 if ( (src->bm_type == BM_OGL) && (dest->bm_type == BM_LINEAR ))
725 ogl_ubitblt_tolinear(w, h, dx, dy, sx, sy, src, dest);
728 if ( (src->bm_type == BM_OGL) && (dest->bm_type == BM_OGL ))
730 ogl_ubitblt_copy(w, h, dx, dy, sx, sy, src, dest);
735 if ( (src->bm_type == BM_LINEAR) && (dest->bm_type == BM_DIRECTX ))
737 Assert ((int)dest->bm_data == BM_D3D_RENDER || (int)dest->bm_data == BM_D3D_DISPLAY);
738 Win32_BlitLinearToDirectX_bm (src, sx, sy, w, h, dx, dy, 1);
741 if ( (src->bm_type == BM_DIRECTX) && (dest->bm_type == BM_DIRECTX ))
743 Assert ((int)src->bm_data == BM_D3D_RENDER || (int)src->bm_data == BM_D3D_DISPLAY);
744 // Win32_BlitDirectXToDirectX (w, h, dx, dy, sx, sy, src->bm_data, dest->bm_data, 0);
750 for (y1=0; y1 < h; y1++ ) {
751 for (x1=0; x1 < w; x1++ ) {
752 if ((c=gr_gpixel(src,sx+x1,sy+y1))!=255)
753 gr_bm_pixel( dest, dx+x1, dy+y1,c );
759 //-NOT-used // From linear to SVGA
760 //-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)
762 //-NOT-used unsigned char * sbits;
764 //-NOT-used unsigned int offset, EndingOffset, VideoLocation;
766 //-NOT-used int sbpr, dbpr, y1, page, BytesToMove;
768 //-NOT-used sbpr = src->bm_rowsize;
770 //-NOT-used dbpr = dest->bm_rowsize << gr_bitblt_dest_step_shift;
772 //-NOT-used VideoLocation = (unsigned int)dest->bm_data + (dest->bm_rowsize * dy) + dx;
774 //-NOT-used sbits = src->bm_data + ( sbpr*sy ) + sx;
776 //-NOT-used for (y1=0; y1 < h; y1++ ) {
778 //-NOT-used page = VideoLocation >> 16;
779 //-NOT-used offset = VideoLocation & 0xFFFF;
781 //-NOT-used gr_vesa_setpage( page );
783 //-NOT-used EndingOffset = offset+w-1;
785 //-NOT-used if ( EndingOffset <= 0xFFFF )
787 //-NOT-used gr_linear_rep_movsd_2x( (void *)sbits, (void *)(offset+gr_video_memory), w );
789 //-NOT-used VideoLocation += dbpr;
790 //-NOT-used sbits += sbpr;
794 //-NOT-used BytesToMove = 0xFFFF-offset+1;
796 //-NOT-used gr_linear_rep_movsd_2x( (void *)sbits, (void *)(offset+gr_video_memory), BytesToMove );
799 //-NOT-used gr_vesa_setpage(page);
801 //-NOT-used gr_linear_rep_movsd_2x( (void *)(sbits+BytesToMove/2), (void *)gr_video_memory, EndingOffset - 0xFFFF );
803 //-NOT-used VideoLocation += dbpr;
804 //-NOT-used sbits += sbpr;
812 //-NOT-used // From Linear to Linear
813 //-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)
815 //-NOT-used unsigned char * dbits;
816 //-NOT-used unsigned char * sbits;
817 //-NOT-used //int src_bm_rowsize_2, dest_bm_rowsize_2;
821 //-NOT-used sbits = src->bm_data + (src->bm_rowsize * sy) + sx;
822 //-NOT-used dbits = dest->bm_data + (dest->bm_rowsize * dy) + dx;
824 //-NOT-used // No interlacing, copy the whole buffer.
825 //-NOT-used for (i=0; i < h; i++ ) {
826 //-NOT-used gr_linear_rep_movsd_2x( sbits, dbits, w );
828 //-NOT-used sbits += src->bm_rowsize;
829 //-NOT-used dbits += dest->bm_rowsize << gr_bitblt_dest_step_shift;
833 void gr_bm_ubitblt00_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
835 unsigned char * dbits;
836 unsigned char * sbits;
840 sbits = &src->bm_data[4 + src->bm_h];
841 for (i=0; i<sy; i++ )
842 sbits += (int)src->bm_data[4+i];
844 dbits = dest->bm_data + (dest->bm_rowsize * dy) + dx;
846 // No interlacing, copy the whole buffer.
847 for (i=0; i < h; i++ ) {
848 gr_rle_expand_scanline( dbits, sbits, sx, sx+w-1 );
849 sbits += (int)src->bm_data[4+i+sy];
850 dbits += dest->bm_rowsize << gr_bitblt_dest_step_shift;
854 void gr_bm_ubitblt00m_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
856 unsigned char * dbits;
857 unsigned char * sbits;
861 sbits = &src->bm_data[4 + src->bm_h];
862 for (i=0; i<sy; i++ )
863 sbits += (int)src->bm_data[4+i];
865 dbits = dest->bm_data + (dest->bm_rowsize * dy) + dx;
867 // No interlacing, copy the whole buffer.
868 for (i=0; i < h; i++ ) {
869 gr_rle_expand_scanline_masked( dbits, sbits, sx, sx+w-1 );
870 sbits += (int)src->bm_data[4+i+sy];
871 dbits += dest->bm_rowsize << gr_bitblt_dest_step_shift;
877 extern void gr_rle_expand_scanline_generic( grs_bitmap * dest, int dx, int dy, ubyte *src,
878 int x1, int x2, int masked );
881 void gr_bm_ubitblt0x_rle(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src,
882 grs_bitmap * dest, int masked )
886 unsigned char * sbits;
888 sbits = &src->bm_data[4 + src->bm_h];
889 for (i=0; i<sy; i++ )
890 sbits += (int)src->bm_data[4+i];
892 for (y1=0; y1 < h; y1++ ) {
893 gr_rle_expand_scanline_generic( dest, dx, dy+y1, sbits, sx, sx+w-1,
895 sbits += (int)src->bm_data[4+y1+sy];
899 // rescalling bitmaps, 10/14/99 Jan Bobrowski jb@wizard.ae.krakow.pl
901 inline void scale_line(byte *in, byte *out, int ilen, int olen)
903 int a = olen/ilen, b = olen%ilen;
905 byte *end = out + olen;
921 void gr_bitmap_scale_to(grs_bitmap *src, grs_bitmap *dst)
923 byte *s = src->bm_data;
924 byte *d = dst->bm_data;
926 int a = dst->bm_h/h, b = dst->bm_h%h;
938 scale_line(s, d, src->bm_w, dst->bm_w);
939 d += dst->bm_rowsize;
941 s += src->bm_rowsize;
945 void show_fullscr(grs_bitmap *bm)
947 grs_bitmap * const scr = &grd_curcanv->cv_bitmap;
950 if(bm->bm_type == BM_LINEAR && scr->bm_type == BM_OGL) {
951 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
955 if(scr->bm_type != BM_LINEAR) {
956 grs_bitmap *tmp = gr_create_bitmap(scr->bm_w, scr->bm_h);
957 gr_bitmap_scale_to(bm, tmp);
958 gr_bitmap(0, 0, tmp);
962 gr_bitmap_scale_to(bm, scr);