Pohled pod kapotu JVM – kreslicí funkce dostupné ve třídě sdljavax.gfx.SDLGfx

Pavel Tišnovský 8. 4. 2014

V dnešní části seriálu o programovacím jazyku Java i o virtuálním stroji tohoto jazyka si popíšeme některé funkce nabízené třídou sdljavax.gfx.SDLGfx. Tyto funkce slouží k vykreslování různých základních grafických entit do zvolené plochy (SDL_Surface), tedy mj. i přímo do framebufferu.

Obsah

1. Pohled pod kapotu JVM – kreslicí funkce dostupné ve třídě sdljavax.gfx.SDLGfx

2. Seznam základních kreslicích funkcí

3. Kreslení na úrovni jednotlivých pixelů

4. Demonstrační příklad SDLTest47: vykreslení pixelů s využitím funkce sdljavax.gfx.SDLGfx.pixelRGBA()

5. Demonstrační příklad SDLTest48: vykreslení pixelů s využitím funkce sdljavax.gfx.SDLGfx.pixelColor()

6. Demonstrační příklad SDLTest49: korektní výpočet barev pro funkci sdljavax.gfx.SDLGfx.pixelColor()

7. Kreslení úseček, antialiasing a využití alfa kanálu

8. Demonstrační příklad SDLTest50: vykreslení obrazce složeného z úseček

9. Demonstrační příklad SDLTest51: využití antialiasingu

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

11. Odkazy na Internetu

1. Pohled pod kapotu JVM – kreslicí funkce dostupné ve třídě sdljavax.gfx.SDLGfx

Při popisu knihovny SDLJava jsme se prozatím zmínili pouze o dvou způsobech používaných při vykreslování objektů do zvolené plochy typu SDL_Surface. Jedná se o metodu SDLSurface.fillRect(), které se předá objekt typu SDLRect obsahující informace o geometrii vyplňovaného obdélníku (pozice na obrazovce plus rozměry) a taktéž barva, kterou se má obdélník vyplnit. Barva je představována proměnnou typu long a pro získání skutečné hodnoty barvy se používá metoda SDLSurface.mapRGB(), která zajistí, že se výpočet barvy provede s ohledem na formát pixelů uložených v bitmapě nebo ve framebufferu. To mj. znamená, že v případě použití grafického režimu s jinou bitovou hloubkou vrátí tato metoda odlišnou hodnotu.

Druhý způsob vykreslování objektů, který nám knihovna SDLJava nabízí a který jsme si již také popsali, spočívá ve využití možností OpenGL – jakmile dojde k inicializaci kontextu OpenGL, je možné zahájit vykreslování do předního a/nebo zadního bufferu, a to samozřejmě s využitím schopností grafických akcelerátorů.

Existuje ovšem i mnoho případů, v nichž je zapotřebí provést vykreslení nějaké (základní) entity nikoli do framebufferu, ale do vybrané SDL_Surface uložené v operační paměti. V tomto případě nám již metoda SDLSurface.fillRect() nebude dostačovat a vykreslení přes OpenGL se zpětnou kopií bitmapy z framebufferu do vybrané SDL_Surface je zbytečně komplikované. Nicméně knihovna SDLJava nám i v této chvíli nabízí řešení spočívající ve využití funkcí uložených ve třídě sdljavax.gfx.SDLGfx. Termín „funkce“ je zde použit z toho důvodu, že v sdljavax.gfx.SDLGfx nalezneme pouze statické veřejné metody, což znamená, že tyto metody/funkce lze staticky importovat, což vede ke kratšímu zápisu algoritmů sloužících k vykreslení celé scény (a právě statický import sdljavax.gfx.SDLGfx bude použit i v dnešních demonstračních příkladech).

2. Seznam základních kreslicích funkcí

V následující tabulce jsou vypsány vybrané funkce ze třídy sdljavax.gfx.SDLGfx, které lze použít k vykreslení základních entit do zvolené plochy typu SDL_Surface. Povšimněte si, že mnoho funkcí se od sebe odlišuje pouze ve způsobu specifikace barvy:

# Název funkce Parametry Stručný popis
1 pixelColor SDLSurface dst, int x, int y, long color vykreslení pixelu
2 pixelRGBA SDLSurface dst, int x, int y, int r, int g, int b, int a vykreslení pixelu
       
