Hlavní navigace

2D grafika s využitím knihovny OpenVG (nejenom) na Raspberry Pi: cesty

17. 3. 2016
Doba čtení: 19 minut

Sdílet

Vykreslování je v grafické knihovně OpenVG z velké části založeno na konceptu takzvaných cest (paths), takže se dnes budeme zabývat především popisem segmentů, z nichž se jednotlivé cesty mohou skládat.

Obsah

1. 2D grafika s využitím knihovny OpenVG (nejenom) na Raspberry Pi: cesty

2. Nastavení kvality vykreslování

3. Specifikace fyzického formátu a tvarů pixelů pro subpixelový antialiasing

4. Koncept cest v knihovně OpenVG

5. Příkazy používané při tvorbě cesty

6. Formát numerických hodnot pro specifikaci vrcholů

7. Příkaz pro uzavření křivky

8. Příkaz typu „move to“

9. Lineární části cesty

10. Kvadratické Bézierovy křivky

11. Kubické Bézierovy křivky

12. Křivkové segmenty garantující geometrickou spojitost G1

13. Křivkové segmenty vytvořené z eliptických oblouků

14. Operace, které je možné s cestami provádět

15. Odkazy na Internetu

1. 2D grafika s využitím knihovny OpenVG (nejenom) na Raspberry Pi: cesty

V dnešním článku o grafické knihovně OpenVG se budeme zabývat popisem konceptu takzvaných cest (paths), protože z cest jsou složeny prakticky všechny vykreslované 2D objekty, ať již se jedná o objekty otevřené (úsečky, polyčáry, oblouky, křivky) či uzavřené (kruh, vyplněné mnohoúhelníky apod.). Každá cesta se skládá z prakticky libovolného množství segmentů (segments), přičemž je zajímavé, že jednotlivé segmenty na sebe nemusí navazovat. Použití cest v 2D grafice samozřejmě není nic nového; spíš by se dalo říci, že se jedná o dlouhým časem prověřenou technologii použitou například v PostScriptu či v SVG (PostScript lze přitom chápat jako souborový formát, programovací jazyk a současně i vykreslovací knihovnu).

2. Nastavení kvality vykreslování

Před popisem způsobu tvorby cest se na chvíli zastavme u kvality jejich vykreslování. To je možné v knihovně OpenVG do určité míry řídit parametrem VG_RENDERING_QUALITY, jehož hodnota se nastavuje funkcí vgSeti, s níž jsme se již seznámili minule. Zde si jen připomeňme, že jednou provedené nastavení je platné pro celý kontext – rendering context – a je možné ho kdykoli změnit. Programátor si může zvolit tři úrovně: vypnutí antialiasingu při vykreslování, režim co nejrychlejšího vykreslování a naopak režim co nejkvalitnějšího (a většinou i nejpomalejšího) vykreslování:

vgSeti(VG_RENDERING_QUALITY, VG_RENDERING_QUALITY_NONANTIALIASED);
vgSeti(VG_RENDERING_QUALITY, VG_RENDERING_QUALITY_FASTER);
vgSeti(VG_RENDERING_QUALITY, VG_RENDERING_QUALITY_BETTER);

Výchozí volbou nastavenou při vytvoření nového kontextu je VG_RENDERING_QUALITY_BETTER, takže pokud máte například ve hře problém s výkonem či počtem snímků vykreslených za sekundu, můžete se pokusit nastavit horší kvalitu.

Poznámka: specifikace ponechává způsob vykreslování na autorech konkrétní implementace OpenVG, což mj. znamená, že dvě stejné scény se mohou na různých implementacích odlišovat v barvě pixelů výsledné bitmapy.

3. Specifikace fyzického formátu a tvarů pixelů pro subpixelový antialiasing

