Práce s rastrovými obrázky v knihovně OpenVG

Pavel Tišnovský 21. 7. 2016

V šesté části seriálu o knihovně OpenVG se seznámíme se způsoby manipulace s rastrovými obrázky, protože prakticky ve všech aplikacích se kromě 2D vektorových objektů setkáme i s běžnými bitmapami.

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

4. Rastrové obrázky v OpenVG

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()

15. Odkazy na Internetu

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:

  1. Vytvoření nového objektu typu obrázek (VGImage) se zvoleným formátem.
  2. Zrušení obrázku a jeho následné odstranění z paměti GPU.
  3. Vytvoření podobrázku (child image)
  4. Vykreslení obrázku na aktuální kreslicí plochu.
  5. Vymazání zvoleného regionu (osově orientovaného obdélníku) v obrázku.
  6. Přečtení všech pixelů ve zvoleném regionu (osově orientovaného obdélníku).
  7. Zápis všech pixelů do zvoleného regionu (osově orientovaného obdélníku).
  8. Kopie dat mezi dvěma obrázky popř. provedení konverze pixelů.
  9. 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:

  1. Funkce pro načítání a ukládání obrázků z rastrových formátů (GIF, PNG, JPEG, BMP…).
  2. 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

  1. 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).
  2. 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.
  3. 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á.
  4. 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).
  5. 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.
  6. 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.
  7. 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.
  8. 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ů:

  1. Lineární prostor RGB nebo sRGB: VG_s/VG_l
  2. Uložení složek v pořadí RGBA/ARGB/BGRA/ABGR
  3. Počet bitů: 8+8+8+8, 5+5+5+1 (zde je alfa kanál jen jednobitový), 4+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ří:

  1. Vytvoření nového obrázku: vgCreateImage().
  2. Zrušení obrázku a jeho následné odstranění z paměti GPU: vgDestroyImage().
  3. Vymazání zvoleného regionu (obdélníku): vgClearImage().
  4. Zápis všech pixelů do zvoleného regionu: vgImageSubData().
  5. Přečtení všech pixelů ve zvoleném regionu: vgGetImageSubData().
  6. 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?

  1. Načtení obrázku z externího souboru
  2. Vytvoření nového objektu typu VGImage funkcí vgCreateImage
  3. Zápis pixelů do objektu typu VGImage funkcí vgImageSubData
  4. 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:

widgety

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

  1. 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/
  2. EGL quick reference card
    https://www.khronos.org/files/egl-1–4-quick-reference-card.pdf
  3. EGL Reference Pages Index
    https://www.khronos.org/re­gistry/egl/sdk/docs/man/html/in­dexflat.php
  4. Funkce eglInitialize
    https://www.khronos.org/re­gistry/egl/sdk/docs/man/html/e­glInitialize.xhtml
  5. Funkce eglGetDisplay
    https://www.khronos.org/re­gistry/egl/sdk/docs/man/html/e­glGetDisplay.xhtml
  6. Funkce eglGetConfigs
    https://www.khronos.org/re­gistry/egl/sdk/docs/man/html/e­glGetConfigs.xhtml
  7. Funkce eglGetConfigAttrib
    https://www.khronos.org/re­gistry/egl/sdk/docs/man/html/e­glGetConfigAttrib.xhtml
  8. Funkce eglDestroySurface
    https://www.khronos.org/re­gistry/egl/sdk/docs/man/html/e­glDestroySurface.xhtml
  9. Funkce eglDestroyContext
    https://www.khronos.org/re­gistry/egl/sdk/docs/man/html/e­glDestroyContext.xhtml
  10. Funkce eglTerminate
    https://www.khronos.org/re­gistry/egl/sdk/docs/man/html/e­glTerminate.xhtml
  11. Khronos Native Platform Graphics Interface
    https://www.khronos.org/re­gistry/egl/specs/eglspec.1­.4.pdf
  12. Khronos Group
    https://www.khronos.org/
  13. Khronos Group (Wikipedia)
    https://en.wikipedia.org/wi­ki/Khronos_Group
  14. Raspberry Pi VideoCore APIs
    http://elinux.org/Raspberry_Pi_Vi­deoCore_APIs
  15. Programming AudioVideo on the Raspberry Pi GPU
    https://jan.newmarch.name/RPi/in­dex.html
  16. The Standard for Vector Graphics Acceleration
    https://www.khronos.org/openvg/
  17. OpenVG (Wikipedia)
    https://en.wikipedia.org/wiki/OpenVG
  18. OpenVG Quick Reference Card
    https://www.khronos.org/files/openvg-quick-reference-card.pdf
  19. OpenVG on the Raspberry Pi
    http://mindchunk.blogspot­.cz/2012/09/openvg-on-raspberry-pi.html
  20. ShivaVG: open-source ANSI C OpenVG
    http://ivanleben.blogspot­.cz/2007/07/shivavg-open-source-ansi-c-openvg.html
  21. Testbed for exploring OpenVG on the Raspberry Pi
    https://github.com/ajstarks/openvg
  22. 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/
  23. 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/
  24. 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/
  25. 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/
  26. 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/
  27. 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/
  28. Seriál Grafické karty a grafické akcelerátory
    http://www.root.cz/serialy/graficke-karty-a-graficke-akceleratory/
  29. Grafika na osmibitových počítačích firmy Sinclair II
    http://www.root.cz/clanky/grafika-na-osmibitovych-pocitacich-firmy-sinclair-ii/
  30. Xiaolin_Wu's Line Algorithm
    https://en.wikipedia.org/wi­ki/Xiaolin_Wu's_line_algo­rithm
  31. Grafické čipy v osmibitových počítačích Atari
    http://www.root.cz/clanky/graficke-cipy-v-osmibitovych-pocitacich-atari/
  32. Osmibitové počítače Commodore a čip VIC-II
    http://www.root.cz/clanky/osmibitove-pocitace-commodore-a-cip-vic-ii/
  33. Grafika na osmibitových počítačích firmy Apple
    http://www.root.cz/clanky/grafika-na-osmibitovych-pocitacich-firmy-apple/
  34. Počátky grafiky na PC: grafické karty CGA a Hercules
    http://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/
  35. Karta EGA: první použitelná barevná grafika na PC
    http://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/
  36. Grafické karty MCGA a VGA
    http://www.root.cz/clanky/graficke-karty-mcga-a-vga/
  37. Grafický subsystém počítačů Amiga
    http://www.root.cz/clanky/graficky-subsystem-pocitacu-amiga/
  38. Grafický subsystém počítačů Amiga II
    http://www.root.cz/clanky/graficky-subsystem-pocitacu-amiga-ii/
  39. Raspberry Pi pages
    https://www.raspberrypi.org/
  40. BCM2835 registers
    http://elinux.org/BCM2835_registers
  41. VideoCore (archiv stránek společnosti Alphamosaic)
    http://web.archive.org/web/20030209213838/www­.alphamosaic.com/videocore/
  42. VideoCore (Wikipedia)
    https://en.wikipedia.org/wi­ki/Videocore
  43. RPi lessons: Lesson 6 Screen01
    http://www.cl.cam.ac.uk/pro­jects/raspberrypi/tutorial­s/os/screen01.html
  44. Raspberry Pi forum: Bare metal
    https://www.raspberrypi.or­g/forums/viewforum.php?f=72
  45. C library for Broadcom BCM 2835 as used in Raspberry Pi
    http://www.airspayce.com/mi­kem/bcm2835/
  46. Raspberry Pi Hardware Components
    http://elinux.org/RPi_Har­dware#Components
  47. (Linux) Framebuffer
    http://wiki.linuxquestion­s.org/wiki/Framebuffer
  48. (Linux) Framebuffer HOWTO
    http://tldp.org/HOWTO/Framebuffer-HOWTO/
  49. Linux framebuffer (Wikipedia)
    https://en.wikipedia.org/wi­ki/Linux_framebuffer
  50. RPi Framebuffer
    http://elinux.org/RPi_Framebuffer
  51. 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/
  52. Zdrojový kód fb.c pro RPI
    https://github.com/jncronin/rpi-boot/blob/master/fb.c
  53. RPiconfig
    http://elinux.org/RPi_config.txt
  54. Mailbox framebuffer interface
    https://github.com/raspbe­rrypi/firmware/wiki/Mailbox-framebuffer-interface
  55. Seriál Grafické formáty
    http://www.root.cz/serialy/graficke-formaty/
  56. Vykreslovací pipeline OpenVG (schéma)
    https://www.khronos.org/as­sets/uploads/apis/openvg_pi­peline1.jpg
  57. sRGB
    https://cs.wikipedia.org/wiki/SRGB
Našli jste v článku chybu?
120na80.cz: Co je padesátkrát sladší než cukr?

Co je padesátkrát sladší než cukr?

DigiZone.cz: Na jaká videa se vlastně díváme

Na jaká videa se vlastně díváme

Lupa.cz: Blíží se konec Wi-Fi sítí bez hesla?

Blíží se konec Wi-Fi sítí bez hesla?

120na80.cz: Galerie: Čínští policisté testují českou minerálku

Galerie: Čínští policisté testují českou minerálku

DigiZone.cz: Banaxi: videa kdekoli na světě

Banaxi: videa kdekoli na světě

Vitalia.cz: Antibakteriální mýdla nepomáhají, spíš škodí

Antibakteriální mýdla nepomáhají, spíš škodí

DigiZone.cz: Nova opět stahuje „milionáře“

Nova opět stahuje „milionáře“

Lupa.cz: Další Češi si nechali vložit do těla čip

Další Češi si nechali vložit do těla čip

Lupa.cz: Jak se prodává firma za miliardu?

Jak se prodává firma za miliardu?

Vitalia.cz: Jsou vegani a vyrábějí nemléko

Jsou vegani a vyrábějí nemléko

DigiZone.cz: Digi Slovakia zařazuje stanice SPI

Digi Slovakia zařazuje stanice SPI

DigiZone.cz: DVB-T2 ověřeno: seznam TV zveřejněn

DVB-T2 ověřeno: seznam TV zveřejněn

Podnikatel.cz: Letáky? Lidi zuří, ale ony stále fungují

Letáky? Lidi zuří, ale ony stále fungují

DigiZone.cz: Wimbledon na Nova Sport až do 2019

Wimbledon na Nova Sport až do 2019

Lupa.cz: Patička e-mailu závazná jako vlastnoruční podpis?

Patička e-mailu závazná jako vlastnoruční podpis?

Vitalia.cz: Tradiční čínská medicína a rakovina

Tradiční čínská medicína a rakovina

Podnikatel.cz: Byla finanční manažerka, teď cvičí jógu

Byla finanční manažerka, teď cvičí jógu

Podnikatel.cz: ČSSZ posílá přehled o důchodovém kontě

ČSSZ posílá přehled o důchodovém kontě

Vitalia.cz: Jak Ondra o astma přišel

Jak Ondra o astma přišel

DigiZone.cz: Rapl: seriál, který vás smíří s ČT

Rapl: seriál, který vás smíří s ČT