Hlavní navigace

Pohled pod kapotu JVM – kreslicí funkce dostupné ve třídě sdljavax.gfx.SDLGfx (2.část)

Pavel Tišnovský

V dnešní části seriálu o programovacím jazyku Java i o virtuálním stroji tohoto jazyka si ukážeme některé další „kreslicí“ funkce, které jsou dostupné ve třídě sdljavax.gfx.SDLGfx. Kromě vykreslování jednotlivých pixelů a úseček je totiž možné s využitím této třídy vykreslovat i složitější entity.

1. Pohled pod kapotu JVM – kreslicí funkce dostupné ve třídě sdljavax.gfx.SDLGfx (2.část)

V předchozí části tohoto seriálu jsme si ukázali, jakým způsobem je možné využít funkce (tj. veřejné statické metody) nabízené třídou sdljavax.gfx.SDLGfx pro vykreslování základních grafických entit do vybrané plochy typu SDL_Surface, tj. mj. i do předního či zadního bufferu. Připomeňme si, že jsme si na pětici demonstračních příkladů ukázali využití funkcí sdljavax.gfx.SDLGfx.pixelRGBA(), sdljavax.gfx.SDLGfx.pixelColor(), sdljavax.gfx.SDLGfx.lineColor(), sdljavax.gfx.SDLGfx.lineRGBA(), sdljavax.gfx.SDLGfx.aalineColor() a konečně sdljavax.gfx.SDLGfx.aalineRGBA(). V knihovně SDLJava ovšem můžeme najít i mnoho dalších funkcí využitelných při kreslení složitějších grafických entit.

Obrázek 1: Vzorek vykreslený s využitím funkce pixelRGBA().

Dnes si ukážeme, jakým způsobem je možné vykreslovat kružnice, kruhy, trojúhelníky, ale i obecné polygony či Bézierovy křivky využívané v mnoha vektorových grafických editorech i například v PostScriptu či ve vektorovém formátu SVG. Vykreslování pixelů, úseček, kružnic či trojúhelníků vyžaduje předání konstantního počtu parametrů příslušným funkcím, ovšem v případě obecných polygonů a Bézierových křivek je situace poněkud složitější, neboť těmto funkcím se předává větší (proměnný) počet vrcholů. V knihovně SDLJava se tento problém řeší na první pohled poněkud nešikovným způsobem – použitím možností nabízených třídou java.nio.ShortBuffer. Podrobnosti si popíšeme v závěrečných kapitolách dnešního článku.

Obrázek 2: Vzorek vykreslený s využitím funkce aalineRGBA().

2. Kreslení kružnic a kruhů

Pro kreslení kružnic popř. kruhů je možné využít osm funkcí, které jsou vypsány v následující tabulce:

# Název funkce Parametry Stručný popis
1 circleColor SDLSurface dst, int x, int y, int r, long color kružnice
2 circleRGBA SDLSurface dst, int x, int y, int rad, int r, int g, int b, int a kružnice
3 aacircleColor SDLSurface dst, int x, int y, int r, long color kružnice s vyhlazeným okrajem
4 aacircleRGBA SDLSurface dst, int x, int y, int rad, int r, int g, int b, int a kružnice s vyhlazeným okrajem
5 filledCircleColor SDLSurface dst, int x, int y, int r, long color kruh
6 filledCircleRGBA SDLSurface dst, int x, int y, int rad, int r, int g, int b, int a kruh

Povšimněte si, že první čtyři parametry těchto funkcí jsou vždy shodné – jedná se o objekt představující plochu, do níž se má kružnice či kruh vykreslit, souřadnice středu této grafické entity a konečně poloměr kruhu popř. kružnice. Poté již následuje určení barvy, která může být specifikována buď jediným 32bitovým číslem ve formátu 0×rrggbbaa, nebo alternativně čtveřicí osmibitových celočíselných parametrů představujících hodnoty barvových složek red, green, blue následované průhledností (alpha).

Určení barvy použitím 32bitové hodnoty je využito ve funkcích circleColor(), aacircleColor()filledCircleColor(), zatímco trojice barvových složek a hodnota průhlednosti je použita ve funkcích circleRGBA(), aacircleRGBA()filledCircleRGBA(). Kružnice lze vykreslit buď rychlým celočíselným Brehsemanovým algoritmem (funkce circleColor()circleRGBA()) nebo naopak pomalejším algoritmem s antialiasingem (funkce aacircleColor()aacircleRGBA()). Při kresbě kruhů není antialiasing (kupodivu) použit.

Obrázek 3: Čtyřikrát zvětšený detail obrazovky s kružnicemi vykreslenými rychlým Bresenhamovým celočíselným algoritmem.

Obrázek 4: Čtyřikrát zvětšený detail obrazovky s kružnicemi vykreslenými algoritmem s antialiasingem.

3. Demonstrační příklad SDLTest52: vykreslení jednoduchého vzorku s využitím funkce circleColor()

Dnešní první demonstrační příklad nazvaný SDLTest52 využívá funkci circleColor() pro vykreslení vzorku složeného z většího množství poloprůhledných kružnic se shodnou barvou. Barva je nejdříve uložena do čtveřice konstant pojmenovaných red, green, bluealpha, z nichž je následně vypočtena 32bitová hodnota uložená do konstanty pojmenované color. Tato konstanta je následně použita v programové smyčce, v níž je celý vzorek vykreslen přímo do framebufferu a tedy i na obrazovku:

// vypocet barvovych slozek pixelu
    final int red =    0xff;
    final int green =  0xff;
    final int blue =   0xff;
    final int alpha =  0x80;
 
    // vypocet barvy
    final int color = (red << 24) | (green << 16) | (blue << 8) | alpha;
 
    // vykreslit vzorek s vyuzitim funkce circleColor()
    for (int i = 0; i < 90; i++) {
        final int radius = 90 - i;
        final int x = (width >> 1)  + (int)((i * 2 + 70) * Math.cos(i/10.0));
        final int y = (height >> 1) + (int)((i * 2 + 70) * Math.sin(i/10.0));
        circleColor(screen, x, y, radius, color);
    }

Obrázek 5: Vzorek vykreslený demonstračním příkladem SDLTest52.

Obrázek 6: Detail, na němž je patrný výpočet průhlednosti a překryvu kružnic.

Následuje výpis zdrojového kódu tohoto demonstračního příkladu:

import sdljava.SDLMain;
import sdljava.SDLException;
 
import sdljava.event.SDLEvent;
import sdljava.event.SDLKeyboardEvent;
import sdljava.event.SDLKey;
import sdljava.event.SDLQuitEvent;
 
import sdljava.video.SDLSurface;
import sdljava.video.SDLVideo;
 
import sdljava.x.swig.SDLPressedState;
import static sdljavax.gfx.SDLGfx.*;
 
 
 
/**
 * Padesaty druhy demonstracni priklad vyuzivajici knihovnu SDLjava.
 *
 * Vykresleni jednoducheho vzorku s vyuzitim funkce circleColor().
 *
 * @author Pavel Tisnovsky
 */
public class SDLTest52 {
 
    /**
     * Horizontalni rozliseni vybraneho grafickeho rezimu ci okna.
     */
    private static final int GFX_WIDTH = 480;
 
    /**
     * Vertikalni rozliseni vybraneho grafickeho rezimu ci okna.
     */
    private static final int GFX_HEIGHT = 480;
 
    /**
     * Bitova hloubka vybraneho grafickeho rezimu.
     * (0 znamena automaticky vyber, ovsem lze samozrejme pouzit
     * i hodnoty 8, 16, 24 ci 32, podle vlastnosti graficke karty)
     */
    private static final int GFX_BPP = 0;
 
    /**
     * Inicializace grafickeho rezimu ci otevreni okna pro vykreslovani.
     */
    private static SDLSurface initVideo() throws SDLException {
        final long flags = SDLVideo.SDL_DOUBLEBUF;
        return SDLVideo.setVideoMode(GFX_WIDTH, GFX_HEIGHT, GFX_BPP, flags);
    }
 
    /**
     * Smycka pro zpracovani udalosti.
     */
    private static void eventLoop() throws SDLException {
        while (true) {
            // precist udalost z fronty
            SDLEvent event = SDLEvent.waitEvent();
 
            // vyskok ze smycky pro zpracovani udalosti pri vyskytu
            // udalosti typu SDLQuitEvent
            if (event instanceof SDLQuitEvent) {
                return;
            }
 
            // stisk ci pusteni klavesy
            if (event instanceof SDLKeyboardEvent) {
                // pretypovani
                final SDLKeyboardEvent keyEvent = (SDLKeyboardEvent)event;
 
                // symbol/kod klavesy
                final int symbol = keyEvent.getSym();
 
                // ESC ukonci program
                if (symbol == SDLKey.SDLK_ESCAPE && keyEvent.getState() == SDLPressedState.PRESSED) {
                    return;
                }
            }
        }
    }
 
    /**
     * Vykresleni sceny na obrazovku ci do okna aplikace.
     * 
     * @param screen
     *            framebuffer
     */
    private static void drawOnScreen(SDLSurface screen) throws SDLException {
        // rozmery okna aplikace ci rozliseni obrazovky
        final int width = screen.getWidth();
        final int height = screen.getHeight();
 
        // vypocet barvovych slozek pixelu
        final int red =    0xff;
        final int green =  0xff;
        final int blue =   0xff;
        final int alpha =  0x80;
 
        // vypocet barvy
        final int color = (red << 24) | (green << 16) | (blue << 8) | alpha;
 
        // vykreslit vzorek s vyuzitim funkce circleColor()
        for (int i = 0; i < 90; i++) {
            final int radius = 90 - i;
            final int x = (width >> 1)  + (int)((i * 2 + 70) * Math.cos(i/10.0));
            final int y = (height >> 1) + (int)((i * 2 + 70) * Math.sin(i/10.0));
            circleColor(screen, x, y, radius, color);
        }
 
        // nutno volat i v pripade, ze neni pouzit double buffering
        screen.updateRect();
        screen.flip();
    }
 
    /**
     * Spusteni padesateho druheho demonstracniho prikladu.
     */
    public static void main(String[] args) {
        try {
            // inicializace knihovny SDLJava
            SDLMain.init(SDLMain.SDL_INIT_VIDEO);
 
            // inicializace grafickeho rezimu ci otevreni okna pro vykreslovani
            final SDLSurface screen = initVideo();
 
            // vykresleni sceny na obrazovku
            drawOnScreen(screen);
 
            // smycka pro zpracovani udalosti
            eventLoop();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            // musime obnovit puvodni graficky rezim
            // i v tom pripade, ze nastane nejaka vyjimka
            SDLMain.quit();
        }
    }
 
}

Skript pro překlad tohoto demonstračního příkladu na Linuxu:

#!/bin/sh
 
SDL_JAVA_LIBS=./sdljava-0.9.1/lib
 
javac -cp $SDL_JAVA_LIBS/sdljava.jar SDLTest52.java

Dávkový soubor pro překlad tohoto demonstračního příkladu na Windows:

set SDL_JAVA_LIBS=.\sdljava-0.9.1\lib
 
javac -cp %SDL_JAVA_LIBS%\sdljava.jar SDLTest52.java

Skript pro spuštění na Linuxu:

#!/bin/sh
 
SDL_JAVA_LIBS=./sdljava-0.9.1/lib
 
java -cp .:$SDL_JAVA_LIBS/sdljava.jar -Djava.library.path=$SDL_JAVA_LIBS SDLTest52

Dávkový soubor pro spuštění na Windows:

set SDL_JAVA_LIBS=.\sdljava-0.9.1\lib
 
java -cp .;%SDL_JAVA_LIBS%\sdljava.jar -Djava.library.path=%SDL_JAVA_LIBS% SDLTest52

4. Demonstrační příklad SDLTest53: vykreslení jednoduchého vzorku s využitím funkce circleRGBA()

Při vykreslování kružnic (či jiných grafických entit), u nichž se programově mění jejich barva popř. průhlednost, je výhodnější namísto 32bitové hodnoty předávané do funkcí *Color() použít čtveřici hodnot předávaných do funkcí *RGBA(). V tomto případě ani není nutné kontrolovat, zda každá hodnota leží v předpokládaném rozsahu 0 až 255. Právě funkce circleRGBA() je použita v dnešním druhém demonstračním příkladu pojmenovaném SDLTest53 jehož vykreslovací „jádro“ vypadá následovně:

    // vypocet barvovych slozek pixelu
    int red =    0xff;
    int green =  0xff;
    int blue =   0x00;
    final int alpha =  0x80;
 
    // vykreslit vzorek s vyuzitim funkce circleRGBA()
    for (int i = 0; i < 90; i++) {
        final int radius = 90 - i;
        final int x = (width >> 1)  + (int)((i * 2 + 70) * Math.cos(i/10.0));
        final int y = (height >> 1) + (int)((i * 2 + 70) * Math.sin(i/10.0));
        circleRGBA(screen, x, y, radius, red, green, blue, alpha);
        red-=2;
        blue+=2;
    }

Obrázek 7: Vzorek vykreslený demonstračním příkladem SDLTest53.

Obrázek 8: Detail, na němž je patrný výpočet průhlednosti a překryvu kružnic.

Celý zdrojový kód demonstračního příkladu SDLTest53:

import sdljava.SDLMain;
import sdljava.SDLException;
 
import sdljava.event.SDLEvent;
import sdljava.event.SDLKeyboardEvent;
import sdljava.event.SDLKey;
import sdljava.event.SDLQuitEvent;
 
import sdljava.video.SDLSurface;
import sdljava.video.SDLVideo;
 
import sdljava.x.swig.SDLPressedState;
import static sdljavax.gfx.SDLGfx.*;
 
 
 
/**
 * Padesaty treti demonstracni priklad vyuzivajici knihovnu SDLjava.
 *
 * Vykresleni jednoducheho vzorku s vyuzitim funkce circleRGBA().
 *
 * @author Pavel Tisnovsky
 */
public class SDLTest53 {
 
    /**
     * Horizontalni rozliseni vybraneho grafickeho rezimu ci okna.
     */
    private static final int GFX_WIDTH = 480;
 
    /**
     * Vertikalni rozliseni vybraneho grafickeho rezimu ci okna.
     */
    private static final int GFX_HEIGHT = 480;
 
    /**
     * Bitova hloubka vybraneho grafickeho rezimu.
     * (0 znamena automaticky vyber, ovsem lze samozrejme pouzit
     * i hodnoty 8, 16, 24 ci 32, podle vlastnosti graficke karty)
     */
    private static final int GFX_BPP = 0;
 
