int y1 = max ( 0, y - orgY );
int y2 = min ( screenHeight, y - orgY + height);
char far * videoPtr = videoAddr + y1 * screenWidth + x1;
char * ptr = underlmage;
int step = screenWidth - (x2 - x1);
for (register int y ~ yt; y < y2; y++, videoPtr += step ) for (register int x = x1; x < x2; x++ ) * ptr ++ = * videoPtr ++;
}
void Sprite :: restoreUnder () {
4. Работа с основными графическими устройствами
int x1 = max ( 0, x - orgX );
int x2 = min ( screen Width, x - orgX + width );
int y1 = max ( 0, у - orgY );
int y2 = min ( screenHeight, у - orgY + height);
char far * videoPtr = videoAddr + y1 * screenWidth + x1;
char * ptr = underlmage;
int step = screenWidth - (x2 - x1);
for ( register int у = у 1; у < y2; у++, videoPtr += step ) for (register int x = x1; x < x2; x++ ), * videoPtr ++ = * ptr ++;
}
Для ускорения вывода спрайта можно воспользоваться механизмом RLE-кодйрования (RLE-Run Length Encoding) строки, разбивающим изображение на прозрачные и непрозрачные участки. Каждый такой участок начинается с байта, задающего длину участка, при этом старший бит этого байта определяет, является ли этот участок набором прозрачных пикселов (бит установлен) или набором выводимых пикселов (бит сброшен), а в младших 7 битах хранится длина участка (количество пикселов). Для участков, состоящих из непрозрачных пикселов, за байтом длины следует соответствующее количество байт данных. Подобная организация данных позволяет избежать проверки на прозрачность при выводе каждого пиксела и выводить пикселы сразу целыми группами. Так, последовательность из 12 пикселов
0,0, 0, 0, 0,1,1,5,1,0, 0,7
будет закодирована следующим набором байтов:
0x85, 0x04, 0x01, 0x01, 0x05, 0x01, 0x82, 0x01, 0x07.
Однако поскольку теперь количество байт, задающих строку, не является больше постоянной величиной, то для каждой фазы спрайта (соответствующего изображения) необходимо задать начало каждой строки относительно начала изображения. Соответствующая программная реализация приводится ниже.