Szybkie losowanie - QuickDraw

QuickDraw jest 2D grafika biblioteki i wiąże Application Programming Interface (API) , który jest podstawowym elementem w klasycznym Mac OS system operacyjny . Pierwotnie został napisany przez Billa Atkinsona i Andy'ego Hertzfelda . QuickDraw nadal istniał jako część bibliotek Mac OS X , ale został w dużej mierze zastąpiony przez bardziej nowoczesny system graficzny Quartz . W systemie Mac OS X v10.4 QuickDraw został oficjalnie wycofany . W systemie Mac OS X 10.5 aplikacje korzystające z QuickDraw nie mogą korzystać z dodanej obsługi 64-bitowej. W systemie Mac OS X 10.8 obsługa nagłówków QuickDraw została usunięta z systemu operacyjnego. Aplikacje korzystające z QuickDraw będą nadal działać w systemach OS X 10.8 do macOS 10.13; jednak aktualne wersje Xcode i macOS SDK nie zawierają plików nagłówkowych do kompilowania takich programów.

Zasady QuickDraw

QuickDraw został zakorzeniony w LisaGraf firmy Apple Lisa z wczesnych lat 80. i został zaprojektowany tak, aby dobrze pasował do interfejsów opartych na Pascalu i środowisk programistycznych wczesnych systemów Apple . Ponadto QuickDraw był systemem grafiki rastrowej , który definiuje piksel jako podstawową jednostkę informacji graficznej. Jest to w przeciwieństwie do systemów grafiki wektorowej , w których prymitywy grafiki są definiowane w kategoriach matematycznych i rasteryzowane zgodnie z wymaganiami rozdzielczości wyświetlania. System rastrowy wymaga jednak znacznie mniejszej mocy obliczeniowej i był dominującym paradygmatem w czasie, gdy opracowano QuickDraw.

QuickDraw zdefiniował kluczową strukturę danych, port graficzny lub GrafPort. Był to logiczny obszar rysowania, w którym można było rysować grafikę. Najbardziej oczywistym "obiektem" na ekranie odpowiadającym GrafPortowi było okno , ale cały widok pulpitu mógł być GrafPortem, a porty pozaekranowe również mogły istnieć.

GrafPort zdefiniował układ współrzędnych . W QuickDraw miał on rozdzielczość 16 bitów , co daje 65 536 unikalnych lokalizacji w pionie i poziomie. Są one ponumerowane od -32767 po lewej stronie (lub u góry) do +32 767 po prawej stronie (lub na dole). Okno było zwykle ustawiane tak, że lewy górny róg jego obszaru zawartości znajdował się na 0,0 w powiązanym GrafPort. Obszar zawartości okna nie zawierał ramki okna, cienia ani paska tytułu (jeśli istnieje).

Współrzędne QuickDraw odnosiły się do nieskończenie cienkich linii między lokalizacjami pikseli . Rzeczywisty piksel został narysowany w przestrzeni bezpośrednio po prawej i poniżej współrzędnej. Ułatwiło to programistom uniknięcie błędów graficznych spowodowanych błędami „off-by-one” .

Na Macintoshu piksele były kwadratowe, a GrafPort miał domyślną rozdzielczość 72 pikseli na cal, wybraną tak, aby pasowała do konwencji ustalonych przez przemysł poligraficzny o 72 punktach na cal.

QuickDraw zawierał również szereg funkcji skalowania i mapowania.

QuickDraw utrzymywał wiele zmiennych globalnych na proces, z których główną jest obecny port. Pierwotnie uprościło to interfejs API, ponieważ wszystkie operacje dotyczyły „bieżącego portu”, ale w miarę rozwoju systemu operacyjnego korzystanie ze stanu globalnego znacznie utrudniło integrację QuickDraw z nowoczesnymi podejściami do projektowania, takimi jak wielowątkowość i wielozadaniowość z wywłaszczaniem. . Aby rozwiązać te problemy, Carbon API (pomost między Mac OS 9 i Mac OS X) dodał dodatkowe parametry do niektórych procedur, pozwalając na (nieprzezroczyste) przechowywanie informacji o wątkach i nową (nieodpytywaną) strukturę zdarzeń.

Prymitywy graficzne

Wszystko co widać na klasycznym ekranie Mac OS rysuje QuickDraw, ale sama biblioteka stoi na dość niskim poziomie. Prymitywne obiekty, które może narysować, to:

  • Linie
  • Prostokąty
  • Zaokrąglone (i owalne) prostokąty z narożnikami
  • Owale (w tym koła i elipsy)
  • Łuki (i kliny), zarówno okrągłe, jak i owalne
  • Wielokąty (dowolne zamknięte kształty zbudowane z listy punktów połączonych liniami)
  • Regiony (dowolne zestawy pikseli — patrz poniżej)
  • Bitmapy i pixmapy
  • Tekst

Każdy z tych obiektów (oprócz tekstu) można narysować „długopisem”, który może mieć dowolne prostokątne wymiary, wzór lub kolor. Zwróć uwagę, że ponieważ pióro jest prostokątne i wyrównane do osi, ukośne linie będą grubsze niż linie poziome lub pionowe. Kształty mogą być wypełnione lub obramowane dowolnym wzorem lub kolorem. Wypełniony łuk tworzy klin. Tekst może być narysowany dowolną zainstalowaną czcionką, w różnych odmianach stylistycznych, w dowolnym rozmiarze i kolorze. W zależności od tego, jak wybrana czcionka jest przechowywana, tekst można skalować na różne sposoby — czcionki TrueType będą skalować płynnie do dowolnego rozmiaru, podczas gdy czcionki bitmapowe zwykle nie skalują się dobrze.

Ważną cechą QuickDraw była obsługa trybów transferu , które określały, w jaki sposób docelowa wartość piksela była powiązana z jej poprzednią wartością i kolorem rysowanego obiektu.

Zestaw atrybutów pióra i rysunku tekstowego jest powiązany z GrafPortem.

Regiony są kluczową strukturą danych w QuickDraw. Definiują arbitralny zestaw pikseli, podobnie jak bitmapa, ale w skompresowanej formie, którą można bardzo szybko manipulować w skomplikowany sposób. Regiony mogą być łączone ( składanie ), odejmowane (różnica) i XOR - owane, aby utworzyć inne regiony. Można ich używać w GrafPort do przycinania lub rysować z wypełnieniem lub ramkami jak każdy inny kształt. Szereg kształtów w ramkach i połączonych linii można połączyć w Region. Region nie musi składać się z ciągłego zestawu pikseli — rozłączone regiony są możliwe i wspólne. Chociaż regiony mogą pozwolić na potężne manipulacje grafiką, są one ograniczone przez obecną implementację, która ogranicza maksymalny rozmiar przechowywania danych regionu do wartości szesnastu bitów, a zatem nie są praktyczne jako narzędzie do kompozycji rysunkowych ogólnego przeznaczenia, a praktyczne użycie w wysokiej rozdzielczości jest również ograniczone. Regiony stanowią podstawę pozostałej części QuickDraw, umożliwiając przycinanie do dowolnych kształtów, co jest niezbędne do implementacji wielu nakładających się okien. Wynalezione przez Billa Atkinsona Regiony zostały opatentowane przez Apple jako odrębny wynalazek. [1]

Region jest określany (po początkowym utworzeniu) przez otwarcie regionu, narysowanie różnych kształtów QuickDraw i zamknięcie regionu. Ukryte procedury tworzą region podczas wykonywania poleceń QuickDraw. Mapy bitowe można również konwertować na regiony, a mapy bitowe można tworzyć z regionów poprzez „malowanie” lub „wypełnianie” regionu portem graficznym.

Wewnętrzna struktura regionu, inna niż długość przechowywania i otaczający go prostokąt, jest nieprzezroczysta – nie ma dostępnych dokumentów opublikowanych przez Apple, chociaż mechanizm jest opisany w patencie. Regiony są implementowane przy użyciu kompresji pionowej i poziomej . Region jest przechowywany jako seria poziomych linii skanowania („ rastry ”), z których każda zawiera współrzędną pionową, po której następuje lista współrzędnych odwrócenia w poziomie. Każdy punkt odwrócenia można traktować jako przełączanie włączenia do regionu dla wszystkich punktów po nim: pierwszy punkt włącza region, drugi wyłącza i tak dalej. Dalszą kompresję osiąga się poprzez przechowywanie każdej linii w sposób różnicowy: każda linia zawiera tylko różnice w stosunku do poprzedniej linii, a nie pełny zestaw punktów inwersji. Wreszcie, identyczne sąsiednie linie skanowania są efektywnie kodowane przez proste ich pominięcie. W ten sposób powszechnie używany region, prostokąt z zaokrąglonymi narożnikami, jest efektywnie zakodowany, a złożone operacje, takie jak skład regionu i obcinanie obrazu, mogą być wykonywane bez konieczności wykonywania długich cykli procesora lub dużej ilości pamięci. (Oryginalne systemy wykonujące kod QuickDraw wykorzystywały procesory działające z częstotliwością zegara 8 megaherców, a systemy miały tylko 128 kilobajtów pamięci do zapisu).

Ponieważ regiony są związane z określoną orientacją, obrót regionu o dziewięćdziesiąt stopni wymagałby zarówno szczegółowej inżynierii odwrotnej struktury, jak i obszernego kodowania. Ogólny obrót jest niepraktyczny w porównaniu z obracaniem oryginalnego opisu granicy źródła i prostym tworzeniem nowego regionu. Jednak interfejs API zawiera procedury konwersji do iz BitMaps. (Mapy bitowe można również obracać przy użyciu dobrze znanych metod, ale z różnym stopniem degradacji obrazu w zależności od wybranego kąta, dostępnych dla operacji cykli pamięci i procesora oraz złożoności algorytmu.)

Firma Apple niedawno (w Carbon API ) zdefiniowała regiony jako nieprzezroczystą strukturę w ramach niektórych opcji kompilacji programów.

Operacje wyższego poziomu

Każda seria wywołań grafiki do QuickDraw może być nagrana w strukturze zwanej obrazem . Można to następnie zapisać w pamięci i „odtworzyć” w dowolnym momencie, odtwarzając sekwencję graficzną. W czasie odtwarzania obraz może być umieszczony w nowych współrzędnych lub skalowany. Obraz można zapisać na dysku, w którym określa format Apple PICT .

Cała BitMapa (lub PixMap w przypadku kolorowych obrazów) może zostać skopiowana z jednego GrafPortu do drugiego, ze skalowaniem i przycinaniem. Znana jako blitting lub CopyBits , po nazwie funkcji, ta operacja jest podstawą większości animacji i efektów przypominających sprite'y na komputerze Mac.

QuickDraw zapewnia podobną funkcję blittingu, która jest przeznaczona do implementacji przewijania w GrafPort - obraz w porcie może być przesunięty do nowej lokalizacji bez skalowania (ale z przycinaniem w razie potrzeby).

Każda prosta operacja graficzna jest wektorowana przez StdProcs, serię wskaźników funkcji przechowywanych w GrafPort. Ten ograniczony polimorfizm pozwala na nadpisanie lub zastąpienie poszczególnych operacji funkcjami niestandardowymi, umożliwiając sterownikom drukarki przechwytywanie poleceń graficznych i przekształcanie ich na odpowiednie operacje drukarki. W ten sposób QuickDraw może być renderowany przy użyciu PostScriptu , co umożliwiło Macintoshowi praktycznie wynalezienie DTP .

