Hlavní navigace

Historie vývoje grafického uživatelského rozhraní (2)

16. 9. 2010
Doba čtení: 22 minut

Sdílet

V deváté části seriálu o programovacích jazycích pro výuku programování si řekneme, jak se vyvíjelo grafické rozhraní na osobních počítačích, zejména na Xerox Alto, Apple Lisa a Macintosh. Taktéž si řekneme, co znamená poněkud tajemná zkratka BitBLT, která má svůj původ právě ve Smalltalku a počítači Xerox Alto.

Obsah

1. Grafická uživatelská rozhraní a technologie vektorových displejů

2. Vývoj grafického uživatelského rozhraní využívajícího rastrovou grafiku

3. Grafické uživatelské rozhraní počítače Apple Lisa

4. Apple Macintosh – první komerčně úspěšné GUI

5. Tajemná zkratka BitBLT

6. Rastrové operace prováděné během BitBLT

7. BitBLT a ROP ve WinAPI a DirectX

8. Rastrové operace v knihovnách GDK a Qt

9. Odkazy na Internetu

1. Grafická uživatelská rozhraní a technologie vektorových displejů

V předchozí části tohoto seriálu jsme se zabývali historií vývoje grafického uživatelského rozhraní, především samotných počátků experimentů s GUI. Zaměřili jsme se zejména na popis velmi zajímavého a současně i detailně propracovaného systému Sketchpad, realizovaného již v roce 1963 Ivanem E. Sutherlandem. Jednalo se o předchůdce moderních systémů typu CAD, který pro zobrazení výkresů i pro další interakci s uživatelem používal vektorovou obrazovku, konkrétně paprsek vychylovaný pomocí lineárních interpolátorů s desetibitovou přesností (takže celá plocha obrazovky představovala z pohledu programátorů souřadnou mřížku o velikosti 1024×1024 vrcholů). Volba vektorové obrazovky byla v roce 1963 logická, protože v té době byly ještě hojně používány analogové počítače (které však s dnešními počítači nemají kromě názvu prakticky nic společného), jejichž výstup, konkrétně nějaký signál proměnný v čase, byl většinou zobrazován na obrazovce osciloskopu.

Obrázek 1: Interaktivní konstrukce geometrického objektu pomocí světelného pera a takzvané pružné úsečky v systému Sketchpad.

Jednalo se tedy o v té době dobře ověřenou zobrazovací technologii, která navíc měla velkou přednost v tom, že umožňovala zobrazení i poměrně složité kresby bez větších nároků na kapacitu operační paměti – namísto paměťově poměrně náročné bitmapy uložené ve framebufferu (nebo jeho obdobě, například ve vyhrazené části operační paměti) postačovalo v případě použití vektorového displeje mít v paměti uloženy pouze koncové souřadnice kreslených polyčar (lomených úseček), o jejichž postupnou interpolaci se většinou staraly specializované analogové nebo číslicové obvody (interpolátory). O tom, že se vektorové displeje skutečně na přelomu padesátých a šedesátých let minulého století velmi často používaly, svědčí i to, že tímto typem displeje byl vybaven i legendární počítač PDP-1 (Programmed Data Processor-1) z roku 1959, na němž kromě mnoha dalších zajímavých a důležitých projektů vznikla i hra Spacewar!, jejímž autorem je Steve Russell.

pdp1

Obrázek 2: Tvar vektorového monitoru počítače PDP-1 je opravdu netradiční. Při zobrazení složitějšího obrázku docházelo ke znatelnému poblikávání, a to přesto, že luminofor použitý u této obrazovky, měl poměrně dlouhou dobu dosvitu.

Ovšem vzhledem k tomu, že u vektorových displejů bylo velmi těžké pracovat s barevným obrazem a celková složitost obrázků (přesněji řečeno počet a délka vykreslených vektorů a současně i celková složitost kresby) byla omezena rychlostí vykreslování i dosvitem luminoforu obrazovky, nedočkaly se vektorové displeje většího a trvalejšího rozšíření. K opuštění vektorových displejů přispěly i zvyšující se kapacity operačních pamětí a současně i jejich snižující se cena (po přepočtu na cenu za jeden bit), což způsobilo, že se postupně přešlo téměř výhradně na rastrovou grafiku. To mj. umožnilo konstruktérům domácích počítačů implementovat výstup grafické informace na běžném televizoru pomocí VF modulátoru a konstruktérům počítačů osobních použít relativně jednoduchý monitor. Jednou z mála výjimek bylo několik herních automatů (například původní verze hry Asteroids!, hra Lunar Lander aj.) a taktéž herní konzole Vectrex, u níž byl využitý vektorový displej.

pdp1

