/*
 * atlas_sprite_init — инициализировать спрайт лентой idx W0-атласа.
 * Аналог sprite_init, но img/размер КАДРА берутся из каталога атласа
 * (заголовок ленты трогать нельзя — он в невидимой сейчас странице),
 * а page = страница атласа (sprite_update подключит её сам).
 * Кадр (0,0); кадр (i,j) ленты — sprite_frame(s, i*fw, j*fh).
 */
#include <sprinter.h>
#include <sprite.h>
#include "../_bgi.h"

void atlas_sprite_init(sprite_t *s, const atlas_t *a, uint8_t idx)
{
    uint8_t saved = _io_page_w3;
    const uint8_t *e;
    uint16_t img;                        /* W0-адрес шапки ленты */

    sprinter_page_w3(a->page);
    e = (const uint8_t *)(0xC000 + _ATL_DIR_OFF) + (uint16_t)idx * 8;
    img  = (uint16_t)(e[0] | (e[1] << 8));
    s->img = (const void *)img;
    s->w   = e[2];                       /* fw — размер КАДРА */
    s->h   = e[3];                       /* fh                */
    /* stride = полная ширина ЛЕНТЫ из её getimage-шапки (каталог хранит
     * только размер кадра; лента nx>1 шире кадра).  Шапка лежит в
     * странице атласа — читаем через ТЕКУЩИЙ W3-маппинг: адрес в W3 =
     * 0xC000 + W0-адрес. */
    {
        const uint8_t *hdr = (const uint8_t *)(0xC000 + img);
        s->stride = (uint16_t)(hdr[0] | (hdr[1] << 8));
    }
    sprinter_page_w3(saved);

    /* src — W0-адрес пикселей кадра (0,0); разыменовывается блитом
     * только при подключенной странице (sprite_update мапит сам). */
    s->src = (const uint8_t *)img + 4;

    s->x = 0;  s->y = 0;
    s->sx = 0; s->sy = 0;
    s->flags = 0;
    s->page  = a->page;
    s->an_flags = 0;             /* авто-анимации выключены */
    s->an_frame = 0;
    s->layer = 0;                /* нижний слой Y-сортировки */
    s->drawn[0].on = 0;
    s->drawn[1].on = 0;
}
