/* * 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(); }