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