stringtranslate.com

QuickDraw

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 включает процедуры преобразования в и из BitMaps. (Растровые изображения также можно поворачивать с использованием хорошо известных методов, но с различной степенью ухудшения изображения в зависимости от выбранного угла, циклов памяти и процессора, доступных для операции, и сложности алгоритма.)

Недавно Apple (в Carbon API ) определила регионы как непрозрачную структуру в некоторых параметрах компиляции программ.

Операции более высокого уровня

Любая серия графических вызовов QuickDraw может быть записана в структуру, называемую Picture . Затем ее можно сохранить в памяти и «воспроизвести» в любое время, воспроизведя графическую последовательность. Во время воспроизведения изображение может быть размещено в новых координатах или масштабировано без потери разрешения, что обычно происходит при масштабировании растровых изображений. Изображение может быть сохранено на диске, в форме, которая определяет формат Apple PICT .

Весь BitMap (или PixMap, когда речь идет о цветных изображениях) может быть скопирован из одного GrafPort в другой с масштабированием и обрезкой. Эта операция, известная как blitting или 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. В это время Билл Аткинсон был занят HyperCard , поэтому работа над Color QuickDraw была выполнена Эрни Бирнинком (тогда ему было еще 23 года): [2] Дэйв Аллен из Apple также отметил Дэйва Фанга. [3] Первоначальная архитектура не имела большого запаса для расширяемости, но с помощью ряда уловок разработчикам Apple удалось сделать добавление цвета и новую видеоархитектуру практически бесшовными как для разработчиков, так и для конечных пользователей.

Color QuickDraw представил новые структуры данных, включая GDevices для представления каждой подключенной видеокарты/монитора и новую структуру цветного GrafPort (CGrafPort) для обработки цвета, а также PixMaps вместо BitMaps для изображений с несколькими битами на пиксель. Одним из хаков для обеспечения совместимости, использованных здесь, было то, что новая структура была точно такого же размера, как и старая, с большинством членов данных в том же месте, но с дополнительными дескрипторами и указателями на цветовые структуры вместо полей BitMap. Верхние два бита поля rowBytes были принудительно использованы в качестве флагов для различения GrafPort от CGrafPort (они всегда были равны нулю в старых GrafPort, потому что BitMap никогда не мог быть настолько широким, чтобы когда-либо устанавливать эти биты). Использование этих двух старших битов позже аукнется QuickDraw, так как оно вынуждало максимальную ширину строки всего 4095 на 32-битных PixMaps, что стало проблематичным для работы с графикой высокого разрешения. Более поздняя разработка (Mac OS 8.5/Carbon) устранила это ограничение, но не была полностью обратно совместима. В Color QuickDraw также был добавлен менеджер палитр, который управлял арбитражем цветов на индексированных видеоустройствах. Большинство операций с графическими примитивами либо остались неизменными (но работали в цвете), либо были добавлены новые цветные версии черно-белых API.

Первоначально Color QuickDraw мог работать только с 1, 2, 4 и 8-битными видеокартами, которые были всем, что было доступно в то время. Однако вскоре появились 24-битные видеокарты (так называемый true color), и QuickDraw снова обновился для поддержки до 32 бит на пиксель (в действительности 24 бита с 8 неиспользуемыми) цветовых данных («32-Bit 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 Image Compression Manager тесно интегрировался с QuickDraw: в частности, вызовы декомпрессии изображений были полноценными вызовами рисования QuickDraw, и если записывалось изображение, сжатые данные сохранялись как часть изображения для отображения при последующем рисовании изображения. Image Compression Manager также добавил интеграцию с сопоставлением цветов 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 через Музей компьютерной истории [4] также стала доступна историческая версия исходного кода QuickDraw. [5]

Смотрите также

Ссылки

  1. ^ "Фольклор: -2000 строк кода". folklore.org .
  2. Леви, Стивен (май 1987 г.). «Создание Macintosh II». Macworld . Сан-Франциско: PCW Communications. стр. 55–63. ISSN  0741-8647 . Получено 31 июля 2024 г. стр. 60: 23-летний Эрни Бирник [так в оригинале] блестяще переделал графические процедуры QuickDraw для поддержки цвета.
  3. ^ Аллен, Дэн (лето 1988 г.). «Введение в программирование HyperCard». Dr. Dobb's Macintosh Special . стр. 56–74. ISSN  1044-789X . Получено 2 августа 2024 г. стр. 64: Однако Билл не участвовал в разработке Color QuickDraw, установленного на Mac II, поскольку в то время он работал над HyperCard. Color QuickDraw делали Эрни Бирнинк и Дэйв Фанг.
  4. ^ "MacPaint и QuickDraw Исходный код". Музей компьютерной истории . 20 июля 2010 г.
  5. ^ Хессельдаль, Эрик (2010-07-20). «Apple Donates MacPaint Source Code To Computer History Museum». businessweek.com. Архивировано из оригинала 2012-02-09 . Получено 2014-08-23 .

Внешние ссылки