3 lineColor SDLSurface dst, int x1, int y1, int x2, int y2, long color úsečka
4 lineRGBA SDLSurface dst, int x1, int y1, int x2, int y2, int r, int g, int b, int a úsečka
5 hlineColor SDLSurface dst, int x1, int x2, int y, long color vodorovná úsečka
6 hlineRGBA SDLSurface dst, int x1, int x2, int y, int r, int g, int b, int a vodorovná úsečka
7 vlineColor SDLSurface dst, int x, int y1, int y2, long color svislá úsečka
8 vlineRGBA SDLSurface dst, int x, int y1, int y2, int r, int g, int b, int a svislá úsečka
9 aalineColor SDLSurface dst, int x1, int y1, int x2, int y2, long color úsečka s vyhlazenou hranou
10 aalineRGBA SDLSurface dst, int x1, int y1, int x2, int y2, int r, int g, int b, int a úsečka s vyhlazenou hranou
       
11 circleColor SDLSurface dst, int x, int y, int r, long color kružnice
12 circleRGBA SDLSurface dst, int x, int y, int rad, int r, int g, int b, int a kružnice
13 aacircleColor SDLSurface dst, int x, int y, int r, long color kružnice s vyhlazeným okrajem
14 aacircleRGBA SDLSurface dst, int x, int y, int rad, int r, int g, int b, int a kružnice s vyhlazeným okrajem
15 filledCircleColor SDLSurface dst, int x, int y, int r, long color kruh
16 filledCircleRGBA SDLSurface dst, int x, int y, int rad, int r, int g, int b, int a kruh
       
17 ellipseColor SDLSurface dst, int x, int y, int rx, int ry, long color elipsa
18 ellipseRGBA SDLSurface dst, int x, int y, int rx, int ry, int r, int g, int b, int a elipsa
19 aaellipseColor SDLSurface dst, int xc, int yc, int rx, int ry, long color elipsa s vyhlazeným okrajem
20 aaellipseRGBA SDLSurface dst, int x, int y, int rx, int ry, int r, int g, int b, int a elipsa s vyhlazeným okrajem
21 filledEllipseColor SDLSurface dst, int x, int y, int rx, int ry, long color vyplněná elipsa
22 filledEllipseRGBA SDLSurface dst, int x, int y, int rx, int ry, int r, int g, int b, int a vyplněná elipsa

3. Kreslení na úrovni jednotlivých pixelů

Z tabulky vypsané v předchozí kapitole lze mj. vyčíst, že knihovna SDLJava nabízí programátorům i dvojici funkcí určených pro zápis barvy jednoho pixelu do zvolené roviny typu SDL_Surface. Tyto funkce se jmenují pixelColor()pixelRGBA(). Obě zmíněné funkce se od sebe odlišují pouze tím, jakým způsobem je reprezentována barva vykreslovaného pixelu. V případě použití funkce pixelRGBA() se barva zadává čtyřmi argumenty reprezentujícími barvové složky red, greenblue i průhlednost pixelu alfa. Funkce pixelColor() naproti tomu očekává, že barva i průhlednost pixelu bude reprezentována jedinou 32bitovou hodnotou, která musí mít formát 0×RRGGBBAA – to znamená, že v dolních osmi bitech je uložena průhlednost pixelu, v dalších osmi bitech červená barvová složka, následuje zelená barvová složka a konečně v nejvyšších osmi bitech je uložena červená barvová složka. Na tomto místě je zapotřebí upozornit na to, že v mnoha algoritmech, jejichž zápis lze najít na internetu, se naproti tomu předpokládá formát 0×AARRGGBB či dokonce 0×AABBGGRR!

4. Demonstrační příklad SDLTest47: vykreslení pixelů s využitím funkce sdljavax.gfx.SDLGfx.pixelRGBA()

V dnešním prvním demonstračním příkladu pojmenovaném SDLTest47 je ukázán způsob využití funkce sdljavax.gfx.SDLGfx.pixelRGBA() při nastavování barev jednotlivých pixelů uložených přímo ve framebufferu. V metodě drawOnScreen() je do zadního bufferu (back buffer) vykreslen vzorek známý pod jménem „circle (pattern)“, jenž je mj. použit i v programu Fractint. Každá barvová složka pixelu je nejprve uložena do lokální proměnné red, green, blue a následně je zavolána již zmíněná funkce sdljavax.gfx.SDLGfx.pixelRGBA(), která se postará o vykreslení pixelu do zadního bufferu. Povšimněte si posledního parametru této funkce – v něm je předána hodnota průhlednosti pixelu. Z tohoto důvodu zde používáme hodnotu 255, protože původně zadní buffer obsahoval pouze černé pixely:

// vykreslit vzorek s vyuzitim funkce pixelRGBA().
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        // vypocet barvovych slozek pixelu
        final int red =   (x*x) + (y*y);
        final int green = ((x-1)*x) + (y*y);
        final int blue =  (x*x) + ((y-1)*y);
        // vykresleni pixelu
        pixelRGBA(screen, x, y, red, green, blue, 255);
    }
}

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

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.*;
 
 
 
/**
 * Ctyricaty sedmy demonstracni priklad vyuzivajici knihovnu SDLjava.
 *
 * Vykresleni vzorku s vyuzitim funkce sdljavax.gfx.SDLGfx.pixelRGBA().
 *
 * @author Pavel Tisnovsky
 */
public class SDLTest47 {
 
    /**
     * Horizontalni rozliseni vybraneho grafickeho rezimu ci okna.
     */
    private static final int GFX_WIDTH = 640;
 
    /**
     * 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();
 
        // vykreslit vzorek s vyuzitim funkce pixelRGBA().
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                // vypocet barvovych slozek pixelu
                final int red =   (x*x) + (y*y);
                final int green = ((x-1)*x) + (y*y);
                final int blue =  (x*x) + ((y-1)*y);
                // vykresleni pixelu
                pixelRGBA(screen, x, y, red, green, blue, 255);
            }
        }
 
        // nutno volat i v pripade, ze neni pouzit double buffering
        screen.updateRect();
        screen.flip();
    }
 
    /**
     * Spusteni ctyricateho sedmeho 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 SDLTest47.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 SDLTest47.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 SDLTest47

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% SDLTest47

5. Demonstrační příklad SDLTest48: vykreslení pixelů s využitím funkce sdljavax.gfx.SDLGfx.pixelColor()

Ve druhém demonstračním příkladu pojmenovaném SDLTest48 je ukázáno použití funkce sdljavax.gfx.SDLGfx.pixelColor() pro vykreslení vzorku „circle pattern“, který by měl odpovídat vzorku vykresleného v předchozím demonstračním příkladu. Barvové složky jednotlivých pixelů jsou opět (v metodě drawOnScreen) vypočteny zvlášť a posléze jsou sloučeny do jediné 32bitové hodnoty, a to z toho důvodu, že funkce sdljavax.gfx.SDLGfx.pixelColor() akceptuje barvu a průhlednost pixelu zakódovanou do jediného 32bitového slova:

// vykreslit vzorek s vyuzitim funkce pixelColor().
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        // vypocet barvovych slozek pixelu
        final int red =   (x*x) + (y*y);
        final int green = ((x-1)*x) + (y*y);
        final int blue =  (x*x) + ((y-1)*y);
        // vypocet barvy
        final int color = (red << 24) | (green << 16) | (blue << 8) | 255;
        // vykresleni pixelu
        pixelColor(screen, x, y, color);
    }
}

Při pohledu na vzorek vykreslený tímto demonstračním příkladem je však patrné, že ve skutečnosti při výpočtu barev jednotlivých pixelů došlo k chybě. Ta je způsobena tím, že hodnoty jednotlivých barvových složek mohou být vyšší než 255 a tím pádem hodnota dané barvové složky „přeteče“ do té části 32bitové hodnoty, která je již vyhrazena pro jinou barvovou složku:

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

Opět se podívejme na výpis úplného zdrojového textu 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.*;
 
 
 
/**
 * Ctyricaty osmy demonstracni priklad vyuzivajici knihovnu SDLjava.
 *
 * Vykresleni vzorku s vyuzitim funkce sdljavax.gfx.SDLGfx.pixelColor().
 *
 * @author Pavel Tisnovsky
 */
public class SDLTest48 {
 
    /**
     * Horizontalni rozliseni vybraneho grafickeho rezimu ci okna.
     */
    private static final int GFX_WIDTH = 640;
 
