QuickDraw
Эта статья нуждается в дополнительных цитатах для проверки . ( сентябрь 2014 г. ) |
macOS графическая модель |
---|
Рендеринг |
Композитинг |
QuickDraw — это библиотека 2D- графики и связанный с ней интерфейс прикладного программирования (API), который является основной частью классической Mac OS . Первоначально его написали Билл Аткинсон и Энди Херцфельд . [1] QuickDraw все еще существовал как часть библиотек macOS , но был в значительной степени вытеснен более современной графической системой Quartz . В Mac OS X Tiger функция QuickDraw официально объявлена устаревшей . В Mac OS X приложения Leopard, использующие QuickDraw, не могут использовать добавленную поддержку 64-битных версий. В OS X Mountain Lion поддержка заголовков QuickDraw была удалена из операционной системы. Приложения, использующие QuickDraw, по-прежнему работали от OS X Mountain Lion до macOS High Sierra; однако текущие версии Xcode и macOS SDK не содержат заголовочные файлы для компиляции таких программ.
Принципы QuickDraw
[ редактировать ]QuickDraw был основан на LisaGraf от Apple Lisa начала 1980-х годов и был разработан так, чтобы хорошо сочетаться с интерфейсами на основе Pascal и средами разработки ранних систем Apple . Кроме того, QuickDraw представляла собой систему растровой графики , которая определяет пиксель как базовую единицу графической информации. В этом отличие от систем векторной графики , где графические примитивы определяются математически и растеризуются в соответствии с разрешением экрана. Однако растровая система требует гораздо меньше вычислительной мощности и была преобладающей парадигмой на момент разработки QuickDraw.
QuickDraw определил ключевую структуру данных, графический порт или GrafPort. Это была логическая область рисования, где можно было рисовать графику. Наиболее очевидным экранным «объектом», соответствующим GrafPort, было окно , но весь рабочий стол мог быть GrafPort, а также могли существовать внеэкранные порты.
GrafPort определил систему координат . В QuickDraw это имело разрешение 16 бит , что давало 65 536 уникальных вертикальных и горизонтальных позиций. Они пронумерованы от -32 767 в крайнем левом углу (или вверху) до +32 767 в крайнем правом (или внизу). Окно обычно настраивалось так, чтобы верхний левый угол его области содержимого располагался на отметке 0,0 в связанном GrafPort. Область содержимого окна не включала рамку окна, тень или строку заголовка (если таковые имеются).
Координаты QuickDraw относятся к бесконечно тонким линиям между местоположениями пикселей . Фактический пиксель был нарисован в пространстве справа и под координатой. Это позволило программистам избежать графических сбоев, вызванных ошибками отклонения на единицу .
На Macintosh пиксели были квадратными, а разрешение GrafPort по умолчанию составляло 72 пикселя на дюйм, выбранное в соответствии с принятыми в полиграфической отрасли соглашениями о 72 точках на дюйм.
QuickDraw также содержал ряд функций масштабирования и сопоставления.
QuickDraw поддерживает ряд глобальных переменных для каждого процесса, главной из которых является текущий порт. Первоначально это упростило API, поскольку все операции относились к «текущему порту», но по мере развития ОС такое использование глобального состояния также значительно усложнило интеграцию QuickDraw с современными подходами к проектированию, такими как многопоточность и вытесняющая многозадачность. . Чтобы решить эти проблемы, Carbon API (мост между Mac OS 9 и Mac OS X) добавил к некоторым процедурам дополнительные параметры, позволяющие (непрозрачно) хранить информацию о потоках и новую (неопрашиваемую) структуру событий.
Графические примитивы
[ редактировать ]Все, что видно на классическом экране Mac OS, рисуется с помощью QuickDraw, но сама библиотека находится на довольно низком уровне. Примитивные объекты, которые он может рисовать:
- Линии
- Прямоугольники
- Прямоугольники со скругленными (и овальными) углами.
- Овалы (включая круги и эллипсы)
- Дуги (и клинья), как круглые, так и овальные.
- Многоугольники (произвольные замкнутые фигуры, построенные из списка точек, соединенных линиями)
- Регионы (произвольные наборы пикселей — см. ниже)
- Растровые изображения и растровые изображения
- Текст
Каждый из этих объектов (кроме текста) можно нарисовать с помощью «пера», которое может иметь любые прямоугольные размеры, узор или цвет. Обратите внимание: поскольку перо имеет прямоугольную форму и выровнено по оси, диагональные линии будут толще горизонтальных или вертикальных. Фигуры можно рисовать заполненными или обрамленными, используя любой узор или цвет. Заполненная дуга образует клин. Текст может быть нарисован любым установленным шрифтом, в различных стилистических вариантах, любого размера и цвета. В зависимости от того, как хранится выбранный шрифт, текст можно масштабировать различными способами: шрифты TrueType плавно масштабируются до любого размера, тогда как растровые шрифты обычно масштабируются плохо.
Важной особенностью QuickDraw была поддержка режимов передачи , которые определяли, как значение целевого пикселя было связано с его предыдущим значением и цветом рисуемого объекта.
Набор атрибутов пера и рисования текста связан с GrafPort.
Регионы — это ключевая структура данных в QuickDraw. Они определяют произвольный набор пикселей, похожий на растровое изображение, но в сжатой форме, которой можно очень быстро манипулировать сложными способами. Регионы можно объединять (объединять), вычитать (разница) и использовать операцию XOR для формирования других регионов. Их можно использовать в GrafPort для обрезки , рисовать заполненными или обрамлять, как любую другую фигуру. Ряд фигур в рамке и соединенных линий можно объединить в регион. Регион не обязательно должен состоять из непрерывного набора пикселей — отдельные регионы возможны и распространены. Хотя регионы могут позволять мощные графические манипуляции, они ограничены текущей реализацией, которая ограничивает максимальный размер хранилища данных региона шестнадцатибитным значением и поэтому непрактичны в качестве универсального инструмента композиции чертежей, а практическое использование с высоким разрешением также ограничено. Регионы лежат в основе остальной части QuickDraw, позволяя обрезать произвольные формы, что важно для реализации нескольких перекрывающихся окон. Изобретенные Биллом Аткинсоном регионы были запатентованы Apple как отдельное изобретение. [1]
Регион указывается (после первоначального создания) путем открытия региона, рисования различных фигур QuickDraw и закрытия региона. Скрытые процедуры создают область при выполнении команд QuickDraw. Растровые изображения также могут быть преобразованы в регионы, а растровые изображения могут быть созданы из регионов путем «рисования» или «заполнения» региона в графический порт.
Внутренняя структура региона, за исключением длины хранилища и ограничивающего его прямоугольника, непрозрачна — документов, опубликованных Apple, нет, хотя механизм описан в патенте. Регионы реализуются с использованием как вертикального, так и горизонтального сжатия . Регион хранится в виде серии строк горизонтального сканирования (« растров »), каждая из которых содержит вертикальную координату, за которой следует список горизонтальных инверсных координат. Каждую точку инверсии можно рассматривать как включение в регион всех точек после нее: первая точка включает регион, вторая выключает его и так далее. Дальнейшее сжатие достигается за счет дифференциального хранения каждой строки: каждая строка содержит только отличия от предыдущей строки, а не полный набор точек инверсии. Наконец, идентичные соседние строки сканирования эффективно кодируются путем их простого пропуска. Таким образом, часто используемая область, прямоугольник с закругленными углами, эффективно кодируется, и сложные операции, такие как композиция области и обрезка изображения, могут выполняться, не требуя ни длительных циклов процессора, ни больших объемов памяти. (Первоначальные системы, выполняющие код QuickDraw, использовали процессоры, работающие с тактовой частотой 8 МГц, а системы имели всего 128 килобайт записываемой памяти.)
Поскольку регионы привязаны к определенной ориентации, поворот региона на девяносто градусов потребует как детального обратного проектирования структуры, так и обширного кодирования. Общий поворот непрактичен по сравнению с поворотом исходного описания границы источника и простым созданием новой области. Однако API включает в себя процедуры преобразования в растровые изображения и обратно. (Растровые изображения также можно поворачивать, используя хорошо известные методы, но с различной степенью ухудшения качества изображения в зависимости от выбранного угла, количества циклов хранения и процессора, доступных для операции, а также сложности алгоритма.)
Apple недавно (в Carbon API ) определила регионы как непрозрачную структуру в некоторых параметрах компиляции программы.
Операции более высокого уровня
[ редактировать ]Любая серия графических вызовов QuickDraw может быть записана в структуру, называемую Picture . Затем это можно сохранить в памяти и «проиграть» в любое время, воспроизведя графическую последовательность. Во время воспроизведения изображение может быть помещено в новые координаты или масштабировано без потери разрешения, обычно встречающейся при масштабировании растрового изображения. Изображение можно сохранить на диск, в каком виде оно определяется форматом Apple PICT .
Весь BitMap (или PixMap, если речь идет о цветных изображениях) можно скопировать из одного GrafPort в другой с масштабированием и обрезкой. Эта операция, известная как копирование или CopyBits по названию функции, является основой большинства анимационных и спрайтовых эффектов на Mac.
QuickDraw предоставляет аналогичную функцию копирования, которая предназначена для реализации прокрутки внутри GrafPort — изображение в порту можно переместить в новое место без масштабирования (но с обрезкой при желании).
Каждая операция графического примитива векторизируется через StdProcs — серию указателей на функции, хранящихся в GrafPort. Этот ограниченный полиморфизм позволяет переопределять или заменять отдельные операции пользовательскими функциями, позволяя драйверам принтеров перехватывать графические команды и преобразовывать их в подходящие операции принтера. Таким образом, QuickDraw можно визуализировать с помощью PostScript , что позволило Macintosh практически изобрести настольные издательские системы .
Подобно подклассу , структура данных Window начинается с соответствующего GrafPort, что делает окна взаимозаменяемыми с любым GrafPort. Несмотря на удобство, это упрощало написание ошибочного кода, который передавал порт закадровой графики в API, ожидавший полномасштабного окна.
История
[ редактировать ]QuickDraw начал свою жизнь как Lisa Graf в рамках разработки Apple Lisa . Для Macintosh он изначально был упрощен, но позже расширен. Первоначально QuickDraw GrafPorts поддерживал только битовую глубину 1, то есть один бит на пиксель, или черно-белый цвет. Это подходило для встроенного экрана ранних Macintosh с фиксированным размером 512×342 пикселей. Ограниченный цвет поддерживался с использованием грубой плоской модели, что позволяло QuickDraw работать с некоторыми типами матричных принтеров , в которых использовались разноцветные ленты, но очень немногие приложения поддерживали эту функцию.
В 1987 году был разработан и выпущен Macintosh II , который представлял собой более традиционную трехблочную конструкцию — компьютер , монитор и клавиатура были разделены. Поскольку монитор был отдельным и больше, чем у оригинального Mac, видеоархитектуру пришлось обязательно изменить. Кроме того, Mac II превратил Macintosh из черно-белого в полноцветный. В это время Apple также решила впервые в отрасли поддержать единый рабочий стол, охватывающий несколько мониторов. Таким образом, был создан Color QuickDraw, значительное расширение оригинального QuickDraw. В исходной архитектуре не хватало возможностей для расширения, но с помощью ряда хаков разработчикам Apple удалось сделать добавление цвета и новой видеоархитектуры практически незаметным как для разработчиков, так и для конечных пользователей.
Color QuickDraw представил новые структуры данных, включая GDevices для представления каждой подключенной видеокарты/монитора, и новую структуру цвета GrafPort (CGrafPort) для обработки цвета, а также PixMaps вместо BitMaps для изображений с несколькими битами на пиксель. Один из использованных здесь приемов совместимости заключался в том, что новая структура имела точно такой же размер, как и старая, с большинством элементов данных в том же месте, но с дополнительными дескрипторами и указателями на цветовые структуры вместо полей BitMap. Два верхних бита поля rowBytes были использованы в качестве флагов, позволяющих отличать GrafPort от CGrafPort (они всегда были равны нулю в GrafPorts старого стиля, потому что BitMap никогда не мог быть настолько широким, чтобы когда-либо устанавливать эти биты). Использование этих двух старших битов позже снова стало преследовать QuickDraw, поскольку оно требовало максимальной ширины строки всего 4095 на 32-битных PixMaps, что стало проблематично для работы с графикой высокого разрешения. Более поздняя разработка (Carbon) устранила это ограничение, но не имела полной обратной совместимости. В Color QuickDraw также был добавлен диспетчер палитр, который управлял арбитражем цветов на индексированных видеоустройствах. Большинство операций с графическими примитивами остались либо неизменными (но работали в цвете), либо были добавлены новые цветные версии черно-белых API.
Изначально Color QuickDraw мог работать только с 1, 2, 4 и 8-битными видеокартами — и это все, что было доступно на тот момент. Однако вскоре после этого появились 24-битные видеокарты (так называемый настоящий цвет), и QuickDraw был снова обновлен для поддержки до 32 бит на пиксель (в реальности 24 бита, при этом 8 неиспользуемых) цветовых данных («32-битная QuickDraw»). Однако архитектура всегда допускала это, поэтому новые API не требовались. Сами структуры цветовых данных допускали глубину цвета 1, 2, 4, 8, 15 и 24 бита, что давало 2, 4, 16, 256, 32 768 и 16 777 216 цветов соответственно или 4, 16 и 256 шкал серого. QuickDraw позаботился об управлении повторной выборкой цветов в соответствии с доступной глубиной цвета реального видеооборудования или передачей между закадровыми буферами изображений, включая опциональное сглаживание изображений до более низкой глубины для улучшения качества изображения. Также был добавлен набор утилит для выборки цвета, чтобы программисты могли создавать оптимальные цветовые палитры для использования с индексированными видеоустройствами.
Архитектура QuickDraw всегда позволяла создавать GrafPorts и связанные с ними BitMaps или PixMaps «за кадром», где графика могла быть составлена в памяти без ее немедленного просмотра на экране. Пиксели можно было передавать между этими закадровыми портами и экраном с помощью функции копирования QuickDraw CopyBits. Подобный закадровый композитинг является «рабочей лошадкой» для игр и приложений с интенсивным использованием графики. Однако до появления 32-битного QuickDraw такие закадровые миры приходилось создавать и настраивать программистам вручную в своих приложениях. Это может быть подвержено ошибкам, поскольку оно включает в себя три или более отдельных и довольно сложных структур данных (CGrafPort, PixMap и GDevice, а для индексированных устройств — справочную таблицу цветов и ее обратную). В 32-битном QuickDraw была добавлена поддержка ОС для этой обработки с помощью «Мира внеэкранной графики» или GWorld. Видеобуфер (PixMap) GWorld может храниться в основной памяти или, если он доступен, в неиспользуемых частях видеопамяти, где копирование на экран можно оптимизировать по скорости, избегая необходимости передавать большое количество пиксельных данных через основную память. шина памяти.
С появлением QuickTime QuickDraw получил возможность работать со сжатыми растровыми данными, такими как JPEG . Менеджер сжатия изображений QuickTime тесно интегрировался с QuickDraw: в частности, вызовы распаковки изображений представляли собой полноценные вызовы рисования QuickDraw, и если изображение записывалось, сжатые данные сохранялись как часть изображения для отображения при его создании. позже нарисовано. В диспетчере сжатия изображений также добавлена интеграция с сопоставлением цветов ColorSync .
После этого, если не считать внутренних изменений для оптимизации под новые архитектуры процессоров ( PowerPC ), QuickDraw оставался практически неизменным на протяжении всей оставшейся жизни классической Mac OS. QuickDraw GX и QuickDraw 3D имели общее имя QuickDraw и могли взаимодействовать с QuickDraw PixMap и структурами данных изображений, но в остальном были полностью разными по функциональности.
В Mac OS X QuickDraw стал частью Carbon API . В 2005 году с выпуском Mac OS X 10.4 поддержка QuickDraw была официально прекращена.
В 2010 году, когда MacPaint 1.3 исходный код был опубликован в Музее истории компьютеров , [2] также стала доступна историческая версия исходного кода QuickDraw. [3]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Фольклор: -2000 строк кода» . фольклор.орг .
- ^ «Исходный код MacPaint и QuickDraw» . Музей истории компьютеров . 20 июля 2010 г.
- ^ Хессельдал, Эрик (20 июля 2010 г.). «Apple передает исходный код MacPaint Музею истории компьютеров» . businessweek.com. Архивировано из оригинала 9 февраля 2012 г. Проверено 23 августа 2014 г.
Внешние ссылки
[ редактировать ]- Apple Computer, Inc. Создание изображений с помощью QuickDraw (PDF) . Архивировано из оригинала (PDF) 17 мая 2013 г. Проверено 9 марта 2018 г. — оригинальная документация QuickDraw с сайта Developer.apple.com.
- Apple Computer, Inc. Справочник по QuickDraw (устаревшая версия) (PDF) . Архивировано из оригинала (PDF) 18 апреля 2014 г. Проверено 9 марта 2018 г. — более поздняя документация QuickDraw с сайта Developer.apple.com.
- QuickDraw — список ресурсов QuickDraw с сайта Developer.apple.com.
- Folklore.org: Истории Macintosh: круглые прямоугольники повсюду! , май 1981 г., рассказ о создании QuickDraw
- Исходный код MacPaint и QuickDraw , Музей истории компьютеров
- -2000 строк кода