S kvalitou vykreslování velmi úzce souvisí i použití takzvaného subpixelového antialiasingu, které se používá například při vykreslování písma. Způsob výpočtu se ovlivňuje volbou VG_PIXEL_LAYOUT, pomocí níž můžete určit, jaký je fyzický formát pixelů na displeji. Pixely jsou totiž na většině displejů vytvořeny trojicí barevných pásků, které mohou být umístěny horizontálně či vertikálně a odlišovat se mohou i pořadí barev (existují však i různé další fyzické formáty pixelů). Ve většině případů je vhodné se spolehnout na informace dodané samotným systémem, ale skutečně záleží jen na programátorech, zda si do každé aplikace přidají dialog pro nastavení formátu pixelů (který stejně uživatelé neznají, takže se musí spolehnout na vizuální zpětnou vazbu).

vgSeti(VG_PIXEL_LAYOUT, VG_PIXEL_LAYOUT_UNKNOWN);
vgSeti(VG_PIXEL_LAYOUT, VG_PIXEL_LAYOUT_RGB_VERTICAL);
vgSeti(VG_PIXEL_LAYOUT, VG_PIXEL_LAYOUT_BGR_VERTICAL);
vgSeti(VG_PIXEL_LAYOUT, VG_PIXEL_LAYOUT_RGB_HORIZONTAL);
vgSeti(VG_PIXEL_LAYOUT, VG_PIXEL_LAYOUT_BGR_HORIZONTAL);

Poznámka: i pro toto nastavení platí, že specifikace knihovny OpenVG přesně neurčuje, jakým způsobem (a zda vůbec) se subpixelový antialiasing při vykreslování použije.

4. Koncept cest v knihovně OpenVG

Po krátké odbočce k problematice kvality vykreslování se vraťme k popisu cest v knihovně OpenVG. Jak jsme si již řekli v úvodním odstavci, může se každá cesta skládat z libovolného množství segmentů, přičemž segmentem může být úsečka, kvadratická Bézierova křivka, kubická Bézierova křivka, kruhový oblouk či eliptický oblouk. Prázdná cesta se vytváří funkcí vgCreatePath:

VGPath vgCreatePath(
    VGint          pathFormat,
    VGPathDatatype datatype,
    VGfloat        scale,
    VGfloat        bias,
    VGint          segmentCapacityHint,
    VGint          coordCapacityHint,
    VGbitfield     capabilities);

Tato funkce sice vyžaduje předání sedmi parametrů, ale ve skutečnosti se do mnoha parametrů předává stále stejná hodnota. To je případ prvního parametru, který bývá nastaven na VG_PATH_FORMAT_STANDARD. Ve druhém parametru se specifikuje formát hodnot použitých pro uložení vrcholů jednotlivých segmentů, což je problematika, které se věnuji v šesté kapitole. Následuje dvojice parametrů scale a bias, které slouží pro jednoduchou transformaci všech souřadnic podle vzorce scale*x+bias. Typicky se předává scale=1.0 a bias=0.0, pokud je ovšem vstupní formát souřadnic nějak specifický, můžete hodnoty těchto parametrů pochopitelně změnit. Parametry segmentCapacityHint a coordCapacityHint slouží pouze pro optimalizaci alokátoru paměti – předává se zde předpokládaná velikost cesty (počet segmentů, celkový počet souřadnic). Pokud tyto hodnoty dopředu neznáte, nebo je nechcete počítat, předává se 0 značící unknown. Význam posledního parametru capabilities popisuji ve čtrnácté kapitole.

Segmenty se z cesty dají kdykoli odstranit funkcí vgClearPath, jejíž hlavička je velmi jednoduchá (druhý parametr bude opět vysvětlen ve čtrnácté kapitole):

void vgClearPath(
    VGPath     path,
    VGbitfield capabilities);

Předposlední důležitou funkcí při práci s cestami je funkce nazvaná vgDestroyPath, která cestu z aktuálního kontextu odstraní a uvolní paměť (buď na grafickém akcelerátoru nebo obyčejnou operační paměť). V aplikacích je vhodné tuto funkci zavolat co nejdříve a nenechávat v paměti uloženo zbytečně velké množství cest:

void vgDestroyPath(
    VGPath path);

5. Příkazy používané při tvorbě cesty