Podobnie do podklasy , struktura danych Window zaczynała się od skojarzonego GrafPort, w ten sposób zasadniczo umożliwiając wymianę okien z dowolnym GrafPort. Chociaż jest to wygodne, może to być źródłem błędów programistycznych.

Historia

QuickDraw rozpoczął życie jako Lisa Graf w ramach rozwoju Apple Lisa . W przypadku Macintosha został on początkowo uproszczony, ale później rozszerzony. Pierwotnie QuickDraw GrafPorts obsługiwał tylko głębię bitową 1, czyli jeden bit na piksel lub czarno-biały. To pasowało do wbudowanego ekranu wczesnych komputerów Macintosh, z jego stałym rozmiarem 512×342 pikseli. Ograniczony kolor był obsługiwany przy użyciu prymitywnego modelu planarnego , dzięki czemu QuickDraw mógł obsługiwać niektóre typy drukarek igłowych, które używały wielokolorowych taśm, ale bardzo niewiele aplikacji obsługiwało tę funkcję.

W 1987 roku opracowano i uruchomiono Macintosha II , który został zaprojektowany jako bardziej konwencjonalny, trzyczęściowy projekt — komputer , monitor i klawiatura są oddzielone. Ponieważ monitor był oddzielny i większy niż oryginalny Mac, architektura wideo musiała się koniecznie zmienić. Ponadto Mac II zmienił Macintosha z czarno-białego na pełnokolorowy. Firma Apple zdecydowała się również w tym czasie na obsługę bezproblemowego komputera stacjonarnego obejmującego wiele monitorów, co jest pierwszym w branży. W ten sposób powstał Color QuickDraw, znaczące rozszerzenie oryginalnego QuickDraw. W oryginalnej architekturze brakowało wielu możliwości rozbudowy, ale dzięki serii hacków programiści Apple zdołali sprawić, że dodanie kolorów i nowej architektury wideo będzie praktycznie bezproblemowe zarówno dla programistów, jak i użytkowników końcowych.

Color QuickDraw wprowadził nowe struktury danych, w tym GDevices do reprezentowania każdej dołączonej karty graficznej/monitora oraz nową strukturę koloru GrafPort (CGrafPort) do obsługi koloru, a także PixMaps zamiast BitMaps dla obrazów z wieloma bitami na piksel. Jednym z hacków służących do zapewnienia kompatybilności było to, że nowa struktura miała dokładnie taki sam rozmiar jak stara, z większością elementów danych w tym samym miejscu, ale z dodatkowymi uchwytami i wskaźnikami do kolorowych struktur zamiast pól BitMap. Dwa górne bity pola rowBytes zostały użyte jako flagi, aby odróżnić GrafPort od CGrafPort (w starym GrafPorts zawsze były one zerowe, ponieważ BitMap nigdy nie może być tak szeroki, aby kiedykolwiek ustawić te bity). Użycie tych dwóch wysokich bitów powróciło później, by prześladować QuickDraw, ponieważ wymusiło maksymalną szerokość wiersza wynoszącą zaledwie 4095 w 32-bitowych PixMaps, co stało się problematyczne dla pracy z grafiką w wysokiej rozdzielczości. Późniejszy rozwój (Carbon) wyeliminował to ograniczenie, ale nie był w pełni kompatybilny wstecz. W programie Color QuickDraw dodano również menedżera palet, który zarządzał arbitrażem kolorów na zindeksowanych urządzeniach wideo. Większość operacji na elementach graficznych pozostała niezmieniona (ale działała w kolorze), albo dodano nowe kolorowe wersje czarno-białych interfejsów API.

Początkowo Color QuickDraw mógł działać tylko z 1, 2, 4 i 8-bitowymi kartami graficznymi, które były wszystkim, co było wówczas dostępne. Jednak wkrótce potem pojawiły się 24-bitowe karty graficzne (tzw. True Color), a QuickDraw został ponownie zaktualizowany, aby obsługiwać do 32 bitów na piksel (w rzeczywistości 24 bity, z 8 nieużywanymi) danych kolorów („32-Bit Szybkie losowanie"). Architektura zawsze jednak na to pozwalała, więc nie były potrzebne żadne nowe API. Same struktury danych kolorów pozwalały na uzyskanie głębi koloru 1, 2, 4, 8, 15 i 24 bitów, dając odpowiednio 2, 4, 16, 256, 32 768 i 16 777 216 kolorów lub 4, 16 i 256 odcieni szarości. QuickDraw zajął się zarządzaniem ponownym próbkowaniem kolorów do dostępnych głębi kolorów rzeczywistego sprzętu wideo lub transferem między buforami obrazu poza ekranem, w tym opcjonalnie ditheringiem obrazów do niższej głębi w celu poprawy jakości obrazu. Dodano również zestaw narzędzi do próbkowania kolorów, aby programiści mogli generować optymalne palety kolorów do użytku z indeksowanymi urządzeniami wideo.

Architektura QuickDraw zawsze pozwalała na tworzenie GrafPorts i powiązanych z nimi BitMap lub PixMaps „poza ekranem”, gdzie grafika mogła być komponowana w pamięci bez natychmiastowej widoczności na ekranie. Piksele mogą być przesyłane między tymi portami pozaekranowymi a ekranem za pomocą funkcji QuickDraw blittingu CopyBits. Takie komponowanie poza ekranem jest koniem roboczym dla gier i aplikacji intensywnie korzystających z grafiki. Jednak do czasu pojawienia się 32-bitowego QuickDraw, takie pozaekranowe światy musiały być tworzone i konfigurowane ręcznie przez programistów w swoich aplikacjach. Może to być podatne na błędy, ponieważ obejmowało trzy lub więcej oddzielnych i dość złożonych struktur danych (CGrafPort, PixMap i GDevice, a w przypadku urządzeń indeksowanych — tablicę wyszukiwania kolorów i jej odwrotność). Z 32-bitowym QuickDraw, dodano obsługę systemu operacyjnego do obsługi tego, z "Offscreen Graphics World" lub GWorld. Bufor wideo (PixMap) GWorld może być przechowywany w pamięci głównej lub, gdy jest dostępny, w nieużywanych częściach pamięci wideo, gdzie kopiowanie na ekran może być zoptymalizowane pod kątem szybkości, unikając konieczności przesyłania dużej ilości danych pikseli przez główną magistrala pamięci.

Wraz z pojawieniem się QuickTime , QuickDraw zyskał możliwość radzenia sobie ze skompresowanymi danymi rastrowymi, takimi jak JPEG . QuickTime Image Compression Manager jest ściśle zintegrowany z QuickDraw: w szczególności wywołania dekompresji obrazu były pełnoprawnymi wywołaniami rysowania QuickDraw, a jeśli obraz był nagrywany, skompresowane dane byłyby zapisywane jako część obrazu do wyświetlenia, gdy obraz był później narysowany. Image Compression Manager dodał również integrację z dopasowaniem kolorów ColorSync .

Po tym, oprócz zmian zaplecza mających na celu optymalizację pod kątem nowych architektur procesorów ( PowerPC ), QuickDraw pozostał w dużej mierze niezmieniony przez resztę życia klasycznego systemu Mac OS. QuickDraw GX i QuickDraw 3D miały wspólną nazwę QuickDraw i były w stanie współpracować z QuickDraw PixMap i strukturami danych obrazu, ale poza tym były całkowicie oddzielne pod względem funkcjonalności.

Wraz z Mac OS X QuickDraw stał się częścią Carbon API . W 2005 roku, wraz z wydaniem systemu Mac OS X 10.4, QuickDraw został oficjalnie wycofany.

W 2010 roku, wraz z wydaniem kodu źródłowego MacPaint 1.3 przez Computer History Museum , dostępna stała się również historyczna wersja kodu źródłowego QuickDraw.

Zobacz też

Bibliografia

Linki zewnętrzne