В рассматриваемом режиме регистр BitMask позволяет защищать от изменения определенные пикселы. В тех позициях, где соответствующий бит из регистра BitMask равен нулю, пиксел не изменяет своего значения. Регистр MapMask позволяет защищать от изменения определенные плоскости.
Биты 3 и 4 регистра DataRotate определяют способ наложения выводимого изображения на существующее (аналогично функции setwritemode).
Значение битов |
Операция |
Эквивалент в BGI |
0 0 |
Замена |
COPY PUT |
0 1 | Or | OR PUT |
1 0 | And | AND PUT |
1 1 | Xor | XORJPUT |
Процедура setWriteMode устанавливает соответствующий режим наложения. Посланный процессором байт циклически сдвигается вправо на указанное в битах 0-2 регистра Data Rotate количество раз.
Компьютерная графика. Полигональные модели Результирующее значение определяется следующим образом. На плоскость, соответствующий бит которой в регистре Enable Set/Reset равен нулю, накладывается посланный процессором байт, "прокрученный" заданное количество раз, с учетом регистров BitMask и MapMask. Если соответствующий бит равен единице, то во все позиции, разрешенные регистром BitMask, записывается бит из регистра Set/Reset, соответствующий плоскости.
На практике наиболее часто встречаются следующие два случая:
Enable Set/Reset = 0 (байт, посланный процессором, циклически сдвигается в соответствии со значением битов 0-2 регистра Data Rotate; после этого получившийся байт заданным способом (см. биты 3-4 регистра Data Rotate) накладывается на те плоскости, которые разрешены регистром Map Mask, причем изменяются лишь разрешенные регистром BitMask биты);
Enable Set/Reset = OF (в позиции, разрешенные регистром BitMask, ставятся точки цвета, заданного в регистре Set/Reset; байт, посланный процессором, никакой роли не играет).
Для того чтобы нарисовать только нужный пиксел, необходимо поставить регистр BitMask так, чтобы защитить от изменения остальные 7 пикселов, соответствующих этому байту.
S // File WritePxl.cpp
void writePixel (int x, int у, int color) {
char far * vptr = (char far *) MK_FP (OxAOOO, y*80+(x»3));