Ve specifikaci OpenVG je popsáno celkem třináct různých příkazů pro definici segmentů cest. Jednotlivé typy segmentů budou podrobněji popsány v navazujících kapitolách, proto si zde pouze uveďme symbolické konstanty, které jsou k typům segmentů přiřazeny:

# Symbolická konstanta Hodnota Význam
1 VG_CLOSE_PATH 0 uzavření cesty
2 VG_MOVE_TO 2 přesun aktivního bodu bez kreslení
3 VG_LINE_TO 4 lineární segment (úsečka)
4 VG_HLINE_TO 6 horizontální úsečka
5 VG_VLINE_TO 8 vertikální úsečka
6 VG_QUAD_TO 10 kvadratická Bézierova křivka
7 VG_CUBIC_TO 12 kubická Bézierova křivka
8 VG_SQUAD_TO 14 segment s G1 spojitostí tvořený kvadratickou křivkou
9 VG_SCUBIC_TO 16 segment s G1 spojitostí tvořený kubickou křivkou
10 VG_SCCWARC_TO 18 kratší segment tvořený eliptickým obloukem
11 VG_SCWARC_TO 20 kratší segment tvořený eliptickým obloukem
12 VG_LCCWARC_TO 22 delší segment tvořený eliptickým obloukem
13 VG_LCWARC_TO 24 delší segment tvořený eliptickým obloukem

Každý příkaz může používat absolutní souřadnice (vztažené vůči počátku souřadného systému) či souřadnice relativní (vztažené vůči poslední zadané či vypočtené souřadnici). Rozhodnutí o použití relativních či absolutních souřadnicích se provádí na základě nejnižšího bitu příkazu, který může nabývat hodnot:

# Symbolická konstanta Hodnota Význam
1 VG_ABSOLUTE 0 příznak použití absolutních souřadnic
2 VG_RELATIVE 1 příznak použití relativních souřadnic

Povšimněte si, že hodnoty symbolických konstant pro kreslení se zvyšují s krokem 2, takže je zajištěno, že spodní bit bude vždy nulový. Díky tomu lze zkombinovat příkaz pro kreslení s příznakem absolutních či relativních souřadnic. Bitovou aritmetiku (ve skutečnosti prosté OR) nemusíte provádět ručně, protože příslušné kombinace konstant jsou již připraveny v hlavičkových souborech. První příkaz VG_CLOSE_PATH zde samozřejmě není zahrnut, protože ten žádné souřadnice nepotřebuje:

# Symbolická konstanta Vypočteno z
1 VG_MOVE_TO_ABS VG_MOVE_TO | VG_ABSOLUTE
2 VG_MOVE_TO_REL VG_MOVE_TO | VG_RELATIVE
3 VG_LINE_TO_ABS VG_LINE_TO | VG_ABSOLUTE
4 VG_LINE_TO_REL VG_LINE_TO | VG_RELATIVE
5 VG_HLINE_TO_ABS VG_HLINE_TO | VG_ABSOLUTE
6 VG_HLINE_TO_REL VG_HLINE_TO | VG_RELATIVE
7 VG_VLINE_TO_ABS VG_VLINE_TO | VG_ABSOLUTE
8 VG_VLINE_TO_REL VG_VLINE_TO | VG_RELATIVE
9 VG_QUAD_TO_ABS VG_QUAD_TO | VG_ABSOLUTE
10 VG_QUAD_TO_REL VG_QUAD_TO | VG_RELATIVE
11 VG_CUBIC_TO_ABS VG_CUBIC_TO | VG_ABSOLUTE
12 VG_CUBIC_TO_REL VG_CUBIC_TO | VG_RELATIVE
13 VG_SQUAD_TO_ABS VG_SQUAD_TO | VG_ABSOLUTE
14 VG_SQUAD_TO_REL VG_SQUAD_TO | VG_RELATIVE
15 VG_SCUBIC_TO_ABS VG_SCUBIC_TO | VG_ABSOLUTE
16 VG_SCUBIC_TO_REL VG_SCUBIC_TO | VG_RELATIVE
17 VG_SCCWARC_TO_ABS VG_SCCWARC_TO | VG_ABSOLUTE
18 VG_SCCWARC_TO_REL VG_SCCWARC_TO | VG_RELATIVE
19 VG_SCWARC_TO_ABS VG_SCWARC_TO | VG_ABSOLUTE
20 VG_SCWARC_TO_REL VG_SCWARC_TO | VG_RELATIVE
21 VG_LCCWARC_TO_ABS VG_LCCWARC_TO | VG_ABSOLUTE
22 VG_LCCWARC_TO_REL VG_LCCWARC_TO | VG_RELATIVE
23 VG_LCWARC_TO_ABS VG_LCWARC_TO | VG_ABSOLUTE
24 VG_LCWARC_TO_REL VG_LCWARC_TO | VG_RELATIVE

Obrázek 1: Příklad cesty vytvořené z několika úsečkových (lineárních) segmentů.

6. Formát numerických hodnot pro specifikaci vrcholů

Při specifikaci vrcholů jednotlivých křivkových segmentů, z nichž se skládá celá cesta, je možné použít různé formáty numerických hodnot (každá hodnota samozřejmě reprezentuje souřadnici x, souřadnici y či relativní posun oproti předchozí hodnotě/souřadnici). Již při vytváření cesty příkazem vgCreatePath se určuje, v jakém formátu budou souřadnice jednotlivých vrcholů uloženy. Samozřejmě je vhodné zvolit takový formát, který co nejlépe vyhovuje potřebám aplikace popř. formátu použitém pro uložení vektorové grafiky (SVG, PostScript, SLD, starobylé WMF či EMF atd.):

# Konstanta předaná do vgCreatePath Formát Bajtů/souřadnici
1 VG_PATH_DATATYPE_S8 8bitový integer se znaménkem 1
2 VG_PATH_DATATYPE_S16 16bitový integer se znaménkem 2
3 VG_PATH_DATATYPE_S32 32bitový integer se znaménkem 4
4 VG_PATH_DATATYPE_F typ float/single dle IEEE 754 4

7. Příkaz pro uzavření křivky

Nejjednodušším příkazem sloužícím pro vytvoření nového segmentu v cestě je příkaz VG_CLOSE_PATH. Tento příkaz jednoduše do cesty přidá úsečku spojující poslední vrchol s vrcholem prvním. Cesta se tak uzavře a je ji možné v případě potřeby vyplnit (paint). Na rozdíl od všech ostatních příkazů nepotřebuje VG_CLOSE_PATH specifikaci ani jednoho vrcholu a navíc se i (celkem logicky) ignorují příznaky VG_ABSOLUTE a VG_RELATIVE. Interně je tento příkaz reprezentován jediným bajtem.

V SVG tomuto příkazu odpovídají dva příkazy:

Příkaz Parametry Popis
Z (nejsou) uzavření cesty úsečkovým segmentem
z (nejsou) má stejný význam jako příkaz Z

Poznámka: ve skutečnosti může být tento příkaz použitý vícekrát a současně se nemusí jednat o poslední příkaz při definici cesty.

8. Příkaz typu „move to“

Jak jsme si již řekli v úvodních kapitolách, nemusí na sebe jednotlivé segmenty, z nichž se cesta skládá, přímo navazovat. Jinými slovy mohou cestu tvořit i izolované segmenty či skupiny segmentů (tyto na sebe navazující segmenty se nazývají subpath). Pro přeskok na začátek dalšího segmentu (a ukončení poslední subpath) se používá příkaz VG_MOVE_TO, resp. jedna z jeho variant VG_MOVE_TO_ABS či VG_MOVE_TO_REL. V obou případech tento příkaz akceptuje dvojici souřadnic x0, y0, které se po obvyklé transformaci (viz část textu o parametrech scale a bias) buď přičtou k posledním známým souřadnicím či se přímo tyto souřadnice nastaví. Tímto příkazem většinou definice cesty začíná.

V SVG tomuto příkazu odpovídají dva příkazy:

