Obsah
1. Práce s rastrovými obrázky v knihovně OpenVG
2. Vykreslovací pipeline implementovaná v knihovně OpenVG
3. Jednotlivé operace prováděné ve vykreslovací pipeline
5. Formáty RGB (pixely bez průhlednosti)
6. Formáty RGBA (pixely s průhledností)
7. Speciální formáty (černobílý obrázek, obrázek ve stupních šedi atd.)
8. Základní funkce určené pro operace s rastrovými obrázky
9. Vytvoření obrázku – funkce vgCreateImage()
10. Odstranění obrázku – funkce vgDestroyImage()
11. Smazání vybraného regionu – funkce vgClearImage()
12. Zápis pixelů do rastrového obrázku – funkce vgImageSubData()
13. Přečtení pixelů z rastrového obrázku – funkce vgGetImageSubData()
14. Vykreslení rastrového obrázku – funkce vgDrawImage()
1. Práce s rastrovými obrázky v knihovně OpenVG
V knihovně OpenVG se pracuje se dvěma velmi odlišnými typy 2D objektů. Prvním typem 2D objektů jsou cesty (paths), kterým jsme se již podrobně věnovali v předchozích třech částech tohoto seriálu a druhým typem 2D objektů jsou rastrové obrázky (bitmapy, pixmapy). V knihovně OpenVG je možné provádět následující operace nad rastrovými obrázky:
- Vytvoření nového objektu typu obrázek (VGImage) se zvoleným formátem.
- Zrušení obrázku a jeho následné odstranění z paměti GPU.
- Vytvoření podobrázku (child image)
- Vykreslení obrázku na aktuální kreslicí plochu.
- Vymazání zvoleného regionu (osově orientovaného obdélníku) v obrázku.
- Přečtení všech pixelů ve zvoleném regionu (osově orientovaného obdélníku).
- Zápis všech pixelů do zvoleného regionu (osově orientovaného obdélníku).
- Kopie dat mezi dvěma obrázky popř. provedení konverze pixelů.
- Přenos pixelů mezi obrázkem a kreslicí plochou.
Jednotlivé operace si postupně popíšeme v navazujících kapitolách.
Co v OpenVG naopak nenajdeme:
- Funkce pro načítání a ukládání obrázků z rastrových formátů (GIF, PNG, JPEG, BMP…).
- Funkce pro DCT, filtraci, aplikaci barvové palety apod.
2. Vykreslovací pipeline implementovaná v knihovně OpenVG
S principem činnosti vykreslovací pipeline jsme se sice již ve stručnosti seznámili v článku obsahujícím stručný přehled grafických knihoven určených (nejenom) pro jednodeskové mikropočítače Raspberry Pi, ovšem některé probíhající operace, zejména pak operace týkající se práce s rastrovými obrázky, je vhodné si dnes popsat podrobněji. Podívejme se nyní na typický způsob realizace vykreslovací pipeline v knihovně OpenVG, protože způsob postupné aplikace jednotlivých operací v pipeline vlastně přímo určuje, jakým způsobem se budou jednotlivé grafické prvky vykreslovat.
Vykreslování probíhá v několika krocích popsaných v navazující kapitole, které mohou být skutečně prováděny v pipeline za účelem urychlení vykreslování, při softwarové implementaci však pravděpodobně budou prováděny sekvenčně (z principu činnosti hardwarové pipeline implementované v GPU samozřejmě vyplývá, že jakmile je jedna operace vykonána nad jednou sadou dat, může se začít vykonávat nad další sadou, takže vlastně všechny operace probíhají současně, i když nad jinými částmi renderovaného obrazu a nad odlišnými vstupními daty).
Všech osm operací prováděných ve vykreslovací pipeline je zobrazeno v tomto dokumentu.
3. Jednotlivé operace prováděné ve vykreslovací pipeline
- Na vstupu do vykreslovací pipeline se nachází informace o dvourozměrných grafických objektech, které se mají vykreslit. Jedná se především o cesty (path), s nimiž jsme se seznámili v předchozích třech článcích [1] [2] [3], informace o lineárních transformacích, které se mají provést (transformation), informace o štětcích použitých při vykreslování (stroke) a konečně informace o způsobu vykreslení výplně uzavřených křivek resp. cest (paint).
- Prvním krokem je aplikace štětců (stroke) na cesty (path). Výsledkem této operace je datová struktura popisující vrcholy mnohoúhelníků, které budou následně při vlastní rasterizaci pospojovány. Pokud se má například vykreslit široká úsečka, vznikne aplikací štětce úzký obdélník. V případě čárkované úsečky pak sekvence obdélníků. V průběhu této operace se samozřejmě berou v úvahu i styly štětce, tj. případné zaoblení konců cesty a zakulacení všech zlomů. Je dobré si uvědomit, že tato operace není příliš rychlá, zejména ve chvíli, kdy jsou použity kruhové a eliptické oblouky či Bézierovy křivky.
- V dalším kroku následuje transformace souřadnic vrcholů na základě vstupních informací (transformačních matic). Transformovány jsou samozřejmě vrcholy vypočtené v předchozím kroku, tj. nikoli vrcholy původní cesty zadané uživatelem/programátorem, ale vrcholy popisující obrysy cesty. Pod pojmem transformace si můžeme představit především posun, změnu měřítka či otočení (popř. kombinaci těchto transformací). Transformovány jsou i obrysy rastrových obrázků, což je téma, které nás dnes zajímá.
- V dalším kroku je prováděna takzvaná rasterizace, tj. převod geometrického tvaru představujícího obrys cesty na pixely. My jsme se již s rasterizací setkali dříve, a to konkrétně při implementaci algoritmů určených pro vykreslování úseček. Ovšem vzhledem k podpoře složitějších tvarů a zejména kvůli dosažení lepší kvality výsledného obrázku v OpenVG jsou zde implementované rasterizační algoritmy složitější (v pozdějších krocích se volitelně provádí i antialiasing pro zmenšení viditelnosti „schodků“ šikmých úseček). Navíc se rasterizace nemusí provádět přímo do framebufferu, ale například do bitmapy uložené v paměti GPU (to z toho důvodu, aby bylo možné jednoduše a poměrně přímočaře aplikovat další tři kroky vykreslovací pipeline).
- Již během rasterizace, popř. v navazujícím kroku, se provádí ořezání (clipping a scissoring) a popř. maskování (masking), opět na základě údajů získaných z uživatelské aplikace (ořezové obdélníky, bitová maska apod.). Ořezání je nejdříve provedeno takovým způsobem, aby se odstranily fragmenty ležící mimo vykreslovací plochu (typicky obrazovku). Současně je možné provést další ořezání, a to s využitím takzvaných ořezových obdélníků (scissoring rectangles), kterých může uživatel zadat větší množství a vytvořit z nich popř. i složitější tvar.
- Následuje případná výplň uzavřených tvarů (paint). Nejjednodušší výplní je konstantní barva (to jsme si již ukázali v několika demonstračních příkladech), lze však použít i složitější styl výplně, včetně gradientních přechodů a textur.
- Při některých operacích s rastrovými obrázky je nutné aplikovat (bilineární) interpolaci. Jedná se zejména o zvětšení, zmenšení či otočení obrázku před jeho vykreslením do framebufferu. Tuto důležitou operaci si vysvětlíme dále.
- Poslední prováděnou operací je blending, tj. aplikace nějaké funkce (například lineární interpolace) na barvy pixelů ve zdrojovém obrázku (získaném rasterizací a vyplněním uzavřených ploch) a v obrázku cílovém (což může být například framebuffer).
4. Rastrové obrázky v OpenVG
V pojetí knihovny OpenVG nejsou rastrové obrázky nic jiného než obdélníková mřížka tvořená jednotlivými pixely s přidanými metainformacemi (rozměry bitmapy, formát atd.). Pixely nemusí v paměti tvořit kontinuální region, protože mezi jednotlivými obrazovými řádky mohou být vytvořeny mezery (stride). Formát jednotlivých pixelů je volitelný – k dispozici je několik dostupných formátů, i když například obrázky s barvovou paletou zde nenajdeme. Mnoho formátů pixelů je vytvořeno takovým způsobem, že je každému pixelu přiřazena i průhlednost (alfa kanál). Ovšem formát pixelů popsaný ve specifikaci (a taktéž v navazujících kapitolách) se projevuje „pouze“ při čtení či zápisu pixelů do obrázku. Naproti tomu interní formát uložení pixelů (a vlastně i celých bitmap) použitý v paměti GPU není nikde specifikován, takže se tvůrci každé implementace mohou sami rozhodnout, jakým způsobem se budou obrázky ukládat do obrazové paměti. Případné konverze však musí probíhat beze ztráty kvality, což je mj. kontrolováno akceptačními testy každé implementace.
5. Formáty RGB (pixely bez průhlednosti)
V první skupině formátů pixelů nalezneme takové formáty, v nichž není použit alfa kanál. K dispozici je celkem deset alternativ, přičemž první dva formáty mají 16 bitů na pixel (bpp), takže barvová složka R a B využívá pět bitů a barvová složka G šest bitů (vyšší citlivost oka v této frekvenční oblasti). Dalších osm formátů již používá pro každou barvovou složku osm bitů, přičemž zbývajících osm bitů do 32 bitového slova je nevyužito (může v nich být zapsáno cokoli, ale tyto hodnoty se nijak neinterpretují). Formáty začínající na VG_s využívají nelineární barvový prostor sRGB (převod mezi lineárními složkami a složkami nelineárními je popsán zde) zatímco formáty začínající na VG_l používají lineární RGB – zde tedy záleží na tom, jak jsou reprezentována vstupní data a zda se neprovádí konverze již při jejich načítání (libpng atd.):
# | Konstanta | Bitů/pixel | Další vlastnosti |
---|---|---|---|
1 | VG_sRGB565 | 16 | nelineární barvový prostor sRGB |
2 | VG_sBGR565 | 16 | nelineární barvový prostor sRGB |
3 | VG_sRGBX_8888 | 32 | nelineární barvový prostor sRGB |
4 | VG_lRGBX_8888 | 32 | lineární barvový prostor |
5 | VG_sXRGB_8888 | 32 | nelineární barvový prostor sRGB |
6 | VG_lXRGB_8888 | 32 | lineární barvový prostor |
7 | VG_sBGRX_8888 | 32 | nelineární barvový prostor sRGB |
8 | VG_lBGRX_8888 | 32 | lineární barvový prostor |
9 | VG_sXBGR_8888 | 32 | nelineární barvový prostor sRGB |
10 | VG_lXBGR_8888 | 32 | lineární barvový prostor |
6. Formáty RGBA (pixely s průhledností)
Dalších 24 formátů je navrženo takovým způsobem, že se u každého pixelu kromě barvových složek R, G a B používá i alfa kanál, ať již plnohodnotný 4bitový či 8bitový alfa kanál či jen jednobitová informace o průhlednosti pixelu (0 nebo 1, resp. 0% nebo 100%). Těchto 24 formátů vlastně vzniklo kombinací čtyř parametrů:
- Lineární prostor RGB nebo sRGB: VG_s/VG_l
- Uložení složek v pořadí RGBA/ARGB/BGRA/ABGR
- Počet bitů: 8+8+8+8, 5+5+5+1 (zde je alfa kanál jen jednobitový), 4+4+4+4
- Zda jsou barvové složky dopředu vynásobeny alfa hodnotou: (R, G, B, α) versus (α* R, α* G, α* B, α)
Povšimněte si, že koncovka _PRE je použita pouze u formátů, v nichž jsou všechny tři barvové složky reprezentovány osmi bity (stejně jako alfa kanál):
# | Konstanta | Bitů/pixel | Další vlastnosti |
---|---|---|---|
1 | VG_sRGBA_8888 | 32 | |
2 | VG_sRGBA_8888_PRE | 32 | složky R, G, B jsou vynásobeny hodnotou α |
3 | VG_sRGBA_5551 | 16 | jednobitový alfa kanál |
4 | VG_sRGBA_4444 | 16 | všechny složky mají pouze čtyři bity (12bitová hloubka) |
5 | VG_lRGBA_8888 | 32 | |
6 | VG_lRGBA_8888_PRE | 32 | složky R, G, B jsou vynásobeny hodnotou α |
7 | VG_sARGB_8888 | 32 | |
8 | VG_sARGB_8888_PRE | 32 | složky R, G, B jsou vynásobeny hodnotou α |
9 | VG_sARGB_1555 | 16 | jednobitový alfa kanál |
10 | VG_sARGB_4444 | 16 | všechny složky mají pouze čtyři bity (12bitová hloubka) |
11 | VG_lARGB_8888 | 32 | |
12 | VG_lARGB_8888_PRE | 32 | složky R, G, B jsou vynásobeny hodnotou α |
13 | VG_sBGRA_8888 | 32 | |
14 | VG_sBGRA_8888_PRE | 32 | složky R, G, B jsou vynásobeny hodnotou α |
15 | VG_sBGRA_5551 | 16 | jednobitový alfa kanál |
16 | VG_sBGRA_4444 | 16 | všechny složky mají pouze čtyři bity (12bitová hloubka) |
17 | VG_lBGRA_8888 | 32 | |
18 | VG_lBGRA_8888_PRE | 32 | složky R, G, B jsou vynásobeny hodnotou α |
19 | VG_sABGR_8888 | 32 | |
20 | VG_sABGR_8888_PRE | 32 | složky R, G, B jsou vynásobeny hodnotou α |
21 | VG_sABGR_1555 | 16 | jednobitový alfa kanál |
22 | VG_sABGR_4444 | 16 | všechny složky mají pouze čtyři bity (12bitová hloubka) |
23 | VG_lABGR_8888 | 32 | |
24 | VG_lABGR_8888_PRE | 32 | složky R, G, B jsou vynásobeny hodnotou α |
7. Speciální formáty (černobílý obrázek, obrázek ve stupních šedi atd.)
Posledních šest dostupných formátů pixelů je možné rozdělit na tři skupiny. Nejjednodušší je formát VG_BW1 pro specifikaci černobílých obrázků (0=černý pixel, 1=bílý pixel), následují dva formáty pixelů reprezentujících stupně šedi (dostupná je ovšem pouze osmibitová hloubka) a speciální použití mají formáty obsahující pouze alfa kanál. Takové obrázky je možné použít například pro ztmavení části 2D scény, pro poloprůhlednou výplň cest atd.:
# | Konstanta | Bitů/pixel | Další vlastnosti |
---|---|---|---|
1 | VG_BW1 | 1 | černobílý obrázek |
2 | VG_sL8 | 8 | stupně šedi (grayscale) |
3 | VG_lL8 | 8 | stupně šedi (grayscale) |
4 | VG_A1 | 1 | pouze alfa kanál |
5 | VG_A4 | 4 | pouze alfa kanál |
6 | VG_A8 | 8 | pouze alfa kanál |
Poznámka: pokud máte na vstupu aplikace obrázky s barvovou paletou, jsou případné konverze ponechány na samotných programátorech aplikace či na vývojářích pomocných knihoven (libpng, …). Tuto problematiku OpenVG vůbec neřeší.
8. Základní funkce určené pro operace s rastrovými obrázky
V následujících šesti kapitolách si ve stručnosti popíšeme šest základních funkcí určených pro práci s rastrovými obrázky. Dovolím si říci, že pro většinu aplikací postačuje znát pouze těchto šest funkcí, i když knihovna OpenVG ve skutečnosti nabízí i další funkce (které budou popsány příště). Mezi základní šestici patří:
- Vytvoření nového obrázku: vgCreateImage().
- Zrušení obrázku a jeho následné odstranění z paměti GPU: vgDestroyImage().
- Vymazání zvoleného regionu (obdélníku): vgClearImage().
- Zápis všech pixelů do zvoleného regionu: vgImageSubData().
- Přečtení všech pixelů ve zvoleném regionu: vgGetImageSubData().
- Vykreslení obrázku na aktuální kreslicí plochu: vgDrawImage().
9. Vytvoření obrázku – funkce vgCreateImage()
První operací při práci s rastrovými obrázky je (pochopitelně) jejich vytvoření, o což se stará funkce:
VGImage vgCreateImage( VGImageFormat format, VGint width, VGint height, VGbitfield allowedQuality);
Této funkci se předávají čtyři parametry:
# | Parametr | Význam |
---|---|---|
1 | format | jedna ze symbolických konstant popsaných v předchozích kapitolách |
2 | width | šířka v pixelech, musí být menší než VG_MAX_IMAGE_WIDTH |
3 | height | výška v pixelech, musí být menší než VG_MAX_IMAGE_HEIGHT |
4 | allowedQuality | VG_IMAGE_QUALITY_NONANTIALIASED kombinované s VG_IMAGE_QUALITY_FASTER či VG_IMAGE_QUALITY_BETTER |
Poslední parametr ovlivňuje všechny operace, při nichž dochází k rotaci či ke změně měřítka bitmapy. Pokud je zaručeno mapování pixelů na obrazovku 1:1, nemá tento parametr žádný vliv.
Vrácena je hodnota typu VGImage, která je použita ve všech dalších pěti funkcích.
Povšimněte si, že se skutečně pouze vytvoří nový obrázek, ale zatím se do něj nezapisují žádné pixely. Je to podobné situaci s cestami – tam se taktéž nejprve vytvořila prázdná cesta, do níž se dalšími funkcemi mohly přidat nové segmenty.
10. Odstranění obrázku – funkce vgDestroyImage()
Opakem funkce vgCreateImage() je podle očekávání funkce vgDestroyImage(), která celý obrázek odstraní z paměti GPU. Ovšem ve chvíli, kdy je obrázek používán jiným objektem (cíl pro vykreslování, obrázek použitý pro vyplnění uzavřených cest atd.), dojde k jeho skutečnému uvolnění až ve chvíli, kdy jsou uvolněny i na obrázek navázané objekty (interně se tedy pro každý obrázek pamatuje příznak „může být automaticky odstraněn“):
void vgDestroyImage( VGImage image);
# | Parametr | Význam |
---|---|---|
1 | image | reference na obrázek vytvořený funkcí vgCreateImage |
11. Smazání vybraného regionu – funkce vgClearImage()
Pokud je zapotřebí vymazat nějaký region v obrázku konstantní barvou, je možné pro tuto operaci použít funkci vgClearImage(). Tato funkce použije barvu nastavenou parametrem VG_CLEAR_COLOR a region, který se má vymazat, je specifikován osově orientovaným obdélníkem začínajícím na souřadnicích [x,y], jehož strany mají délku width a height. Vymazání je samozřejmě rychlejší než přenos (konstantních) pixelů::
void vgClearImage( VGImage image, VGint x, VGint y, VGint width, VGint height)
# | Parametr | Význam |
---|---|---|
1 | image | reference na obrázek vytvořený funkcí vgCreateImage |
2 | x | x-ová souřadnice vrcholu obdélníka |
3 | y | y-ová souřadnice vrcholu obdélníka |
4 | width | šířka obdélníka |
5 | height | výška obdélníka |
Barvu pro vymazání lze nastavit takto:
/* vymazani casti obrazku cernou barvou */ VGfloat color1[4] = {0.0f, 0.0f, 0.0f, 1.0f}; vgSetfv(VG_CLEAR_COLOR, 4, color1);
12. Zápis pixelů do rastrového obrázku – funkce vgImageSubData()
Pro zápis pixelů z operační paměti do obrázku se používá funkce pojmenovaná vgImageSubData(). Ve skutečnosti se při zápisu mohou provádět i transformace pixelů mezi různými reprezentacemi. Knihovna OpenVG totiž ví, jaký je formát již vytvořeného obrázku a ve funkci vgImageSubData se specifikuje formát zapisovaných pixelů, takže všechny údaje nutné pro konverzi jsou k dispozici. Dalším důležitým parametrem je parametr dataStride, kterým lze specifikovat mezery mezi jednotlivými obrazovými řádky (stride). Pozor na to, že některé jiné knihovny používají namísto hodnoty stride hodnotu pitch, což je ve skutečnosti offset mezi obrazovými řádky: pitch=width+stride. Povšimněte si, že lze zapisovat jen do zvoleného regionu:
void vgImageSubData( VGImage image, const void *data, VGint dataStride, VGImageFormat dataFormat, VGint x, VGint y, VGint width, VGint height)
# | Parametr | Význam |
---|---|---|
1 | image | reference na obrázek vytvořený funkcí vgCreateImage |
2 | data | ukazatel na zdrojová data pixelů uložených v operační paměti |
3 | dataStride | mezery mezi obrazovými řádky (na vstupu), hodnota je v bajtech |
4 | dataFormat | vstupní formát pixelů, jedna ze symbolických konstant popsaných v předchozích kapitolách |
5 | x | x-ová souřadnice vrcholu obdélníka |
6 | y | y-ová souřadnice vrcholu obdélníka |
7 | width | šířka obdélníka |
8 | height | výška obdélníka |
Jak tedy zobrazit nějaký obrázek?
- Načtení obrázku z externího souboru
- Vytvoření nového objektu typu VGImage funkcí vgCreateImage
- Zápis pixelů do objektu typu VGImage funkcí vgImageSubData
- Vlastní vykreslení funkcí vgDrawPath
13. Přečtení pixelů z rastrového obrázku – funkce vgGetImageSubData()
Opakem funkce vgImageSubData je funkce nazvaná vgGetImageSubData určená pro čtení pixelů z obrázku typu VGImage, konverzi dat (pixelů) a následné uložení konvertovaných dat do zvolené oblasti operační paměti:
void vgGetImageSubData( VGImage image, void *data, VGint dataStride, VGImageFormat dataFormat, VGint x, VGint y, VGint width, VGint height);
# | Parametr | Význam |
---|---|---|
1 | image | reference na obrázek vytvořený funkcí vgCreateImage |
2 | data | region v operační paměti, o jehož alokaci se musí postarat programátor |
3 | dataStride | mezery mezi obrazovými řádky (na výstupu), hodnota je v bajtech |
4 | dataFormat | výstupní formát pixelů, jedna ze symbolických konstant popsaných v předchozích kapitolách |
5 | x | x-ová souřadnice vrcholu obdélníka |
6 | y | y-ová souřadnice vrcholu obdélníka |
7 | width | šířka obdélníka |
8 | height | výška obdélníka |
14. Vykreslení rastrového obrázku – funkce vgDrawImage()
Poslední dnes popisovaná funkce se jmenuje vgDrawImage() a jak již její název napovídá, slouží tato funkce k vykreslení obrázku na aktivní kreslicí plochu (surface). Chování této funkce je tedy do jisté míry podobné funkci vgDrawPath() – ani zde se totiž nespecifikuje cíl vykreslování. Obrázek může být vykreslen třemi způsoby: jako skutečný obrázek (jedná se tedy o operaci typu BitBLT), zapisované barvy pixelů se mohou násobit s nastavenou barvou (takto lze vykreslit poloprůhledný obrázek atd.) a dokonce je možné obrázek (pixely) použít jako masku (stencil) při vykreslování cest:
void vgDrawImage( VGImage image);
# | Parametr | Význam |
---|---|---|
1 | image | reference na obrázek vytvořený funkcí vgCreateImage |
Poznámka: všech šest dnes popisovaných funkcí bude příště použito v demonstračních příkladech.
15. Odkazy na Internetu
- So What's the Big Deal with Horizontal and Vertical Bezier Handles Anyway? (pro grafiky)
http://theagsc.com/blog/tutorials/so-whats-the-big-deal-with-horizontal-vertical-bezier-handles-anyway/ - EGL quick reference card
https://www.khronos.org/files/egl-1–4-quick-reference-card.pdf - EGL Reference Pages Index
https://www.khronos.org/registry/egl/sdk/docs/man/html/indexflat.php - Funkce eglInitialize
https://www.khronos.org/registry/egl/sdk/docs/man/html/eglInitialize.xhtml - Funkce eglGetDisplay
https://www.khronos.org/registry/egl/sdk/docs/man/html/eglGetDisplay.xhtml - Funkce eglGetConfigs
https://www.khronos.org/registry/egl/sdk/docs/man/html/eglGetConfigs.xhtml - Funkce eglGetConfigAttrib
https://www.khronos.org/registry/egl/sdk/docs/man/html/eglGetConfigAttrib.xhtml - Funkce eglDestroySurface
https://www.khronos.org/registry/egl/sdk/docs/man/html/eglDestroySurface.xhtml - Funkce eglDestroyContext
https://www.khronos.org/registry/egl/sdk/docs/man/html/eglDestroyContext.xhtml - Funkce eglTerminate
https://www.khronos.org/registry/egl/sdk/docs/man/html/eglTerminate.xhtml - Khronos Native Platform Graphics Interface
https://www.khronos.org/registry/egl/specs/eglspec.1.4.pdf - Khronos Group
https://www.khronos.org/ - Khronos Group (Wikipedia)
https://en.wikipedia.org/wiki/Khronos_Group - Raspberry Pi VideoCore APIs
http://elinux.org/Raspberry_Pi_VideoCore_APIs - Programming AudioVideo on the Raspberry Pi GPU
https://jan.newmarch.name/RPi/index.html - The Standard for Vector Graphics Acceleration
https://www.khronos.org/openvg/ - OpenVG (Wikipedia)
https://en.wikipedia.org/wiki/OpenVG - OpenVG Quick Reference Card
https://www.khronos.org/files/openvg-quick-reference-card.pdf - OpenVG on the Raspberry Pi
http://mindchunk.blogspot.cz/2012/09/openvg-on-raspberry-pi.html - ShivaVG: open-source ANSI C OpenVG
http://ivanleben.blogspot.cz/2007/07/shivavg-open-source-ansi-c-openvg.html - Testbed for exploring OpenVG on the Raspberry Pi
https://github.com/ajstarks/openvg - Programovací jazyky a knihovny určené pro výuku základů počítačové grafiky: knihovna Pygame
http://mojefedora.cz/programovaci-jazyky-a-knihovny-urcene-pro-vyuku-zakladu-pocitacove-grafiky-knihovna-pygame/ - Programovací jazyky a knihovny určené pro výuku základů počítačové grafiky: knihovna Pygame prakticky
http://mojefedora.cz/programovaci-jazyky-a-knihovny-urcene-pro-vyuku-zakladu-pocitacove-grafiky-knihovna-pygame-prakticky/ - Programovací jazyky a knihovny určené pro výuku základů počítačové grafiky: práce s bitmapami a TrueType fonty
http://mojefedora.cz/programovaci-jazyky-a-knihovny-urcene-pro-vyuku-zakladu-pocitacove-grafiky-prace-s-bitmapami-a-truetype-fonty/ - Programovací jazyky a knihovny určené pro výuku základů počítačové grafiky: sprity v knihovně Pygame
http://mojefedora.cz/programovaci-jazyky-a-knihovny-urcene-pro-vyuku-zakladu-pocitacove-grafiky-sprity-v-knihovne-pygame/ - Programovací jazyky a knihovny určené pro výuku základů počítačové grafiky: detekce kolize spritů
http://mojefedora.cz/programovaci-jazyky-a-knihovny-urcene-pro-vyuku-zakladu-pocitacove-grafiky-detekce-kolize-spritu/ - Programovací jazyky a knihovny určené pro výuku základů počítačové grafiky: transformace rastrových obrázků
http://mojefedora.cz/programovaci-jazyky-a-knihovny-urcene-pro-vyuku-zakladu-pocitacove-grafiky-transformace-rastrovych-obrazku/ - Seriál Grafické karty a grafické akcelerátory
http://www.root.cz/serialy/graficke-karty-a-graficke-akceleratory/ - Grafika na osmibitových počítačích firmy Sinclair II
http://www.root.cz/clanky/grafika-na-osmibitovych-pocitacich-firmy-sinclair-ii/ - Xiaolin_Wu's Line Algorithm
https://en.wikipedia.org/wiki/Xiaolin_Wu's_line_algorithm - Grafické čipy v osmibitových počítačích Atari
http://www.root.cz/clanky/graficke-cipy-v-osmibitovych-pocitacich-atari/ - Osmibitové počítače Commodore a čip VIC-II
http://www.root.cz/clanky/osmibitove-pocitace-commodore-a-cip-vic-ii/ - Grafika na osmibitových počítačích firmy Apple
http://www.root.cz/clanky/grafika-na-osmibitovych-pocitacich-firmy-apple/ - Počátky grafiky na PC: grafické karty CGA a Hercules
http://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/ - Karta EGA: první použitelná barevná grafika na PC
http://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/ - Grafické karty MCGA a VGA
http://www.root.cz/clanky/graficke-karty-mcga-a-vga/ - Grafický subsystém počítačů Amiga
http://www.root.cz/clanky/graficky-subsystem-pocitacu-amiga/ - Grafický subsystém počítačů Amiga II
http://www.root.cz/clanky/graficky-subsystem-pocitacu-amiga-ii/ - Raspberry Pi pages
https://www.raspberrypi.org/ - BCM2835 registers
http://elinux.org/BCM2835_registers - VideoCore (archiv stránek společnosti Alphamosaic)
http://web.archive.org/web/20030209213838/www.alphamosaic.com/videocore/ - VideoCore (Wikipedia)
https://en.wikipedia.org/wiki/Videocore - RPi lessons: Lesson 6 Screen01
http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/screen01.html - Raspberry Pi forum: Bare metal
https://www.raspberrypi.org/forums/viewforum.php?f=72 - C library for Broadcom BCM 2835 as used in Raspberry Pi
http://www.airspayce.com/mikem/bcm2835/ - Raspberry Pi Hardware Components
http://elinux.org/RPi_Hardware#Components - (Linux) Framebuffer
http://wiki.linuxquestions.org/wiki/Framebuffer - (Linux) Framebuffer HOWTO
http://tldp.org/HOWTO/Framebuffer-HOWTO/ - Linux framebuffer (Wikipedia)
https://en.wikipedia.org/wiki/Linux_framebuffer - RPi Framebuffer
http://elinux.org/RPi_Framebuffer - HOWTO: Boot your Raspberry Pi into a fullscreen browser kiosk
http://blogs.wcode.org/2013/09/howto-boot-your-raspberry-pi-into-a-fullscreen-browser-kiosk/ - Zdrojový kód fb.c pro RPI
https://github.com/jncronin/rpi-boot/blob/master/fb.c - RPiconfig
http://elinux.org/RPi_config.txt - Mailbox framebuffer interface
https://github.com/raspberrypi/firmware/wiki/Mailbox-framebuffer-interface - Seriál Grafické formáty
http://www.root.cz/serialy/graficke-formaty/ - Vykreslovací pipeline OpenVG (schéma)
https://www.khronos.org/assets/uploads/apis/openvg_pipeline1.jpg - sRGB
https://cs.wikipedia.org/wiki/SRGB