    /**
     * Inicializace grafickeho rezimu ci otevreni okna pro vykreslovani.
     */
    private static SDLSurface initVideo() throws SDLException {
        final long flags = SDLVideo.SDL_DOUBLEBUF;
        return SDLVideo.setVideoMode(GFX_WIDTH, GFX_HEIGHT, GFX_BPP, flags);
    }
 
    /**
     * Smycka pro zpracovani udalosti.
     */
    private static void eventLoop() throws SDLException {
        while (true) {
            // precist udalost z fronty
            SDLEvent event = SDLEvent.waitEvent();
 
            // vyskok ze smycky pro zpracovani udalosti pri vyskytu
            // udalosti typu SDLQuitEvent
            if (event instanceof SDLQuitEvent) {
                return;
            }
 
            // stisk ci pusteni klavesy
            if (event instanceof SDLKeyboardEvent) {
                // pretypovani
                final SDLKeyboardEvent keyEvent = (SDLKeyboardEvent)event;
 
                // symbol/kod klavesy
                final int symbol = keyEvent.getSym();
 
                // ESC ukonci program
                if (symbol == SDLKey.SDLK_ESCAPE && keyEvent.getState() == SDLPressedState.PRESSED) {
                    return;
                }
            }
        }
    }
 
    /**
     * Vykresleni sceny na obrazovku ci do okna aplikace.
     * 
     * @param screen
     *            framebuffer
     */
    private static void drawOnScreen(SDLSurface screen) throws SDLException {
        // rozmery okna aplikace ci rozliseni obrazovky
        final int width = screen.getWidth();
        final int height = screen.getHeight();
 
        // vypocet barvovych slozek pixelu
        int red =    0xff;
        int green =  0xff;
        int blue =   0x00;
        final int alpha =  0x80;
 
        // vykreslit vzorek s vyuzitim funkce circleRGBA()
        for (int i = 0; i < 90; i++) {
            final int radius = 90 - i;
            final int x = (width >> 1)  + (int)((i * 2 + 70) * Math.cos(i/10.0));
            final int y = (height >> 1) + (int)((i * 2 + 70) * Math.sin(i/10.0));
            circleRGBA(screen, x, y, radius, red, green, blue, alpha);
            red-=2;
            blue+=2;
        }
 
        // nutno volat i v pripade, ze neni pouzit double buffering
        screen.updateRect();
        screen.flip();
    }
 
    /**
     * Spusteni padesateho tretiho demonstracniho prikladu.
     */
    public static void main(String[] args) {
        try {
            // inicializace knihovny SDLJava
            SDLMain.init(SDLMain.SDL_INIT_VIDEO);
 
            // inicializace grafickeho rezimu ci otevreni okna pro vykreslovani
            final SDLSurface screen = initVideo();
 
            // vykresleni sceny na obrazovku
            drawOnScreen(screen);
 
            // smycka pro zpracovani udalosti
            eventLoop();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            // musime obnovit puvodni graficky rezim
            // i v tom pripade, ze nastane nejaka vyjimka
            SDLMain.quit();
        }
    }
 
}

Skript pro překlad tohoto demonstračního příkladu na Linuxu:

#!/bin/sh
 
SDL_JAVA_LIBS=./sdljava-0.9.1/lib
 
javac -cp $SDL_JAVA_LIBS/sdljava.jar SDLTest53.java

Dávkový soubor pro překlad tohoto demonstračního příkladu na Windows:

set SDL_JAVA_LIBS=.\sdljava-0.9.1\lib
 
javac -cp %SDL_JAVA_LIBS%\sdljava.jar SDLTest53.java

Skript pro spuštění na Linuxu:

#!/bin/sh
 
SDL_JAVA_LIBS=./sdljava-0.9.1/lib
 
java -cp .:$SDL_JAVA_LIBS/sdljava.jar -Djava.library.path=$SDL_JAVA_LIBS SDLTest53

Dávkový soubor pro spuštění na Windows:

set SDL_JAVA_LIBS=.\sdljava-0.9.1\lib
 
java -cp .;%SDL_JAVA_LIBS%\sdljava.jar -Djava.library.path=%SDL_JAVA_LIBS% SDLTest53

5. Demonstrační příklad SDLTest54: vykreslení jednoduchého vzorku s využitím funkce aacircleColor()

Ve třetím demonstračním příkladu SDLTest54 se opět vykreslují kružnice, tentokrát však již s využitím algoritmu aplikujícího jednoduchý antialiasing, tj. namísto funkcí circleColor() popř. circleRGBA() se používají funkce aacircleColor() popř. aacircleRGBA(). Výsledkem použití vykreslovacího algoritmu s antialiasingem je následující scéna:

Obrázek 9: Vzorek vykreslený demonstračním příkladem SDLTest54.

Obrázek 10: Detail, na němž je vidět funkce algoritmu pro antialiasing.

Podobně jako tomu bylo i v případě úseček, je i zde dobré mít na paměti, že současné použití antialiasingu a poloprůhledných objektů může zapříčinit vznik nežádoucích moaré:

Obrázek 11: Vznik moaré při vykreslení poloprůhledných kružnic.

Obrázek 12: Detail, na němž je vidět funkce algoritmu pro antialiasing.

Zdrojový kód příkladu SDLTest54:

import sdljava.SDLMain;
import sdljava.SDLException;
 
import sdljava.event.SDLEvent;
import sdljava.event.SDLKeyboardEvent;
import sdljava.event.SDLKey;
import sdljava.event.SDLQuitEvent;
 
import sdljava.video.SDLSurface;
import sdljava.video.SDLVideo;
 
import sdljava.x.swig.SDLPressedState;
import static sdljavax.gfx.SDLGfx.*;
 
 
 
/**
 * Padesaty ctvrty demonstracni priklad vyuzivajici knihovnu SDLjava.
 *
 * Vykresleni jednoducheho vzorku s vyuzitim funkce aacircleColor().
 *
 * @author Pavel Tisnovsky
 */
public class SDLTest54 {
 
    /**
     * Horizontalni rozliseni vybraneho grafickeho rezimu ci okna.
     */
    private static final int GFX_WIDTH = 480;
 
    /**
     * Vertikalni rozliseni vybraneho grafickeho rezimu ci okna.
     */
    private static final int GFX_HEIGHT = 480;
 
    /**
     * Bitova hloubka vybraneho grafickeho rezimu.
     * (0 znamena automaticky vyber, ovsem lze samozrejme pouzit
     * i hodnoty 8, 16, 24 ci 32, podle vlastnosti graficke karty)
     */
    private static final int GFX_BPP = 0;
 
    /**
     * Inicializace grafickeho rezimu ci otevreni okna pro vykreslovani.
     */
    private static SDLSurface initVideo() throws SDLException {
        final long flags = SDLVideo.SDL_DOUBLEBUF;
        return SDLVideo.setVideoMode(GFX_WIDTH, GFX_HEIGHT, GFX_BPP, flags);
    }
 
    /**
     * Smycka pro zpracovani udalosti.
     */
    private static void eventLoop() throws SDLException {
        while (true) {
            // precist udalost z fronty
            SDLEvent event = SDLEvent.waitEvent();
 
            // vyskok ze smycky pro zpracovani udalosti pri vyskytu
            // udalosti typu SDLQuitEvent
            if (event instanceof SDLQuitEvent) {
                return;
            }
 
            // stisk ci pusteni klavesy
            if (event instanceof SDLKeyboardEvent) {
                // pretypovani
                final SDLKeyboardEvent keyEvent = (SDLKeyboardEvent)event;
 
                // symbol/kod klavesy
                final int symbol = keyEvent.getSym();
 
                // ESC ukonci program
                if (symbol == SDLKey.SDLK_ESCAPE && keyEvent.getState() == SDLPressedState.PRESSED) {
                    return;
                }
            }
        }
    }
 
    /**
     * Vykresleni sceny na obrazovku ci do okna aplikace.
     * 
     * @param screen
     *            framebuffer
     */
    private static void drawOnScreen(SDLSurface screen) throws SDLException {
        // rozmery okna aplikace ci rozliseni obrazovky
        final int width = screen.getWidth();
        final int height = screen.getHeight();
 
        // vypocet barvovych slozek pixelu
        final int red =    0xff;
        final int green =  0xff;
        final int blue =   0xff;
        final int alpha =  0xff;
 
        // vypocet barvy
        final int color = (red << 24) | (green << 16) | (blue << 8) | alpha;
 
        // vykreslit vzorek s vyuzitim funkce aacircleColor()
        for (int i = 0; i < 140; i++) {
            final int radius = 140 - i;
            final int x = (width >> 1)  + (int)((i + 80) * Math.cos(i/12.0));
            final int y = (height >> 1) + (int)((i + 80) * Math.sin(i/12.0));
            aacircleColor(screen, x, y, radius, color);
        }
 
        // nutno volat i v pripade, ze neni pouzit double buffering
        screen.updateRect();
        screen.flip();
    }
 
    /**
     * Spusteni padesateho ctvrteho demonstracniho prikladu.
     */
    public static void main(String[] args) {
        try {
            // inicializace knihovny SDLJava
            SDLMain.init(SDLMain.SDL_INIT_VIDEO);
 
            // inicializace grafickeho rezimu ci otevreni okna pro vykreslovani
            final SDLSurface screen = initVideo();
 
            // vykresleni sceny na obrazovku
            drawOnScreen(screen);
 
            // smycka pro zpracovani udalosti
            eventLoop();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            // musime obnovit puvodni graficky rezim
            // i v tom pripade, ze nastane nejaka vyjimka
            SDLMain.quit();
        }
    }
 
}

Skript pro překlad tohoto demonstračního příkladu na Linuxu:

#!/bin/sh
 
SDL_JAVA_LIBS=./sdljava-0.9.1/lib
 
javac -cp $SDL_JAVA_LIBS/sdljava.jar SDLTest54.java

Dávkový soubor pro překlad tohoto demonstračního příkladu na Windows:

set SDL_JAVA_LIBS=.\sdljava-0.9.1\lib
 
javac -cp %SDL_JAVA_LIBS%\sdljava.jar SDLTest54.java

Skript pro spuštění na Linuxu:

#!/bin/sh
 
SDL_JAVA_LIBS=./sdljava-0.9.1/lib
 
java -cp .:$SDL_JAVA_LIBS/sdljava.jar -Djava.library.path=$SDL_JAVA_LIBS SDLTest54

Dávkový soubor pro spuštění na Windows:

set SDL_JAVA_LIBS=.\sdljava-0.9.1\lib
 
java -cp .;%SDL_JAVA_LIBS%\sdljava.jar -Djava.library.path=%SDL_JAVA_LIBS% SDLTest54

6. Demonstrační příklad SDLTest55: vykreslení jednoduchého vzorku s využitím funkce filledCircleRGBA()

Poslední příklad, v němž se používají funkce pro vykreslení kružnic a kruhů, nese pojmenování SDLTest55. V tomto příkladu se v jediné programové smyčce nejdříve vykreslí barevný kruh a přes něj černá kružnice, která zvýrazní hranice kruhu. Jádro vykreslovacího algoritmu se v mnoha ohledech podobá jádru použitému v předchozí trojici příkladů:

// vykreslit vzorek s vyuzitim funkce filledCircleRGBA()
for (int i = 0; i < 140; i++) {
    final int radius = 140 - i;
    final int x = (width >> 1)  + (int)((i + 80) * Math.cos(i/12.0));
    final int y = (height >> 1) + (int)((i + 80) * Math.sin(i/12.0));
    filledCircleRGBA(screen, x, y, radius, red, green, blue, alpha);
    aacircleColor(screen, x, y, radius, 0xff); // cerna nepruhledna barva
    red-=2;
    blue+=2;
}

Povšimněte si, že černá neprůhledná barva je reprezentována 32bitovou konstantou 0×000000ff.

Obrázek 13: Vzorek vykreslený demonstračním příkladem SDLTest55.

Zdrojový kód příkladu SDLTest55 má tvar:

import sdljava.SDLMain;
import sdljava.SDLException;
 
import sdljava.event.SDLEvent;
import sdljava.event.SDLKeyboardEvent;
import sdljava.event.SDLKey;
import sdljava.event.SDLQuitEvent;
 
import sdljava.video.SDLSurface;
import sdljava.video.SDLVideo;
 
import sdljava.x.swig.SDLPressedState;
import static sdljavax.gfx.SDLGfx.*;
 
 
 
/**
 * Padesaty paty demonstracni priklad vyuzivajici knihovnu SDLjava.
 *
 * Vykresleni jednoducheho vzorku s vyuzitim funkce filledCircleRGBA().
 *
 * @author Pavel Tisnovsky
 */
public class SDLTest55 {
 
    /**
     * Horizontalni rozliseni vybraneho grafickeho rezimu ci okna.
     */
    private static final int GFX_WIDTH = 480;
 
    /**
     * Vertikalni rozliseni vybraneho grafickeho rezimu ci okna.
     */
    private static final int GFX_HEIGHT = 480;
 
    /**
     * Bitova hloubka vybraneho grafickeho rezimu.
     * (0 znamena automaticky vyber, ovsem lze samozrejme pouzit
     * i hodnoty 8, 16, 24 ci 32, podle vlastnosti graficke karty)
     */
    private static final int GFX_BPP = 0;
 
    /**
     * Inicializace grafickeho rezimu ci otevreni okna pro vykreslovani.
     */
    private static SDLSurface initVideo() throws SDLException {
        final long flags = SDLVideo.SDL_DOUBLEBUF;
        return SDLVideo.setVideoMode(GFX_WIDTH, GFX_HEIGHT, GFX_BPP, flags);
    }
 
    /**
     * Smycka pro zpracovani udalosti.
     */
    private static void eventLoop() throws SDLException {
        while (true) {
            // precist udalost z fronty
            SDLEvent event = SDLEvent.waitEvent();
 
            // vyskok ze smycky pro zpracovani udalosti pri vyskytu
            // udalosti typu SDLQuitEvent
            if (event instanceof SDLQuitEvent) {
                return;
            }
 
            // stisk ci pusteni klavesy
            if (event instanceof SDLKeyboardEvent) {
                // pretypovani
                final SDLKeyboardEvent keyEvent = (SDLKeyboardEvent)event;
 
                // symbol/kod klavesy
                final int symbol = keyEvent.getSym();
 
                // ESC ukonci program
                if (symbol == SDLKey.SDLK_ESCAPE && keyEvent.getState() == SDLPressedState.PRESSED) {
                    return;
                }
            }
        }
    }
 
    /**
     * Vykresleni sceny na obrazovku ci do okna aplikace.
     * 
     * @param screen
     *            framebuffer
     */
    private static void drawOnScreen(SDLSurface screen) throws SDLException {
        // rozmery okna aplikace ci rozliseni obrazovky
        final int width = screen.getWidth();
        final int height = screen.getHeight();
 
        // vypocet barvovych slozek pixelu
        int red =    0xff;
        int green =  0xff;
        int blue =   0x00;
        final int alpha =  0x10;
 
        // vykreslit vzorek s vyuzitim funkce filledCircleRGBA()
        for (int i = 0; i < 140; i++) {
            final int radius = 140 - i;
            final int x = (width >> 1)  + (int)((i + 80) * Math.cos(i/12.0));
            final int y = (height >> 1) + (int)((i + 80) * Math.sin(i/12.0));
            filledCircleRGBA(screen, x, y, radius, red, green, blue, alpha);
            aacircleColor(screen, x, y, radius, 0xff); // cerna nepruhledna barva
            red-=2;
            blue+=2;
        }
 
        // nutno volat i v pripade, ze neni pouzit double buffering
        screen.updateRect();
        screen.flip();
    }
 
    /**
     * Spusteni padesateho pateho demonstracniho prikladu.
     */
    public static void main(String[] args) {
        try {
            // inicializace knihovny SDLJava
            SDLMain.init(SDLMain.SDL_INIT_VIDEO);
 
            // inicializace grafickeho rezimu ci otevreni okna pro vykreslovani
            final SDLSurface screen = initVideo();
 
            // vykresleni sceny na obrazovku
            drawOnScreen(screen);
 
            // smycka pro zpracovani udalosti
            eventLoop();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            // musime obnovit puvodni graficky rezim
            // i v tom pripade, ze nastane nejaka vyjimka
            SDLMain.quit();
        }
    }
 
}

Skript pro překlad tohoto demonstračního příkladu na Linuxu:

#!/bin/sh
 
SDL_JAVA_LIBS=./sdljava-0.9.1/lib
 
javac -cp $SDL_JAVA_LIBS/sdljava.jar SDLTest55.java

Dávkový soubor pro překlad tohoto demonstračního příkladu na Windows:

set SDL_JAVA_LIBS=.\sdljava-0.9.1\lib
 
javac -cp %SDL_JAVA_LIBS%\sdljava.jar SDLTest55.java

Skript pro spuštění na Linuxu:

#!/bin/sh
 
SDL_JAVA_LIBS=./sdljava-0.9.1/lib
 
java -cp .:$SDL_JAVA_LIBS/sdljava.jar -Djava.library.path=$SDL_JAVA_LIBS SDLTest55

Dávkový soubor pro spuštění na Windows:

set SDL_JAVA_LIBS=.\sdljava-0.9.1\lib
 
java -cp .;%SDL_JAVA_LIBS%\sdljava.jar -Djava.library.path=%SDL_JAVA_LIBS% SDLTest55

7. Kreslení trojúhelníků a obdélníků

Pro kreslení trojúhelníků a obdélníků je možné využít několika funkcí, které jsou vypsány v následující tabulce:

# Název funkce Parametry Stručný popis
1 rectangleColor SDLSurface dst, int x1, int y1, int x2, int y2, long color obdélník
2 rectangleRGBA SDLSurface dst, int x1, int y1, int x2, int y2, int r, int g, int b, int a obdélník
3 boxColor SDLSurface dst, int x1, int y1, int x2, int y2, long color vyplněný obdélník
4 boxRGBA SDLSurface dst, int x1, int y1, int x2, int y2, int r, int g, int b, int a vyplněný obdélník
       
5 trigonColor SDLSurface dst, int x1, int y1, int x2, int y2, int x3, int y3, long color trojúhelník
6 trigonRGBA SDLSurface dst, int x1, int y1, int x2, int y2, int x3, int y3, int r, int g, int b, int a trojúhelník
7 aatrigonColor SDLSurface dst, int x1, int y1, int x2, int y2, int x3, int y3, long color trojúhelník (antialiasing hran)
8 aatrigonRGBA SDLSurface dst, int x1, int y1, int x2, int y2, int x3, int y3, int r, int g, int b, int a trojúhelník (antialiasing hran)
9 filledTrigonColor SDLSurface dst, int x1, int y1, int x2, int y2, int x3, int y3, int color vyplněný trojúhelník
10 filledTrigonRGBA SDLSurface dst, int x1, int y1, int x2, int y2, int x3, int y3, int r, int g, int b, int a vyplněný trojúhelník

Pravděpodobně není překvapující, že pro osově orientované obdélníky neexistují varianty funkcí pro vykreslování s využitím antialiasingu.

8. Demonstrační příklad SDLTest56: využití kreslicí funkce filledTrigonColor()

V dnešním posledním příkladu pojmenovaném SDLTest56 je ukázáno využití výše zmíněné funkce filledTrigonColor() při tvorbě vzorku složeného z vyplněných trojúhelníků. Z výpisu zdrojového kódu je patrné, že se této funkci musí předat osm parametrů – plocha typu SDL_Surface, do níž se má trojúhelník vykreslit, za ní následuje trojice souřadnic vrcholů trojúhelníku a posledním parametrem je barva, kterou je trojúhelník vyplněn:

// vykresleni vzorku funkci filledTrigonColor()
for (int y = 0; y < height + width/3; y += 20) {
    for (int x = 0; x < width; x += 20) {
        final int off = x/3;
        filledTrigonColor(screen, x, y - off, x + 16, y - off, x + 8, y - 12 - off, 0xffff00ff);
        filledTrigonColor(screen, x + 7, y - off + 1, x + 23, y - off + 1, x + 15, y + 13 - off, 0xff0000ff);
    }
}

Obrázek 14: Vzorek vykreslený pomocí funkce filledTrigonColor().

Zdrojový kód demonstračního příkladu SDLTest56 má tvar:

import sdljava.SDLMain;
import sdljava.SDLException;
 
import sdljava.event.SDLEvent;
import sdljava.event.SDLKeyboardEvent;
import sdljava.event.SDLKey;
import sdljava.event.SDLQuitEvent;
 
import sdljava.video.SDLSurface;
import sdljava.video.SDLVideo;
 
import sdljava.x.swig.SDLPressedState;
import static sdljavax.gfx.SDLGfx.*;
 
 
 
/**
 * Padesaty paty demonstracni priklad vyuzivajici knihovnu SDLjava.
 *
 * Vykresleni jednoducheho vzorku s vyuzitim funkce filledTrigonColor().
 *
 * @author Pavel Tisnovsky
 */
public class SDLTest56 {
 
    /**
     * Horizontalni rozliseni vybraneho grafickeho rezimu ci okna.
     */
    private static final int GFX_WIDTH = 480;
 
    /**
     * Vertikalni rozliseni vybraneho grafickeho rezimu ci okna.
     */
    private static final int GFX_HEIGHT = 480;
 
    /**
     * Bitova hloubka vybraneho grafickeho rezimu.
     * (0 znamena automaticky vyber, ovsem lze samozrejme pouzit
     * i hodnoty 8, 16, 24 ci 32, podle vlastnosti graficke karty)
     */
    private static final int GFX_BPP = 0;
 
    /**
     * Inicializace grafickeho rezimu ci otevreni okna pro vykreslovani.
     */
    private static SDLSurface initVideo() throws SDLException {
        final long flags = SDLVideo.SDL_DOUBLEBUF;
        return SDLVideo.setVideoMode(GFX_WIDTH, GFX_HEIGHT, GFX_BPP, flags);
    }
 
    /**
     * Smycka pro zpracovani udalosti.
     */
    private static void eventLoop() throws SDLException {
        while (true) {
            // precist udalost z fronty
            SDLEvent event = SDLEvent.waitEvent();
 
            // vyskok ze smycky pro zpracovani udalosti pri vyskytu
            // udalosti typu SDLQuitEvent
            if (event instanceof SDLQuitEvent) {
                return;
            }
 
            // stisk ci pusteni klavesy
            if (event instanceof SDLKeyboardEvent) {
                // pretypovani
                final SDLKeyboardEvent keyEvent = (SDLKeyboardEvent)event;
 
                // symbol/kod klavesy
                final int symbol = keyEvent.getSym();
 
                // ESC ukonci program
                if (symbol == SDLKey.SDLK_ESCAPE && keyEvent.getState() == SDLPressedState.PRESSED) {
                    return;
                }
            }
        }
    }
 
    /**
     * Vykresleni sceny na obrazovku ci do okna aplikace.
     * 
     * @param screen
     *            framebuffer
     */
    private static void drawOnScreen(SDLSurface screen) throws SDLException {
        // rozmery okna aplikace ci rozliseni obrazovky
        final int width = screen.getWidth();
        final int height = screen.getHeight();
 
        // vykresleni vzorku funkci filledTrigonColor()
        for (int y = 0; y < height + width/3; y += 20) {
            for (int x = 0; x < width; x += 20) {
                final int off = x/3;
                filledTrigonColor(screen, x, y - off, x + 16, y - off, x + 8, y - 12 - off, 0xffff00ff);
                filledTrigonColor(screen, x + 7, y - off + 1, x + 23, y - off + 1, x + 15, y + 13 - off, 0xff0000ff);
            }
        }
 
        // nutno volat i v pripade, ze neni pouzit double buffering
        screen.updateRect();
        screen.flip();
    }
 
    /**
     * Spusteni padesateho sesteho demonstracniho prikladu.
     */
    public static void main(String[] args) {
        try {
            // inicializace knihovny SDLJava
            SDLMain.init(SDLMain.SDL_INIT_VIDEO);
 
            // inicializace grafickeho rezimu ci otevreni okna pro vykreslovani
            final SDLSurface screen = initVideo();
 
            // vykresleni sceny na obrazovku
            drawOnScreen(screen);
 
            // smycka pro zpracovani udalosti
            eventLoop();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            // musime obnovit puvodni graficky rezim
            // i v tom pripade, ze nastane nejaka vyjimka
            SDLMain.quit();
        }
    }
 
}

Skript pro překlad tohoto demonstračního příkladu na Linuxu:

#!/bin/sh
 
SDL_JAVA_LIBS=./sdljava-0.9.1/lib
 
javac -cp $SDL_JAVA_LIBS/sdljava.jar SDLTest56.java

Dávkový soubor pro překlad tohoto demonstračního příkladu na Windows:

set SDL_JAVA_LIBS=.\sdljava-0.9.1\lib
 
javac -cp %SDL_JAVA_LIBS%\sdljava.jar SDLTest56.java

Skript pro spuštění na Linuxu:

#!/bin/sh
 
SDL_JAVA_LIBS=./sdljava-0.9.1/lib
 
java -cp .:$SDL_JAVA_LIBS/sdljava.jar -Djava.library.path=$SDL_JAVA_LIBS SDLTest56

Dávkový soubor pro spuštění na Windows:

set SDL_JAVA_LIBS=.\sdljava-0.9.1\lib
 
java -cp .;%SDL_JAVA_LIBS%\sdljava.jar -Djava.library.path=%SDL_JAVA_LIBS% SDLTest56

9. Kreslicí funkce pro grafické entity s proměnným počtem vrcholů a/nebo řídicích bodů

V knihovně SDLJava nalezneme i několik funkcí určených pro vykreslení složitějších grafických entit, konkrétně entit s proměnným počtem vrcholů. Jedná se jak o polygony, tak i o Bézierovy křivky. Programátoři využívající Javu by mohli předpokládat, že se v tomto případě použijí statické metody/funkce s proměnným počtem parametrů, ovšem vzhledem k tomu, že je SDLJava nízkoúrovňová knihovna, je implementováno poněkud překvapivé řešení – souřadnice vrcholů jsou předávány přes objekty typu java.nio.ShortBuffer, což sice není příliš elegantní řešení, ovšem je efektivní při přenosu většího množství dat mezi Javovskou částí aplikace a nativním kódem. Příklady použití při vykreslování obecných polygonů a Bézierových křivek si ukážeme v navazující části tohoto seriálu.

10. Repositář se zdrojovými kódy všech pěti dnešních demonstračních příkladů

Všech pět dnes popsaných demonstračních příkladů bylo společně s podpůrnými skripty určenými pro jejich překlad a následné spuštění uloženo do Mercurial repositáře dostupného na adrese http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/. Podobně jako tomu bylo i v předchozích několika dílech tohoto seriálu, i ke dnešním příkladům jsou přiloženy skripty využitelné pro jejich překlad a spuštění. Navíc byly přidány i skripty využitelné ve Windows:

# Zdrojový soubor/skript Umístění souboru v repositáři
1 SDLTest52.java http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest52/SDLTest52.ja­va
2 SDLTest52_compile.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest52/SDLTest52_com­pile.sh
3 SDLTest52_compile_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest52/SDLTest52_com­pile_sys.sh
4 SDLTest52_run.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest52/SDLTest52_run­.sh
5 SDLTest52_run_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest52/SDLTest52_run_sys­.sh
6 SDLTest52_compile.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest52/SDLTest52_com­pile.bat
7 SDLTest52_run.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest52/SDLTest52_run­.bat
     
8 SDLTest53.java http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest53/SDLTest53.ja­va
9 SDLTest53_compile.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest53/SDLTest53_com­pile.sh
10 SDLTest53_compile_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest53/SDLTest53_com­pile_sys.sh
11 SDLTest53_run.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest53/SDLTest53_run­.sh
12 SDLTest53_run_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest53/SDLTest53_run_sys­.sh
13 SDLTest53_compile.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest53/SDLTest53_com­pile.bat
14 SDLTest53_run.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest53/SDLTest53_run­.bat
     
15 SDLTest54.java http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest54/SDLTest54.ja­va
16 SDLTest54_compile.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest54/SDLTest54_com­pile.sh
17 SDLTest54_compile_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest54/SDLTest54_com­pile_sys.sh
18 SDLTest54_run.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest54/SDLTest54_run­.sh
19 SDLTest54_run_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest54/SDLTest54_run_sys­.sh
20 SDLTest54_compile.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest54/SDLTest54_com­pile.bat
21 SDLTest54_run.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest54/SDLTest54_run­.bat
     
22 SDLTest55.java http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest55/SDLTest55.ja­va
23 SDLTest55_compile.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest55/SDLTest55_com­pile.sh
24 SDLTest55_compile_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest55/SDLTest55_com­pile_sys.sh
25 SDLTest55_run.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest55/SDLTest55_run­.sh
26 SDLTest55_run_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest55/SDLTest55_run_sys­.sh
27 SDLTest55_compile.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest55/SDLTest55_com­pile.bat
28 SDLTest55_run.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest55/SDLTest55_run­.bat
     
29 SDLTest56.java http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest56/SDLTest56.ja­va
30 SDLTest56_compile.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest56/SDLTest56_com­pile.sh
31 SDLTest56_compile_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest56/SDLTest56_com­pile_sys.sh
32 SDLTest56_run.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest56/SDLTest56_run­.sh
33 SDLTest56_run_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest56/SDLTest56_run_sys­.sh
34 SDLTest56_compile.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest56/SDLTest56_com­pile.bat
35 SDLTest56_run.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/94287489492c/sdlja­va/SDLTest56/SDLTest56_run­.bat

11. Odkazy na Internetu

  1. SDLJava: package sdljava.ttf
    http://sdljava.sourceforge­.net/docs/api/sdljava/ttf/pac­kage-summary.html#package_description
  2. SDLJava: class sdljava.ttf.SDLTTF
    http://sdljava.sourceforge­.net/docs/api/sdljava/ttf/SDLTTF­.html
  3. SDLJava: class sdljava.ttf.SDLTrueTypeFont
    http://sdljava.sourceforge­.net/docs/api/sdljava/ttf/SDLTru­eTypeFont.html
  4. SDL_ttf Documentation
    http://www.libsdl.org/pro­jects/SDL_ttf/docs/
  5. SDL_ttf 2.0 (není prozatím součástí SDLJava)
    http://www.libsdl.org/pro­jects/SDL_ttf/
  6. SDL_ttf doc
    http://www.libsdl.org/pro­jects/SDL_ttf/docs/SDL_ttf_fra­me.html
  7. SDL 1.2 Documentation: SDL_Surface
    http://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlsurface.html
  8. SDL 1.2 Documentation: SDL_PixelFormat
    http://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlpixelformat.html
  9. SDL 1.2 Documentation: SDL_LockSurface
    http://www.libsdl.org/release/SDL-1.2.15/docs/html/sdllocksurface.html
  10. SDL 1.2 Documentation: SDL_UnlockSurface
    http://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlunlocksurface.html
  11. SDL 1.2 Documentation: SDL_LoadBMP
    http://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlloadbmp.html
  12. SDL 1.2 Documentation: SDL_SaveBMP
    http://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlsavebmp.html
  13. SDL 1.2 Documentation: SDL_BlitSurface
    http://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlblitsurface.html
  14. SDL 1.2 Documentation: SDL_VideoInfo
    http://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlvideoinfo.html
  15. SDL 1.2 Documentation: SDL_GetVideoInfo
    http://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlgetvideoinfo.html
  16. glDrawArrays
    http://www.opengl.org/sdk/doc­s/man4/xhtml/glDrawArrays­.xml
  17. glDrawElements
    http://www.opengl.org/sdk/doc­s/man4/xhtml/glDrawElemen­ts.xml
  18. glDrawArraysInstanced
    http://www.opengl.org/sdk/doc­s/man4/xhtml/glDrawArraysIn­stanced.xml
  19. glDrawElementsInstanced
    http://www.opengl.org/sdk/doc­s/man4/xhtml/glDrawElemen­tsInstanced.xml
  20. Root.cz: Seriál Grafická knihovna OpenGL
    http://www.root.cz/serialy/graficka-knihovna-opengl/
  21. Root.cz: Seriál Tvorba přenositelných grafických aplikací využívajících knihovnu GLUT
    http://www.root.cz/serialy/tvorba-prenositelnych-grafickych-aplikaci-vyuzivajicich-knihovnu-glut/
  22. Best Practices for Working with Vertex Data
    https://developer.apple.com/li­brary/ios/documentation/3ddra­wing/conceptual/opengles_pro­grammingguide/Techniquesfor­WorkingwithVertexData/Techni­quesforWorkingwithVertexDa­ta.html
  23. Class BufferStrategy
    http://docs.oracle.com/ja­vase/6/docs/api/java/awt/i­mage/BufferStrategy.html
  24. Class Graphics
    http://docs.oracle.com/ja­vase/1.5.0/docs/api/java/aw­t/Graphics.html
  25. Double Buffering and Page Flipping
    http://docs.oracle.com/ja­vase/tutorial/extra/fullscre­en/doublebuf.html
  26. BufferStrategy and BufferCapabilities
    http://docs.oracle.com/ja­vase/tutorial/extra/fullscre­en/bufferstrategy.html
  27. Java:Tutorials:Double Buffering
    http://content.gpwiki.org/in­dex.php/Java:Tutorials:Dou­ble_Buffering
  28. Double buffer in standard Java AWT
    http://www.codeproject.com/Ar­ticles/2136/Double-buffer-in-standard-Java-AWT
  29. Java 2D: Hardware Accelerating – Part 1 – Volatile Images
    http://www.javalobby.org/fo­rums/thread.jspa?threadID=16840&tstar­t=0
  30. Java 2D: Hardware Accelerating – Part 2 – Buffer Strategies
    http://www.javalobby.org/ja­va/forums/t16867.html
  31. How does paintComponent work?
    http://stackoverflow.com/qu­estions/15544549/how-does-paintcomponent-work
  32. A Swing Architecture Overview
    http://www.oracle.com/technet­work/java/architecture-142923.html
  33. Class javax.swing.JComponent
    http://docs.oracle.com/ja­vase/6/docs/api/javax/swin­g/JComponent.html
  34. Class java.awt.Component
    http://docs.oracle.com/ja­vase/6/docs/api/java/awt/Com­ponent.html
  35. Class java.awt.Component.BltBufferStrategy
    http://docs.oracle.com/ja­vase/6/docs/api/java/awt/Com­ponent.BltBufferStrategy.html
  36. Class java.awt.Component.FlipBufferStrategy
    http://docs.oracle.com/ja­vase/6/docs/api/java/awt/Com­ponent.FlipBufferStrategy­.html
  37. Metoda java.awt.Component.isDoubleBuffered()
    http://docs.oracle.com/ja­vase/6/docs/api/java/awt/Com­ponent.html#isDoubleBuffe­red()
  38. Metoda javax.swing.JComponent.is­DoubleBuffered()
    http://docs.oracle.com/ja­vase/6/docs/api/javax/swin­g/JComponent.html#isDouble­Buffered()
  39. Metoda javax.swing.JComponent.set­DoubleBuffered()
    http://docs.oracle.com/ja­vase/6/docs/api/javax/swin­g/JComponent.html#setDouble­Buffered(boolean)
  40. Javadoc – třída GraphicsDevice
    http://docs.oracle.com/ja­vase/7/docs/api/java/awt/Grap­hicsDevice.html
  41. Javadoc – třída GraphicsEnvironment
    http://docs.oracle.com/ja­vase/7/docs/api/java/awt/Grap­hicsEnvironment.html
  42. Javadoc – třída GraphicsConfiguration
    http://docs.oracle.com/ja­vase/7/docs/api/java/awt/Grap­hicsConfiguration.html
  43. Javadoc – třída DisplayMode
    http://docs.oracle.com/ja­vase/7/docs/api/java/awt/Dis­playMode.html
  44. Lesson: Full-Screen Exclusive Mode API
    http://docs.oracle.com/ja­vase/tutorial/extra/fullscre­en/
  45. Full-Screen Exclusive Mode
    http://docs.oracle.com/ja­vase/tutorial/extra/fullscre­en/exclusivemode.html
  46. Display Mode
    http://docs.oracle.com/ja­vase/tutorial/extra/fullscre­en/displaymode.html
  47. Using the Full-Screen Exclusive Mode API in Java
    http://www.developer.com/ja­va/other/article.php/3609776/U­sing-the-Full-Screen-Exclusive-Mode-API-in-Java.htm
  48. Java quick guide: JVM Instruction Set (tabulka všech instrukcí JVM)
    http://www.mobilefish.com/tu­torials/java/java_quickgu­ide_jvm_instruction_set.html
  49. The JVM Instruction Set
    http://mpdeboer.home.xs4a­ll.nl/scriptie/node14.html
  50. MultiMedia eXtensions
    http://softpixel.com/~cwrig­ht/programming/simd/mmx.phpi
  51. SSE (Streaming SIMD Extentions)
    http://www.songho.ca/misc/sse/sse­.html
  52. Timothy A. Chagnon: SSE and SSE2
    http://www.cs.drexel.edu/~tc365/mpi-wht/sse.pdf
  53. Intel corporation: Extending the Worldr's Most Popular Processor Architecture
    http://download.intel.com/techno­logy/architecture/new-instructions-paper.pdf
  54. SIMD architectures:
    http://arstechnica.com/ol­d/content/2000/03/simd.ar­s/
  55. GC safe-point (or safepoint) and safe-region
    http://xiao-feng.blogspot.cz/2008/01/gc-safe-point-and-safe-region.html
  56. Safepoints in HotSpot JVM
    http://blog.ragozin.info/2012/10/sa­fepoints-in-hotspot-jvm.html
  57. Java theory and practice: Synchronization optimizations in Mustang
    http://www.ibm.com/develo­perworks/java/library/j-jtp10185/
  58. How to build hsdis
    http://hg.openjdk.java.net/jdk7/hot­spot/hotspot/file/tip/src/sha­re/tools/hsdis/README
  59. Java SE 6 Performance White Paper
    http://www.oracle.com/technet­work/java/6-performance-137236.html
  60. Lukas Stadler's Blog
    http://classparser.blogspot­.cz/2010/03/hsdis-i386dll.html
  61. How to build hsdis-amd64.dll and hsdis-i386.dll on Windows
    http://dropzone.nfshost.com/hsdis.htm
  62. PrintAssembly
    https://wikis.oracle.com/dis­play/HotSpotInternals/Prin­tAssembly
  63. The Java Virtual Machine Specification: 3.14. Synchronization
    http://docs.oracle.com/ja­vase/specs/jvms/se7/html/jvms-3.html#jvms-3.14
  64. The Java Virtual Machine Specification: 8.3.1.4. volatile Fields
    http://docs.oracle.com/ja­vase/specs/jls/se7/html/jls-8.html#jls-8.3.1.4
  65. The Java Virtual Machine Specification: 17.4. Memory Model
    http://docs.oracle.com/ja­vase/specs/jls/se7/html/jls-17.html#jls-17.4
  66. The Java Virtual Machine Specification: 17.7. Non-atomic Treatment of double and long
    http://docs.oracle.com/ja­vase/specs/jls/se7/html/jls-17.html#jls-17.7
  67. Open Source ByteCode Libraries in Java
    http://java-source.net/open-source/bytecode-libraries
  68. ASM Home page
    http://asm.ow2.org/
  69. Seznam nástrojů využívajících projekt ASM
    http://asm.ow2.org/users.html
  70. ObjectWeb ASM (Wikipedia)
    http://en.wikipedia.org/wi­ki/ObjectWeb_ASM
  71. Java Bytecode BCEL vs ASM
    http://james.onegoodcooki­e.com/2005/10/26/java-bytecode-bcel-vs-asm/
  72. BCEL Home page
    http://commons.apache.org/bcel/
  73. Byte Code Engineering Library (před verzí 5.0)
    http://bcel.sourceforge.net/
  74. Byte Code Engineering Library (verze >= 5.0)
    http://commons.apache.org/pro­per/commons-bcel/
  75. BCEL Manual
    http://commons.apache.org/bcel/ma­nual.html
  76. Byte Code Engineering Library (Wikipedia)
    http://en.wikipedia.org/wiki/BCEL
  77. BCEL Tutorial
    http://www.smfsupport.com/sup­port/java/bcel-tutorial!/
  78. Bytecode Engineering
    http://book.chinaunix.net/spe­cial/ebook/Core_Java2_Volu­me2AF/0131118269/ch13lev1sec6­.html
  79. Bytecode Outline plugin for Eclipse (screenshoty + info)
    http://asm.ow2.org/eclipse/index.html
  80. Javassist
    http://www.jboss.org/javassist/
  81. Byteman
    http://www.jboss.org/byteman
  82. Java programming dynamics, Part 7: Bytecode engineering with BCEL
    http://www.ibm.com/develo­perworks/java/library/j-dyn0414/
  83. The JavaTM Virtual Machine Specification, Second Edition
    http://java.sun.com/docs/bo­oks/jvms/second_edition/html/VMSpec­TOC.doc.html
  84. The class File Format
    http://java.sun.com/docs/bo­oks/jvms/second_edition/html/Clas­sFile.doc.html
  85. javap – The Java Class File Disassembler
    http://docs.oracle.com/ja­vase/1.4.2/docs/tooldocs/win­dows/javap.html
  86. javap-java-1.6.0-openjdk(1) – Linux man page
    http://linux.die.net/man/1/javap-java-1.6.0-openjdk
  87. Using javap
    http://www.idevelopment.in­fo/data/Programming/java/mis­cellaneous_java/Using_javap­.html
  88. Examine class files with the javap command
    http://www.techrepublic.com/ar­ticle/examine-class-files-with-the-javap-command/5815354
  89. aspectj (Eclipse)
    http://www.eclipse.org/aspectj/
  90. Aspect-oriented programming (Wikipedia)
    http://en.wikipedia.org/wi­ki/Aspect_oriented_program­ming
  91. AspectJ (Wikipedia)
    http://en.wikipedia.org/wiki/AspectJ
  92. EMMA: a free Java code coverage tool
    http://emma.sourceforge.net/
  93. Cobertura
    http://cobertura.sourceforge.net/
  94. jclasslib bytecode viewer
    http://www.ej-technologies.com/products/jclas­slib/overview.html