Příkaz Parametry Popis
M (x y)+ absolutní pohyb na souřadnice [x, y] bez kreslení. Pokud je uvedeno více párů [x, y], všechny následující páry jsou považovány za parametry příkazu lineto
m (x y)+ relativní pohyb o souřadnice [x, y] bez kreslení. Pokud je uvedeno více párů [x, y], všechny následující páry jsou považovány za parametry příkazu lineto

9. Lineární části cesty

V cestě se může nacházet libovolné množství úseček. Pro jejich tvorbu se používají tři základní příkazy VG_LINE_TO, VG_HLINE_TO a VG_VLINE_TO, které se opět modifikují příponami _REL a _ABS. Příkaz VG_LINE_TO vyžaduje zadání obou relativních či absolutních souřadnic (horizontální a vertikální), zatímco u příkazu VG_HLINE_TO se očekává jen x-ová souřadnice a u příkazu VG_VLINE_TO pouze souřadnice y-ová. Můžeme zde opět vidět souvislost s knihovnou SVG, protože i v této knihovně nalezneme při deklaraci cesty příkazy „H“, „h“, „L“ a „l“ (ostatně jedním z důvodů vzniku OpenVG je podpora SVG):

Příkaz Parametry Popis
L (x y)+ absolutní pohyb na souřadnice [x, y] s kreslením úsečkového segmentu. Je možné zapsat libovolné množství párů [x, y], výsledkem jejich vykreslení je lomená čára.
l (x y)+ relativní pohyb o souřadnice [x, y] s kreslením úsečkového segmentu. Je možné zapsat libovolné množství párů [x, y], výsledkem jejich vykreslení je lomená čára.
H x+ horizontální posun na absolutní souřadnici x s kreslením (vykreslení vodorovné úsečky). Je možné zapsat i více souřadnic, většinou to však nemá smysl (záleží však na nastaveném stylu cesty).
h x+ relativní posun o hodnotu x v horizontálním směru (vykreslení vodorovné úsečky)
V y+ vertikální posun na absolutní souřadnici y s kreslením (vykreslení svislé úsečky)
v y+ relativní posun o hodnotu y ve vertikálním směru (vykreslení svislé úsečky)

10. Kvadratické Bézierovy křivky

Cesta může obsahovat i segmenty složené z Bézierových křivek. V knihovně OpenVG jsou podporovány jak Bézierovy kvadratické křivky, tak i Bézierovy křivky kubické. Kvadratické křivky jsou specifikovány trojicí řídicích bodů, zatímco křivky kubické potřebují pro zadání svého tvaru čtyři řídicí body. Bézierova křivka obecně prochází pouze svým prvním a posledním bodem (kotvicí body), ostatní body „pouze“ ovlivňují výsledný tvar křivky – jedná se tedy o aproximační křivky, i když je lze po programových výpočtech použít i pro interpolaci. Ve speciálních případech však křivka může procházet i dalšími (řídicími) body, například tehdy, když všechny body leží na jedné přímce.

S využitím prvního bodu (kotvicího) a druhého bodu (řídicího) se určuje tečný vektor na začátku křivky. Předposlední bod (řídicí) a poslední bod (kotvicí) zase určují tečný vektor na konci křivky. Této vlastnosti se velmi často využívá při hladkém navazování Bézierových křivek. Samozřejmě je také možné stejným postupem hladce navázat Bézierovu křivku na úsečku či kruhový oblouk.

Obrázek 2: Řídicí body kvadratických a kubických Bézierových křivek.

V knihovně OpenVG se Bézierovy křivky zadávají pomocí čtyř variant příkazů, přičemž každá varianta existuje ve své absolutní a relativní podobě podle toho, jakým způsobem jsou zadávány (a případně i dopočítávány) souřadnice řídicích bodů.

Pro vytvoření Bézierovy kvadratické křivky se používá příkaz VG_QUAD_TO_ABS popř. VG_QUAD_TO_REL, který očekává dva vrcholy. Prvním vrcholem je řídicí bod křivky, druhým vrcholem pak její koncový bod (počáteční bod již známe, je to aktuální konec cesty). Ostatně jeden z důvodů oblíbenosti tohoto typu křivek v počítačové grafice, zejména v oblasti fontů, spočívá v tom, že pro definici křivky potřebujeme znát jen velmi malý počet řídicích bodů.

