| 521 | } |
| 522 | #define N_FADE_STAGES 4 |
| 523 | void RenderBmpScanline(tceffect *tce, float frametime, int xoff, int yoff, bool ok_to_render) { |
| 524 | ASSERT(tce->type == EFX_BMP_SCANLINE); |
| 525 | if (!ok_to_render) { |
| 526 | if (tce->flags == TC_BMPF_OUT && (!(tce->flags & TC_NOEARLYRENDER))) { |
| 527 | UploadChunk(&tce->bmpinfo.chunk_bmp); |
| 528 | BltBmpToScreen(tce->pos_x + glitch_dx + xoff, tce->pos_y + glitch_dy + yoff, &tce->bmpinfo.chunk_bmp); |
| 529 | } |
| 530 | return; |
| 531 | } |
| 532 | |
| 533 | bool changed = true; |
| 534 | bool done; |
| 535 | int x, y; |
| 536 | int sbm_handle = tce->bmpinfo.bm_handle; |
| 537 | int dbm_handle = tce->bmpinfo.temp_bmhandle; |
| 538 | uint16_t *src, *dest; |
| 539 | int rowsize, w, h, xx, yy, stage; |
| 540 | float k; |
| 541 | if (dbm_handle == BAD_BITMAP_HANDLE) |
| 542 | goto done_scanline; |
| 543 | bm_ClearBitmap(dbm_handle); |
| 544 | |
| 545 | x = 0; |
| 546 | y = 0; |
| 547 | done = false; |
| 548 | |
| 549 | k = tce->age / tce->speed; |
| 550 | |
| 551 | if (k > 1.2) |
| 552 | goto done_scanline; |
| 553 | if (k > 1.0) { |
| 554 | k = 1.0; |
| 555 | done = 1; |
| 556 | } |
| 557 | if (tce->flags == TC_BMPF_OUT) { |
| 558 | k = 1.0 - k; |
| 559 | } |
| 560 | src = bm_data(sbm_handle, 0); |
| 561 | dest = bm_data(dbm_handle, 0); |
| 562 | rowsize = bm_w(sbm_handle, 0); |
| 563 | w = bm_w(sbm_handle, 0); |
| 564 | h = bm_h(sbm_handle, 0); |
| 565 | for (yy = stage = 0; yy < h; yy++) { |
| 566 | int span_width; |
| 567 | span_width = w * ((k - ((float)stage / N_FADE_STAGES)) * N_FADE_STAGES); |
| 568 | if (span_width < 0) |
| 569 | span_width = 0; |
| 570 | if (span_width > w) |
| 571 | span_width = w; |
| 572 | for (xx = 0; xx < span_width; xx++) |
| 573 | if (dest && src) |
| 574 | *dest++ = *src++; |
| 575 | |
| 576 | dest += (rowsize - xx); |
| 577 | src += (w - span_width); |
| 578 | switch (stage) { |
| 579 | case 0: |
| 580 | stage = 2; |
no test coverage detected