Našli jste v článku chybu?
Vitalia.cz: 7 originálních adventních kalendářů pro mlsné

7 originálních adventních kalendářů pro mlsné

120na80.cz: Boreliózu nelze žádným testem prokázat

Boreliózu nelze žádným testem prokázat

Lupa.cz: Levný tarif pro Brno nebude, je to kartel

Levný tarif pro Brno nebude, je to kartel

DigiZone.cz: R2B2 a Hybrid uzavřely partnerství

R2B2 a Hybrid uzavřely partnerství

DigiZone.cz: SES zajistí HD pro M7 Group

SES zajistí HD pro M7 Group

Podnikatel.cz: Chtějte údaje k dani z nemovitostí do mailu

Chtějte údaje k dani z nemovitostí do mailu

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Lupa.cz: Obchod budoucnosti je bez front, košíků i pokladen

Obchod budoucnosti je bez front, košíků i pokladen

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Vitalia.cz: Jak vybrat ořechy do cukroví a kde mají levné

Jak vybrat ořechy do cukroví a kde mají levné

Měšec.cz: Za palivo zaplatíte mobilem (TEST)

Za palivo zaplatíte mobilem (TEST)

DigiZone.cz: Ohrozí Freedom TV přechodové sítě?

Ohrozí Freedom TV přechodové sítě?

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka

Měšec.cz: Exekuční poradna: ptejte se online

Exekuční poradna: ptejte se online

Podnikatel.cz: E-Ježíšek si zařádí: nákupy od 2 do 5 tisíc

E-Ježíšek si zařádí: nákupy od 2 do 5 tisíc

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Vitalia.cz: Nejlepší obranou při nachlazení je útok

Nejlepší obranou při nachlazení je útok