Формати даних

Сучасні принтери здатні працювати в будь-якому режимі — графічному або текстовому. Після включення живлення й апаратного або програмного скидання принтер готовий до одержання текстових даних і команд. Принтери, як правило, працюють у розширеній (8-бітної) таблиці ASCII-кодів. Перші 32 коду (O-lFh) використовуються для керуючих символів, безпосередньо не відображуваних принтером. Далі випливають коди спеціальних символів, цифр, прописних (uppercase — верхній регістр) і рядкових (lowercase — нижній регістр) букв латинського алфавіту. Коди 80-FFh потрібні для знаків національних алфавітів (зокрема, росіянина) і символів псевдографіки. З керуючих кодів, використовуваних при печатці в символьному режимі, особливо відзначимо коди повернення каретки (CR, ODh), перекладу рядка (LF, OAh) і формату (FF, ОСЬ). Якщо принтерові заданий режим AutoLF, то по коду повернення каретки принтер буде автоматично виконувати і переклад рядка. Цей режим може бути заданий конфигурированием принтера, а також спеціальним сигналом інтерфейсу Centronics. Файли для печатки наприкінці кожного рядка, як правило, містять пари кодів — CR і LF (послідовність байтів 0D, ОА), і при їхній роздруківці в режимі AutoLF будуть пропускатися порожні рядки. Звичайно режим AutoLF не використовують. По трактуванню керуючих кодів серед матричних принтерів поширені дві основні системи команд: IBM (для принтера IBM Pro-Printer) і Epson. Практично всі команди зміни режимів печатки (переключення шрифтів, зміна розміру, ефекти печатки і т.п.), а також переключення в графічний режим, починаються з коду Escape (Esc, lBh). Далі випливає один або більш байтів коду команди; формат послідовності визначається першим байтом (командою), що випливає за кодом Esc. Уся ця конструкція називається Escape-послідовністю.

Для графічної печатки існує безліч мов зі своїми системами команд.

У матричних принтерах використовувалися два режими печатки — бітовий образ і растровий режим, досить докладно описані в [7]. Бітовий образ був цілком природним для перших 8-9-голчастих принтерів. У цьому режимі блок графічних даних несе байти, що відповідають за печатку одного стовпчика всіх голок голівки принтера. Для 9-голчастих принтерів було зручно друкувати стовпчика з 8 крапок (щоб стовпчик умістився в байт), молодшому бітові байта відповідала верхня голка. Байти задавали сусідні стовпчики, ліворуч праворуч. Escape-послідовність графічного елемента рядка складається з команди печатки, коду режиму (дозволу), числа стовпчиків у рядку (2 байти), за яких випливає необхідне число байтів даних для кожного стовпчика. Графічний принтер інтерпретує цю послідовність як блок графічних даних, а наступні байти — як нову команду або символ тексту. Для 24-голчастих принтерів кожен стовпчик задають три байти графічних даних. Рядок буде надрукована після подачі символів CR, LF. У рядку може бути кілька графічних блоків, розташованих друг за другом, і вони навіть можуть чергуватися (або сполучатися) з текстовими символами, але використовувати цю можливість програмно незручно. Для графічної печатки потрібно окремо програмувати і вертикальний крок переміщення папера (межстрочное відстань). Керуючи кроком і графічним режимом, можна вибирати необхідний дозвіл по вертикалі і горизонталі. Бітовий образ придатний тільки для чорно-білої печатки; він незручний тим, що формат блоку даних залежить від числа голок принтера (бувають і 24-, і 48-голчасті принтери).

У растровому режимі чорно-білої печатки кожен байт графічних даних несе інформацію про горизонтальну групу з восьми крапок лінії; старший біт відповідає лівій крапці, що випливають друг за другом байти відображаються ліворуч праворуч. Після байтів, що описують одну лінію, випливають байти наступної лінії (зверху вниз), і так до кінця сторінки (аналогічно образові екрана в графічному режимі). Формат кольорової печатки трохи складніше, але загальна ідея зберігається. Растровий режим природний для лазерних принтерів — він відповідає способові формування зображення на барабані. Цей режим підтримують і багато сучасних струминних принтерів. Логічно цей формат зручніше, оскільки він не залежить від числа сопів; правда, вимагає досить великої буферної пам'яті принтера, але на сучасному етапі розвитку техніки це вже не проблема. Растровий режим дозволяє представити будь-як зображення. Однак тут (як і у випадку бітового образа) обсяг переданих даних росте пропорційно добуткові вертикального і горизонтального дозволів (dpi) на розміри зображення (у дюймах) і число битов на пиксел для кольорової печатки.

Для лазерних принтерів фірма Hewlett-Packard розробила спеціальну мову PCL (Printer Control Language), у якому крім керуючих команд, аналогічних Escape-послідовностям матричних принтерів, маються і графічні, що описують малювання геометричних примітивів. У мові маються і засобу роботи з убудованими шрифтами принтера, що забезпечують масштабирование і повороти букв. Мова PCL підтримують ряд струминних принтерів. Використання мови PCL дозволяє скоротити обсяг даних, переданих принтерові для печатки складних зображень, що складаються з тексту і графіки, у порівнянні з растровим форматом. Особливо ця економія істотна для високого дозволу і кольорової печатки — для PCL обсяг переданої інформації не так сильно залежить від дозволу і кольоровості. Однак для доступу до цих можливостей мова PCL повинна «розуміти» і додаток, що здійснює графічний висновок. Підтримка PCL цілком природна для додатків з векторною графікою (включаючи текстові процесори і видавничі системи). Сугубо растрові системи, природно, генерують команди растрової печатки.