Obrázek 3: Legendární herní konzole Vectrex je mj. vybavena pravděpodobně nejvýkonnějším mikroprocesorem osmibitové éry Motorola M6809, zvukovým čipem AY-3–8912 („aýčkem“ známým i ze ZX Spectra 128+ a Atari ST) a vlastním řadičem vektorového displeje.

2. Vývoj grafického uživatelského rozhraní využívajícího rastrovou grafiku

Vraťme se však k tématu tohoto článku – k historii vývoje grafického uživatelského rozhraní (GUI). Již v předchozí části tohoto seriálu jsme si řekli, že první skutečně moderně pojaté GUI bylo (i když v poněkud spartánské podobě) vytvořeno ve firmě Xerox, konkrétně v pobočce PARC (Palo Alto Research Center). Na vývoji tohoto rozhraní, v němž se postupně objevily dnes běžné prvky GUI, jakými jsou okna, ikony, scrollbary, vyskakovací menu či systém drag and drop, se podílel větší tým vývojářů, mezi nimiž byli i Alan Kay (několikrát již v tomto seriálu zmíněný), Larry Tesler a Dan Ingalls. Aby vůbec bylo možné realizovat plnohodnotné grafické uživatelské rozhraní, rozhodli se jeho tvůrci zkonstruovat počítač, jehož grafický systém byl umožnil snadno a dostatečně rychle zobrazovat bitmapy, což byl v roce 1973 poměrně zásadní odklon od v té době převážně používaných textových terminálů či výše zmíněných vektorových displejů.

pdp1

Obrázek 4: Automatová varianta hry Spacewar!, v níž je opět využit vektorový displej.

Bitmapová grafika totiž kromě nesporných výhod, především možnosti zobrazení libovolně složitého obrázku, přinášela i několik nevýhod, především obecně větší nároky na kapacitu a rychlost paměťových modulů a taktéž na rychlost samotného procesoru, který při zpracování bitmapových dat musel provádět veškeré operace buď programově (to mohlo být pomalé – viz dále zmíněná Apple Lisa) nebo s využitím specializovaných obvodů, které ovšem zvyšovaly cenu počítače (toto řešení bylo později použito například v Amigách a pozdějších modelech Atari ST vybavených takzvaným blitterem). Počítač Xerox Alto byl vybaven displejem o velikosti 8×10 palců, jenž byl postavený na výšku. Na tomto displeji se zobrazoval monochromatický bitmapový obrázek s rozlišením 606×808 pixelů. To při práci s texty s využitím fontu se znaky o velikosti 7×9 pixelů odpovídalo textovému režimu 86×89 znaků, což bylo mnohem více než nabízela většina tehdejších znakových terminálů.

Obrázek 5: Grafické uživatelské rozhraní Smalltalku na počítači Xerox Alto.

Zobrazovaná bitmapa byla v operační paměti počítače Xerox Alto uložena po jednotlivých řádcích, přičemž každému pixelu odpovídal jeden bit. Pokud si nyní říkáte, co je na tomto způsobu uložení bitmapy zvláštního – ve skutečnosti vůbec nic (z pohledu programátora je to naprosto přirozená organizace paměti), ovšem někteří pozdější výrobci grafických karet, například firma IBM s její kartou CGA se pravděpodobně předháněli v tom, jak přístup do obrazové paměti udělat co nejsložitější (v případě CGA se jednalo o vlastnost video řadiče Motorola 6845). Důvodů, proč konstruktéři Xerox Alta nepoužili barevné zobrazení (popř. zobrazení ve stupních šedi), bylo několik. Především se jednalo o poměrně vysokou cenu paměťových modulů; například rozšíření grafických schopností o režim se šestnácti barvami by vyžadoval 4× větší počet paměťových modulů. Druhým důvodem pro použití pouze jednobitové barevné hloubky bylo to, že veškeré grafické operace byly realizovány programově, takže při práci s objemnějšími bitmapami by bylo zapotřebí obětovat větší množství strojového času. Navíc jednobitová barevná hloubka v podstatě věrně odpovídala chápání tehdejšího GUI – jednalo se o desktop, který měl simulovat skutečnou pracovní plochu plnou popsaných a pokreslených papírů.

Obrázek 6: Systém Cedar pro počítač Xerox Alto byl plně založen na interaktivní práci uživatele pomocí grafického uživatelského rozhraní. Povšimněte si mimochodem, že System Browser tohoto systému se nápadně podobá System Browseru ve Squeaku, což v žádném případě není náhoda.

3. Grafické uživatelské rozhraní počítače Apple Lisa

