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