Hlavní navigace

Pohled pod kapotu JVM – práce s TTF fonty v knihovně SDLJava

Pavel Tišnovský 25. 3. 2014

V dnešní části seriálu o programovacím jazyku Java i o virtuálním stroji tohoto jazyka si na čtveřici demonstračních příkladů ukážeme, jakým způsobem je možné s využitím knihovny SDLJava pracovat s TTF fonty a jak je možné do bitmap (a tím pádem i na obrazovku) vykreslovat text.

Obsah

1. Pohled pod kapotu JVM – práce s TTF fonty v knihovně SDLJava

2. Vykreslení textu vybraným fontem do samostatné bitmapy

3. Demonstrační příklad SDLTest40: vykreslení textu vybraným fontem do samostatné bitmapy

4. Pozadí textu: využití průhlednosti či vybrané konstantní barvy

5. Demonstrační příklad SDLTest41: vykreslení textu přes již dříve vykreslenou bitmapu

6. Demonstrační příklad SDLTest42: volba barvy pozadí textu

7. Fonty a antialiasing

8. Demonstrační příklad SDLTest43: vykreslení textu s využitím antialiasingu

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

10. Odkazy na Internetu

1. Práce s TTF fonty v knihovně SDLJava

Při programování grafických aplikací a her se v naprosté většině případů setkáme s nutností vykreslit na obrazovku nějaký text, ať již se jedná o titulek hry či o součást grafického uživatelského rozhraní aplikace (hlavní menu, nápověda atd.). V knihovně SDLJava existuje podpora pro vykreslování znaků, přičemž veškerá funkcionalita je ve skutečnosti zajištěna nativní knihovnou SDL_ttf verze 1.2 či 2.0, která navíc při své činnosti využívá další nativní knihovnu pojmenovanou (lib)FreeType (http://www.freetype.org/).

Obrázek 1: Hra Luola využívá knihovnu SDL i SDL_ttf.

Při instalaci knihovny SDLJava se kromě vlastního javovského archivu sdljava.jar vytvoří v pracovním adresáři i několik souborů obsahujících nativní části této knihovny. Jedním z těchto souborů je i libsdljava_ttf.so popř. sdljava_ttf.dll obsahující tenkou mezivrstvu mezi knihovnou SDLJava a nativní knihovnou libSDL_ttf. Pokud vám tedy nebudou dnešní demonstrační příklady pracovat korektně, je nutné zjistit, zda jsou všechny potřebné (nativní) knihovny skutečně nainstalovány. Pro běh demonstračních příkladů je taktéž nutné mít v pracovním adresáři umístěn font freesans.ttf dostupný na adrese http://www.fontspace.com/gnu-freefont/freesans (postačuje jen jediný uvedený soubor freesans.ttf či FreeSans.ttf – pozor na správné použití velkých a malých písmen v demonstračních příkladech v konstantě FONT_NAME!).

Obrázek 2: Scéna vykreslená dnešním prvním demonstračním příkladem.

2. Vykreslení textu vybraným fontem do samostatné bitmapy

Jak jsme si již řekli v předchozí kapitole, dokáže knihovna SDLJava pracovat s fonty typu TTF (True Type Font), v nichž jsou tvary jednotlivých znaků uloženy ve formě obrysů složených ze sekvence na sebe navazujících úseček a kvadratických Bézierových křivek. Ve skutečnosti se však v naprosté většině případů programátoři nemusí zabývat přesným algoritmem vykreslování jednotlivých znaků, což je ostatně dosti komplikované, především při menších velikostech znaků a použití tzv. hintingu. Díky třídám nabízených knihovnou SDLJava je možné jednoduše načíst vybraný soubor typu TTF s uvedením velikosti výsledného písma. Knihovna SDLJava se s využitím nativních částí SDL_ttfFreeType sama postará o rasterizaci jednotlivých znaků, tj. o vykreslení a vyplnění již zmíněných úseček a Bézierových křivek představujících obrysy jednotlivých znaků. Základem při práci s písmy jsou třídy sdljava.ttf.SDLTTFsdljava.ttf.SDLTrueTypeFont. Inicializace písma se provede následujícím způsobem:

// inicializace subsystemu SDL_ttf
SDLTTF.init();
 
// instance tridy SDLTrueTypeFont nese jiz zpracovane informace fontu
// vybrane velikosti
final SDLTrueTypeFont font = SDLTTF.openFont("font.ttf", 36 /* velikost v pt */);

Následně je možné využít instanci třídy SDLTrueTypeFont pro vykreslení řetězce do samostatné (automaticky vytvořené) bitmapy, se kterou je možné pracovat jako s běžným spritem:

// vykreslit text do samostatne bitmapy
SDLSurface bitmap = font.renderTextSolid("www.root.cz", new SDLColor(255, 95, 95));
 
// vypocitat umisteni bitmapy na obrazovce.
final SDLRect rect = computePositionOnScreen(screen, bitmap);
 
// provest operaci typu BitBLT
bitmap.blitSurface(screen, rect);
 
// nutno volat i v pripade, ze neni pouzit double buffering
screen.updateRect();
screen.flip();

Při ukončování činnosti aplikace je vhodné provést i deinicializaci subsystému pro práci s fonty:

try {
    // uvolneni prostredku vyuzivanych subsytemem SDL_ttf.
    SDLTTF.quit();
}
catch (SDLException e) {
    e.printStackTrace();
}

Obrázek 3: Scéna vykreslená dnešním prvním demonstračním příkladem (použit je odlišný font).

3. Demonstrační příklad SDLTest40: vykreslení textu vybraným fontem do samostatné bitmapy

Postup pro vykreslení řetězce popsaný v předchozí kapitole je použit v dnešním prvním demonstračním příkladu nazvaném SDLTest40, jehož zdrojový kód lze nalézt na této adrese. Nejprve je provedena inicializace knihovny SDLJava, posléze se inicializuje i systém pro práci s fonty a následně je vybraný font načten (měl by se nacházet v pracovním adresáři). Vykreslení celé scény (zde pouze jednořádkového textu) je realizováno v metodě drawOnScreen():

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.SDLColor;
import sdljava.video.SDLRect;
import sdljava.video.SDLSurface;
import sdljava.video.SDLVideo;
 
import sdljava.ttf.SDLTTF;
import sdljava.ttf.SDLTrueTypeFont;
 
import sdljava.x.swig.SDLPressedState;
 
 
 
/**
 * Ctyricaty demonstracni priklad vyuzivajici knihovnu SDLjava.
 *
 * Ukazka vyuziti zakladnich moznosti tridy sdljava.ttf.SDLTTF.
 *
 * @author Pavel Tisnovsky
 */
public class SDLTest40 {
 
    /**
     * 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;
 
    /**
     * Jmeno souboru s fontem.
     */
    private static final String FONT_NAME = "freesans.ttf";
    //private static final String FONT_NAME = "mcgf.ttf";
    //private static final String FONT_NAME = "aescr5b.ttf";
 
    /**
     * Velikost pisma udavana v bodech.
     */
    private static final int FONT_SIZE = 72;
 
    /**
     * Barva vykresleneho textu.
     */
    private static final SDLColor FONT_COLOR = new SDLColor(255, 95, 95);
 
    /**
     * 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 bitmapy s textem na obrazovku (do okna aplikace).
     * 
     * @param screen
     *            framebuffer
     * @param font
     *            font pouzity pri vykreslovani
     */
    private static void drawOnScreen(SDLSurface screen, SDLTrueTypeFont font) throws SDLException {
        // vykreslit text do samostatne bitmapy
        SDLSurface bitmap = font.renderTextSolid("www.root.cz", FONT_COLOR);
 
        // vypocitat umisteni bitmapy na obrazovce.
        final SDLRect rect = computePositionOnScreen(screen, bitmap);
 
        // provest operaci typu BitBLT
        bitmap.blitSurface(screen, rect);
 
        // nutno volat i v pripade, ze neni pouzit double buffering
        screen.updateRect();
        screen.flip();
    }
 
    /**
     * Vypocitat umisteni bitmapy na obrazovce.
     * 
     * @param screen
     *            framebuffer
     * @param bitmap
     *            bitmapa s pismem, ktera se ma na obrazovku vykreslit
     * @return obdelnik predstavujici pozici bitmapy na obrazovce
     */
    private static SDLRect computePositionOnScreen(SDLSurface screen, SDLSurface bitmap) {
        // ziskat rozmery obrazovky i bitmapy
        final int screenWidth = screen.getWidth();
        final int screenHeight = screen.getHeight();
        final int bitmapWidth = bitmap.getWidth();
        final int bitmapHeight = bitmap.getHeight();
 
        // vypocitat umisteni bitmapy na obrazovce
        final int x = (screenWidth - bitmapWidth)>>1;
        final int y = (screenHeight - bitmapHeight)>>1;
        return new SDLRect(x, y, bitmapWidth, bitmapHeight);
    }
 
    /**
     * Spusteni ctyricateho demonstracniho prikladu.
     */
    public static void main(String[] args) {
        try {
            // inicializace knihovny SDLJava
            SDLMain.init(SDLMain.SDL_INIT_VIDEO);
 
            // inicializace subsystemu SDL_ttf
            SDLTTF.init();
 
            // inicializace grafickeho rezimu ci otevreni okna pro vykreslovani
            final SDLSurface screen = initVideo();
 
            // instance tridy SDLTrueTypeFont nese jiz zpracovane informace fontu
            // vybrane velikosti
            final SDLTrueTypeFont font = SDLTTF.openFont(FONT_NAME, FONT_SIZE);
 
            // vykresleni sceny na obrazovku
            drawOnScreen(screen, font);
 
            // smycka pro zpracovani udalosti
            eventLoop();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            try {
                // uvolneni prostredku vyuzivanych subsytemem SDL_ttf.
                SDLTTF.quit();
            }
            catch (SDLException e) {
                e.printStackTrace();
            }
 
            // musime obnovit puvodni graficky rezim
            // i v tom pripade, ze nastane nejaka vyjimka
            SDLMain.quit();
        }
    }
 
}

Obrázek 4: Scéna vykreslená dnešním prvním demonstračním příkladem (opět je použit odlišný font).

Skript pro překlad na Linuxu:

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

Dávkový soubor pro překlad na Windows:

set SDL_JAVA_LIBS=.\sdljava-0.9.1\lib
 
javac -cp %SDL_JAVA_LIBS%\sdljava.jar SDLTest40.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 SDLTest40

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

4. Pozadí textu: využití průhlednosti či vybrané konstantní barvy

Bitmapa, která je automaticky vytvořena při vykreslení fontu, může obsahovat buď průhlednou barvu pozadí (kde je průhlednost nastavena na 100%) nebo naopak zvolenou barvu. To, jaká možnost se při vykreslování využije, závisí na tom, zda se použije metoda SDLTrueTypeFont.renderTextSolid() nebo alternativní metoda SDLTrueTypeFont.renderTextShaded(). V prvním případě je vytvořena bitmapa s bitovou hloubkou 8bpp obsahující v místech, kde se nenachází žádný znak, zcela průhledné pixely. Při použití druhé metody jsou tyto pixely vyplněny zadanou barvou, ovšem vytvořená bitmapa bude mít stále shodnou bitovou hloubku 8bpp. Rozdíly mezi oběma vytvořenými bitmapami jsou patrné na následujících dvou obrázcích, u nichž byly texty (resp. přesněji řečeno bitmapy s texty) vykresleny přes již dříve vykreslenou bitmapu s načteným obrázkem:

Obrázek 5: Průhledné pozadí textu vykreslené demonstračním příkladem SDLTest41.

Obrázek 6: Neprůhledné pozadí textu vykreslené demonstračním příkladem SDLTest42.

5. Demonstrační příklad SDLTest41: vykreslení textu přes již dříve vykreslenou bitmapu

V dnešním druhém demonstračním příkladu pojmenovaném SDLTest41 je ukázáno, že se při zavolání metody SDLTrueTypeFont.renderTextSolid() skutečně vytvoří bitmapa obsahující průhledné pixely – pod textem je totiž zobrazen rastrový obrázek xscorch.bmp, který jsme již využili v několika předchozích demonstračních příkladech. Vlastní vykreslení obou bitmap je realizováno ve dvojici metod drawOnScreen()drawBitmap():

/**
 * Vykresleni bitmapy na obrazovku.
 * 
 * @param screen
 *            framebuffer
 * @param bitmap
 *            bitmapa, ktery se ma na obrazovku vykreslit
 */
private static void drawBitmap(SDLSurface screen, SDLSurface bitmap) throws SDLException {
    // vypocitat umisteni bitmapy na obrazovce.
    final SDLRect rect = computePositionOnScreen(screen, bitmap);
 
    // provest operaci typu BitBLT
    bitmap.blitSurface(screen, rect);
 
}
 
/**
 * Vykresleni podkladove bitmapy i bitmapy s textem na obrazovku (do okna aplikace).
 * 
 * @param screen
 *            framebuffer
 * @param font
 *            font pouzity pri vykreslovani
 * @param bitmap
 *            bitmapa, ktery se ma na obrazovku vykreslit
 */
private static void drawOnScreen(SDLSurface screen, SDLTrueTypeFont font, SDLSurface bitmap) throws SDLException {
    // vykreslit text do samostatne bitmapy
    SDLSurface textBitmap = font.renderTextSolid("www.root.cz", FONT_COLOR);
 
    // vykresleni podkladove bitmapy s obrazkem
    drawBitmap(screen, bitmap);
 
    // vykresleni bitmapy s textem
    drawBitmap(screen, textBitmap);
 
    // nutno volat i v pripade, ze neni pouzit double buffering
    screen.updateRect();
    screen.flip();
}

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.SDLColor;
import sdljava.video.SDLRect;
import sdljava.video.SDLSurface;
import sdljava.video.SDLVideo;
 
import sdljava.ttf.SDLTTF;
import sdljava.ttf.SDLTrueTypeFont;
 
import sdljava.x.swig.SDLPressedState;
 
 
 
/**
 * Ctyricaty prvni demonstracni priklad vyuzivajici knihovnu SDLjava.
 *
 * Ukazka vyuziti zakladnich moznosti tridy sdljava.ttf.SDLTTF.
 * Pod textem je vykreslena podkladova bitmapa s obrazkem.
 * Text je vykreslen metodou SDLTrueTypeFont.renderTextSolid()
 *
 * @author Pavel Tisnovsky
 */
public class SDLTest41 {
 
    /**
     * 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;
 
    /**
     * Jmeno souboru s fontem.
     */
    private static final String FONT_NAME = "freesans.ttf";
    //private static final String FONT_NAME = "mcgf.ttf";
    //private static final String FONT_NAME = "aescr5b.ttf";
 
    /**
     * Velikost pisma udavana v bodech.
     */
    private static final int FONT_SIZE = 72;
 
    /**
     * Barva vykresleneho textu.
     */
    private static final SDLColor FONT_COLOR = new SDLColor(95, 192, 95);
 
    /**
     * Nazev bitmapy, ktera se ma nacist a nasledne zobrazit.
     */
    private static final String INPUT_IMAGE_NAME = "xscorch.bmp";
 
    /**
     * 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 bitmapy na obrazovku.
     * 
     * @param screen
     *            framebuffer
     * @param bitmap
     *            bitmapa, ktery se ma na obrazovku vykreslit
     */
    private static void drawBitmap(SDLSurface screen, SDLSurface bitmap) throws SDLException {
        // vypocitat umisteni bitmapy na obrazovce.
        final SDLRect rect = computePositionOnScreen(screen, bitmap);
 
        // provest operaci typu BitBLT
        bitmap.blitSurface(screen, rect);
 
    }
 
    /**
     * Vykresleni podkladove bitmapy i bitmapy s textem na obrazovku (do okna aplikace).
     * 
     * @param screen
     *            framebuffer
     * @param font
     *            font pouzity pri vykreslovani
     * @param bitmap
     *            bitmapa, ktery se ma na obrazovku vykreslit
     */
    private static void drawOnScreen(SDLSurface screen, SDLTrueTypeFont font, SDLSurface bitmap) throws SDLException {
        // vykreslit text do samostatne bitmapy
        SDLSurface textBitmap = font.renderTextSolid("www.root.cz", FONT_COLOR);
 
        // vykresleni podkladove bitmapy s obrazkem
        drawBitmap(screen, bitmap);
 
        // vykresleni bitmapy s textem
        drawBitmap(screen, textBitmap);
 
        // nutno volat i v pripade, ze neni pouzit double buffering
        screen.updateRect();
        screen.flip();
    }
 
    /**
     * Vypocitat umisteni bitmapy na obrazovce.
     * 
     * @param screen
     *            framebuffer
     * @param bitmap
     *            bitmapa s pismem, ktera se ma na obrazovku vykreslit
     * @return obdelnik predstavujici pozici bitmapy na obrazovce
     */
    private static SDLRect computePositionOnScreen(SDLSurface screen, SDLSurface bitmap) {
        // ziskat rozmery obrazovky i bitmapy
        final int screenWidth = screen.getWidth();
        final int screenHeight = screen.getHeight();
        final int bitmapWidth = bitmap.getWidth();
        final int bitmapHeight = bitmap.getHeight();
 
        // vypocitat umisteni bitmapy na obrazovce
        final int x = (screenWidth - bitmapWidth)>>1;
        final int y = (screenHeight - bitmapHeight)>>1;
        return new SDLRect(x, y, bitmapWidth, bitmapHeight);
    }
 
    /**
     * Spusteni ctyricateho prvniho demonstracniho prikladu.
     */
    public static void main(String[] args) {
        try {
            // inicializace knihovny SDLJava
            SDLMain.init(SDLMain.SDL_INIT_VIDEO);
 
            // inicializace subsystemu SDL_ttf
            SDLTTF.init();
 
            // inicializace grafickeho rezimu ci otevreni okna pro vykreslovani
            final SDLSurface screen = initVideo();
 
            // nacteni bitmapy z externiho souboru
            final SDLSurface bitmap = SDLVideo.loadBMP(INPUT_IMAGE_NAME);
 
            // instance tridy SDLTrueTypeFont nese jiz zpracovane informace fontu
            // vybrane velikosti
            final SDLTrueTypeFont font = SDLTTF.openFont(FONT_NAME, FONT_SIZE);
 
            // vykresleni sceny na obrazovku
            drawOnScreen(screen, font, bitmap);
 
            // smycka pro zpracovani udalosti
            eventLoop();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            try {
                // uvolneni prostredku vyuzivanych subsytemem SDL_ttf.
                SDLTTF.quit();
            }
            catch (SDLException e) {
                e.printStackTrace();
            }
 
            // musime obnovit puvodni graficky rezim
            // i v tom pripade, ze nastane nejaka vyjimka
            SDLMain.quit();
        }
    }
 
}

Skript pro překlad na Linuxu:

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

Dávkový soubor pro překlad na Windows:

set SDL_JAVA_LIBS=.\sdljava-0.9.1\lib
 
javac -cp %SDL_JAVA_LIBS%\sdljava.jar SDLTest41.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 SDLTest41

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

6. Demonstrační příklad SDLTest42: volba barvy pozadí textu

V demonstračním příkladu SDLTest42, jehož zdrojový kód je vypsán pod tímto odstavcem, se namísto metody SDLTrueTypeFont.renderTextSolid() používá pro výpis textu do bitmapy metoda SDLTrueTypeFont.renderTextShaded(); žádné další změny oproti předchozímu příkladu SDLTest41 zde nebyly provedeny:

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.SDLColor;
import sdljava.video.SDLRect;
import sdljava.video.SDLSurface;
import sdljava.video.SDLVideo;
 
import sdljava.ttf.SDLTTF;
import sdljava.ttf.SDLTrueTypeFont;
 
import sdljava.x.swig.SDLPressedState;
 
 
 
/**
 * Ctyricaty druhy demonstracni priklad vyuzivajici knihovnu SDLjava.
 *
 * Ukazka vyuziti zakladnich moznosti tridy sdljava.ttf.SDLTTF.
 * Pod textem je vykreslena podkladova bitmapa s obrazkem.
 * Text je vykreslen metodou SDLTrueTypeFont.renderTextShaded().
 *
 * @author Pavel Tisnovsky
 */
public class SDLTest42 {
 
    /**
     * 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;
 
    /**
     * Jmeno souboru s fontem.
     */
    private static final String FONT_NAME = "freesans.ttf";
    //private static final String FONT_NAME = "mcgf.ttf";
    //private static final String FONT_NAME = "aescr5b.ttf";
 
    /**
     * Velikost pisma udavana v bodech.
     */
    private static final int FONT_SIZE = 72;
 
    /**
     * Barva vykresleneho textu.
     */
    private static final SDLColor FONT_COLOR = new SDLColor(95, 192, 95);
 
    /**
     * Barva pozadi vykresleneho textu.
     */
    private static final SDLColor BACKGROUND_COLOR = new SDLColor(32, 32, 32);
 
    /**
     * Nazev bitmapy, ktera se ma nacist a nasledne zobrazit.
     */
    private static final String INPUT_IMAGE_NAME = "xscorch.bmp";
 
    /**
     * 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 bitmapy na obrazovku.
     * 
     * @param screen
     *            framebuffer
     * @param bitmap
     *            bitmapa, ktery se ma na obrazovku vykreslit
     */
    private static void drawBitmap(SDLSurface screen, SDLSurface bitmap) throws SDLException {
        // vypocitat umisteni bitmapy na obrazovce.
        final SDLRect rect = computePositionOnScreen(screen, bitmap);
 
        // provest operaci typu BitBLT
        bitmap.blitSurface(screen, rect);
 
    }
 
    /**
     * Vykresleni podkladove bitmapy i bitmapy s textem na obrazovku (do okna aplikace).
     * 
     * @param screen
     *            framebuffer
     * @param font
     *            font pouzity pri vykreslovani
     * @param bitmap
     *            bitmapa, ktery se ma na obrazovku vykreslit
     */
    private static void drawOnScreen(SDLSurface screen, SDLTrueTypeFont font, SDLSurface bitmap) throws SDLException {
        // vykreslit text do samostatne bitmapy
        SDLSurface textBitmap = font.renderTextShaded("www.root.cz", FONT_COLOR, BACKGROUND_COLOR);
 
        // vykresleni podkladove bitmapy s obrazkem
        drawBitmap(screen, bitmap);
 
        // vykresleni bitmapy s textem
        drawBitmap(screen, textBitmap);
 
        // nutno volat i v pripade, ze neni pouzit double buffering
        screen.updateRect();
        screen.flip();
    }
 
    /**
     * Vypocitat umisteni bitmapy na obrazovce.
     * 
     * @param screen
     *            framebuffer
     * @param bitmap
     *            bitmapa s pismem, ktera se ma na obrazovku vykreslit
     * @return obdelnik predstavujici pozici bitmapy na obrazovce
     */
    private static SDLRect computePositionOnScreen(SDLSurface screen, SDLSurface bitmap) {
        // ziskat rozmery obrazovky i bitmapy
        final int screenWidth = screen.getWidth();
        final int screenHeight = screen.getHeight();
        final int bitmapWidth = bitmap.getWidth();
        final int bitmapHeight = bitmap.getHeight();
 
        // vypocitat umisteni bitmapy na obrazovce
        final int x = (screenWidth - bitmapWidth)>>1;
        final int y = (screenHeight - bitmapHeight)>>1;
        return new SDLRect(x, y, bitmapWidth, bitmapHeight);
    }
 
    /**
     * Spusteni ctyricateho druheho demonstracniho prikladu.
     */
    public static void main(String[] args) {
        try {
            // inicializace knihovny SDLJava
            SDLMain.init(SDLMain.SDL_INIT_VIDEO);
 
            // inicializace subsystemu SDL_ttf
            SDLTTF.init();
 
            // inicializace grafickeho rezimu ci otevreni okna pro vykreslovani
            final SDLSurface screen = initVideo();
 
            // nacteni bitmapy z externiho souboru
            final SDLSurface bitmap = SDLVideo.loadBMP(INPUT_IMAGE_NAME);
 
            // instance tridy SDLTrueTypeFont nese jiz zpracovane informace fontu
            // vybrane velikosti
            final SDLTrueTypeFont font = SDLTTF.openFont(FONT_NAME, FONT_SIZE);
 
            // vykresleni sceny na obrazovku
            drawOnScreen(screen, font, bitmap);
 
            // smycka pro zpracovani udalosti
            eventLoop();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            try {
                // uvolneni prostredku vyuzivanych subsytemem SDL_ttf.
                SDLTTF.quit();
            }
            catch (SDLException e) {
                e.printStackTrace();
            }
 
            // musime obnovit puvodni graficky rezim
            // i v tom pripade, ze nastane nejaka vyjimka
            SDLMain.quit();
        }
    }
 
}

Skript pro překlad na Linuxu:

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

Dávkový soubor pro překlad na Windows:

set SDL_JAVA_LIBS=.\sdljava-0.9.1\lib
 
javac -cp %SDL_JAVA_LIBS%\sdljava.jar SDLTest42.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 SDLTest42

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

7. Fonty a antialiasing

Při vykreslování textu s využitím výše popsaných metod SDLTrueTypeFont.renderTextSolid()SDLTrueTypeFont.renderTextShaded() se vždy vytvoří bitmapa s bitovou hloubkou 8bpp. Samotné vykreslování takového bitmapy s použitím nám již známé metody SDLSurface.blitSurface() je velmi rychlé a i samotný způsob uložení bitmapy v paměti je poměrně efektivní, ovšem na druhou stranu zde neexistuje podpora pro skutečný antialiasing textů, takže šikmé tahy znaků budou vykazovat typické „schody“. V případě, že je antialiasing nutné použít (což nemusí být případ hry, kde se většinou upřednostňuje rychlejší vykreslování před kvalitou!), použije se metoda SDLTrueTypeFont.renderTextBlended(), která vytvoří bitmapu s hloubkou 32bpp a tím pádem i s plnohodnotným osmibitovým alfa kanálem. A právě alfa kanál je využit při antialiasingu, zejména při rasterizaci okrajů písma (zde budou použity pixely s variabilní průhledností):

Obrázek 7: Text vykreslený bez použití antialiasingu.

Obrázek 8: Text vykreslený s využitím antialiasingu.

Nevýhody použití metody SDLTrueTypeFont.renderTextBlended() jsou tři: pomalejší vykreslování výsledné bitmapy metodou SDLSurface.blitSurface(), neboť je nutné provádět výpočet průhlednosti s každým pixelem (násobení!); větší paměťové nároky (projeví se při meziukládání bitmap) a taktéž problematická práce s těmito bitmapami ve chvíli, kdy není nastaven celoobrazovkový grafický režim s hloubkou 24bpp či 32bpp – a tyto režimy se v mnoha hrách nepoužívají, právě z důvodu větších nároků při práci s grafikou (přesun větších bitmap při operaci BitBlt atd.). Je tedy nutné pečlivě zvážit, kterou metodou se budou texty do (herních) scén vykreslovat a mnohdy převáží sice méně kvalitní, ale zato rychlejší rendering textů metodou SDLTrueTypeFont.renderTextSolid().

8. Demonstrační příklad SDLTest43: vykreslení textu s využitím antialiasingu

Vykreslení textu s využitím metody SDLTrueTypeFont.renderTextBlended() a tím pádem s využitím antialiasingu je použito v dnešním čtvrtém a současně i posledním demonstračním příkladu pojmenovaném SDLTest43. V tomto příkladu je pod vlastním textem (bitmapou s textem) opět zobrazena podkladová bitmapa, aby bylo patrné, jakým způsobem se průhledné a poloprůhledné pixely překreslí přes již dříve vykreslený obrázek na pozadí:

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.SDLColor;
import sdljava.video.SDLRect;
import sdljava.video.SDLSurface;
import sdljava.video.SDLVideo;
 
import sdljava.ttf.SDLTTF;
import sdljava.ttf.SDLTrueTypeFont;
 
import sdljava.x.swig.SDLPressedState;
 
 
 
/**
 * Ctyricaty treti demonstracni priklad vyuzivajici knihovnu SDLjava.
 *
 * Ukazka vyuziti zakladnich moznosti tridy sdljava.ttf.SDLTTF.
 * Pod textem je vykreslena podkladova bitmapa s obrazkem.
 * Text je vykreslen metodou SDLTrueTypeFont.renderTextBlended().
 *
 * @author Pavel Tisnovsky
 */
public class SDLTest43 {
 
    /**
     * 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;
 
    /**
     * Jmeno souboru s fontem.
     */
    //private static final String FONT_NAME = "freesans.ttf";
    //private static final String FONT_NAME = "mcgf.ttf";
    private static final String FONT_NAME = "aescr5b.ttf";
 
    /**
     * Velikost pisma udavana v bodech.
     */
    private static final int FONT_SIZE = 72;
 
    /**
     * Barva vykresleneho textu.
     */
    private static final SDLColor FONT_COLOR = new SDLColor(95, 192, 95);
 
    /**
     * Nazev bitmapy, ktera se ma nacist a nasledne zobrazit.
     */
    private static final String INPUT_IMAGE_NAME = "xscorch.bmp";
 
    /**
     * 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 bitmapy na obrazovku.
     * 
     * @param screen
     *            framebuffer
     * @param bitmap
     *            bitmapa, ktery se ma na obrazovku vykreslit
     */
    private static void drawBitmap(SDLSurface screen, SDLSurface bitmap) throws SDLException {
        // vypocitat umisteni bitmapy na obrazovce.
        final SDLRect rect = computePositionOnScreen(screen, bitmap);
 
        // provest operaci typu BitBLT
        bitmap.blitSurface(screen, rect);
 
    }
 
    /**
     * Vykresleni podkladove bitmapy i bitmapy s textem na obrazovku (do okna aplikace).
     * 
     * @param screen
     *            framebuffer
     * @param font
     *            font pouzity pri vykreslovani
     * @param bitmap
     *            bitmapa, ktery se ma na obrazovku vykreslit
     */
    private static void drawOnScreen(SDLSurface screen, SDLTrueTypeFont font, SDLSurface bitmap) throws SDLException {
        // vykreslit text do samostatne bitmapy
        SDLSurface textBitmap = font.renderTextBlended("www.root.cz", FONT_COLOR);
 
        // vykresleni podkladove bitmapy s obrazkem
        drawBitmap(screen, bitmap);
 
        // vykresleni bitmapy s textem
        drawBitmap(screen, textBitmap);
 
        // nutno volat i v pripade, ze neni pouzit double buffering
        screen.updateRect();
        screen.flip();
    }
 
    /**
     * Vypocitat umisteni bitmapy na obrazovce.
     * 
     * @param screen
     *            framebuffer
     * @param bitmap
     *            bitmapa s pismem, ktera se ma na obrazovku vykreslit
     * @return obdelnik predstavujici pozici bitmapy na obrazovce
     */
    private static SDLRect computePositionOnScreen(SDLSurface screen, SDLSurface bitmap) {
        // ziskat rozmery obrazovky i bitmapy
        final int screenWidth = screen.getWidth();
        final int screenHeight = screen.getHeight();
        final int bitmapWidth = bitmap.getWidth();
        final int bitmapHeight = bitmap.getHeight();
 
        // vypocitat umisteni bitmapy na obrazovce
        final int x = (screenWidth - bitmapWidth)>>1;
        final int y = (screenHeight - bitmapHeight)>>1;
        return new SDLRect(x, y, bitmapWidth, bitmapHeight);
    }
 
    /**
     * Spusteni ctyricateho tretiho demonstracniho prikladu.
     */
    public static void main(String[] args) {
        try {
            // inicializace knihovny SDLJava
            SDLMain.init(SDLMain.SDL_INIT_VIDEO);
 
            // inicializace subsystemu SDL_ttf
            SDLTTF.init();
 
            // inicializace grafickeho rezimu ci otevreni okna pro vykreslovani
            final SDLSurface screen = initVideo();
 
            // nacteni bitmapy z externiho souboru
            final SDLSurface bitmap = SDLVideo.loadBMP(INPUT_IMAGE_NAME);
 
            // instance tridy SDLTrueTypeFont nese jiz zpracovane informace fontu
            // vybrane velikosti
            final SDLTrueTypeFont font = SDLTTF.openFont(FONT_NAME, FONT_SIZE);
 
            // vykresleni sceny na obrazovku
            drawOnScreen(screen, font, bitmap);
 
            // smycka pro zpracovani udalosti
            eventLoop();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            try {
                // uvolneni prostredku vyuzivanych subsytemem SDL_ttf.
                SDLTTF.quit();
            }
            catch (SDLException e) {
                e.printStackTrace();
            }
 
            // musime obnovit puvodni graficky rezim
            // i v tom pripade, ze nastane nejaka vyjimka
            SDLMain.quit();
        }
    }
 
}

Obrázek 9: Scéna vykreslená dnešním čtvrtým demonstračním příkladem.

Skript pro překlad na Linuxu:

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

Dávkový soubor pro překlad na Windows:

set SDL_JAVA_LIBS=.\sdljava-0.9.1\lib
 
javac -cp %SDL_JAVA_LIBS%\sdljava.jar SDLTest43.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 SDLTest43

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

Obrázek 10: Scéna vykreslená dnešním čtvrtým demonstračním příkladem.

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

Všechny čtyři dnes popsané demonstrační příklady byly společně s podpůrnými skripty určenými pro jejich překlad a následné spuštění uloženy 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 devíti 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 SDLTest40.java http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest40/SDLTest40.ja­va
2 SDLTest40_compile.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest40/SDLTest40_com­pile.sh
3 SDLTest40_compile_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest40/SDLTest40_com­pile_sys.sh
4 SDLTest40_run.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest40/SDLTest40_run­.sh
5 SDLTest40_run_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest40/SDLTest40_run_sys­.sh
6 SDLTest40_compile.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest40/SDLTest40_com­pile.bat
7 SDLTest40_run.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest40/SDLTest40_run­.bat
     
8 SDLTest41.java http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest41/SDLTest41.ja­va
9 SDLTest41_compile.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest41/SDLTest41_com­pile.sh
10 SDLTest41_compile_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest41/SDLTest41_com­pile_sys.sh
11 SDLTest41_run.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest41/SDLTest41_run­.sh
12 SDLTest41_run_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest41/SDLTest41_run_sys­.sh
13 SDLTest41_compile.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest41/SDLTest41_com­pile.bat
14 SDLTest41_run.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest41/SDLTest41_run­.bat
     
15 SDLTest42.java http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest42/SDLTest42.ja­va
16 SDLTest42_compile.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest42/SDLTest42_com­pile.sh
17 SDLTest42_compile_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest42/SDLTest42_com­pile_sys.sh
18 SDLTest42_run.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest42/SDLTest42_run­.sh
19 SDLTest42_run_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest42/SDLTest42_run_sys­.sh
20 SDLTest42_compile.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest42/SDLTest42_com­pile.bat
21 SDLTest42_run.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest42/SDLTest42_run­.bat
     
22 SDLTest43.java http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest43/SDLTest43.ja­va
23 SDLTest43_compile.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest43/SDLTest43_com­pile.sh
24 SDLTest43_compile_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest43/SDLTest43_com­pile_sys.sh
25 SDLTest43_run.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest43/SDLTest43_run­.sh
26 SDLTest43_run_sys.sh http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest43/SDLTest43_run_sys­.sh
27 SDLTest43_compile.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest43/SDLTest43_com­pile.bat
28 SDLTest43_run.bat http://icedtea.classpath.or­g/people/ptisnovs/jvm-tools/file/c9a741483dfc/sdlja­va/SDLTest43/SDLTest43_run­.bat

10. 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?

25. 3. 2014 18:27

No rikal jsem si, ze tento rok to asi uz bude tisicovka, ale ze je to tak brzy, me taky prekvapilo :) Diky za upozorneni.

26. 3. 2014 9:59

-nd- (neregistrovaný)

Tak tedy gratuluji , děkuji za Vaše velmi zajímavé články a těším se na další!
-nd-


Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Lupa.cz: Babiš: E-shopů se EET možná nebude týkat

Babiš: E-shopů se EET možná nebude týkat

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí

Lupa.cz: Není sleva jako sleva. Jak obchodům nenaletět?

Není sleva jako sleva. Jak obchodům nenaletět?

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

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

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami