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ů
10. Kvadratické 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
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).
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_TRANSFORMED_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
- 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/