/*
 * gfx_blit_cols_part_noclip — блит спрайта column-major БЕЗ клипа по экрану,
 * с обрезкой сверху (как gfx_blit_cols_part).  Пара к gfx_blit_cols_part
 * ровно так же, как gfx_blit_part_noclip — к gfx_blit_part.
 *
 * Зачем: у персонажей PoP спрайт почти всегда целиком на экране, а общий
 * gfx_blit_cols_part платит за проверку четырёх границ, пересчёт w/h/cx/sy и
 * 16-битную арифметику независимо от того, вылезает край или нет — замер в
 * MAME (roomtest, страж + клинок): 5 622 такта подготовки против 13 596 на
 * сам accel-проход.  Здесь та же колонка уходит в _bgi_blit_cols_raw без
 * подготовки.
 *
 * Требования (проверяет ВЫЗЫВАЮЩИЙ, кода проверок здесь нет):
 *   - прямоугольник назначения целиком на экране;
 *   - ширина и высота кадра <= 255, y <= 255;
 *   - skip < высоты кадра.
 * Не выполняется — зовите gfx_blit_cols_part.
 *
 * Флип, как и в gfx_blit_cols_part, бесплатный: подаём src с последней
 * колонки и отрицательный страйд — accel сам кладёт её в левый x.
 *
 * W3-скобка ставится ЗДЕСЬ (код libbgi живёт в W1): из приложения,
 * собранного с --w3, её вызывать нельзя — после _bgi_begin окно W3 занято
 * видеобанком и код вызывающего исчезает из адресного пространства.
 */
#include <stdint.h>
#include "../_bgi.h"

void gfx_blit_cols_part_noclip(int x, int y, const void *img, uint8_t flip,
                               uint8_t skip, uint8_t rows)
{
    const uint8_t *p = (const uint8_t *)img;
    uint8_t w = p[0];                        /* ширина кадра (< 256)  */
    uint8_t fh = p[2];                       /* высота кадра (< 256)  */
    const uint8_t *src = p + 4;
    uint8_t h;

    if (w == 0 || fh == 0 || skip >= fh) return;
    h = (uint8_t)(fh - skip);
    if (rows && rows < h) h = rows;

    if (flip) src += (uint16_t)(w - 1) * fh;  /* последняя колонка -> левый x */
    src += skip;

    _bgi_begin();
    _bgi_blit_cols_raw(src, (uint8_t *)(_gfx_addr_base + (uint16_t)x),
                       w, h, flip ? -(int)fh : (int)fh, (uint8_t)y);
    _bgi_end();
}