    /**
     * 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();
 
        // vykreslit vzorek s vyuzitim funkce pixelColor().
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                // vypocet barvovych slozek pixelu
                final int red =   (x*x) + (y*y);
                final int green = ((x-1)*x) + (y*y);
                final int blue =  (x*x) + ((y-1)*y);
                // vypocet barvy
                final int color = (red << 24) | (green << 16) | (blue << 8) | 255;
                // vykresleni pixelu
                pixelColor(screen, x, y, color);
            }
        }
 
        // nutno volat i v pripade, ze neni pouzit double buffering
        screen.updateRect();
        screen.flip();
    }
 
    /**
     * Spusteni ctyricateho osmeho 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 SDLTest48.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 SDLTest48.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 SDLTest48

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% SDLTest48

6. Demonstrační příklad SDLTest49: korektní výpočet barev pro funkci sdljavax.gfx.SDLGfx.pixelColor()

Náprava chyby při výpočtu barvových složek jednotlivých pixelů, které jsme se dopustili v předchozím demonstračním příkladu, je ve skutečnosti velmi jednoduchá. Hodnoty barvových složek je nutné upravit s využitím masky 255 (0×ff) takovým způsobem, aby jejich výsledná hodnota ležela pouze v rozsahu 0 až 255. Poté lze již bez dalších problémů spojit jednotlivé barvové složky i průhlednost do jediného 32bitového slova předaného do funkce sdljavax.gfx.SDLGfx.pixelColor():

// vykreslit vzorek s vyuzitim funkce pixelColor().
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        // vypocet barvovych slozek pixelu
        final int red =   0xff & ((x*x) + (y*y));
        final int green = 0xff & (((x-1)*x) + (y*y));
        final int blue =  0xff & ((x*x) + ((y-1)*y));
        // vypocet barvy
        final int color = (red << 24) | (green << 16) | (blue << 8) | 255;
        // vykresleni pixelu
        pixelColor(screen, x, y, color);
    }
}

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

Podívejme se nyní na úplný výpis opraveného 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.*;
 
 
 
/**
 * Ctyricaty devaty demonstracni priklad vyuzivajici knihovnu SDLjava.
 *
 * Vykresleni vzorku s vyuzitim funkce sdljavax.gfx.SDLGfx.pixelColor().
 *
 * @author Pavel Tisnovsky
 */
public class SDLTest49 {
 
    /**
     * Horizontalni rozliseni vybraneho grafickeho rezimu ci okna.
     */
    private static final int GFX_WIDTH = 640;
 
    /**
     * 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();
 
        // vykreslit vzorek s vyuzitim funkce pixelColor().
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                // vypocet barvovych slozek pixelu
                final int red =   0xff & ((x*x) + (y*y));
                final int green = 0xff & (((x-1)*x) + (y*y));
                final int blue =  0xff & ((x*x) + ((y-1)*y));
                // vypocet barvy
                final int color = (red << 24) | (green << 16) | (blue << 8) | 255;
                // vykresleni pixelu
                pixelColor(screen, x, y, color);
            }
        }
 
        // nutno volat i v pripade, ze neni pouzit double buffering
        screen.updateRect();
        screen.flip();
    }
 
    /**
     * Spusteni ctyricateho devateho 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 SDLTest49.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 SDLTest49.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 SDLTest49

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% SDLTest49

7. Kreslení úseček, antialiasing a využití alfa kanálu

V knihovně SDLJava nalezneme mj. i osm funkcí sloužících pro vykreslení úsečky o šířce jednoho pixelu vybranou barvou do zvolené SDL_Surface. Těchto osm funkcí lze rozdělit podle tří vlastností – jakým způsobem je zapsána barva úsečky (čtyři složky versus 32bitové slovo), o jaký typ úsečky se jedná (obecná úsečka, vodorovná úsečka, svislá úsečka) a konečně, zda se má či naopak nemá při vykreslování použít algoritmus pro vyhlazení hran (Bresenhamův algoritmus popř. při vyhlazování Xiaolin Wuův algoritmus). Všech osm zmíněných funkcí je vypsáno v následující tabulce, kde si můžete povšimnout, že algoritmus pro vyhlazení hran není použit pro vodorovné či svislé úsečky, což je ostatně logické, neboť by v tomto případě mohlo dojít k rozostření hrany:

# Název funkce Parametry Stručný popis
1 lineColor SDLSurface dst, int x1, int y1, int x2, int y2, long color úsečka
2 lineRGBA SDLSurface dst, int x1, int y1, int x2, int y2, int r, int g, int b, int a úsečka
3 hlineColor SDLSurface dst, int x1, int x2, int y, long color vodorovná úsečka
4 hlineRGBA SDLSurface dst, int x1, int x2, int y, int r, int g, int b, int a vodorovná úsečka
5 vlineColor SDLSurface dst, int x, int y1, int y2, long color svislá úsečka
6 vlineRGBA SDLSurface dst, int x, int y1, int y2, int r, int g, int b, int a svislá úsečka
7 aalineColor SDLSurface dst, int x1, int y1, int x2, int y2, long color úsečka s vyhlazenou hranou
8 aalineRGBA SDLSurface dst, int x1, int y1, int x2, int y2, int r, int g, int b, int a úsečka s vyhlazenou hranou

8. Demonstrační příklad SDLTest50: vykreslení obrazce složeného z úseček

Podívejme se nyní na způsob, jak lze s využitím funkce lineRGBA() vykreslit obrazec složený z úseček (jedná se o tzv. „string art“). Při vykreslení se používá průhlednost nastavená na hodnotu 0×80 (tj. 128 v desítkové soustavě), což znamená, že úsečky jsou na černém pozadí vykresleny šedou barvou [127, 127, 127] a v místech překryvu úseček nalezneme pixely se světlejší barvou [191, 191, 191] popř. při vícenásobném překryvu i [223, 223, 223]. I přes použití průhlednosti je však při vykreslování použit Bresenhamův algoritmus, který úsečku vykreslí s ostrými hranami (což může a nemusí být očekávaný výsledek):

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

Zdrojový kód demonstračního příkladu SDLTest50:

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 demonstracni priklad vyuzivajici knihovnu SDLjava.
 *
 * Vykresleni vzorku s vyuzitim funkce sdljavax.gfx.SDLGfx.lineRGBA().
 *
 * @author Pavel Tisnovsky
 */
public class SDLTest50 {
 