V SVG opět existuje obdoba pro výše zmíněné příkazy:

Příkaz Parametry Popis
Q (x1 y1 x y)+ kvadratická Bézierova křivka zadaná trojicí řídicích bodů s absolutními souřadnicemi.
q (x1 y1 x y)+ má stejný význam jako příkaz Q s tím rozdílem, že souřadnice řídicích bodů jsou zadány relativně (vůči předchozím souřadnicím).

11. Kubické Bézierovy křivky

Kubické Bézierovy křivky většina uživatelů používajících vektorové grafické editory již velmi dobře zná (ale nalezneme je i v rastrových grafických editorech, například v GIMPu). Připomeňme si tedy, že tyto křivky jsou definovány počátečním bodem, koncovým bodem a dvojicí řídicích bodů. Větší množství řídicích bodů dává uživatelům i větší možnosti tvarování křivky, protože je možné vytvořit i esíčko atd. V knihovně OpenVG se tyto křivky (resp. segmenty složené z kubických Bézierových křivek) specifikují příkazy VG_CUBIC_TO_ABS a VG_CUBIC_TO_REL, přičemž se očekávají tři body (tedy šest souřadnic), protože počáteční bod již známe – je jím dočasný poslední bod aktuálně vytvářené cesty.

V SVG samozřejmě existuje obdoba pro výše zmíněné příkazy:

Příkaz Parametry Popis
C (x1 y1 x2 y2 x y)+ kubická Bézierova křivka. Souřadnice řídicích bodů jsou zadány absolutně.
c (x1 y1 x2 y2 x y)+ má stejný význam jako příkaz C s tím rozdílem, že souřadnice řídicích bodů jsou zadány relativně (vůči předchozím souřadnicím).

12. Křivkové segmenty garantující geometrickou spojitost G1

Knihovna OpenVG podporuje i tvorbu segmentů složených z na sebe navazujících křivkových segmentů, přičemž je dodržena geometrická spojitost G1 (křivka je tedy hladká). Tato podpora přináší dvě výhody: ušetří se několik bajtů v deklaraci cesty, neboť odpadne nutnost zadání jednoho řídicího bodu a navíc se mohou zjednodušit některé výpočty v aplikaci. V případě kvadratické Bézierovy křivky se pro její hladké navázání na předchozí segment používají příkazy VG_SQUAD_TO_ABS a VG_SQUAD_TO_REL, u nichž se specifikuje pouze jediný vrchol, kterým je koncový bod křivky. Její začátek samozřejmě známe a jediný řídicí body je vypočten z pozice řídicího bodu předchozí křivky (podobně je tomu v TrueType fontech). U kubické Bézierovy křivky je při použití příkazů VG_SCUBIC_TO_ABS a VG_SCUBIC_TO_REL zapotřebí zadat souřadnice druhého řídicího bodu (první je opět dopočten) a samozřejmě i koncový bod křivky. Podrobnosti si možná ukážeme příště v demonstračním příkladu.

Pokud vás zajímá, zda existují obdobné příkazy v SVG, odpověď naleznete v tabulce:

Příkaz Parametry Popis
T (x y)+ kvadratická Bézierova křivka vedoucí od konce vytvářené cesty do zadaného bodu se souřadnicemi [x, y]. Řídicí bod této křivky není zadán, protože je dopočítán z pozice řídicího bodu předchozí kvadratické Bézierovy křivky tak, aby na sebe křivky hladce navazovaly (to znamená, že před příkazem T by měl být příkaz Q, q, T či t).
t (x y)+ má stejný význam jako příkaz T s tím rozdílem, že souřadnice koncového bodu Bézierovy kvadratické křivky jsou zadány relativně vůči koncovému bodu cesty.
S (x2 y2 x y)+ tento příkaz je podobný příkazu T, ovšem s tím rozdílem, že se vytvoří kubická Bézierova křivka. První řídicí bod křivky je automaticky vypočítán ze druhého řídicího bodu předchozí kubické Bézierovy křivky, tak, aby na sebe křivky hladce navazovaly. To znamená, že před tímto příkazem by měl předcházet příkaz C či S. Norma neurčuje, že by se měly dopočítat návaznosti kvadratických a kubických křivek, proto kombinace příkazů Q a S nemusí dát očekávané výsledky (podobně není možné automaticky navázat kruhový oblouk na křivku).
s (x2 y2 x y)+ podobné příkazu S, ale všechny souřadnice řídicích bodů jsou zadány relativně.

