Слово про використання модуля Graph у Linux

Ті, хто вивчає Pascal по книгах з описом TurboPascal, дійшовши до прикладів роботи з графікою і спробувавши перенести їх в Linux, зазвичай стикаються з проблемою, коли ці програми відмовляються компілюватися, видаючи якісь безглузді сполучення, на кшталт цього:

Скажу одразу - це лінковник (тобто програма, яка збирає після компіляції всі модулі в єдине ціле і налаштовує на самому початку правильний заголовок-запускник) скаржиться на відсутність графічної бібліотеки."Cannot find"- "Не можу знайти", далі"-l"- це опція підключення зовнішньої бібліотеки, після чого йде назва самої бібліотеки. А самі програми, при компіляції їх у Windows, компілюються без проблем. Чому? Тут без історичного екскурсу не обійтись.

Подорож у далеке минуле

Коли створювалася операційна система Unix, на нащадку якої ми з вами зараз працюємо, комп'ютери були надзвичайно малохольними і непритомніли від найменшого навантаження. На першому комп'ютері, його звали "Еніак", навіть не було клавіатури для введення даних та монітора для перегляду результатів обчислень. Дані в нього вводили за допомогою перемикачів (або 0, або 1), а результати зчитували з ряду лампочок (якщо лампочка горить – це 1, якщо не горить – це 0). Сумною і важкою була робота з таким комп'ютером. Я це знаю собою, т.к. у мене в дитинстві була обчислювальна машина, на кшталт "Еніак" - звалася вона ДВМ-2 і програмувалася дротяними перемичками, а відповідь виводила на чотири різнокольорові лампочки.

Коли даних небагато, такі убогі засоби введення-виведення ще можна було пережити, але якщо даних дуже багато? Тоді вводити дані зручно тими символами, до яких звикла людина, добре, що зразок вже був - друкарська машинка. За її зразком та подобою зробиликлавіатури.

А ось як виводити? Знову ж таки, дивлячись на друкарську машинку, весь висновок спочатку роздруковували на папері. Ось тільки не завжди програми були одразу правильними, тому тонни паперу йшли у сміття. Розумні голови досить швидко звернули увагу на телевізор - а що якщо все сміття спочатку друкуватиме на телеекрані і лише правильні відповіді видавати на папір? Сказано – зроблено, припаяли до комп'ютера телевізор. Усі радіють, що вдалося зберегти ліси від неправильних обчислень.

Звісно, ​​негайно почали думати, а як на комп'ютері показувати картинки? І відразу зрозуміли, чим комп'ютер відрізняється від телевізійної студії. Телестудія передає в ефір вже готову картинку, а комп'ютер повинен її спочатку сконструювати всередині себе і потім вже показувати. А ні пам'яті, ні швидкодії цього бракує. Якщо з генерацією літер та цифр комп'ютер справлявся більш-менш успішно, то з картинками, які треба вимальовувати за точками, вже немає. Тому дуже довго комп'ютери зображали лише текст, чи псевдографіку, використовуючи їй відповідні символи.

Становлення та розвиток Unix довелося саме на цей період, тому основний наголос у ній робився на відображення та передачу тексту. Але все змінюється, зокрема потужність процесорів та обсяг оперативної пам'яті. І ось з'явилася можливість генерації більш-менш нормальної графіки. Багато вчених-комп'ютерників стали думати, як це робити в вже готовій ОС. Звісно придумали. І вийшло так, що кожен колектив пропонував щось своє. Тому в Unix, на відміну від Windows, немає якоїсь однієї стандартної графіки бібліотеки. Їх багато. Як то кажуть - вибирай на будь-який смак.

Починаємо графітуватися.