    /**
     * 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;
 
        // vykreslit vzorek s vyuzitim funkce lineRGBA().
        for (int i = 0; i < Math.min(width, height); i += 10) {
            // vykresleni usecky
            lineRGBA(screen, 0, i, i, height-1, red, green, blue, alpha);
            // vykresleni usecky
            lineRGBA(screen, 10, 0, width-1, i, red, green, blue, alpha);
        }
 
        // nutno volat i v pripade, ze neni pouzit double buffering
        screen.updateRect();
        screen.flip();
    }
 
    /**
     * Spusteni padesateho 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 SDLTest50.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 SDLTest50.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 SDLTest50

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% SDLTest50

9. Demonstrační příklad SDLTest51: využití antialiasingu

V případě nutnosti vykreslení úsečky s vyhlazenými hranami se musí namísto funkcí lineRGBA()/lineColor() použít funkce aalineRGBA() popř. aalineColor(). Při implementaci těchto funkcí již není použit rychlý Bresenhamův algoritmus, ale nepatrně pomalejší algoritmus navržený Xiaolin Wuem, který vykresluje úsečku širokou dva pixely, přičemž se však (poněkud zjednodušeně řečeno) barvy obou pixelů vypočítají ze vzdálenosti středů těchto pixelů od skutečného průběhu úsečky. Výsledkem jsou skutečně vyhlazené úsečky, ovšem jednou z nevýhod tohoto algoritmu může být vznik nepříjemného moaré patrného i z pátého screenshotu:

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

Zdrojový kód demonstračního příkladu SDLTest51:

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 prvni demonstracni priklad vyuzivajici knihovnu SDLjava.
 *
 * Vykresleni vzorku s vyuzitim funkce sdljavax.gfx.SDLGfx.aalineRGBA().
 *
 * @author Pavel Tisnovsky
 */
public class SDLTest51 {
 
