Блог → Секрети Turbo Pascal: текст в графічному режимі. Частина 1
У цій статті я коротко ознайомлю вас з особливостями програмування текстових інтерфейсів в графічних режимах EGA / VGA, застосовуваних у програмах на мові Turbo Pascal 6.0. Тим, хто знайомий з Турбо-Паскалем, буде значно простіше зрозуміти код, наведений в рамках цієї замітки, але і для володіють іншими мовами програмування, прочитання статті може бути цікавим і пізнавальним. Отож, не будемо затягувати вступ, а відразу приступимо до суті питання.
Я не буду торкатися стандартних текстових процедур з модуля GRAPH.TPU, їх докладний опис всі бажаючі можуть знайти в спеціальній літературі. Зазначу лише, що поява наведених в цьому розділі процедур викликано прозової проблемою, яка виникає при багаторазовому виведення різних текстових повідомлень стандартними процедурами OutTextXY і OutText, в одну до ту ж позицію на екрані. Кому не доводилося щоб уникнути накладення одного рядка на іншу перед кожним черговим висновком тексту очищати екран від попередніх повідомлень. Все б нічого, але коли це робиться часто, наприклад при висвітленні поточних координат курсора миші, то незмінно виникає ефект мерехтіння. Причина його появи полягає в тому, що процедури OutTextXY і OutText малюють тільки пікселі самого символу, залишаючи незмінними пікселі фону в матриці символу. Найкращий вихід з таких ситуацій - зміна при виведенні тексту на екран поряд з пікселями, складовими сам символ, і пікселів фону в матриці символу. У цьому розділі я розповім, як це можна зробити.
Символ на екрані складається з розташованих в певному порядку пікселів в межах прямокутної матриці символу. Він малюється через підрядник починаючи з верхнього рядка; його висота визначається кількістю рядків в матриці, а ширина дорівнює, як правило, 8 пикселам або 1 байту (наведені процедури розраховані саме на цю ширину). Графічні образи символів містяться в так званій таблиці опису символів (ТОС). Кожен байт таблиці є бітовим шаблоном рядки символу, тому кожен символ в ТОС представлений кількістю байтів, рівним висоті символу. Розташовуються символи в таблиці послідовно, відповідно до їх кодом ASCII, звідси легко обчислити зміщення символу щодо початку ТОС (висота множиться на код символу).
Кожен встановлений біт в бітовому шаблоні вказує на наявність пікселя зображення (тобто пікселя, що входить в сам символ) у відповідному рядку матриці символу (див. Малюнок - заповнену, відповідно до вмісту ТОС, матрицю символу розмірами 8x8 пікселів).
Unit GrafText;
interface
uses Dos, VC_Graph;
Type GrfFnt = array [l..l] of byte;
Var TextForeColor, TextBackColor, TextLogGlb. byte;
SegFontTabдe, OfsFontTable. word;
CharRow. byte;
FontLoaded. boolean;
FointsBIOS. byte absolute $ 40: $ 85;
GrafFont. ^ GrfFnt;
Const ROMFont8x8 - 1;
ROMFontl4x8 - 2;
ROMFontl6x8 - 3;
Russian8x8 - 4;
FileFont - 5;
RussianFont: array [1..8 * 256] of byte
VSetFonlType (2, '');
VSetTextColor (15,9,0);
VOutTextXY (l () 4,25,
'Procedure VSetTextColor (ForeColor, BackColor, TextLog);');
For I: = 0 to 15 do
begin
VSetTextColor (1,15-I, 0);
VOutTextXY (104,80 + I * 15,
'Procedure VSetTextColor (ForeColor, BackColor, TextLog);');
Readln;
ClearViewPort;
VSetTextColor (15,9,0);
VOutTextXY (104,25,
'Procedure VOutCharXY (CharCode, X, Y, ForeColor, BackColor');
For I: = 0 to 15 do
For J: = 0 to 15 do
begin
Можна розширити можливості наведених процедур, наприклад переписати їх для виведення символів змінної ширини або зробити так, щоб у міру читання бітових образів з ТОС, вони зсувалися вправо на певну кількість пікселів, для генерування жирного або курсиву символів. Будь-яка з цих можливостей підвищить ефективність і гнучкість Вашого програмного знакогенератора, однак ускладнить вихідний код, і в кінцевому рахунку, сповільнить його.