void scale_bitmap_asm(grs_bitmap *source_bmp, grs_bitmap *dest_bmp, int x0, int y0, int x1, int y1, fix u0, fix v0, fix u1, fix v1 ) { fix du, dv, v; int y; du = (u1-u0) / (x1-x0); dv = (v1-v0) / (y1-y0); v = v0; for (y=y0; y<=y1; y++ ) { scale_row_asm_transparent( &source_bmp->bm_data[source_bmp->bm_rowsize*f2i(v)], &dest_bmp->bm_data[dest_bmp->bm_rowsize*y+x0], x1-x0+1, u0, du ); v += dv; } }
void scale_bitmap_asm_rle(grs_bitmap *source_bmp, grs_bitmap *dest_bmp, int x0, int y0, int x1, int y1, fix u0, fix v0, fix u1, fix v1 ) { fix du, dv, v; int y, last_row=-1; du = (u1-u0) / (x1-x0); dv = (v1-v0) / (y1-y0); v = v0; for (y=y0; y<=y1; y++ ) { if ( f2i(v) != last_row ) { last_row = f2i(v); decode_row( source_bmp, last_row ); } scale_row_asm_transparent( scale_rle_data, &dest_bmp->bm_data[dest_bmp->bm_rowsize*y+x0], x1-x0+1, u0, du ); v += dv; } }
void scale_bitmap_c_rle(grs_bitmap *source_bmp, grs_bitmap *dest_bmp, int x0, int y0, int x1, int y1, fix u0, fix v0, fix u1, fix v1, int orientation ) { fix du, dv, v; int y, last_row=-1; // Rotation doesn't work because explosions are not square! // -- if (orientation & 4) { // -- int t; // -- t = u0; u0 = v0; v0 = t; // -- t = u1; u1 = v1; v1 = t; // -- } du = (u1-u0) / (x1-x0); dv = (v1-v0) / (y1-y0); if (orientation & 1) { u0 = u1; du = -du; } if (orientation & 2) { v0 = v1; dv = -dv; if (dv < 0) v0--; } v = v0; if (v<0) { //was: Assert(v >= 0); //Int3(); //this should be checked in higher-level routine return; } for (y=y0; y<=y1; y++ ) { if ( f2i(v) != last_row ) { last_row = f2i(v); decode_row( source_bmp, last_row ); } scale_row_asm_transparent( scale_rle_data, &dest_bmp->bm_texBuf[dest_bmp->bm_props.rowsize*y+x0], x1-x0+1, u0, du ); v += dv; } }