/*
 * gfx_blit_part_noclip — блит ПОД-ПРЯМОУГОЛЬНИКА картинки getimage-формата
 * БЕЗ клипа по экрану, в ТЕКУЩЕМ банке (gfx_set_bank).  Пара к
 * gfx_blit_noclip ровно так же, как gfx_blit_part — к gfx_blit.
 *
 * Зачем: тайловому движку часто нужно положить поверх спрайта не весь
 * тайл, а только ту его часть, что перекрывает спрайт.  Через
 * gfx_blit_part это идёт общим ядром _gfx_blit_full (16-битная
 * арифметика, клип, нарезка полос) — ~13 К тактов накладных на вызов
 * независимо от размера; здесь тот же под-прямоугольник рисуется линейным
 * спрайтовым ядром (~4.6 К на 32×3).  Замер PoP roomtest 2026-07-29:
 * fore-слой поверх персонажа рисовал 9 целых тайлов за 432 К тактов
 * (стена = блок 64×63); с обрезкой по прямоугольнику спрайта тех же
 * пикселей остаётся втрое меньше.
 *
 * Требования (проверяет ВЫЗЫВАЮЩИЙ, кода проверок здесь нет):
 *   - под-прямоугольник (sx,sy,w,h) лежит внутри картинки;
 *   - прямоугольник назначения целиком на экране;
 *   - w,h <= 255, y <= 255.
 * Не выполняется — зовите gfx_blit_part.
 *
 * W3-скобка ставится ЗДЕСЬ (код libbgi живёт в W1): из приложения,
 * собранного с --w3, её вызывать нельзя — после _bgi_begin окно W3 занято
 * видеобанком и код вызывающего исчезает из адресного пространства.
 */
#include "../_bgi.h"

void gfx_blit_part_noclip(int x, int y, const void *img,
                          uint8_t sx, uint8_t sy, uint8_t w, uint8_t h)
{
    const uint8_t *p = (const uint8_t *)img;
    uint16_t stride = (uint16_t)(p[0] | (p[1] << 8));
    const uint8_t *src = p + 4 + (uint16_t)sy * stride + sx;

    _bgi_begin();
    _gfx_blit_sprite_noclip(x, y, src, stride, w, h);
    _bgi_end();
}
