|
При
соблюдении определенных требований такой подход позволяет в
восемь раз сжать графический образ по отношению к исходному.
Прежде чем использовать эти возможности, следует оценить
последствия ограничений, распространяемых не только на число
возможных шаблонов, но и на число воспроизводимых цветов в
режиме среднего разрешения. Число таких цветов не может
превышать двух. Обычный режим цветной графики позволяет
использовать полную 4-х цветную палитру, в то время как при
использовании возможностей построения изображений на основе
синтеза символов количество цветов в палитре уменьшается до
двух.
В тех случаях, когда таблица рисунков символов,
формируемая пользователем, не применяется для построения
изображений в графическом режиме, можно использовать
специальные символы из расширенного набора. Это может найти
применение при имитации символов текстового режима, при
построении специальных шаблонов или алфавитов. Так, это
наиболее простой и эффективный способ генерации других
национальных алфавитов - греческого, славянского (кириллица),
японского (кана). Символика арабского языка и иврита также
вполне представима, однако, здесь возникают другие сложности
- сложности, связанные с особенностями письма
(справа-налево).
Приложение 9.1. Текст программы генерации изображений
(Паскаль).
module listing_9_1;
type
word_bits_type = set of 0..15;
high_res_pixel_type = (off,on);
medium_res_pixel_type =(color_0,color_1,color_2,color_3;
graphics_screen_type=
record
even_pixel : array [0..99,0..39] of word_bits_type;
filler : array [1..192] of byte;
odd_pixel : array [0..99,0..39] of word_bits_type;
end;
var [static]
graphics_screen_pointer : ads of graphics_screen_type;
general_screen_pointer : adsmem;
row,column : integer;
value
graphics_screen_pointer.s := #B800;
graphics_screen_pointer.r := 0;
general_screen_pointer.s :=#B800;
general_screen_pointer.r :=0;
{===================================================================}
ТЕКСТ РАЗОБРАТЬ НЕЛЬЗЯ
graphics_screen_pointer ^ .odd_pixel [(row-1) div 2,column div 16]
else
work_byte :=
graphics_screen_pointer ^ .even_pixel [row div 2, column div 16];
work_value := column mod 16;
if color = on then
work_byte := work_byte + [work_value]
else
work_byte := work_byte - [work_value];
if odd (row) then
graphics_screen_pointer ^ .odd_pixel [(row-1) div 2, column div 16]
:= work_byte
else
graphics_screen_pointer ^ .even_pixel[row div 2, column div 16]
:= work_byte;
end;
{===========================================================}
procedure set_medium_res_pixel (color : medium_res_pixel_type);
var [static]
work_byte : word_bits_type;
work_set0 : set of 0..15;
work_set1 : set of 0..15;
begin
if odd (row) then
work_byte :=
graphics_screen_pointer ^ .odd_pixel [(row-1) div 2, column div 8];
else
work_byte :=
graphics_screen_pointer ^ .even_pixel [row div 2, column div 8];
work_set0 := [(column mod 8) * 2];
work_set1 := [(column mod 8) * 2 + 1];
if color in [color_2,color_3] then
work_byte := work_byte + work_set0
else
work_byte := work_byte - work_set0;
if color in [color_1,color_3] then
work_byte := work_byte + work_set1
else
work_byte := work_byte - work_set1;
if odd (row) then
graphics_screen_pointer ^ .odd_pixel [(row-1) div 2, column div 8]
:=work_byte
else
graphics_screen_pointer ^ .even_pixel [row div 2, column div 8]
:= work_byte;
end;
{===========================================================}
procedure clear_screen_graphics;
var [static]
i : word;
begin
for i := 0 to 16383 do
general_screen_pointer ^ [i] := 0;
end;
{===========================================================}
end.
ГЛАВА 10.
|