І ось одного разу я запитав - яким чином можна малювати в Linux? Знайшов, що модульGraphє. Це мене надихнуло і я негайно спробував скомпілювати найпростіший додаток із малюванням ліній, кружечків тощо. І одержав повідомлення, яке привів на початку. Порився у вихідникахFreePascalі побачив, що графічних модулів, виявляється, багато, мабуть за кількістю графічних бібліотек. Модулей виявилося аж чотири (мова йде тільки про сумісні з TurboPascal 'євськимGraph):

  • Graph,
  • ggiGraph,
  • ptcGraph,
  • sdlGraph.

Подивившись вихідники цих модулів я зрозумів, що всі вони призначені для суміщення стандартних графічних процедур і функцій, які були в TurboPascal 'євському модуліGraph, з тими функціями, які присутні безпосередньо в графічних бібліотеках . На жаль, безпосередньо модульGraphдля книжкових прикладів із графікою в сучасних операційних системах абсолютно не годиться. Причин цьому кілька:

  • Графічна бібліотекаsvgalib, яка потрібна для роботи модуляGraph, вже давно застаріла і не розвивається більше десяти років, тому ця бібліотека за умовчанням не встановлюється.
  • Найголовніша проблема (якщо ви, все ж таки, встановили цю бібліотеку вручну) полягає в тому, що для своєї роботи ця бібліотека вимагає правroot'а і від звичайного користувача, під яким всі зазвичай працюють уLinux, не буде працювати. Цікаво, чому? Виявляється, для своєї роботи вона потребує виділення окремої консолі. Звичайно, звичайний користувач цього зробити не може.
  • Отже, модульGraphми відкидаємо і спробуємо знайти його працюючий і легкий у використанні аналог. Як я написав вище, таких аналогів аж три, у кожного з яких своя власна графічна бібліотека. Не будуописувати процес випробувань. Зрештою, найбезпроблемнішим у використанні виявився модульptcGraph.

    Що потрібно зробити для роботи ptcGraph?

    Для цього модуль вимагає дві бібліотеки:

    • Xxf86vm(файлlibXxf86vm.so).
    • Xxf86dga(файлlibXxf86dga.so).

    У мене (ОСRuntu 10.04) обидві виявилися вже встановленими, проте містили у своїй назві ще всякі цифри (мабуть, версії бібліотеки). Якщо у вас їх немає, то встановіть із репозиторію вашої операційної системи. Далі потрібно зробити симлінки з правильною назвою:

    Ці дії слід проводити з правами root.

    Різні дрібниці, без яких ніяк не обійтися

    Найперша дрібниця стосується ініціалізації графічного режиму за допомогою процедуриInitGraph(Driver, Mode, . ). ДрайверDriverу всіх книжках поTurboPascalрекомендують призначати за допомогою макросуDETECT, заразом і автоматично призначається графічний режим - роздільна здатність і кольоровість:

    Однак не все так сумно. Процедура: дає нам більш правильні дані про драйвер та графічний режим. Графічний режим можна включати так:

    Виходить досить симпатичне віконце на всю висоту екрану. Однак було б цікаво дізнатися, яка роздільна здатність і скільки кольорів має цей отриманий за умовчанням графічний режим. Напишемо для цього невелику програму:

    Ось що показує програма:

    слово

    Ось що показує програма:

    використання

    У першому стовпці новер драйвера, у другому – номер графічного режиму, у третьому – роздільна здатність, у четвертому – кількість кольорів. Як бачите, крім старих номерів графічного режиму, які були ще вTurboPascalі які мають номер менше 10,є ще група режимів, номер яких більше 100 і які, судячи з роздільної здатності та кольоровості, більше підходять для сучасних програм. Це так званіVESA-режими.

    Загалом, бабу на цій справі нарубали просто неміряно.

    Поговоримо про квіти.

    Виходить така штука:

    слово

    Не сказав би, що залежність кольору від його номера вийшла інтуїтивно зрозумілою, але це один із недоліків старої "досівської" графіки - використовується не повний діапазон RGB-значень (R- червоний,G- зелений,B- синій), лише усічений варіант, тобто. те, що влізло у 16 ​​біт. Тим не менш, це хороша ілюстрація кольорогенерації.

    Напевно ви помітили, що у представленій палітрі відсутні деякі кольори. Це можна поправити призначенням певному номеру кольору того кольору, який вам подобається: тут:

    • NumColor- номер кольору, починаючи від 0 і закінчуючи максимальним, для вибраного вами режиму,
    • Red, Green, Blue- відповідно, червона, зелена та синя складова кольору. Значення від 0 до 255.

    Теж дрібниці, але вже неприємні

    Ви, напевно, вже встигли помітити, що для відображення картинок створюється друге, графічне вікно. Якщо по ходу програми вам потрібно лише показати малюнок або яку-небудь анімацію, то це було б і нічого, але ось як тільки ви захочете інтерактивно покерувати вашим малюнком, то відразу з'ясовується велика проблема - малюнок відображається в одному вікні, а програма чекає ваші натискання клавіші в іншому, що залишилося позаду. Незручно.

    Як це виправити? Для цього є модульptcCrt, який перенаправляє натискання кнопок у графічне вікно. Таким чином, якщо у своїй програмі з графікою ви використовуєте керування клавішами, то врядокUsesпотрібно увімкнути модульptcCrt.

    Зображаємо мистецтва на екрані. Програма, яка не особливо корисна, але щось малює.

    Ось такий у мене вийшов космічний корабель прибульців:

    модуля

    Post Scriptum

    Цей спосіб малювання не придатний для повсякденного використання, тим більше, якщо ви збираєтеся писати корисні для інших людей програми. Він годиться тільки для тих випадків, коли ви захочете перевірити в роботі будь-які програми з книг по TurboPascal. Графічні оболонки операційних систем надають власні засоби малювання графічних примітивів, як точок, ліній, прямокутників, еліпсів і т.п. Плюс, до цього, пропонуються зручніші функції роботи з кольором, засновані на стандарті RGB. Професійні графічні бібліотеки, такі як OpenGL, пропонують ще більш круті засоби роботи з графікою і теж на основі тієї графіки, яка вже є в графічній оболонці вашої ОС. Найбільш легкий спосіб використовувати графіку - перейти до використанняLazarus.