/*
 * sprite_init — инициализировать спрайт: img + размер кадра из заголовка
 * getimage (uint16 w, uint16 h).  Спрайт невидим (flags = 0) и нигде не
 * нарисован (drawn[*].on = 0) — первый sprite_show + sprite_update его
 * выведет.  Для атласа после init перезадать s->w/s->h (размер кадра) и
 * перейти на кадр через sprite_frame.  См. docs/sprite-api-design.md §9.1.
 *
 * Заполняет кэш блита: stride (полная ширина img = шаг строки источника)
 * и src (адрес пикселей кадра (0,0) = img+4) — дальше их ведут
 * sprite_frame и тикер анимации, блит берёт готовыми.
 */
#include "../_bgi.h"
#include <sprite.h>

void sprite_init(sprite_t *s, const void *img)
{
    const uint8_t *p = (const uint8_t *)img;

    s->img = img;
    s->stride = (uint16_t)(p[0] | (p[1] << 8));  /* ширина img/ленты */
    s->src = p + 4;                              /* кадр (0,0)       */
    s->x = 0;
    s->y = 0;
    s->sx = 0;
    s->sy = 0;
    /* Размер кадра ≤ 255 (см. sprite.h) → младший байт uint16-заголовка;
     * старший байт для спрайта-кадра всегда 0. */
    s->w = p[0];
    s->h = p[2];
    s->flags = 0;
    s->page = 0;                 /* img в обычной памяти (не W0-атлас) */
    s->an_flags = 0;             /* авто-анимации выключены            */
    s->an_frame = 0;
    s->layer = 0;                /* нижний слой Y-сортировки           */
    s->drawn[0].on = 0;
    s->drawn[1].on = 0;
}