    /**
     * 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;
 
        // vykreslit vzorek s vyuzitim funkce aalineRGBA().
        for (int i = 0; i < Math.min(width, height); i += 10) {
            // vykresleni usecky
            aalineRGBA(screen, 0, i, i, height-1, red, green, blue, alpha);
            // vykresleni usecky
            aalineRGBA(screen, 10, 0, width-1, i, red, green, blue, alpha);
        }
 
        // nutno volat i v pripade, ze neni pouzit double buffering
        screen.updateRect();
        screen.flip();
    }
 
    /**
     * Spusteni padesateho prvniho 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 SDLTest51.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 SDLTest51.java

Skript pro spuštění na Linuxu:

widgety

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

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% SDLTest51

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 SDLTest47.java http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest47/SDLTest47.ja­va
2 SDLTest47_compile.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest47/SDLTest47_com­pile.sh
3 SDLTest47_compile_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest47/SDLTest47_com­pile_sys.sh
4 SDLTest47_run.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest47/SDLTest47_run­.sh
5 SDLTest47_run_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest47/SDLTest47_run_sys­.sh
6 SDLTest47_compile.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest47/SDLTest47_com­pile.bat
7 SDLTest47_run.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest47/SDLTest47_run­.bat
     
8 SDLTest48.java http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest48/SDLTest48.ja­va
9 SDLTest48_compile.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest48/SDLTest48_com­pile.sh
10 SDLTest48_compile_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest48/SDLTest48_com­pile_sys.sh
11 SDLTest48_run.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest48/SDLTest48_run­.sh
12 SDLTest48_run_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest48/SDLTest48_run_sys­.sh
13 SDLTest48_compile.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest48/SDLTest48_com­pile.bat
14 SDLTest48_run.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest48/SDLTest48_run­.bat
     
15 SDLTest49.java http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest49/SDLTest49.ja­va
16 SDLTest49_compile.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest49/SDLTest49_com­pile.sh
17 SDLTest49_compile_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest49/SDLTest49_com­pile_sys.sh
18 SDLTest49_run.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest49/SDLTest49_run­.sh
19 SDLTest49_run_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest49/SDLTest49_run_sys­.sh
20 SDLTest49_compile.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest49/SDLTest49_com­pile.bat
21 SDLTest49_run.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest49/SDLTest49_run­.bat
     
22 SDLTest50.java http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest50/SDLTest50.ja­va
23 SDLTest50_compile.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest50/SDLTest50_com­pile.sh
24 SDLTest50_compile_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest50/SDLTest50_com­pile_sys.sh
25 SDLTest50_run.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest50/SDLTest50_run­.sh
26 SDLTest50_run_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest50/SDLTest50_run_sys­.sh
27 SDLTest50_compile.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest50/SDLTest50_com­pile.bat
28 SDLTest50_run.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest50/SDLTest50_run­.bat
     
29 SDLTest51.java http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest51/SDLTest51.ja­va
30 SDLTest51_compile.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest51/SDLTest51_com­pile.sh
31 SDLTest51_compile_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest51/SDLTest51_com­pile_sys.sh
32 SDLTest51_run.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest51/SDLTest51_run­.sh
33 SDLTest51_run_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest51/SDLTest51_run_sys­.sh
34 SDLTest51_compile.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest51/SDLTest51_com­pile.bat
35 SDLTest51_run.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/e379cc805083/sdlja­va/SDLTest51/SDLTest51_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?
120na80.cz: Pálení žáhy: která jídla ne a co nás uzdraví?

Pálení žáhy: která jídla ne a co nás uzdraví?

Lupa.cz: Cimrman má hry na YouTube i vlastní doodle

Cimrman má hry na YouTube i vlastní doodle

Měšec.cz: TEST: Vyzkoušeli jsme pražské taxikáře

TEST: Vyzkoušeli jsme pražské taxikáře

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

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

Root.cz: Hořící telefon Samsung Note 7 zapálil auto

Hořící telefon Samsung Note 7 zapálil auto

Vitalia.cz: Muž, který miluje příliš. Ženám neimponuje

Muž, který miluje příliš. Ženám neimponuje

Podnikatel.cz: Babišovi se nedá věřit, stěžovali si hospodští

Babišovi se nedá věřit, stěžovali si hospodští

120na80.cz: Co je padesátkrát sladší než cukr?

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

Podnikatel.cz: Tyto pojmy k #EET byste měli znát

Tyto pojmy k #EET byste měli znát

DigiZone.cz: Světový pohár v přímém přenosu na ČT

Světový pohár v přímém přenosu na ČT

Vitalia.cz: Tesco nabízí desítky tun jídla zdarma

Tesco nabízí desítky tun jídla zdarma

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

Wimbledon na Nova Sport až do 2019

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

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

DigiZone.cz: Numan Two: rozhlasový přijímač s CD

Numan Two: rozhlasový přijímač s CD

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

Nova opět stahuje „milionáře“

Vitalia.cz: 5 chyb, které děláme při skladování potravin

5 chyb, které děláme při skladování potravin

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

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

DigiZone.cz: Ginx TV: pořad o počítačových hráčích

Ginx TV: pořad o počítačových hráčích

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

Jak se prodává firma za miliardu?

Vitalia.cz: Tahák, jak vyzrát nad zápachem z úst

Tahák, jak vyzrát nad zápachem z úst