Prvním komerčně dostupným počítačem s plnohodnotným grafickým uživatelským rozhraním založeným na technologiích, které jsou dodnes používané, je počítač Apple Lisa, jehož sériová výroba začala v roce 1983 a ukončena byla (velmi neslavným způsobem) již v roce 1986. Apple Lisa byl první osobní počítač s podporou (kooperativního) multitaskingu a moderně pojatého grafického uživatelského rozhraní, které se ovládalo z velké části pomocí počítačové myši. I přes nepříliš velké rozšíření tohoto stroje mezi běžnými uživateli i korporátními zákazníky tak Apple Lisa patří mezi velmi zajímavé mikropočítače, které svým způsobem změnily historii výpočetní techniky. Přes mnohé technologické přednosti nebyl Apple Lisa komerčně úspěšný; někteří analytici dokonce tvrdí, že se firma Apple kvůli neúspěchu projektu Apple Lisa mohla ocitnout na hranici krachu. Příčin neúspěchu tohoto počítače je více, ovšem hlavním důvodem byla vysoká tohoto počítače cena (cca 10000 dolarů oproti 2500 dolarům za první modely Macintoshů, které začaly být nabízeny o rok později), v roce 1984 taktéž masivní podpora „konkurenčního“ počítače Macintosh (ostatně není bez zajímavosti, že druhá verze počítače Apple Lisa byla pro jistotu nabízena po jménem Macintosh XL) a v letech následujících pak nabídka konkurenčních osobních počítačů s barevnou grafikou (Atari ST a Amiga 1000, oba modely z roku 1985).

pc74

Obrázek 7: Počítač Apple Lisa. Povšimněte si dvou disketových jednotek (vhodná konfigurace pro počítače bez pevného disku) a jednotlačítko­vé myši.

Z technologického hlediska se jednalo o mikropočítač založený na známém a v pozdější době velmi často používaném mikroprocesoru Motorola M68000 s hodinovou frekvencí 5 MHz (zajímavé je, že v době uvedení Apple Lisa do prodeje již existovaly i verze s hodinovými frekvencemi 10 MHz a dokonce 12,5 MHz) a operační paměti s kapacitou tehdy takřka neuvěřitelného jednoho megabajtu. Pro porovnání: běžné dobové mikropočítače měly kapacitu operační paměti typicky 64 kB a 128 kB a jeden kilobajt operační paměti měl cenu přibližně čtyři dolary (zde již můžeme vidět, odkud se vzala zmiňovaná cena 10000 dolarů za první model Apple Lisa). Celý operační systém byl uložen v paměti ROM o kapacitě 2 MB a paměťový subsystém tohoto počítače byl doplněn o dvojici disketových jednotek o velikosti 5 1/4 palce a volitelně též pevným diskem o kapacitě 5 MB. Součástí počítače Apple Lisa byl i monitor s dvanáctipalcovou úhlopříčkou, klávesnice a jednotlačítková myš, na rozdíl od třítlačítkové myši používané pro počítače Xerox Alto. Se samotným operačním systémem byly dodávané i další aplikace, mezi něž patří:

Název aplikace Stručný popis
Lisa Writer textový editor
Lisa Calc tabulkový kalkulátor
Lisa Draw poměrně jednoduchý grafický program
Lisa Terminal terminálový program
Lisa Desktop Manager ovládání celého desktopu
Lisa Workshop Editor pomůcka určená zejména pro programátory
pc74

Obrázek 8: Ukázka grafického uživatelského rozhraní použitého u počítače Apple Lisa.

Vzhledem k tomu, že veškerá komunikace s uživatelem probíhala v grafickém uživatelském rozhraní, bylo grafickým možnostem tohoto mikropočítače věnováno hodně úsilí, jehož výsledkem byl paradoxně velmi jednoduchý grafický subsystém (a to i v porovnání s osmibitovými domácími počítači, které v té době prožívaly dobu svého největšího rozmachu). Obvod pro generování grafiky, což byl podle svých tvůrců pouze poněkud složitější posuvný registr, podporoval pouze jediné rozlišení 720×360 pixelů v monochromatickém režimu, kde každý pixel mohl být buď zcela černý nebo bílý (pro jeho uložení v paměti byl použit jediný bit, stejně jako u počítače Xerox Alto). Fyzické horizontální rozlišení bylo na použitém monitoru s úhlopříčkou dvanácti palců rovno 90 DPI, fyzické vertikální rozlišení však pouze cca 60 DPI. Tvůrci tohoto počítače totiž vycházeli z faktu, že z psychologického hlediska má větší význam horizontální rozlišení. Počítače Macintosh popsané v následující kapitole naproti tomu měly obě fyzická rozlišení shodná a poměr stran se blížil hodnotě 3:2.

pc74

Obrázek 9: Screenshot obrazovky počítače Apple Lisa, tentokrát pořízený v emulátoru. Podobnost s desktopem Macintoshe nebo Microsoft Windows 1.0 – 3.11 není náhodná, protože obě firmy vycházely ze stejného základu založeného na projektech firmy Xerox a počítači Alto (například ikony nebyly v původním návrhu GUI Apple Lisa použity, avšak Steve Jobs je doplnil po návštěvě PARCu).

Celá grafická paměť (framebuffer) byla ve své podstatě tvořena pouze souvislým regionem paměti o kapacitě 32 kB (720×360/8=32400 bajtů), který mohl být mapovaný do libovolného místa operační paměti. Pozice grafické paměti tedy nebyla pevně zadaná, což například umožňovalo velmi jednoduše implementovat double-buffering, page-flipping i další efekty (ostatně stejný způsob byl použit například i u osmibitových počítačů Atari). Při zobrazování se programově načítaly jednotlivé skupiny pixelů z paměti a posílaly se do již zmíněného posuvného registru, který generoval sled pixelů (černý či bílý) a další důležité synchronizační signály, především signál pro horizontální a vertikální zpětný běh paprsku. Právě programové generování grafiky bylo, společně s poměrně nízkou hodinovou frekvencí mikroprocesoru, jednou z příčin celkového pomalého chodu celého počítače – pravým opakem v přístupu ke grafice je například Amiga, kde je centrální procesor (mimochodem: jedná se též o slavný mikroprocesor Motorola M68000) od celého vytváření grafiky odstíněn a může tak vykonávat i jinou činnost.

pc74

Obrázek 10: Počítač Apple Lisa 2 se od své předchůdkyně na první pohled odlišuje především absencí druhé disketové jednotky.

4. Apple Macintosh – první komerčně úspěšné GUI

Zatímco o výše popsaném mikropočítači Apple Lisa jsme řekli, že se z komerčního hlediska jednalo o neúspěšný výrobek, pravý opak je možné říci o paralelně vyvíjeném mikropočítači nazvaném Macintosh. Tento mikropočítač byl taktéž založen na mikroprocesoru Motorola M68000, ovšem v tomto případě taktovaném na vyšší hodinové frekvenci 7,834 MHz (tuto frekvenci používaly i přídavné karty). Kapacita operační paměti byla z cenových důvodů a také díky provedeným optimalizacím operačního systému, snížena oproti Apple Lisa na pouhých 128 kB u modelu Macintosh 128 K a v pozdějších modelech na 512 kB (Macintosh 512 K). Základ operačního systému byl uložen v paměti ROM o kapacitě 64 kB; paměťový subsystém byl doplněn disketovou mechanikou pro diskety o průměru 3 1/2 palce s kapacitou 400 kB (využívala se pouze horní strana diskety, na rozdíl od dalších modelů). S počítačem Macintosh byl dodáván i operační systém se striktně grafickým uživatelským rozhraním, který se primárně ovládal kombinací klávesnice a jednotlačítkové myši (prakticky totožné s myší pro Apple Lisa); ostatně jednotlačítková myš byla symbolem Macintoshů i po téměř celá osmdesátá léta.

pc75

Obrázek 11: Snímek ze slavného reklamního videa na Apple Macintosh, které bylo odvysíláno pouze jednou jedinkrát a to v nejdražším reklamním čase – o přestávce Super Bowlu. Celé video můžete najít například na Youtube (+ několik zdařilých parodií).

V implementovaném grafickém uživatelském rozhraní se již objevuje většina ovládacích prvků (widgetů), které se po několika vcelku kosmetických úpravách používají dodnes. Základem jsou modální a nemodální okna, které je možné (většinou) zvětšovat, zmenšovat i posouvat, do nichž se umisťují další ovládací prvky, především tlačítka, textová pole, textové řádky, rozbalovací výběrové seznamy atd. Po grafické stránce se první modely počítačů Macintosh nijak zvlášť neodlišovaly od obou svých ideových předchůdců. K dispozici byl pouze jediný grafický režim podporující zobrazení monochromatické rastrové mapy o rozlišení 512×342 pixelů (není zvláštní, že všechny tři počítače, na nichž vzniklo a postupně se prosadilo GUI, zobrazovaly pouze monochromatické jednobitové bitmapy, zato s poměrně velkým rozlišením?).

pc75

Obrázek 12: Úvodní obrazovka hry Arkanoid upravená pro Macintoshe nevypadá v monochromatickém grafickém režimu nejhůře.

Tvůrci mikropočítače Macintosh se rozhodli zbavit se nesnadno programovatelných grafických čipů používaných na jiných platformách, zcela vynechali možnosti barevného výstupu (což byl podle některých uživatelů velký krok zpět, a to i v porovnání se starším osmibitovým a v USA velmi oblíbeným Apple II) a namísto toho v operační paměti pouze vyhradili místo pro framebuffer o velikosti cca 21 kB (512×342/8=21888 bajtů), ze kterého si příslušný řídicí čip postupně načítal barvy jednotlivých pixelů – co pixel, to jeden bit.

pc75

Obrázek 13: Aplikace HyperCard představovala poměrně snadno ovladatelné vývojové prostředí, ve které mohli i běžní uživatelé tvořit jednoduché programy.

Grafické uživatelské rozhraní podporované operačním systémem je samozřejmě samo o sobě nedostatečné v případě, že ho korektně nepoužívají aplikační programy. To však (dá se říci že nikdy) nebyl problém počítačů Macintosh, protože již u prvních modelů těchto strojů byly kromě operačního systému již v základní výbavě Macintoshe přítomny i další více či méně úspěšné aplikace, například známý MacPaint (vytvářela se pomocí něho jednobarevná rastrová grafika v pevném (!) rozlišení 576×720 pixelů) a neméně známý MacWrite, neboli textový editor typu WYSIWYG, který ještě po dlouhou dobu zůstával nepřekonán a vlastně sloužil jako vzor pro programátory podobných typů aplikací. Později byly k Macintoshům dodány i další aplikace, například vektorový editor MacDraw. Výše zmíněný program MacPaint byl i přes svoji zdánlivou jednoduchost poměrně oblíbený a i pozdější Photoshop používal prakticky stejné grafické uživatelské rozhraní, i když množstvím funkcí se jednalo o aplikaci zcela jiné kategorie.

pc75

Obrázek 14: Word verze 1.0 vznikl, jak jinak, právě pro Macintosh (souběžně se však vyvíjel i Microsoft Word pro DOS, který však byl koncipovaný zcela odlišně – nejednalo se o skutečný WYSIWYG ale spíše o obdobu WordPerfectu nebo staršího WordStaru).

5. Tajemná zkratka BitBLT

Již v předchozích kapitolách jsme si řekli, že počítač Xerox Alto používal pro zobrazování všech informací na monitoru výhradně rastrovou grafiku, konkrétně se jednalo o černobílé bitmapové obrázky. Při programování grafických rutin pro tento počítač a začleňování vytvářených rutin do operačního systému si autoři programového vybavení uvědomili, že poměrně velkou část již implementovaných funkcí lze zobecnit do jediné operace, která tyto funkce může nahradit. Těmito autory byli Daniel Ingalls, Larry Tesler, Bob Sproull a Diana Merry, kteří svoji zobecněnou rastrovou operaci pojmenovali BitBLT, neboli Bit Block Transfer. První část názvu, tj. slovo Bit naznačuje, že se jedná o operaci prováděnou nad bitmapami (původně, jak již víme z předchozího textu, vytvořených z jednobitových pixelů). Druhá polovina názvu, tj. zkratka BLT, byla odvozena ze jména instrukce pro blokový přenos dat, jenž byla používaná v assembleru počítače DEC PDP-10.

pc75

Obrázek 15: MacWrite pro Macintosh – jeden z prvních WYSIWYG textových editorů.

Pomocí operace BitBLT lze provádět, jak její název naznačuje, blokové přenosy bitmap nebo jejich výřezů, popř. v rámci přenosu nad bitmapami provádět různé operace popsané v další kapitole. První implementace operace BitBLT byla použita v roce 1975 ve Smalltalku-72 a od té doby ji najdeme prakticky v každé implementaci tohoto programovacího jazyka, která obsahuje i knihovny pro práci s grafikou (mj. se jedná i o Squeak, ke kterému se ještě v tomto seriálu vrátíme). Pro Smalltalk-74 vytvořil Daniel Ingalls optimalizovanou variantu operace BitBLT implementovanou v mikrokódu. Operace BitBLT se tak stala součástí operačního systému a bylo ji možné volat jak z assembleru, tak i z programů napsaných v jazyce BCPL a samozřejmě i ze Smalltalku. Posléze se díky své univerzalitě tato funkce rozšířila i do mnoha dalších operačních systémů a grafických knihoven.

Obrázek 16: Část původního kódu operace BitBLT naprogramované Danielem Ingallsem.

6. Rastrové operace prováděné během BitBLT

Operace BitBLT, o níž jsme se zmínili v předchozí kapitole, není určena k pouhému blokovému přenosu bitmap (nebo jejich částí) mezi různými oblastmi operační paměti a framebufferu. Stejně důležité je to, že během přenosu je možné s přenášenými pixely provádět různé (rastrové) operace označované zkratkou ROP (Raster Operation(s)). Některé operační systémy či grafické knihovny umožňují kombinovat pixely ze dvou bitmap – zdrojové (bitmapa, která se přenáší) a cílové (bitmapa, do níž se zapisuje), ovšem obecnější systémy mohou pracovat s bitmapami třemi: kromě zdrojové a cílové bitmapy se zde vyskytuje ještě bitmapa hrající roli masky nebo vzorku. Jedním ze systémů, které dokázaly během blokového přenosu pracovat se třemi bitmapami, patří například Amiga nebo funkce knihovny GDI dostupné přes WinAPI.

pc75

Obrázek 17: MacPaint – rastrový grafický editor, grafické rozhraní i ikony jistě nebudou uživatelům Photoshopu neznámé.

Rastrové operace, které může programátor při zavolání operace BitBLT použít, jsou několika typů. Nejjednodušší operací je vymaskování nebo naopak nastavení všech bitů při blokovém přenosu, což vlastně znamená, že se vybraná obdélníková část zdrojové bitmapy vymaže nebo vyplní konstantní barvou. Taktéž je možné přenést bity ze zdrojové bitmapy v nezměněné podobě, což odpovídá běžnému blokovému přenosu, dále lze provést inverzi bitů, změnit pouze ty pixely, u nichž je v masce (třetí bitmapě) nastaven příslušný bit na jedničku atd. Patnáct nejčastěji prováděných rastrových operací je vypsáno v následující tabulce. Názvy těchto operací odpovídají symbolickým konstantám z WinAPI. Konstanty používané dalšími grafickými knihovnami najdete v osmé kapitole:

Pattern (P):     1 1 1 1 0 0 0 0
Source (S):      1 1 0 0 1 1 0 0
Destination (D): 1 0 1 0 1 0 1 0
                                    Význam ROP        Kód ROP    Symbolické jméno
Výsledek:        0 0 0 0 0 0 0 0    0                 0x000042   BLACKNESS
                 0 0 0 1 0 0 0 1    not (S or D)      0x1100A6   NOTSRCERASE
                 0 0 1 1 0 0 1 1    not S             0x330008   NOTSRCCOPY
                 0 1 0 0 0 1 0 0    S and not D       0x440328   SRCERASE
                 0 1 0 1 0 1 0 1    not D             0x550009   DSTINVERT
                 0 1 0 1 1 0 1 0    P xor D           0x5A0049   PATINVERT
                 0 1 1 0 0 1 1 0    S xor D           0x660046   SRCINVERT
                 1 0 0 0 1 0 0 0    S and D           0x8800C6   SRCAND
                 1 0 1 1 1 0 1 1    not S or D        0xBB0226   MERGEPAINT
                 1 1 0 0 0 0 0 0    P and S           0xC000CA   MERGECOPY
                 1 1 0 0 1 1 0 0    S                 0xCC0020   SRCCOPY
                 1 1 1 0 1 1 1 0    S or D            0xEE0086   SRCPAINT
                 1 1 1 1 0 0 0 0    P                 0xF00021   PATCOPY
                 1 1 1 1 1 0 1 1    P or not S or D   0xFB0A09   PATPAINT
                 1 1 1 1 1 1 1 1    1                 0xFF0062   WHITENESS
pc75

Obrázek 18: MacDraw – vektorový editor pro počítače Macintosh.

7. BitBLT a ROP ve WinAPI a DirectX

Operace BitBLT je v operačním systému Windows, tj. v knihovně GDI dostupné přes WinAPI, implementována hned několika funkcemi. Na začátku je nutné říci, že ve WinAPI jsou rozeznávány dva typy rastrových obrázků – bitmapy kompatibilní s daným kontextem zařízení (obrazovkou, tiskárnou atd.) a bitmapy nezávislé na žádném zařízení (device independent – DI). Práce s bitmapami kompatibilními s vybraným kontextem zařízení je sice rychlejší a navíc zde lze použít všechny funkce pro vysokoúrovňové kreslení, ovšem operace nad jednotlivými pixely (tj. nízkoúrovňové kreslení) je mnohem složitější, protože je nutné dodržet formát používaný vybraným zařízením. Pro přenos bitmap kompatibilních s nějakým zařízením a provádění základních operací nad jednotlivými pixely je určena funkce BitBlt() a v případě, že se má přenášená bitmapa zvětšovat či zmenšovat, lze použít funkci StretchBlt(). Blokový přenos bitmap nezávislých na zařízení (včetně jejich vykreslení, tj. konverzi pixelů mezi různými formáty) zajišťují funkce SetDIBitsToDe­vice() a StretchDIBits().

Obrázek 19: Černobílá grafika počítače Xerox Alto s vybranými prvky jeho GUI.

Rastrové operace je možné definovat pouze u funkcí BitBlt() a StretchBlt(). Tyto funkce umožňují během přenosu kombinovat až tři bitmapy – zdrojovou, cílovou a masku/vzorek (viz též předchozí kapitola). Přitom existuje celkem 256 různých kombinací, z nichž patnácti nejdůležitějším je přiděleno symbolické jméno dostupné v hlavičkovém souboru wingdi.h.

BitBlt(
    hdcDst,   // kontext cílového zařízení (získaný například pro okno)
    xDst,     // levý horní roh, odkud se začne vykreslovat
    yDst,
    cx,       // šířka a výška bitmapy
    cy,
    hdcSrc,   // kontext zdrojového zařízení
    xSrc,     // levý horní roh, odkud se začne s přenosem
    ySrc,
    dwROP     // zvolená rastrová operace
);
StretchBlt(
    hdcDst,   // kontext cílového zařízení
    xDst,     // levý horní roh, odkud se začne vykreslovat
    yDst,
    cxDst,    // šířka a výška bitmapy po vykreslení se změnou měřítka
    cyDst,
    hdcSrc,   // kontext zdrojového zařízení
    xSrc,     // levý horní roh, odkud se začne s přenosem
    ySrc,
    cxSrc,    // šířka a výška zdrojové bitmapy
    cySrc,
    dwROP     // zvolená rastrová operace
);
pc76

Obrázek 20: Macintosh Classic – pohled zepředu.

I v knihovně DirectX (původně v knihovně DirectDraw) existuje funkce odvozená od původní operace BitBLT. Jedná se o metodu třídy IDirectDrawSur­face nazvanou jednoduše Blt, kterou je však možné volat i z „čistého“ céčka přes jméno IDirectDrawSur­face_Blt() (interně se jedná o makro). V této metodě je možné specifikovat jak běžné rastrové operace (pojmenované naprosto stejnými konstantami jako v případě funkcí BitBlt() a StretchBlt() z WinAPI), tak i například rotaci bitmap nebo použití míchání na základě alfa kanálu. Rastrová operace je při volání této funkce uložena ve struktuře LPDDBLTFX (pátý parametr) a použije se pouze v případě, že skupina příznaků dwFlags (čtvrtý parametr) obsahuje nastavený bit DDBLT_ROP:

HRESULT Blt(
    LPRECT lpDestRect,
    LPDIRECTDRAWSURFACE4 lpDDSrcSurface,
    LPRECT lpSrcRect,
    DWORD dwFlags,
    LPDDBLTFX lpDDBltFx
);
pc76

Obrázek 21: Známý obrázek vzniklý raytracingem obsahující 256 barev, který byl použit pro demonstraci grafických schopností počítače Macintosh II. Paradoxní přitom je, že tento obrázek vznikl renderingem na superpočítači Cray, nikoli na samotném Macintoshi.

8. Rastrové operace v knihovnách GDK a Qt

Obdobu operace BitBLT můžeme najít i ve známých knihovnách GDK a Qt, které obsahují hned několik funkcí pro práci s bitmapami různých typů. V těchto knihovnách lze definovat rastrovou operaci i při vykreslování různých grafických entit, tedy nejenom bitmap, což je samozřejmě obecnější řešení. V knihovně GDK jsou definovány následující rastrové operace (viz též soubor /usr/include/gtk-verze/gdk/gdkty­pes.h):

Konstanta ROP Význam
GDK_COPY dst = src
GDK_INVERT dst = NOT dst
GDK_XOR dst = src XOR dst
GDK_CLEAR dst = 0
GDK_AND dst = dst AND src
GDK_AND_REVERSE dst = src AND (NOT dst)
GDK_AND_INVERT dst = (NOT src) AND dst
GDK_NOOP dst = dst
GDK_OR dst = src OR dst
GDK_EQUIV dst = (NOT src) XOR dst
GDK_OR_REVERSE dst = src OR (NOT dst)
GDK_COPY_INVERT dst = NOT src
GDK_OR_INVERT dst = (NOT src) OR dst
GDK_NAND dst = (NOT src) OR (NOT dst)
GDK_NOR dst = (NOT src) AND (NOT dst)
GDK_SET dst = 1

Jednotlivé konstanty uvedené v předchozí tabulce jsou jednoduše definovány ve výčtu:

typedef enum
{
    GDK_COPY,
    GDK_INVERT,
    GDK_XOR,
    GDK_CLEAR,
    GDK_AND,
    GDK_AND_REVERSE,
    GDK_AND_INVERT,
    GDK_NOOP,
    GDK_OR,
    GDK_EQUIV,
    GDK_OR_REVERSE,
    GDK_COPY_INVERT,
    GDK_OR_INVERT,
    GDK_NAND,
    GDK_NOR,
    GDK_SET
} GdkFunction;
pc76

Obrázek 22: Macintosh LC III – pohled na základní desku.

CS24_early

Obdobné rastrové operace můžeme najít i v knihovně Qt:

Konstanta ROP Význam ROP
Qt::CopyROP dst = src
Qt::OrROP dst = src OR dst
Qt::XorROP dst = src XOR dst
Qt::NotAndROP dst = (NOT src) AND dst
Qt::EraseROP an alias for NotAndROP
Qt::NotCopyROP dst = NOT src
Qt::NotOrROP dst = (NOT src) OR dst
Qt::NotXorROP dst = (NOT src) XOR dst
Qt::AndROP dst = src AND dst
Qt::NotEraseROP an alias for AndROP
Qt::NotROP dst = NOT dst
Qt::ClearROP dst = 0
Qt::SetROP dst = 1
Qt::NopROP dst = dst
Qt::AndNotROP dst = src AND (NOT dst)
Qt::OrNotROP dst = src OR (NOT dst)
Qt::NandROP dst = NOT (src AND dst)
Qt::NorROP dst = NOT (src OR dst)
pc76

Obrázek 23: Macintosh TV, tj. počítač vybavený televizní kartou, se od svých kolegů odlišuje především tmavým odstínem své skříně. Naprostá většina ostatních Macintoshů používala (takřka) shodný světlý odstín.

9. Odkazy na Internetu

  1. Ivan Sutherland's Sket­chpad
    http://www.you­tube.com/watch?v=mOZ­qRJzE8×g
  2. Sketchpad (in Vision and Reality of Hypertext and Graphical User Interfaces)
    http://www.mpro­ve.de/diplom/tex­t/3.1.2_sketchpad­.html
  3. Sketchpad
    http://en.wiki­pedia.org/wiki/Sket­chpad
  4. The Early History of Smalltalk
    http://gagne.ho­medns.org/~tgag­ne/contrib/Ear­lyHistoryST.html
  5. History of special effects
    http://www.pbs­.org/wgbh/nova/spe­cialfx2/1960.html
  6. Scratch Lowers Resistance to Programming
    http://www.wi­red.com/gadge­tlab/2009/03/scrat­ch-lowers/
  7. Squeak FAQ
    http://wiki.squ­eak.org/squeak/471
  8. Learning Squeak
    http://c2.com/cgi/wi­ki?LearningSqu­eak
  9. Scratch home page
    http://scratch­.mit.edu/
  10. Scratch (programming language)
    http://en.wiki­pedia.org/wiki/Scrat­ch_(programmin­g_language)
  11. Squeak home page
    http://www.squ­eak.org/
  12. XO: The Children's Machine
    http://wiki.lap­top.org/go/The_Chil­dren's_Machine
  13. WIMP (computing)
    http://en.wiki­pedia.org/wiki/WIM­P_(computing)
  14. Xerox Star
    http://en.wiki­pedia.org/wiki/Xe­rox_Star
  15. The Xerox Star 8010 „Dandelion“
    http://www.di­gibarn.com/co­llections/sys­tems/xerox-8010/index.html
  16. Graphical user interface (Wikipedia)
    http://en.wiki­pedia.org/wiki/Grap­hical_user_in­terface
  17. The Real History of the GUI
    http://articles­.sitepoint.com/ar­ticle/real-history-gui
  18. PARC company (Wikipedia)
    http://en.wiki­pedia.org/wiki/PAR­C_(company)
  19. Computer-History: Xerox Alto
    http://www.mr-gadget.de/apple/2004–01–15/computer-history-xerox-alto
  20. bitsavers.org
    http://www.bit­savers.org/
  21. Dokumenty k počítači Xerox Alto na bitsavers.org
    http://www.bit­savers.org/pdf/xe­rox/alto/
  22. The ALTO Computer
    http://www.ma­niacworld.com/al­to-computer-video.html
  23. Xerox Alto Operating System and Alto Applications
    http://www.di­gibarn.com/co­llections/sof­tware/alto/in­dex.html
  24. Xerox Alto (Wikipedia)
    http://en.wiki­pedia.org/wiki/Xe­rox_Alto
  25. BitBLT routines (1975)
    http://www.bit­savers.org/pdf/xe­rox/alto/BitBLT_Nov1975­.pdf
  26. Alto Computer Screenshots
    http://www.bit­savers.org/pdf/xe­rox/alto/AltoS­creenshots.pdf
  27. BitBlt in Squeak
    http://wiki.squ­eak.org/squeak/189
  28. Bitmaps, Device Contexts and BitBlt
    http://www.win­prog.org/tuto­rial/bitmaps.html
  29. BitBlt Game Programming Tutorial
    http://www.fre­evbcode.com/Show­Code.asp?ID=3677
  30. Bit blit (Wikipedia)
    http://en.wiki­pedia.org/wiki/Bit­BLT
  31. IDirectDrawSur­face5::Blt
    http://msdn.mi­crosoft.com/en-us/library/ms929681­.aspx
  32. The Xerox Alto
    http://toasty­tech.com/guis/al­to3.html
  33. History of the graphical user interface
    http://en.wiki­pedia.org/wiki/His­tory_of_the_gr­aphical_user_in­terface

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.