13. Křivkové segmenty vytvořené z eliptických oblouků

Kvadratické ani kubické Bézierovy křivky popsané v předchozích třech kapitolách nemohou geometricky přesně nahradit kruhové a eliptické oblouky (k tomuto účelu by bylo nutné použít racionální křivky, například NURBS). Z tohoto důvodu byly do repertoáru příkazů určených pro vytváření cest přidány i příkazy sloužící pro přidání segmentu vytvořeného z eliptického oblouku do konstruované cesty. Kruhový oblouk je samozřejmě speciálním případem eliptického oblouku, stejně jako elipsa či kruh – pro vytvoření všech těchto tvarů si tedy vystačíme s pouhými čtyřmi příkazy, které se od sebe odlišují v tom, zda se vykreslí delší či kratší část oblouku a zda je oblouk specifikován po směru či proti směru hodinových ručiček.

Příkaz Parametry Význam
VG_SCCWARC_TO rh,rv,rot,x0,y0 menší oblouk, proti směru hodinových ručiček
VG_SCWARC_TO rh,rv,rot,x0,y0 menší oblouk, po směru hodinových ručiček
VG_LCCWARC_TO rh,rv,rot,x0,y0 větší oblouk, proti směru hodinových ručiček
VG_LCWARC_TO rh,rv,rot,x0,y0 větší oblouk, po směru hodinových ručiček

Význam parametrů lze zjistit z nákresu:

Obrázek 3: Čtyři možné eliptické oblouky při znalosti dvou bodů, dvou poloměrů (a zde neuvedené rotace celé elipsy).

CS24_early

14. Operace, které je možné s cestami provádět

Operace, které lze s cestami provádět, jsou specifikovány bitovým polem VGbitfield při zakládání nové cesty funkcí vgCreatePath či při mazání všech segmentů funkcí vgClearPath. Bitové pole se skládá z několika příznaků:

Příznak Význam
VG_PATH_CAPABILITY_APPEND_FROM povolení operace pro spojení dvou cest
VG_PATH_CAPABILITY_APPEND_TO povolení operace pro spojení dvou cest
VG_PATH_CAPABILITY_MODIFY modifikace segmentů
VG_PATH_CAPABILITY_TRANSFORM_FROM lineární transformace aplikovaná na cestu
VG_PATH_CAPABILITY_TRANSFORM_TO lineární transformace aplikovaná na cestu
VG_PATH_CAPABILITY_INTERPOLATE_FROM povolení operace vgInterpolatePath
VG_PATH_CAPABILITY_INTERPOLATE_TO povolení operace vgInterpolatePath
VG_PATH_CAPABILITY_PATH_LENGTH povolení operace pro výpočet délky cesty
VG_PATH_CAPABILITY_POINT_ALONG_PATH povolení vgPointAlongPath
VG_PATH_CAPABILITY_TANGENT_ALONG_PATH povolení vgPointAlongPath
VG_PATH_CAPABILITY_PATH_BOUNDS povolení vgPathBounds
VG_PATH_CAPABILITY_PATH_TRAN­SFORMED_BOUNDS povolení vgPathTransformedBounds
VG_PATH_CAPABILITY_ALL (toto jediné není bitový příznak, ale OR všech ostatních příznaků)

Většina těchto příznaků si vyžádá podrobnější vysvětlení příště.

15. Odkazy na Internetu

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

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.