Мова PostScript також призначена для лазерних принтерів. У цій мові вся сторінка описується у векторному виді. Шрифти задаються контурами (лініями Безье), і їх растеризацией (у потрібному кольорі) займається убудований процесор принтера відповідно до можливостей принтера й обраним дозволом печатки. Векторний опис всіх об'єктів (символів і геометричних фігур) забезпечує можливість точного виконання трансформацій (масштабирования, позиционирования, поворотів, дзеркальних відображень). При цьому файл печатки не залежить від типу принтера (або іншого пристрою) — потрібно тільки підтримка версії мови, на якій створений файл. Шрифти, використовувані для відображення сторінки, передаються у файлі печатки в компактному векторному виді. Крім того, у принтер PostScript убудована велика кількість стандартних шрифтів, що дозволяють ще більше заощаджувати пам'ять. Реалізація PostScript вимагає наявності в принтера могутнього убудованого процесора, ОЗУ і ПЗУ великого обсягу.

Для плоттеров, що одержують винятково векторні команди малювання, існує кілька різних мов. Загальноприйнятим є мова HP-GL, його розуміють усі плоттери і практично всі прикладні програми, що виконують графічний висновок на плоттер. Для плоттеров, особливо пір'яних, актуальна оптимізація вхідних даних. Наприклад, у багатобарвних зображеннях набагато вигідніше малювати спочатку всі елементи одного кольору, потім — іншого. Програми, що генерують дані для малювання, звичайно надходять інакше: вони «відпрацьовують» зображення по об'єктах. Серія дрібних багатобарвних об'єктів породжує часту зміну пер, за кожним з яких голівка повинна «збігати» до магазина. Іноді має сенс використовувати додаткові програми-оптимізатори, вхідні дані для яких надає вихідний файл графічного додатка.

Оскільки між друкуючим (чертящим) додатком і принтером (плоттером) завжди знаходиться програмний драйвер, при невідповідності їхніх мов майже завжди потрібен драйвер-транслятор. Так, матричний принтер, не русифікований на апаратному рівні, можна русифікувати програмно. Переважно використовувати що завантажується знакогенератор принтера — для цього комп'ютер повинний послати в принтер блок даних визначеного формату, що містить команди завантаження і власне вміст знакогенератора. Однак таке завантаження повинне виконуватися щораз після включення принтера, щоб драйвер міг відслідковувати стан принтера (по сигналах інтерфейсу) і вчасно довантажувати знакогенератор. Однак не всі принтери мають таку можливість. Простіше обстоїть справа, коли в принтера є знакогенератор росіян букв, але вони розташовані в іншому порядку, чим потрібно. У цьому випадку драйвер-русифікатор повинен просто перекодувати символи по таблиці. Правда, для цього йому потрібно «розуміти» графічні команди принтера і прозоро (без перетворення) пропускати графічні дані. Якщо принтер узагалі не має потрібного алфавіту і що завантажується знакогенератора, приходиться друкувати текст у графічному режимі. Для цього драйвер повинний виконувати растеризацию символів, не відомих принтерові або всіх підряд (для однорідності), і виводити них на принтер у графічному режимі. При цьому більш ніж на порядок зростає обсяг переданої інформації, що знижує швидкість печатки, особливо при малопотужному процесорі (час витрачається і на растеризацию, і на власне висновок даних). Апаратна або програмна русифікація принтерів актуальна лише для печатки текстових файлів засобами DOS. Додатка Windows використовують графічні режими принтерів, і питання русифікації вже переходять у чисто програмну область (драйвери і системні шрифти). Однак печатка в графічному режимі на матричних голчастих принтерах по нинішніх мірках занадто повільна і гучна, хоч і можлива. Для такої печатки більше підходять струминні, а ще краще — лазерні принтери.

Програмний драйвер може реалізовувати графічна мова, не підтримуваний принтером, — наприклад, є програмні реалізації мови PostScript. Однак при цьому центральний процесор комп'ютера навантажується об'ємною задачею растеризации, причому в ОЗУ повинний уміщатися весь растровий образ виведеної сторінки. Крім того, на принтер при цьому виводиться величезний обсяг даних, що особливо неприємно для мережного принтера. Так що при великих обсягах печатки краще використовувати дійсний «залізний» (апаратний) принтер PostScript, а не його програмну эмуляцию.

З вищесказаного цілком зрозуміло, що драйвер принтера повинний відповідати типові принтера і його язикових можливостей. Так, при використанні принтера PostScript про це повинено «знати» і драйвер, інакше графічний висновок буде вироблятися завжди в растровому режимі і ніяких перевагах апаратної підтримки PostScript користувач не одержить.